sd卡驱动分析之host
SD控制器之初始化(linux/driver/mmc/host)
这一层讲述硬件与硬件之间将要发生的故事,也是最底层驱动的核心。通常所谓的驱动程序设计的任务将落实到这一层上,所以关注host故事的发展也将成为移植整个SD类设备驱动的核心。在host目录中有各种平台下SD卡主机驱动器的实例,这里我们选择s3c2440平台作为分析的重点。参看Kconfig和Makefile即可获得相应信息,这里对应的文件即是s3cmci.c。
旧瓶装新酒,还是那个module_init,不一样的是其中的入口函数。在s3cmci.c中对应的是module_init(s3cmci_init);
[host/s3cmci.c]
1920 static int __init s3cmci_init(void)
1921 {
1922 return platform_driver_register(&s3cmci_driver);
1923 }
1922行注册了一个平台驱动,这个前面分析的串口驱动等是一样的原理。这是新版内核中引入的一个虚拟的平台总线。对应的平台设备早在内核启动时通过platform_add_devices加入到了内核,相关的具体内容前面已经分析的挺多了,这里就不在详细说明。1922行调用的结果会导致s3cmci_driver中的probe方法得以调用,由此也就把我们引入了host的世界。
首先还是来大致看一下s3cmci_driver中所对应的具体内容。
[host/s3cmci.c]
1908 static struct platform_driver s3cmci_driver = {
1909 .driver = {
1910 .name = "s3c-sdi",
1911 .owner = THIS_MODULE,
1912 .pm = s3cmci_pm_ops,
1913 },
1914 .id_table = s3cmci_driver_ids,
1915 .probe = s3cmci_probe,
1916 .remove = __devexit_p(s3cmci_remove),
1917 .shutdown = s3cmci_shutdown,
1918 };
1915行使我们关注的核心,由于host与硬件是直接相关的,probe接下来将做部分关于硬件初始化的工作,因此在分析下面一部分代码之前,最好能对s3c2440的sdi相关的内容有所了解。下面进入到probe的相关内容,整个函数洋洋洒洒三百多行,就分段说明吧。
[host/s3cmci.c]
1548 static int __devinit s3cmci_probe(struct platform_device *pdev)
1549 {
1550 struct s3cmci_host *host;
1551 struct mmc_host *mmc;
1552 int ret;
1553 int is2440;
1554 int i;
1555
1556 is2440 = platform_get_device_id(pdev)->driver_data;
/*根据设备id号判断控制器类型*/
1557
1558 mmc = mmc_alloc_host(sizeof(struct s3cmci_host), &pdev->dev);
1559 if (!mmc) {
1560 ret = -ENOMEM;
1561 goto probe_out;
1562 }
1558行分配一个mmc的控制器,同时struct s3cmci_host结构作为一个私有数据类型将添加到struct mmc_host的private域。mmc_alloc_host相应的代码如下:
[host/host.c]
58 struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
59 {
60 int err;
61 struct mmc_host *host;
62
63 if (!idr_pre_get(&mmc_host_idr, GFP_KERNEL))
64 return NULL;
65
66 host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
67 if (!host)
68 return NULL;
69
70 spin_lock(&mmc_host_lock);
71 err = idr_get_new(&mmc_host_idr, host, &host->index);
72 spin_unlock(&mmc_host_lock);
73 if (err)
74 goto free;
75
76 dev_set_name(&host->class_dev, "mmc%d", host->index);
77
78 host->parent = dev;
79 host->class_dev.parent = dev;
80 host->class_dev.class = &mmc_host_class;
81 device_initialize(&host->class_dev);
82
83 spin_lock_init(&host->lock);
84 init_waitqueue_head(&host->wq);
85 INIT_DELAYED_WORK(&host->detect, mmc_rescan);
86 INIT_DELAYED_WORK_DEFERRABLE(&host->disable,mmc_host_deeper_disable);
87
88 /*
89 * By default, hosts do not support SGIO or large requests.
90 * They have to set these according to their abilities.
91 */
92 host->max_hw_segs = 1;
93 host->max_phys_segs = 1;
94 host->max_seg_size = PAGE_CACHE_SIZE;
95
96 host->max_req_size = PAGE_CACHE_SIZE;
97 host->max_blk_size = 512;
98 host->max_blk_count = PAGE_CACHE_SIZE / 512;
99
100 return host;
101
102 free:
103 kfree(host);
104 return NULL;
105 }
71行是内核的高效搜索树,将host->index与host结构相关联,方便以后查找。
78-81行主要是初始化host->class_dev,这个日后会通过device_register注册进系统。
84行前面已经在这个等待队列上花了不少笔墨,主要是同步对host资源的竞争的。
85-86行两行调用的函数其实没有本质上的区别,这里主要是初始化两个内核的延时工作队列。通过INIT_DELAYED_WORK或INIT_DELAYED_WORK_DEFERRABLE初始化以后,将延时执行的函数与struct delay_work结构相绑定,对于延时工作队列,日后通过调用schedule_delayed_work(),咱们只要传递struct work_struct的结构体参数即可,使得绑定的函数得以运行。关于这两个函数所做的工作,我们后面单独在说,先继续往下走。
92-98行这些个都是设置host的一些属性的,是与block.c中请求队列的设置相对应的。
重新回到s3cmci_probe....
1563
1564 for (i = S3C2410_GPE(5); i <= S3C2410_GPE(10); i++) {
1565 ret = gpio_request(i, dev_name(&pdev->dev));
1566 if (ret) {
1567 dev_err(&pdev->dev, "failed to get gpio %d\n", i);
1568
1569 for (i--; i >= S3C2410_GPE(5); i--)
1570 gpio_free(i);
1571
1572 goto probe_free_host;
1573 }
1574 }
上面这一段申请SD卡驱动器所需的GPIO资源。
1575
1576 host = mmc_priv(mmc);
1577 host->mmc = mmc;
1578 host->pdev = pdev;
1579 host->is2440 = is2440;
1580
上面这段代码就是对struct s3cmci_host *host这个私有结构的配置,对于core或block层见到的只有struct mmc_host。从另外的一个角度可以理解struct mmc_host实际上是
struct s3cmci_host的基类,有着所有控制器所必须具有的属性。struct s3cmci_host还包含了与host硬件平台相关的特征。
1581 host->pdata = pdev->dev.platform_data;
1582 if (!host->pdata) {
1583 pdev->dev.platform_data = &s3cmci_def_pdata;
1584 host->pdata = &s3cmci_def_pdata;
1585 }
1586
这是平台设备注册时platform_device所具有的属性,对于这里分析所使用的mini2440平台来说对应于math-mini2440.c文件中的
375行 s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;
不妨关注一下mini2440_mmc_cfg中大致的一些内容。
[arch/arm/ math-mini2440.c]
334 static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {
335 .gpio_detect = S3C2410_GPG(8),
336 .gpio_wprotect = S3C2410_GPH(8),
337 .set_power = NULL,
338 .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,
339 };
上面定义了写保护引脚、开检测以及供电范围等相关信息。
1587 spin_lock_init(&host->complete_lock);
1588 tasklet_init(&host->pio_tasklet, pio_tasklet, (unsigned long) host);
1589
tasklet就象一个内核定时器,在一个"软中断"的上下文中执行(以原子模式),常用在硬件中断处理中,使得可以使得复杂的任务安全地延后到以后的时间处理。task_init建立一个 tasklet,然后调用函数tasklet_schedule将这个tasklet放在 tasklet_vec链表的头部,并唤醒后台线程 ksoftirqd。当后台线程ksoftirqd运行调用__do_softirq时,会执行在中断向量表softirq_vec里中断号TASKLET_SOFTIRQ对应的tasklet_action函数,然后 tasklet_action遍历 tasklet_vec链表,调用每个 tasklet的函数完成软中断操作,上面例子中即是pio_tasklet函数,另外软中断处理函数只能传递一个long型变量。这里是直接使用host的地址,作为传递参数。关于这个pio_tasklet现在说他还为时过早,等时辰一到自然会对他大书特书。
1590 if (is2440) {
1591 host->sdiimsk = S3C2440_SDIIMSK;
1592 host->sdidata = S3C2440_SDIDATA;
1593 host->clk_div = 1;
1594 } else {
1595 host->sdiimsk = S3C2410_SDIIMSK;
1596 host->sdidata = S3C2410_SDIDATA;
1597 host->clk_div = 2;
1598 }
1599
host->sdiimsk、host->sdidata分别用来存放host控制器SDI中断屏蔽寄存器和SDI数据寄存器相对SDI寄存器的偏移地址。对于s3c2440根据芯片手册SDIIntMsk偏移地址为0x3C,SDIDAT偏移地址为0x40。最后host->clk_div就是指的SDI使用的时钟分频系数了。
1600 host->complete_what = COMPLETION_NONE;
1601 host->pio_active = XFER_NONE;
1602
host->complete_what是一个枚举类型变量,实际上用以标示传输完成的状态;host->pio_active标示数据传输的方向,所以在这里一起初始化为空。
关于传输完成的标示为了后面分析方便还是一起列举出来:
enum s3cmci_waitfor {
COMPLETION_NONE,
COMPLETION_FINALIZE,
COMPLETION_CMDSENT,
COMPLETION_RSPFIN,
COMPLETION_XFERFINISH,
COMPLETION_XFERFINISH_RSPFIN,
};
1603 #ifdef CONFIG_MMC_S3C_PIODMA
1604 host->dodma = host->pdata->dma;
1605 #endif
1606
上面是同时使能了PIO和DMA模式的情况,这里我们对两种传输方式都做相应的分析,所以host->dodma默认为1。
1607 host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1608 if (!host->mem) {
1609 dev_err(&pdev->dev,
1610 failed to get io memory region resouce.\n);
1611
1612 ret = -ENOENT;
1613 goto probe_free_gpio;
1614 }
1615
1616 host->mem = request_mem_region(host->mem->start,
1617 resource_size(host->mem), pdev->name);
1618
1619 if (!host->mem) {
1620 dev_err(&pdev->dev, "failed to request io memory region.\n");
1621 ret = -ENOENT;
1622 goto probe_free_gpio;
1623 }
1624
1625 host->base = ioremap(host->mem->start, resource_size(host->mem));
1626 if (!host->base) {
1627 dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
1628 ret = -EINVAL;
1629 goto probe_free_mem_region;
1630 }
1631
上面的一段代码相对比较简单,都是平台驱动设计过程中常用的几个处理函数,就不一一展开了。首先是获取IO资源,这当然即使mach-mini2440.c中所注册的IORESOURCE_MEM,
1616行会申请这个资源并检查是否可用,当然只要之前没有使用过SDI寄存器空间,这里都会申请成功。最后就是IO映射,将实地址映射为内核虚拟地址使用。最后,host->base将保持SDI寄存器基地址所对应的内核虚拟地址。
1632 host->irq = platform_get_irq(pdev, 0);
1633 if (host->irq == 0) {
1634 dev_err(&pdev->dev, "failed to get interrupt resouce.\n");
1635 ret = -EINVAL;
1636 goto probe_iounmap;
1637 }
1638
1639 if (request_irq(host->irq, s3cmci_irq, 0, DRIVER_NAME, host)) {
1640 dev_err(&pdev->dev, "failed to request mci interrupt.\n");
1641 ret = -ENOENT;
1642 goto probe_iounmap;
1643 }
1644
上面一段是对中断资源的申请,并通过request_irq安装了中断处理函数,使能了SDI中断。在上段最为关心的是s3cmci_irq 中断处理函数及其传入的dev_id 。关于这个处理函数的分析后面讲述数据传输的时候会进行细致分析。接着向下....
1645 /* We get spurious interrupts even when we have set the IMSK
1646 * register to ignore everything, so use disable_irq() to make
1647 * ensure we don't lock the system with un-serviceable requests. */
1648
1649 disable_irq(host->irq);
1650 host->irq_state = false;
1651
前面我们强调了request_irq调用的结果会使能 host->irq,但此时系统初始化尚未完成这时候出现的中断可能将处理器带入一个异常状态,所以1649行屏蔽中断1650行将中断状态置位无效都是有必要的。
1652 if (!host->pdata->no_detect) {
1653 ret = gpio_request(host->pdata->gpio_detect, "s3cmci detect");
1654 if (ret) {
1655 dev_err(&pdev->dev, "failed to get detect gpio\n");
1656 goto probe_free_irq;
1657 }
1658
如果SD卡存在的检查一般是通过读取专用引脚状态来实现的,这里如果需要做detect相关的工作的话就必须重新分配一个管脚,在当前系统中前面定义了以GPG8作为检测引脚。
1659 host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
1660
s3c2410_gpio_getirq是获取这个GPIO的外部中断向量号,可见后面的SD卡的检测可能会用到这个引脚的外部中断。
1661 if (host->irq_cd >= 0) {
1662 if (request_irq(host->irq_cd, s3cmci_irq_cd,
1663 IRQF_TRIGGER_RISING |
1664 IRQF_TRIGGER_FALLING,
1665 DRIVER_NAME, host)) {
1666 dev_err(&pdev->dev,
1667 can't get card detect irq.\n);
1668 ret = -ENOENT;
1669 goto probe_free_gpio_cd;
1670 }
1671 } else {
1672 dev_warn(&pdev->dev,
1673 "host detect has no irq available\n");
1674 gpio_direction_input(host->pdata->gpio_detect);
1675 }
1676 } else
1677 host->irq_cd = -1;
1678
上面的这段代码意图很明显就是要申请这个中断了,s3cmci_irq_cd是其处理函数。对像SD卡这种可移出设备来作为块设备存储介质的话,大多会涉及到媒体切换,具体这方面的内容后面用到的时候也会有个详细分析。
1679 if (!host->pdata->no_wprotect) {
1680 ret = gpio_request(host->pdata->gpio_wprotect, "s3cmci wp");
1681 if (ret) {
1682 dev_err(&pdev->dev, "failed to get writeprotect\n");
1683 goto probe_free_irq_cd;
1684 }
1685
1686 gpio_direction_input(host->pdata->gpio_wprotect);
1687 }
1688
与检测的管脚类似,这里就不详说了
1689 /* depending on the dma state, get a dma channel to use. */
1690
1691 if (s3cmci_host_usedma(host)) {
1692 host->dma = s3c2410_dma_request(DMACH_SDI, &s3cmci_dma_client,
1693 host);
1694 if (host->dma < 0) {
1695 dev_err(&pdev->dev, "cannot get DMA channel.\n");
1696 if (!s3cmci_host_canpio()) {
1697 ret = -EBUSY;
1698 goto probe_free_gpio_wp;
1699 } else {
1700 dev_warn(&pdev->dev, "falling back to PIO.\n");
1701 host->dodma = 0;
1702 }
1703 }
1704 }
1705
1691行这个我们之前就默认为TURE了,所以接下来的几行代码是免不了。
1692行s3c2410_dma_request申请DMA通道,对s3c2440平台有4通道的DMA。而DMACH_SDI是一个虚拟的通道号,由于这部分代码是和硬件紧密相关的,而且整个DMA的管理相对来讲比较复杂,所以这里只是粗略了解一下。
[plat-s3c24xx/dma.c]
715 int s3c2410_dma_request(unsigned int channel,
716 struct s3c2410_dma_client *client,
717 void *dev)
718 {
719 struct s3c2410_dma_chan *chan;
720 unsigned long flags;
721 int err;
722
723 pr_debug("dma%d: s3c2410_request_dma: client=%s, dev=%p\n",
724 channel, client->name, dev);
725
726 local_irq_save(flags);
727
728 chan = s3c2410_dma_map_channel(channel);
729 if (chan == NULL) {
730 local_irq_restore(flags);
731 return -EBUSY;
732 }
733
734 dbg_showchan(chan);
735
736 chan->client = client;
737 chan->in_use = 1;
738
739 if (!chan->irq_claimed) {
740 pr_debug("dma%d: %s : requesting irq %d\n",
741 channel, __func__, chan->irq);
742
743 chan->irq_claimed = 1;
744 local_irq_restore(flags);
745
746 err = request_irq(chan->irq, s3c2410_dma_irq, IRQF_DISABLED,
747 client->name, (void *)chan);
748
749 local_irq_save(flags);
750
751 if (err) {
752 chan->in_use = 0;
753 chan->irq_claimed = 0;
754 local_irq_restore(flags);
755
756 printk(KERN_ERR "%s: cannot get IRQ %d for DMA %d\n",
757 client->name, chan->irq, chan->number);
758 return err;
760
761 chan->irq_enabled = 1;
762 }
763
764 local_irq_restore(flags);
765
766 /* need to setup */
767
768 pr_debug("%s: channel initialised, %p\n", __func__, chan);
769
770 return chan->number | DMACH_LOW_LEVEL;
771 }
728行是问题的关键,调用s3c2410_dma_map_channel为虚拟的DMA通道寻找一个物理的空闲通道。相应的代码如下:
1388 static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel)
1389 {
1390 struct s3c24xx_dma_order_ch *ord = NULL;
1391 struct s3c24xx_dma_map *ch_map;
1392 struct s3c2410_dma_chan *dmach;
1393 int ch;
1394
1395 if (dma_sel.map == NULL || channel > dma_sel.map_size)
1396 return NULL;
1397
1398 ch_map = dma_sel.map + channel;
1399
1400 /* first, try the board mapping */
1401
1402 if (dma_order) {
1403 ord = &dma_order->channels[channel];
1404
1405 for (ch = 0; ch < dma_channels; ch++) {
1406 if (!is_channel_valid(ord->list[ch]))
1407 continue;
1408
1409 if (s3c2410_chans[ord->list[ch]].in_use == 0) {
1410 ch = ord->list[ch] & ~DMA_CH_VALID;
1411 goto found;
1412 }
1413 }
1414
1415 if (ord->flags & DMA_CH_NEVER)
1416 return NULL;
1417 }
1418
1419 /* second, search the channel map for first free */
1420
1421 for (ch = 0; ch < dma_channels; ch++) {
1422 if (!is_channel_valid(ch_map->channels[ch]))
1423 continue;
1424
1425 if (s3c2410_chans[ch].in_use == 0) {
1426 printk("mapped channel %d to %d\n", channel, ch);
1427 break;
1428 }
1429 }
1430
1431 if (ch >= dma_channels)
1432 return NULL;
1433
1434 /* update our channel mapping */
1435
1436 found:
1437 dmach = &s3c2410_chans[ch];
1438 dmach->map = ch_map;
1439 dmach->req_ch = channel;
1440 s3c_dma_chan_map[channel] = dmach;
1441
1442 /* select the channel */
1443
1444 (dma_sel.select)(dmach, ch_map);
1445
1446 return dmach;
1447 }
从上面的代码可以看到有两种策略来寻找一个空闲的通道,找到以后就走到了found以后的代码了,1444行就是对这个找的通道进行适当的初始化。
1706 host->clk = clk_get(&pdev->dev, "sdi");
1707 if (IS_ERR(host->clk)) {
1708 dev_err(&pdev->dev, "failed to find clock source.\n");
1709 ret = PTR_ERR(host->clk);
1710 host->clk = NULL;
1711 goto probe_free_dma;
1712 }
1713
1714 ret = clk_enable(host->clk);
1715 if (ret) {
1716 dev_err(&pdev->dev, "failed to enable clock source.\n");
1717 goto clk_free;
1718 }
1719
1720 host->clk_rate = clk_get_rate(host->clk);
1721
以上是关于sdi时钟和波特率的有关设置,都是内核提供的一些简单的函数调用,相关的内容不是现在研究的重点就不再详细分析了。
1722 mmc->ops = &s3cmci_ops;
1723 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
1724 #ifdef CONFIG_MMC_S3C_HW_SDIO_IRQ
1725 mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
1726 #else
1727 mmc->caps = MMC_CAP_4_BIT_DATA;
1728 #endif
1729 mmc->f_min = host->clk_rate / (host->clk_div * 256);
1730 mmc->f_max = host->clk_rate / host->clk_div;
1731
1732 if (host->pdata->ocr_avail)
1733 mmc->ocr_avail = host->pdata->ocr_avail;
1734
1735 mmc->max_blk_count = 4095;
1736 mmc->max_blk_size = 4095;
1737 mmc->max_req_size = 4095 * 512;
1738 mmc->max_seg_size = mmc->max_req_size;
1739
1740 mmc->max_phys_segs = 128;
1741 mmc->max_hw_segs = 128;
1742
1743 dbg(host, dbg_debug,
1744 "probe: mode:%s mapped mci_base:%p irq:%u irq_cd:%u dma:%u.\n",
1745 (host->is2440?"2440":""),
1746 host->base, host->irq, host->irq_cd, host->dma);
1747
上面就是对这个将要出嫁的mmc_host进行最后的设置,mmc->ops = &s3cmci_ops;就是一直以来向core层提供的接口函数集。后面的分析可能部分是围绕它其中的函数展开的。
1748 ret = s3cmci_cpufreq_register(host);
1749 if (ret) {
1750 dev_err(&pdev->dev, "failed to register cpufreq\n");
1751 goto free_dmabuf;
1752 }
1753
这里使用的是Linux的通告机制,s3cmci_cpufreq_register相对应的代码如下:
1398 static inline int s3cmci_cpufreq_register(struct s3cmci_host *host)
1399 {
1400 host->freq_transition.notifier_call = s3cmci_cpufreq_transition;
1401
1402 return cpufreq_register_notifier(&host->freq_transition,
1403 CPUFREQ_TRANSITION_NOTIFIER);
1404 }
cpufreq_register_notifier cpu是将host->freq_transition注册到CPU频率通告链上,这个是由内核维护的,当cpu频率改变时将会调用上面注册的s3cmci_cpufreq_transition的内容。
1754 ret = mmc_add_host(mmc);
1755 if (ret) {
1756 dev_err(&pdev->dev, "failed to add mmc host.\n");
1757 goto free_cpufreq;
1758 }
1759
mmc_add_host这是core层的函数,他保存了所有平台通用的代码。同时看上去简简单单的一个mmc_add_host,可能蕴藏着天大的玄机。为此我们将为mmc_add_host另分一章,作为core层的续集,专门讲述mmc_add_host过程中发生的点点滴滴....
在开始分析mmc_add_host之前,让我们还是结束SD主机控制器的probe函数,接下来到了1760行....
1760 s3cmci_debugfs_attach(host);
1761
1762 platform_set_drvdata(pdev, mmc);
1763 dev_info(&pdev->dev, "%s - using %s, %s SDIO IRQ\n", mmc_hostname(mmc),
1764 s3cmci_host_usedma(host) ? "dma" : "pio",
1765 mmc->caps & MMC_CAP_SDIO_IRQ ? "hw" : "sw");
1766
1767 return 0;
1768
1769 free_cpufreq:
1770 s3cmci_cpufreq_deregister(host);
1771
1772 free_dmabuf:
1773 clk_disable(host->clk);
1774
1775 clk_free:
1776 clk_put(host->clk);
1777
1778 probe_free_dma:
1779 if (s3cmci_host_usedma(host))
1780 s3c2410_dma_free(host->dma, &s3cmci_dma_client);
1781
1782 probe_free_gpio_wp:
1783 if (!host->pdata->no_wprotect)
1784 gpio_free(host->pdata->gpio_wprotect);
1785
1786 probe_free_gpio_cd:
1787 if (!host->pdata->no_detect)
1788 gpio_free(host->pdata->gpio_detect);
1789
1790 probe_free_irq_cd:
1791 if (host->irq_cd >= 0)
1792 free_irq(host->irq_cd, host);
1793
1794 probe_free_irq:
1795 free_irq(host->irq, host);
1796
1797 probe_iounmap:
1798 iounmap(host->base);
1799
1800 probe_free_mem_region:
1801 release_mem_region(host->mem->start, resource_size(host->mem));
1802
1803 probe_free_gpio:
1804 for (i = S3C2410_GPE(5); i <= S3C2410_GPE(10); i++)
1805 gpio_free(i);
1806
1807 probe_free_host:
1808 mmc_free_host(mmc);
1809
1810 probe_out:
1811 return ret;
1812 }
上面的一段除了1760行是debugefs相关的,其他都是出错的处理了,那么也就没有必要纠结于此了,赶快开启新的生活吧....
core层续集之mmc_add_host
117 int mmc_add_host(struct mmc_host *host)
121 WARN_ON((host->caps & MMC_CAP_SDIO_IRQ) &&
122 !host->ops->enable_sdio_irq);
124 led_trigger_register_simple(dev_name(&host->class_dev), &host->led);
126 err = device_add(&host->class_dev);
131 mmc_add_host_debugfs(host);
126行设备注册,这个host->class_dev在很早以前我们就对他进行过初始化了,其中并没有给他关联到某某总线或是驱动上,所以实际上这段代码产生的效果就是在sysfs中留下自己走过的痕迹。
134行是时候开启主机控制器了,这也是core层的函数具体的方法如下:
1118 void mmc_start_host(struct mmc_host *host)
1121 mmc_detect_change(host, 0);
代码精炼到了极致,首先来看一下mmc_power_off,内容如下:
911 static void mmc_power_off(struct mmc_host *host)
915 if (!mmc_host_is_spi(host)) {
916 host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
917 host->ios.chip_select = MMC_CS_DONTCARE;
919 host->ios.power_mode = MMC_POWER_OFF;
920 host->ios.bus_width = MMC_BUS_WIDTH_1;
921 host->ios.timing = MMC_TIMING_LEGACY;
关心最多的就是host->ios当中的内容,前段的赋值真正作用在硬件上是调用host层向上提供的struct mmc_host_ops接口。这里922行实际上就是完成了这个工作。
回到mmc_start_host,1121行这一行的作用显然是意义重大,看名字就知道是用来检测SD卡的,内容如下:
1023 void mmc_detect_change(struct mmc_host *host, unsigned long delay)
1027 spin_lock_irqsave(&host->lock, flags);
1029 spin_unlock_irqrestore(&host->lock, flags);
1032 mmc_schedule_delayed_work(&host->detect, delay);
1038 void mmc_rescan(struct work_struct *work)
1041 container_of(work, struct mmc_host, detect.work);
1047 /* if there is a card registered, check whether it is still present */
1048 if ((host->bus_ops != NULL) && host->bus_ops->detect && !host->bus_dead)
1049 host->bus_ops->detect(host);
1056 /* if there still is a card present, stop here */
1057 if (host->bus_ops != NULL) {
1062 /* detect a newly inserted card */
1065 * Only we can add a new handler, so it's safe to
1070 if (host->ops->get_cd && host->ops->get_cd(host) == 0)
1078 mmc_send_if_cond(host, host->ocr_avail);
1081 * First we search for SDIO...
1083 err = mmc_send_io_op_cond(host, 0, &ocr);
1085 if (mmc_attach_sdio(host, ocr))
1093 err = mmc_send_app_op_cond(host, 0, &ocr);
1095 if (mmc_attach_sd(host, ocr))
1103 err = mmc_send_op_cond(host, 0, &ocr);
1105 if (mmc_attach_mmc(host, ocr))
1114 if (host->caps & MMC_CAP_NEEDS_POLL)
1115 mmc_schedule_delayed_work(&host->detect, HZ);
1177 static int s3cmci_card_present(struct mmc_host *mmc)
1179 struct s3cmci_host *host = mmc_priv(mmc);
1180 struct s3c24xx_mci_pdata *pdata = host->pdata;
1183 if (pdata->gpio_detect == 0)
1186 ret = gpio_get_value(pdata->gpio_detect) ? 0 : 1;
1187 return ret ^ pdata->detect_invert;
这是利用了SD卡座的一个机械检测方法,当SD插入以后SD卡的11脚会连接到低电平,从而得到卡插入的状态。对SD卡本身来说只能利用SD3引脚来做相应的判断。1186行就是读取检测引脚的值。
1073行获得主机控制权,这个函数的实现前面已经详细分析过了。
865 static void mmc_power_up(struct mmc_host *host)
869 /* If ocr is set, we use it */
873 bit = fls(host->ocr_avail) - 1;
876 if (mmc_host_is_spi(host)) {
877 host->ios.chip_select = MMC_CS_HIGH;
878 host->ios.bus_mode = MMC_BUSMODE_PUSHPULL;
880 host->ios.chip_select = MMC_CS_DONTCARE;
881 host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
883 host->ios.power_mode = MMC_POWER_UP;
884 host->ios.bus_width = MMC_BUS_WIDTH_1;
885 host->ios.timing = MMC_TIMING_LEGACY;
889 * This delay should be sufficient to allow the power supply
890 * to reach the minimum voltage.
894 if (host->f_min > 400000) {
895 pr_warning("%s: Minimum clock frequency too high for "
897 host->ios.clock = host->f_min;
901 host->ios.power_mode = MMC_POWER_ON;
905 * This delay must be at least 74 clock sizes, or 1 ms, or the
906 * time required to reach a stable voltage.
96 int mmc_go_idle(struct mmc_host *host)
102 * Non-SPI hosts need to prevent chipselect going active during
103 * GO_IDLE; that would put chips into SPI mode. Remind them of
104 * that in case of hardware that won't pull up DAT3/nCS otherwise.
106 * SPI hosts ignore ios.chip_select; it's managed according to
107 * rules that must accomodate non-MMC slaves which this layer
110 if (!mmc_host_is_spi(host)) {
111 mmc_set_chip_select(host, MMC_CS_HIGH);
115 memset(&cmd, 0, sizeof(struct mmc_command));
117 cmd.opcode = MMC_GO_IDLE_STATE;
119 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_NONE | MMC_CMD_BC;
121 err = mmc_wait_for_cmd(host, &cmd, 0);
125 if (!mmc_host_is_spi(host)) {
126 mmc_set_chip_select(host, MMC_CS_DONTCARE);
110-112行由于SD卡会根据初始化过程中CS引脚的状态来判断所采用的传输模式,这里如果不使用SPI传输,那么一定要就CS引脚置位高电平。SD卡不同传输模式下引脚的定义如下所示:
117-119行设置命令格式,MMC_GO_IDLE_STATE对应CMD0,然后调用121行的函数mmc_wait_for_cmd来执行命令。
125-128行将110-112行置位的引脚复位到输入状态,因为在硬件上不确定输入输出关系的引脚都应将其设置为输入,以免引起冲突。
196 int mmc_send_if_cond(struct mmc_host *host, u32 ocr)
200 static const u8 test_pattern = 0xAA;
204 * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND
205 * before SD_APP_OP_COND. This command will harmlessly fail for
208 cmd.opcode = SD_SEND_IF_COND;
209 cmd.arg = ((ocr & 0xFF8000) != 0) << 8 | test_pattern;
210 cmd.flags = MMC_RSP_SPI_R7 | MMC_RSP_R7 | MMC_CMD_BCR;
212 err = mmc_wait_for_cmd(host, &cmd, 0);
216 if (mmc_host_is_spi(host))
217 result_pattern = cmd.resp[1] & 0xFF;
219 result_pattern = cmd.resp[0] & 0xFF;
221 if (result_pattern != test_pattern)
mmc_rescan的1083-1088行,这小段是搜索SDIO设备....
151 int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
158 memset(&cmd, 0, sizeof(struct mmc_command));
160 cmd.opcode = SD_APP_OP_COND;
161 if (mmc_host_is_spi(host))
162 cmd.arg = ocr & (1 << 30); /* SPI only defines one bit */
165 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR;
168 err = mmc_wait_for_app_cmd(host, NULL, &cmd, MMC_CMD_RETRIES);
172 /* if we're just probing, do a single pass */
176 /* otherwise wait until reset completes */
177 if (mmc_host_is_spi(host)) {
178 if (!(cmd.resp[0] & R1_SPI_IDLE))
181 if (cmd.resp[0] & MMC_CARD_BUSY)
190 if (rocr && !mmc_host_is_spi(host))
160-165行还是设置cmd结构,根据我们前面所说的SD卡初始化过程,这里应该是设置目标的工作电压也就是ACMD41。
167行表示mmc_wait_for_app_cmd最多重复做一百次,下面来分析一下她所做的具体工作。
65 int mmc_wait_for_app_cmd(struct mmc_host *host, struct mmc_card *card,
66 struct mmc_command *cmd, int retries)
78 * We have to resend MMC_APP_CMD for each attempt so
79 * we cannot use the retries field in mmc_command.
81 for (i = 0;i <= retries;i++) {
82 memset(&mrq, 0, sizeof(struct mmc_request));
84 err = mmc_app_cmd(host, card);
86 /* no point in retrying; no APP commands allowed */
87 if (mmc_host_is_spi(host)) {
88 if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
94 memset(&mrq, 0, sizeof(struct mmc_request));
96 memset(cmd->resp, 0, sizeof(cmd->resp));
102 mmc_wait_for_req(host, &mrq);
108 /* no point in retrying illegal APP commands */
109 if (mmc_host_is_spi(host)) {
110 if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
上面的代码我们分为两部分来看,81-92行为第一部分,94-113行为第二部分。同样mmc_app_cmd被重复了retries次。不妨看下84行的代码:
23 static int mmc_app_cmd(struct mmc_host *host, struct mmc_card *card)
29 BUG_ON(card && (card->host != host));
35 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC;
38 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_BCR;
41 err = mmc_wait_for_cmd(host, &cmd, 0);
45 /* Check that card supported application commands */
46 if (!mmc_host_is_spi(host) && !(cmd.resp[0] & R1_APP_CMD))
94-112行前面传递过来的ACMD41命令这里就会重新组装成struct mmc_request结构,然后调用mmc_wait_for_cmd(host, &cmd, 0);来执行。
177-183行对于非SPI模式,通过判断返回的状态寄存器rSDIRSP0的第三十一位是否为1,来决定SD卡进入了ready状态。1:ready0:busy。
190-191行这是返回的电压范围。如果一切正常认为初始化的第二阶段已经完成了,就该回到mmc_rescan的1095行mmc_attach_sd函数了。
658 int mmc_attach_sd(struct mmc_host *host, u32 ocr)
665 mmc_sd_attach_bus_ops(host);
668 * We need to get OCR a different way for SPI.
670 if (mmc_host_is_spi(host)) {
673 err = mmc_spi_read_ocr(host, 0, &ocr);
679 * Sanity check the voltages that the card claims to
683 printk(KERN_WARNING "%s: card claims to support voltages "
684 "below the defined range. These will be ignored.\n",
689 if (ocr & MMC_VDD_165_195) {
690 printk(KERN_WARNING "%s: SD card claims to support the "
691 "incompletely defined 'low voltage range'. This "
692 "will be ignored.\n", mmc_hostname(host));
696 host->ocr = mmc_select_voltage(host, ocr);
699 * Can we support the voltage(s) of the card(s)?
707 * Detect and init the card.
709 err = mmc_sd_init_card(host, host->ocr, NULL);
715 err = mmc_add_card(host->card);
722 mmc_remove_card(host->card);
729 printk(KERN_ERR "%s: error %d whilst initialising SD card\n",
665行完成bus_ops与SD卡的绑定,这也就是我们之间所见到的内容,其对应的实现如下:
642 static void mmc_sd_attach_bus_ops(struct mmc_host *host)
644 const struct mmc_bus_ops *bus_ops;
646 if (host->caps & MMC_CAP_NONREMOVABLE)
647 bus_ops = &mmc_sd_ops_unsafe;
650 mmc_attach_bus(host, bus_ops);
646-649行设置了bus_ops对应的方法,这里我们选择mmc_sd_ops,里面对应的具体内容我们用到的时候在去分析。
650行是总线方法和host绑定的过程,中间的内容比较简单就是将bus_ops关联到host->bus_ops上,同时对总线的引用计数进行初始化。相应的代码如下:
968 void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops)
977 spin_lock_irqsave(&host->lock, flags);
986 spin_unlock_irqrestore(&host->lock, flags);
这个总线绑定的过程一旦完成就又重新回到了mmc_attach_sd。
670-676行我们前面分析获取工作电压范围的过程是针对非SPI模式的,这里对于SPI模式我们需要重新获取。
671行首先重新进入idle状态,这个无论哪种工作模式都是一样的。
673行是获取ocr的区别,对于spi使用的命令字为ACMD58,其他的就和一般的命令发送大相径庭了。
355 int mmc_spi_read_ocr(struct mmc_host *host, int highcap, u32 *ocrp)
360 memset(&cmd, 0, sizeof(struct mmc_command));
362 cmd.opcode = MMC_SPI_READ_OCR;
363 cmd.arg = highcap ? (1 << 30) : 0;
364 cmd.flags = MMC_RSP_SPI_R3;
366 err = mmc_wait_for_cmd(host, &cmd, 0);
回到mmc_attach_sd的696行mmc_select_voltage(host, ocr),这是根据host的电压范围和读取到的SD卡工作电压,来判断工作电压是否匹配。函数内容如下:
822 u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)
837 pr_warning("%s: host doesn't support card's voltages\n",
host->ocr_avail前面我们已经进行了相应的初始化。
.ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34。
332 static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
344 * Since we're changing the OCR value, we seem to
345 * need to tell some cards to go back to the idle
346 * state. We wait 1ms to give cards time to
352 * If SD_SEND_IF_COND indicates an SD 2.0
353 * compliant card and we should set bit 30
354 * of the ocr to indicate that we can handle
355 * block-addressed SDHC cards.
357 err = mmc_send_if_cond(host, ocr);
361 err = mmc_send_app_op_cond(host, ocr, NULL);
368 if (mmc_host_is_spi(host))
369 err = mmc_send_cid(host, cid);
371 err =mmc_all_send_cid(host, cid);
376 if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) {
384 * Allocate card structure.
386 card =mmc_alloc_card(host, &sd_type);
393 memcpy(card->raw_cid, cid, sizeof(card->raw_cid));
397 * For native busses: get card RCA and quit open drain mode.
399 if (!mmc_host_is_spi(host)) {
400 err = mmc_send_relative_addr(host, &card->rca);
404 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
411 err = mmc_send_csd(card, card->raw_csd);
415 err = mmc_decode_csd(card);
423 * Select card, as all following commands rely on that.
425 if (!mmc_host_is_spi(host)) {
426 err = mmc_select_card(card);
435 err = mmc_app_send_scr(card, card->raw_scr);
439 err = mmc_decode_scr(card);
444 * Fetch switch information from card.
446 err = mmc_read_switch(card);
452 * For SPI, enable CRC as appropriate.
453 * This CRC enable is located AFTER the reading of the
454 * card registers because some SDHC cards are not able
455 * to provide valid CRCs for non-512-byte blocks.
457 if (mmc_host_is_spi(host)) {
458 err = mmc_spi_set_crc(host, use_spi_crc);
464 * Attempt to change to high-speed (if supported)
466 err = mmc_switch_hs(card);
473 max_dtr = (unsigned int)-1;
475 if (mmc_card_highspeed(card)) {
476 if (max_dtr > card->sw_caps.hs_max_dtr)
477 max_dtr = card->sw_caps.hs_max_dtr;
478 } else if (max_dtr > card->csd.max_dtr) {
479 max_dtr = card->csd.max_dtr;
482 mmc_set_clock(host, max_dtr);
485 * Switch to wider bus (if supported).
487 if ((host->caps & MMC_CAP_4_BIT_DATA) &&
488 (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {
489 err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4);
493 mmc_set_bus_width(host, MMC_BUS_WIDTH_4);
497 * Check if read-only switch is active.
500 if (!host->ops->get_ro || host->ops->get_ro(host) < 0) {
501 printk(KERN_WARNING "%s: host does not "
503 switch. assuming write-enable.\n,
506 if (host->ops->get_ro(host) > 0)
507 mmc_card_set_readonly(card);
这段代码洋洋洒洒二百余行,着实有点难看。但是没关系,深呼吸一下继续来看代码...
349行再见了mmc_go_idle(host),话可以乱说但是代码可不能乱写。这个函数在这里不为别的,只因前面修改了ocr的值。所以必须让大家都回到idle状态。
361行还是前面花了大力气分析过的函数,这里就不必要重申了。
再继续向前之前还是要去瞅瞅我们之前贴出来的那张初始化流程图,下面的时间该到获取卡的身份信息了,由此SD卡将步入identification时代,使用的命令是CMD2。
368-371行我们选择err = mmc_all_send_cid(host, cid),跟踪源码:
177 int mmc_all_send_cid(struct mmc_host *host, u32 *cid)
185 memset(&cmd, 0, sizeof(struct mmc_command));
187 cmd.opcode = MMC_ALL_SEND_CID;
189 cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR;
191 err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
195 memcpy(cid, cmd.resp, sizeof(u32) * 4);
187行跟据#define MMC_ALL_SEND_CID 2可以确定,此刻的SD卡即将进入激动人心的时刻identification。
函数的其他内容就是炒剩饭了,所有的罪就让mmc_wait_for_cmd来背吧。
199 struct mmc_card *mmc_alloc_card(struct mmc_host *host, struct device_type *type)
203 card = kzalloc(sizeof(struct mmc_card), GFP_KERNEL);
209 device_initialize(&card->dev);
211 card->dev.parent = mmc_classdev(host);
212 card->dev.bus = &mmc_bus_type;
213 card->dev.release = mmc_release_card;
207行吃水不忘挖井人,辛辛苦苦为SD卡操劳了N久的host总算还是被struct mmc_host第一个给记下了。当然后面对这个SD卡的所有操作也就顺理成章的交给了card->host。
始终不忘的是那张动情的SD卡初始化流程图,indentification过后就到了设置RCA阶段了,mmc_send_relative_addr最终将不辱使命,内容如下:
227 int mmc_send_relative_addr(struct mmc_host *host, unsigned int *rca)
235 memset(&cmd, 0, sizeof(struct mmc_command));
237 cmd.opcode = SD_SEND_RELATIVE_ADDR;
239 cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;
241 err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
630 void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode)
632 host->ios.bus_mode = mode;
310 int mmc_send_csd(struct mmc_card *card, u32 *csd)
314 if (!mmc_host_is_spi(card->host))
315 return mmc_send_cxd_native(card->host, card->rca << 16,
318 ret = mmc_send_cxd_data(card, card->host, MMC_SEND_CSD, csd, 16);
323 csd[i] = be32_to_cpu(csd[i]);
对于我们一直跟踪的非SPI模式,315行成了整个函数的焦点。MMC_SEND_CSD对应的是CMD9,mmc_send_cxd_native的内容如下:
222 mmc_send_cxd_native(struct mmc_host *host, u32 arg, u32 *cxd, int opcode)
230 memset(&cmd, 0, sizeof(struct mmc_command));
234 cmd.flags = MMC_RSP_R2 | MMC_CMD_AC;
236 err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
240 memcpy(cxd, cmd.resp, sizeof(u32) * 4);
416行取出了CSD的参数,但是哪些个字段表示什么意思就得decode了,下面来看mmc_decode_csd。
90 static int mmc_decode_csd(struct mmc_card *card)
92 struct mmc_csd *csd = &card->csd;
93 unsigned int e, m, csd_struct;
96 csd_struct = UNSTUFF_BITS(resp, 126, 2);
100 m = UNSTUFF_BITS(resp, 115, 4);
101 e = UNSTUFF_BITS(resp, 112, 3);
102 csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10;
103 csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100;
105 m = UNSTUFF_BITS(resp, 99, 4);
106 e = UNSTUFF_BITS(resp, 96, 3);
107 csd->max_dtr = tran_exp[e] * tran_mant[m];
108 csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
110 e = UNSTUFF_BITS(resp, 47, 3);
111 m = UNSTUFF_BITS(resp, 62, 12);
112 csd->capacity = (1 + m) << (e + 2);
114 csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4);
115 csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
116 csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
117 csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
118 csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
119 csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
120 csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
124 * This is a block-addressed SDHC card. Most
125 * interesting fields are unused and have fixed
126 * values. To avoid getting tripped by buggy cards,
127 * we assume those fixed values ourselves.
129 mmc_card_set_blockaddr(card);
131 csd->tacc_ns = 0; /* Unused */
132 csd->tacc_clks = 0; /* Unused */
134 m = UNSTUFF_BITS(resp, 99, 4);
135 e = UNSTUFF_BITS(resp, 96, 3);
136 csd->max_dtr = tran_exp[e] * tran_mant[m];
137 csd->cmdclass = UNSTUFF_BITS(resp, 84, 12);
139 m = UNSTUFF_BITS(resp, 48, 22);
140 csd->capacity = (1 + m) << 10;
146 csd->r2w_factor = 4; /* Unused */
151 printk(KERN_ERR "%s: unrecognised CSD structure version %d\n",
152 mmc_hostname(card->host), csd_struct);
首先来看一下96行频频出现的UNSTUFF_BITS,其实他是个宏定义,具体的形式如下:
44 #define UNSTUFF_BITS(resp,start,size) \
47 const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
48 const int __off = 3 - ((start) / 32); \
49 const int __shft = (start) & 31; \
52 __res = resp[__off] >> __shft; \
53 if (__size + __shft > 32) \
54 __res |= resp[__off-1] << ((32 - __shft) % 32); \
接下来就是根据csd_struct的情况来决定是SD1.1还是SD2.0标准。这里我们关注SD2.0的情况。
129行设置了设备的状态为MMC_STATE_BLOCKADDR,这是SD卡版本所决定的。记性好的朋友可能还记得在card中有一个叫做mmc_blk_set_blksize的函数,里面会使用
#define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR)判断是否设置块大小,这个依据出现在这里。
136行max. data transfer rate最大数据传输率定义在96-106bit,这里也就能够简单地得到了。
137行card command classes指明SD卡所属的指令集,它使用的是84位以后的12bit来表示。
回到mmc_init_card中接下来就该解码CID了,所用的函数即mmc_decode_cid。代码如下:
61 static void mmc_decode_cid(struct mmc_card *card)
65 memset(&card->cid, 0, sizeof(struct mmc_cid));
68 * SD doesn't currently have a version field so we will
69 * have to assume we can parse this.
71 card->cid.manfid = UNSTUFF_BITS(resp, 120, 8);
72 card->cid.oemid = UNSTUFF_BITS(resp, 104, 16);
73 card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8);
74 card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8);
75 card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8);
76 card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8);
77 card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8);
78 card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4);
79 card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4);
80 card->cid.serial = UNSTUFF_BITS(resp, 24, 32);
81 card->cid.year = UNSTUFF_BITS(resp, 12, 8);
82 card->cid.month = UNSTUFF_BITS(resp, 8, 4);
84 card->cid.year += 2000; /* SD cards year offset */
里面始终使用的是UNSTUFF_BITS这个宏定义,具体的内容参照上面的图应该比较清晰就不下详述了。
48 int mmc_select_card(struct mmc_card *card)
52 return _mmc_select_card(card->host, card);
目光投向_mmc_select_card,其实聪明的你早就应该猜到这个函数是怎么做的了,还是来看看源码:
22 static int _mmc_select_card(struct mmc_host *host, struct mmc_card *card)
29 memset(&cmd, 0, sizeof(struct mmc_command));
31 cmd.opcode = MMC_SELECT_CARD;
35 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
38 cmd.flags = MMC_RSP_NONE | MMC_CMD_AC;
41 err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
188 static int mmc_read_switch(struct mmc_card *card)
193 if (card->scr.sda_vsn < SCR_SPEC_VER_1)
196 if (!(card->csd.cmdclass & CCC_SWITCH)) {
197 printk(KERN_WARNING "%s: card lacks mandatory switch "
198 function, performance might suffer.\n,
199 mmc_hostname(card->host));
205 status = kmalloc(64, GFP_KERNEL);
207 printk(KERN_ERR "%s: could not allocate a buffer for "
208 switch capabilities.\n, mmc_hostname(card->host));
212 err = mmc_sd_switch(card, 0, 0, 1, status);
214 /* If the host or the card can't do the switch,
215 * fail more gracefully. */
221 printk(KERN_WARNING "%s: problem reading switch "
222 capabilities, performance might suffer.\n,
223 mmc_hostname(card->host));
230 card->sw_caps.hs_max_dtr = 50000000;
193行如果通过scr判断是ver1.1版,那么这里就没有必要继续做后面的工作了。
205行根据前面的描述,cmd6会利用数据线返回64个字节的信息,这个就是为了存放读取的状态值的。
302 int mmc_sd_switch(struct mmc_card *card, int mode, int group,
313 /* NOTE: caller guarantees resp is heap-allocated */
318 memset(&mrq, 0, sizeof(struct mmc_request));
319 memset(&cmd, 0, sizeof(struct mmc_command));
320 memset(&data, 0, sizeof(struct mmc_data));
326 cmd.arg = mode << 31 | 0x00FFFFFF;
327 cmd.arg &= ~(0xF << (group * 4));
328 cmd.arg |= value << (group * 4);
329 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
333 data.flags = MMC_DATA_READ;
337 sg_init_one(&sg, resp, 64);
339 mmc_set_data_timeout(&data, card);
341 mmc_wait_for_req(card->host, &mrq);
339行mmc_set_data_timeout(&data, card); 设置底层处理超时的参数,这个后面在分析host_ops中会提到。
341行mmc_wait_for_req就是整个函数期待的核心了。如果没有错误mmc_sd_switch就带着返回的数据高高兴兴的返回到mmc_read_switch的怀抱。
还剩下最后要说的两行229-230,根据返回设置卡允许的最大数据传输速率。
继续向下,mmc_sd_init_card 467行,前面我们说过一旦支持高速模式,那么就会利用CMD6来设置高速模式。
241 static int mmc_switch_hs(struct mmc_card *card)
246 if (card->scr.sda_vsn < SCR_SPEC_VER_1)
249 if (!(card->csd.cmdclass & CCC_SWITCH))
252 if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
255 if (card->sw_caps.hs_max_dtr == 0)
260 status = kmalloc(64, GFP_KERNEL);
262 printk(KERN_ERR "%s: could not allocate a buffer for "
263 switch capabilities.\n, mmc_hostname(card->host));
267 err = mmc_sd_switch(card, 1, 0, 1, status);
271 if ((status[16] & 0xF) != 1) {
272 printk(KERN_WARNING "%s: Problem switching card "
274 mmc_hostname(card->host));
276 mmc_card_set_highspeed(card);
277 mmc_set_timing(card->host, MMC_TIMING_SD_HS);
前面已经说过,第二个设置阶段所做的事情还是一样,所以仍然调用了mmc_sd_switch,但是请注意传递的参数是有区别的。
276行mmc_card_set_highspeed(card);就是将这个好消息,记录在card当中。
#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
848 void mmc_set_timing(struct mmc_host *host, unsigned int timing)
850 host->ios.timing = timing;
回到mmc_sd_init_card中来,476-481行最终会得到一个合适的max_dtr。然后调用mmc_set_clock对主机控制器的时钟进行设置。
616 void mmc_set_clock(struct mmc_host *host, unsigned int hz)
618 WARN_ON(hz < host->f_min);
最后一段将会设置DATA的总线宽度。这个依然使用我们前面所说的CMD6命令,调用的函数是mmc_app_set_bus_width,源码如下:
120 int mmc_app_set_bus_width(struct mmc_card *card, int width)
128 memset(&cmd, 0, sizeof(struct mmc_command));
130 cmd.opcode = SD_APP_SET_BUS_WIDTH;
131 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
144 err = mmc_wait_for_app_cmd(card->host, card, &cmd, MMC_CMD_RETRIES);
130行的命令正是CMD6,同样144行的代码也是我们讲过N次的老朋友了。设置完SD卡,接下来该到SD控制器了,不然两边对不上,岂不就麻烦大了....
一旦SD卡接受了这个宽总线的命运,那么SD控制器也将不得不支持,因此497行将是对SD控制器的数据宽度进行设置,调用mmc_set_bus_width如下:
639 void mmc_set_bus_width(struct mmc_host *host, unsigned int width)
641 host->ios.bus_width = width;
#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
回头对照一下SD卡初始化的流程图,总线宽度设置结束以后,初始化的过程就完成了。SD卡也就真正进入了数据传输的时代。同时mmc_sd_init_card也就走到了他生命的尽头....
在mmc_sd_init_card中走了很久很久,已经记不清来时的路了。也许好像大概,我们回到了mmc_attach_sd....
714行对于SD卡而言,主机为我们做了初始化中他所有能做的事情,该放他回家休息了,一句 mmc_release_host(host);带着无限的感激释放了SD卡控制器。
222 int mmc_add_card(struct mmc_card *card)
227 dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca);
235 if (mmc_card_blockaddr(card))
246 if (mmc_host_is_spi(card->host)) {
247 printk(KERN_INFO "%s: new %s%s card on SPI\n",
249 mmc_card_highspeed(card) ? "high speed " : "",
252 printk(KERN_INFO "%s: new %s%s card at address %04x\n",
254 mmc_card_highspeed(card) ? "high speed " : "",
258 ret = device_add(&card->dev);
263 mmc_add_card_debugfs(card);
266 mmc_card_set_present(card);
如果让我选出SD卡子系统中最美丽的一个函数的话,我愿意说是mmc_add_card,但时也是最八卦的一个函数。整个函数一共50余行,却单单只说了一句有意义的话:
258 ret = device_add(&card->dev);
好了,再美丽的函数我们也只能欣赏到这了,循着来时的路我们走到了mmc_attach_sd的尽头,等着我们的依旧是哪个不老的传说——mmc_rescan。
一旦mmc_attach_sd成功走出,我们的目光将跳转到1113行....
为了找到这个幕后的真凶,看来我们又不得不重入mmc_rescan的代码了。代码就不贴了,用到了再说,只要您不是太健忘,估计还是能找到他的出生地的。
642 static void mmc_sd_attach_bus_ops(struct mmc_host *host)
644 const struct mmc_bus_ops *bus_ops;
646 if (host->caps & MMC_CAP_NONREMOVABLE)
647 bus_ops = &mmc_sd_ops_unsafe;
650 mmc_attach_bus(host, bus_ops);
bus_ops = &mmc_sd_ops;立即吸引了我们的眼球,那么干脆坚持到底,看看他是些什么东西。
627 static const struct mmc_bus_ops mmc_sd_ops = {
632 .power_restore = mmc_sd_power_restore,
好了,有了这个基础我们继续回到mmc_rescan,那么1045行也就是增加这条总线的引用计数了。
540 static void mmc_sd_detect(struct mmc_host *host)
550 * Just check if our card has been removed.
552 err = mmc_send_status(host->card, NULL);
这里检测SD卡是否存在的方法很简单,直接查询状态,如果出错,那对不起接下来发生的一切就让人难以接受了。之前初始化的一切都将付之一炬….
528 static void mmc_sd_remove(struct mmc_host *host)
533 mmc_remove_card(host->card);
275 void mmc_remove_card(struct mmc_card *card)
278 mmc_remove_card_debugfs(card);
281 if (mmc_card_present(card)) {
282 if (mmc_host_is_spi(card->host)) {
283 printk(KERN_INFO "%s: SPI card removed\n",
284 mmc_hostname(card->host));
286 printk(KERN_INFO "%s: card %04x removed\n",
287 mmc_hostname(card->host), card->rca);
289和292行将SD卡在设备模型的中的所有记录将全部销毁,同时card目录下驱动对应的remove函数也将做相应的清理工作,这里就不详细诉了。回到mmc_sd_remove…
最后,host解除了与card之间的约定,使得host->card = NULL;。那么悲剧的mmc_sd_remove函数也就悄悄谢幕了…
接下来就是对这条bus_ops的操作了,mmc_detach_bus相关内容如下:
993 void mmc_detach_bus(struct mmc_host *host)
1002 spin_lock_irqsave(&host->lock, flags);
1006 spin_unlock_irqrestore(&host->lock, flags);
1004和1010行使得bus_ops与card彻底绝交,伤心的card从新回到mmc_rescan….
http://m.blog.csdn.net/blog/rain0993/8476755
sd卡驱动分析之host相关推荐
- Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇
Core层中有两个重要函数 mmc_alloc_host 用于构造host,前面已经学习过,这里不再阐述:另一个就是 mmc_add_host,用于注册host 前面探测函数s3cmci_probe, ...
- SD卡驱动分析(二)
三.下面分析一下高通的android2.3的代码中SD卡驱动的流程. 在kernel中,SD卡是作为平台设备加入到内核中去的,在/kernel/arch/arm/mach-msm/devices-ms ...
- SD卡驱动分析(一)
Android下的SD卡驱动与标准LINUX下的SD卡驱动好像没有太大的区别,这里就以高通的ANDROID 2.3以代表,来简要分析一下LINUX下SD卡驱动的写法.由于小弟的技术有限,分析的有错的地 ...
- S3C2440上MMC/SD卡驱动分析(二)
下面的文章主要是转载的,先记录下自己的经验. MMC/SD驱动有两种模式:FIFO和DMA.在代码中两种方式都予以了实现,在make menuconfig时候,可以选择是使用fifo方式还是DMA方式 ...
- Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇
回顾一下前面的知识,MMC 子系统范围三个部分: HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的. CORE 部分: 这是整个MMC 的核心存,这部分完成 ...
- linux SD卡驱动分析
1. 硬件基础: SD/MMC/SDIO 概念区分概要 SD (Secure Digital )与 MMC (Multimedia Card ) SD 是一种 flash memory card 的标 ...
- sd 卡驱动--基于高通平台
点击打开链接 内容来自以下博客: http://blog.csdn.net/qianjin0703/article/details/5918041 Linux设备驱动子系统第二弹 - SD卡 (有介绍 ...
- rt-thread SDIO驱动框架分析(SD卡驱动\SD Nand驱动)
rt-thread SDIO驱动框架分析之SD卡驱动 文章目录 rt-thread SDIO驱动框架分析之SD卡驱动 1. 前言 2. SDIO通用驱动框架介绍 3. 文件架构分析 4. SDIO设备 ...
- CE下基于Zylonite硬件平台的SD卡驱动开发
摘要:本文结合实际项目(一款以WINCE为操作系统内核的GSM/PHS双模智能手机)对嵌入式系统Windows CE5.0的底层驱动(SD卡)的架构进行了分析和研究,以MARVELL公司提供的基于IN ...
- 嵌入式linux sd卡读写,嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(二)...
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 一.开发环境 主 机:VMWa ...
最新文章
- Leaflet快速入门与加载OSM显示地图
- Scala代码案例:100以内的数求和,求出当和第一次大于20的当前数(循环中断机制)
- 剑指offer 面试题59 - II. 队列的最大值
- Dart的日期时间操作
- python统计字符串中某个字符出现的次数_【面试题总结】1、统计字符串中某个字符出现的次数(2-Python实现)...
- Docker JDK镜像
- DirectX11 SDK 例程报错解决方法
- [小甲鱼]汇编语言笔记 基础知识
- PHP学习之字符串操作
- Cisco路由器内部网关协议(IGP)实验:OSPF
- 解决了联想i908手机SIM卡注册失败、受限服务的BUG
- HTML5超酷新特性WebSockets初体验
- 旋转向量与旋转矩阵的相互转化
- HTML好看个人主页展示开源源码
- listview的属性
- 【其他】Switch电脑注入大气层
- 向日葵Linux命令行安装,向日葵X版Linux安装教程
- 瓦尔机器人智能行李箱_中国制造COWAROBOT智能“跟主人”行李箱正式亮相韩国
- König定理及证明
- superset 细思极恐的代码
热门文章
- bzoj1052 覆盖问题 二分答案 dfs
- centos:/usr/bin/perl is needed by mysql-community-server
- Pytorch构建Transformer实现英文翻译
- 智能芯片与系统基础知识(AI芯片)
- IOS中使用getUserMedia获取视频流展示到video中,进行人脸识别
- 只需4步,就能在SOLIDWORKS创建首件检验报告(FAI)
- debian9自动化部署Fully Automatic Installation(FAI)
- 征途私服mysql启动不了_征途服务器架设需要的LINUX版本
- oracle 本地连接不上,为什么Guardium S-TAP无法抓取Oracle本地连接(Bequeath)流量
- 深入理解操作系统实验——bomb lab(phase_3)