SD控制器之初始化(linux/driver/mmc/host

这一层讲述硬件与硬件之间将要发生的故事,也是最底层驱动的核心。通常所谓的驱动程序设计的任务将落实到这一层上,所以关注host故事的发展也将成为移植整个SD类设备驱动的核心。在host目录中有各种平台下SD卡主机驱动器的实例,这里我们选择s3c2440平台作为分析的重点。参看KconfigMakefile即可获得相应信息,这里对应的文件即是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接下来将做部分关于硬件初始化的工作,因此在分析下面一部分代码之前,最好能对s3c2440sdi相关的内容有所了解。下面进入到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_hostprivate域。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->indexhost结构相关联,方便以后查找。

78-81行主要是初始化host->class_dev,这个日后会通过device_register注册进系统。

84行前面已经在这个等待队列上花了不少笔墨,主要是同步对host资源的竞争的。

85-86行两行调用的函数其实没有本质上的区别,这里主要是初始化两个内核的延时工作队列。通过INIT_DELAYED_WORKINIT_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这个私有结构的配置,对于coreblock层见到的只有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->sdiimskhost->sdidata分别用来存放host控制器SDI中断屏蔽寄存器和SDI数据寄存器相对SDI寄存器的偏移地址。对于s3c2440根据芯片手册SDIIntMsk偏移地址为0x3CSDIDAT偏移地址为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      

上面是同时使能了PIODMA模式的情况,这里我们对两种传输方式都做相应的分析,所以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了,所以接下来的几行代码是免不了。

1692s3c2410_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

 [core/host.c]

117    int mmc_add_host(struct mmc_host *host)                

118    {                

119             int err;         

120                      

121             WARN_ON((host->caps & MMC_CAP_SDIO_IRQ) &&     

122                      !host->ops->enable_sdio_irq);

123                      

124             led_trigger_register_simple(dev_name(&host->class_dev), &host->led);      

125                      

126             err = device_add(&host->class_dev);      

127             if (err)

128                      return err;

129                      

130    #ifdef CONFIG_DEBUG_FS               

131             mmc_add_host_debugfs(host);     

132    #endif         

133                      

134             mmc_start_host(host);      

135                      

136             return 0;      

137    }                

124行还是前面所说的那个LED,这里不做研究。

126行设备注册,这个host->class_dev在很早以前我们就对他进行过初始化了,其中并没有给他关联到某某总线或是驱动上,所以实际上这段代码产生的效果就是在sysfs中留下自己走过的痕迹。

130-132debug相关的可以跳过了。

134行是时候开启主机控制器了,这也是core层的函数具体的方法如下:

[core/core.c]

1118   void mmc_start_host(struct mmc_host *host)   

1119   {       

1120           mmc_power_off(host);

1121           mmc_detect_change(host, 0);

1122   }       

代码精炼到了极致,首先来看一下mmc_power_off,内容如下:

[core/core.c]

911    static void mmc_power_off(struct mmc_host *host)              

912    {                

913             host->ios.clock = 0;

914             host->ios.vdd = 0;  

915             if (!mmc_host_is_spi(host)) {      

916                      host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;

917                      host->ios.chip_select = MMC_CS_DONTCARE;

918             }       

919             host->ios.power_mode = MMC_POWER_OFF;        

920             host->ios.bus_width = MMC_BUS_WIDTH_1;         

921             host->ios.timing = MMC_TIMING_LEGACY;

922             mmc_set_ios(host); 

923    }

关心最多的就是host->ios当中的内容,前段的赋值真正作用在硬件上是调用host层向上提供的struct mmc_host_ops接口。这里922行实际上就是完成了这个工作。

      回到mmc_start_host1121行这一行的作用显然是意义重大,看名字就知道是用来检测SD卡的,内容如下:

[core/core.c]

1023   void mmc_detect_change(struct mmc_host *host, unsigned long delay)                

1024   {                

1025   #ifdef CONFIG_MMC_DEBUG           

1026           unsigned long flags;

1027           spin_lock_irqsave(&host->lock, flags);   

1028           WARN_ON(host->removed);       

1029           spin_unlock_irqrestore(&host->lock, flags);      

1030   #endif         

1031                    

1032           mmc_schedule_delayed_work(&host->detect, delay);   

1033   }

除了1032行说了句人话,其他的百分之九十九的都是废话。曾几何时我们说过内核有个延时工作队列,没错就是他了。当然这可不是随便拿来玩的,与之对应的初始化前面已经说过即INIT_DELAYED_WORK(&host->detect, mmc_rescan);

好了1032行作用的结果估计大家都能猜到了,就是延时delay时间后就会去调用mmc_rescan了。前面我们传递的delay=0,那么这里就没有延时了,既然驱动都等不及要rescan了,我们也就不再卖关子了,直接mmc_rescan

[core/core.c]

1038   void mmc_rescan(struct work_struct *work)                        

1039   {                         

1040           struct mmc_host *host =            

1041                    container_of(work, struct mmc_host, detect.work);      

1042           u32 ocr;                

1043           int err;                  

1044                              

1045           mmc_bus_get(host);         

1046                              

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);       

1050                              

1051           mmc_bus_put(host);                  

1052                              

1053                              

1054           mmc_bus_get(host);         

1055                              

1056           /* if there still is a card present, stop here */              

1057           if (host->bus_ops != NULL) {              

1058                    mmc_bus_put(host);         

1059                    goto out;     

1060           }                

1061                              

1062           /* detect a newly inserted card */           

1063                              

1064           /*               

1065           * Only we can add a new handler, so it's safe to                 

1066           * release the lock here.              

1067           */             

1068           mmc_bus_put(host);                  

1069                              

1070           if (host->ops->get_cd && host->ops->get_cd(host) == 0)               

1071                    goto out;     

1072                              

1073           mmc_claim_host(host);              

1074                              

1075           mmc_power_up(host);                

1076           mmc_go_idle(host);         

1077                              

1078           mmc_send_if_cond(host, host->ocr_avail);                

1079                              

1080           /*               

1081           * First we search for SDIO...              

1082           */             

1083           err = mmc_send_io_op_cond(host, 0, &ocr);              

1084           if (!err) {               

1085                    if (mmc_attach_sdio(host, ocr))    

1086                              mmc_power_off(host);

1087                    goto out;     

1088           }                

1089                              

1090           /*               

1091           * ...then normal SD...              

1092           */             

1093           err = mmc_send_app_op_cond(host, 0, &ocr);            

1094           if (!err) {               

1095                    if (mmc_attach_sd(host, ocr))      

1096                              mmc_power_off(host);

1097                    goto out;     

1098           }                

1099                              

1100           /*               

1101           * ...and finally MMC.              

1102           */             

1103           err = mmc_send_op_cond(host, 0, &ocr);                  

1104           if (!err) {               

1105                    if (mmc_attach_mmc(host, ocr))   

1106                              mmc_power_off(host);

1107                    goto out;     

1108           }                

1109                              

1110           mmc_release_host(host);             

1111           mmc_power_off(host);               

1112                              

1113   out:                      

1114           if (host->caps & MMC_CAP_NEEDS_POLL)           

1115                    mmc_schedule_delayed_work(&host->detect, HZ);      

1116   }                         

又是一个core层的函数,这可不好host表示“host很生气,后果很严重”。但是这也没办法阿,现实就是这么残酷,谁叫人家是core呢。这里又出现了个新名词bus_ops,不过我可以相当负责任的告诉你,现在我们还用不到。那么我们就直接跳到了1070行检测SD卡是否存在。那么host->ops->get_cd(host)将是我们关注的重点,他依然是那个宝刀未老的struct mmc_host_ops结构。get_cd方法正好对应函数.get_cd= s3cmci_card_present。既然都走到这来了就干脆先看完源码再说。

[host/s3cmci.c]

1177   static int s3cmci_card_present(struct mmc_host *mmc)         

1178   {                

1179           struct s3cmci_host *host = mmc_priv(mmc);    

1180           struct s3c24xx_mci_pdata *pdata = host->pdata;         

1181           int ret;         

1182                    

1183           if (pdata->gpio_detect == 0)        

1184                    return -ENOSYS;

1185                    

1186           ret = gpio_get_value(pdata->gpio_detect) ? 0 : 1;        

1187           return ret ^ pdata->detect_invert;  

1188   }                

这是利用了SD卡座的一个机械检测方法,当SD插入以后SD卡的11脚会连接到低电平,从而得到卡插入的状态。对SD卡本身来说只能利用SD3引脚来做相应的判断。1186行就是读取检测引脚的值。

      回到mmc_rescan中,继续往下....

1073行获得主机控制权,这个函数的实现前面已经详细分析过了。

1075行设置并开启主机控制器。

[core/core.c]

865 static void mmc_power_up(struct mmc_host *host)           

866 {           

867        int bit;    

868               

869        /* If ocr is set, we use it */   

870        if (host->ocr) 

871               bit = ffs(host->ocr) - 1;

872        else 

873               bit = fls(host->ocr_avail) - 1;

874               

875        host->ios.vdd = bit;      

876        if (mmc_host_is_spi(host)) {

877               host->ios.chip_select = MMC_CS_HIGH;

878               host->ios.bus_mode = MMC_BUSMODE_PUSHPULL;

879        } else {  

880               host->ios.chip_select = MMC_CS_DONTCARE;

881               host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;

882        }    

883        host->ios.power_mode = MMC_POWER_UP;   

884        host->ios.bus_width = MMC_BUS_WIDTH_1;  

885        host->ios.timing = MMC_TIMING_LEGACY;   

886        mmc_set_ios(host);

887               

888        /*   

889        * This delay should be sufficient to allow the power supply     

890        * to reach the minimum voltage.

891        */  

892        mmc_delay(10);    

893               

894        if (host->f_min > 400000) { 

895               pr_warning("%s: Minimum clock frequency too high for "

896               

897               host->ios.clock = host->f_min;

898        } else     

899               host->ios.clock = 400000;

900               

901        host->ios.power_mode = MMC_POWER_ON;   

902        mmc_set_ios(host);

903               

904        /*   

905        * This delay must be at least 74 clock sizes, or 1 ms, or the     

906        * time required to reach a stable voltage.   

907        */  

908        mmc_delay(10);    

909 }           

上面代码比较简单,894行这里是对初始化阶段的时钟进行相应的控制,不能高于400K,否则有初始化失败的风险。其他的就是mmc_set_ios的工作了,这个我们后面分析mmc_host_ops的时候再来一起说。

      另外,SD卡的初始化一般分为几个阶段如下所示:

1076行使SD卡进入idle状态。

[core/mmc_ops.c]

96   int mmc_go_idle(struct mmc_host *host)                         

97   {                         

98          int err;                 

99          struct mmc_command cmd;                

100                             

101        /*                 

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.               

105        *                 

106        * SPI hosts ignore ios.chip_select; it's managed according to                 

107        * rules that must accomodate non-MMC slaves which this layer                    

108        * won't even know about.                 

109        */                

110        if (!mmc_host_is_spi(host)) {                    

111               mmc_set_chip_select(host, MMC_CS_HIGH);          

112               mmc_delay(1);             

113        }                  

114                             

115        memset(&cmd, 0, sizeof(struct mmc_command));                   

116                             

117        cmd.opcode = MMC_GO_IDLE_STATE;                  

118        cmd.arg = 0;                

119        cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_NONE | MMC_CMD_BC;             

120                             

121        err = mmc_wait_for_cmd(host, &cmd, 0);                

122                             

123        mmc_delay(1);                    

124                             

125        if (!mmc_host_is_spi(host)) {                    

126               mmc_set_chip_select(host, MMC_CS_DONTCARE);       

127               mmc_delay(1);             

128        }                  

129                             

130        host->use_spi_crc = 0;                

131                             

132        return err;                    

133 }                  

110-112行由于SD卡会根据初始化过程中CS引脚的状态来判断所采用的传输模式,这里如果不使用SPI传输,那么一定要就CS引脚置位高电平。SD卡不同传输模式下引脚的定义如下所示:

   

117-119行设置命令格式,MMC_GO_IDLE_STATE对应CMD0,然后调用121行的函数mmc_wait_for_cmd来执行命令。

125-128行将110-112行置位的引脚复位到输入状态,因为在硬件上不确定输入输出关系的引脚都应将其设置为输入,以免引起冲突。

 

      

下面就到了mmc_rescan1078....

 [core/sd_ops.c]

196 int mmc_send_if_cond(struct mmc_host *host, u32 ocr)    

197 {    

198        struct mmc_command cmd;

199        int err;

200        static const u8 test_pattern = 0xAA;

201        u8 result_pattern;

202        

203        /*

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

206        * SD 1.0 cards.

207        */

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;

211        

212        err = mmc_wait_for_cmd(host, &cmd, 0);  

213        if (err)   

214               return err;

215               

216        if (mmc_host_is_spi(host))   

217               result_pattern = cmd.resp[1] & 0xFF;

218        else 

219               result_pattern = cmd.resp[0] & 0xFF;

220               

221        if (result_pattern != test_pattern)  

222               return -EIO;

223               

224        return 0; 

225 }           

这是为了实现对SD 2.0的支持,因为SD 2.0在发送设置SD卡的工作电压之前必须先发送CMD8命令,对于SD1.1来说,这个命令式得不到响应的。SD 2.0版和1.1版在很多地方都有很大的不同的,相关的内容可以参考spece。具体实现的代码与mmc_go_idle类似这里就不再分析了。

 

 

mmc_rescan1083-1088行,这小段是搜索SDIO设备....

1093行是对SD卡的设置,跟踪源码:

[core/sd_ops.c]

151 int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)                      

152 {                         

153        struct mmc_command cmd;                

154        int i, err = 0;                

155                             

156        BUG_ON(!host);                 

157                             

158        memset(&cmd, 0, sizeof(struct mmc_command));                   

159                             

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 */        

163        else               

164               cmd.arg = ocr;             

165        cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR;                 

166                             

167        for (i = 100; i; i--) {                   

168               err = mmc_wait_for_app_cmd(host, NULL, &cmd, MMC_CMD_RETRIES); 

169               if (err)          

170                      break;    

171                             

172               /* if we're just probing, do a single pass */         

173               if (ocr == 0)         

174                      break;    

175                             

176               /* otherwise wait until reset completes */           

177               if (mmc_host_is_spi(host)) {       

178                      if (!(cmd.resp[0] & R1_SPI_IDLE))   

179                             break;

180               } else {         

181                      if (cmd.resp[0] & MMC_CARD_BUSY)    

182                             break;

183               }           

184                             

185               err = -ETIMEDOUT;           

186                             

187               mmc_delay(10);           

188        }                  

189                             

190        if (rocr && !mmc_host_is_spi(host))                

191               *rocr = cmd.resp[0];            

192                             

193        return err;                    

194 }                  

160-165行还是设置cmd结构,根据我们前面所说的SD卡初始化过程,这里应该是设置目标的工作电压也就是ACMD41

167行表示mmc_wait_for_app_cmd最多重复做一百次,下面来分析一下她所做的具体工作。

[core/sd-ops.c]

65   int mmc_wait_for_app_cmd(struct mmc_host *host, struct mmc_card *card,                 

66          struct mmc_command *cmd, int retries)                          

67   {                                

68          struct mmc_request mrq;                           

69                                      

70          int i, err;                     

71                                      

72          BUG_ON(!cmd);                       

73          BUG_ON(retries < 0);                       

74                                      

75          err = -EIO;                         

76                                      

77          /*                        

78          * We have to resend MMC_APP_CMD for each attempt so                          

79          * we cannot use the retries field in mmc_command.                      

80          */                       

81          for (i = 0;i <= retries;i++) {                      

82                 memset(&mrq, 0, sizeof(struct mmc_request));                

83                                      

84                 err = mmc_app_cmd(host, card);               

85                 if (err) {               

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)      

89                                      break;

90                        }           

91                        continue;       

92                 }                  

93                                      

94                 memset(&mrq, 0, sizeof(struct mmc_request));                

95                                      

96                 memset(cmd->resp, 0, sizeof(cmd->resp));               

97                 cmd->retries = 0;                

98                                      

99                 mrq.cmd = cmd;                 

100               cmd->data = NULL;                   

101                                    

102               mmc_wait_for_req(host, &mrq);               

103                                    

104               err = cmd->error;                

105               if (!cmd->error)                  

106                      break;           

107                                    

108               /* no point in retrying illegal APP commands */               

109               if (mmc_host_is_spi(host)) {              

110                      if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)             

111                             break;    

112               }                  

113        }                         

114                                    

115        return err;                           

116 }                                

上面的代码我们分为两部分来看,81-92行为第一部分,94-113行为第二部分。同样mmc_app_cmd被重复了retries次。不妨看下84行的代码:

[core/sd-ops.c]

23   static int mmc_app_cmd(struct mmc_host *host, struct mmc_card *card)                      

24   {                                

25          int err;                        

26          struct mmc_command cmd;                       

27                                      

28          BUG_ON(!host);                        

29          BUG_ON(card && (card->host != host));                        

30                                      

31          cmd.opcode = MMC_APP_CMD;                     

32                                      

33          if (card) {                           

34                 cmd.arg = card->rca << 16;                

35                 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC;            

36          } else {                       

37                 cmd.arg = 0;                

38                 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_BCR;          

39          }                         

40                                      

41          err = mmc_wait_for_cmd(host, &cmd, 0);                       

42          if (err)                        

43                 return err;                    

44                                      

45          /* Check that card supported application commands */                           

46          if (!mmc_host_is_spi(host) && !(cmd.resp[0] & R1_APP_CMD))                        

47                 return -EOPNOTSUPP;              

48                                      

49          return 0;                      

50   }                                

和前面所分析的情况一致,这里最后还是在调用mmc_wait_for_cmd实现MMC_APP_CMACMD55)命令,根据前面的流程图我们知道在非SPI模式下设置ACMD41命令之前,必须先发送ACMD55命令进入AMD模式。因此这里的处理时为了保证ACMD41命令的成功执行。回到mmc_wait_for_app_cmd函数中来....

 

94-112行前面传递过来的ACMD41命令这里就会重新组装成struct mmc_request结构,然后调用mmc_wait_for_cmd(host, &cmd, 0);来执行。

109-112行作为SPI传输来讲这些个命令式被忽略的,所以出现了错误,只要状态指明了R1_SPI_ILLEGAL_COMMAND就不用在重试了。回到mmc_send_app_op_cond函数....

 

177-183行对于非SPI模式,通过判断返回的状态寄存器rSDIRSP0的第三十一位是否为1,来决定SD卡进入了ready状态。1ready0busy

190-191行这是返回的电压范围。如果一切正常认为初始化的第二阶段已经完成了,就该回到mmc_rescan1095mmc_attach_sd函数了。

[core/sd.c]

658 int mmc_attach_sd(struct mmc_host *host, u32 ocr)                 

659 {                  

660        int err;          

661                      

662        BUG_ON(!host);          

663        WARN_ON(!host->claimed);       

664                      

665        mmc_sd_attach_bus_ops(host);           

666                      

667        /*          

668        * We need to get OCR a different way for SPI.        

669        */         

670        if (mmc_host_is_spi(host)) {       

671               mmc_go_idle(host);      

672                      

673               err = mmc_spi_read_ocr(host, 0, &ocr);     

674               if (err)   

675                      goto err;

676        }           

677                      

678        /*          

679        * Sanity check the voltages that the card claims to           

680        * support.           

681        */         

682        if (ocr & 0x7F) {         

683               printk(KERN_WARNING "%s: card claims to support voltages "     

684                      "below the defined range. These will be ignored.\n",    

685                      mmc_hostname(host));   

686               ocr &= ~0x7F;      

687        }           

688                      

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)); 

693               ocr &= ~MMC_VDD_165_195;  

694        }           

695                      

696        host->ocr = mmc_select_voltage(host, ocr);       

697                      

698        /*          

699        * Can we support the voltage(s) of the card(s)?        

700        */         

701        if (!host->ocr) {           

702               err = -EINVAL;    

703               goto err; 

704        }           

705                      

706        /*          

707        * Detect and init the card.          

708        */         

709        err = mmc_sd_init_card(host, host->ocr, NULL);       

710        if (err)          

711               goto err; 

712                      

713        mmc_release_host(host);             

714                      

715        err = mmc_add_card(host->card);       

716        if (err)          

717               goto remove_card; 

718                      

719        return 0;        

720                      

721 remove_card:               

722        mmc_remove_card(host->card);          

723        host->card = NULL;            

724        mmc_claim_host(host);        

725 err:               

726        mmc_detach_bus(host);        

727        mmc_release_host(host);             

728                      

729        printk(KERN_ERR "%s: error %d whilst initialising SD card\n",            

730               mmc_hostname(host), err);   

731                      

732        return err;             

733 }                  

这个函数开始对SD的初始化,下面我们来详细分析。

665行完成bus_opsSD卡的绑定,这也就是我们之间所见到的内容,其对应的实现如下:

[core/sd.c]

642 static void mmc_sd_attach_bus_ops(struct mmc_host *host)             

643 {           

644        const struct mmc_bus_ops *bus_ops;   

645               

646        if (host->caps & MMC_CAP_NONREMOVABLE)    

647               bus_ops = &mmc_sd_ops_unsafe;

648        else 

649               bus_ops = &mmc_sd_ops;

650        mmc_attach_bus(host, bus_ops);  

651 }           

646-649行设置了bus_ops对应的方法,这里我们选择mmc_sd_ops,里面对应的具体内容我们用到的时候在去分析。

650行是总线方法和host绑定的过程,中间的内容比较简单就是将bus_ops关联到host->bus_ops上,同时对总线的引用计数进行初始化。相应的代码如下:

[core/core.c]

968 void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops)       

969 {           

970        unsigned long flags;      

971               

972        BUG_ON(!host);   

973        BUG_ON(!ops);    

974               

975        WARN_ON(!host->claimed);

976               

977        spin_lock_irqsave(&host->lock, flags);

978               

979        BUG_ON(host->bus_ops);   

980        BUG_ON(host->bus_refs);   

981               

982        host->bus_ops = ops;    

983        host->bus_refs = 1;

984        host->bus_dead = 0;

985        

986        spin_unlock_irqrestore(&host->lock, flags);

987 }    

 

这个总线绑定的过程一旦完成就又重新回到了mmc_attach_sd

670-676行我们前面分析获取工作电压范围的过程是针对非SPI模式的,这里对于SPI模式我们需要重新获取。

671行首先重新进入idle状态,这个无论哪种工作模式都是一样的。

673行是获取ocr的区别,对于spi使用的命令字为ACMD58,其他的就和一般的命令发送大相径庭了。

[core/mmc_ops.c]

355 int mmc_spi_read_ocr(struct mmc_host *host, int highcap, u32 *ocrp)    

356 {    

357        struct mmc_command cmd;

358        int err;

359        

360        memset(&cmd, 0, sizeof(struct mmc_command));

361        

362        cmd.opcode = MMC_SPI_READ_OCR;

363        cmd.arg = highcap ? (1 << 30) : 0;

364        cmd.flags = MMC_RSP_SPI_R3;

365        

366        err = mmc_wait_for_cmd(host, &cmd, 0);

367        

368        *ocrp = cmd.resp[1];

369        return err;

370 }    

上面一段代码注意368行获取ocr的差异。

 

       回到mmc_attach_sd696mmc_select_voltage(host, ocr),这是根据host的电压范围和读取到的SD卡工作电压,来判断工作电压是否匹配。函数内容如下:

[core/core.c]

822 u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)                      

823 {                         

824        int bit;                  

825                             

826        ocr &= host->ocr_avail;              

827                             

828        bit = ffs(ocr);               

829        if (bit) {               

830               bit -= 1;        

831                             

832               ocr &= 3 << bit;          

833                             

834               host->ios.vdd = bit;             

835               mmc_set_ios(host);       

836        } else {                

837               pr_warning("%s: host doesn't support card's voltages\n",           

838                             mmc_hostname(host));

839               ocr = 0;         

840        }                  

841                             

842        return ocr;                   

843 }                         

host->ocr_avail前面我们已经进行了相应的初始化。

.ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34

 

 

      回到mmc_attach_sd函数中,下面就到了整个mmc_rescan的高潮部分了,也就是一直在说的初始化SD卡,对应709err = mmc_sd_init_card(host, host->ocr, NULL);这个函数完成了整个SD卡初始化的全动作,下面来看代码:

[core/sd.c]

332 static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,     

333        struct mmc_card *oldcard)

334 {    

335        struct mmc_card *card;

336        int err;

337        u32 cid[4];

338        unsigned int max_dtr;

339        

340        BUG_ON(!host);

341        WARN_ON(!host->claimed);

342        

343        /*

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

347        * respond.

348        */  

349        mmc_go_idle(host);      

350               

351        /*   

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.  

356        */  

357        err = mmc_send_if_cond(host, ocr);    

358        if (!err)  

359               ocr |= 1 << 30;

360               

361        err = mmc_send_app_op_cond(host, ocr, NULL);      

362        if (err)   

363               goto err;

364                      

365        /*          

366        *Fetch CID from card.             

367        */         

368        if (mmc_host_is_spi(host))          

369               err = mmc_send_cid(host, cid);    

370        else        

371               err =mmc_all_send_cid(host, cid);     

372        if (err)          

373               goto err; 

374                      

375        if (oldcard) {        

376               if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) {    

377                      err = -ENOENT;

378                      goto err;

379               }    

380                      

381               card = oldcard;      

382        } else {         

383               /*   

384               * Allocate card structure.    

385               */  

386               card =mmc_alloc_card(host, &sd_type);    

387               if (IS_ERR(card)) {     

388                      err = PTR_ERR(card);

389                      goto err;

390               }    

391                      

392               card->type = MMC_TYPE_SD;   

393               memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); 

394        }           

395                      

396        /*          

397        * For native busses:  get card RCA and quit open drain mode.       

398        */         

399        if (!mmc_host_is_spi(host)) {             

400               err = mmc_send_relative_addr(host, &card->rca);     

401               if (err)   

402                      goto free_card;

403                      

404               mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);    

405        }           

406                      

407        if (!oldcard) {       

408               /*   

409               * Fetch CSD from card.     

410               */  

411               err = mmc_send_csd(card, card->raw_csd); 

412               if (err)   

413                      goto free_card;

414                      

415               err = mmc_decode_csd(card);      

416               if (err)   

417                      goto free_card;

418                      

419               mmc_decode_cid(card);

420        }           

421                      

422        /*          

423        * Select card, as all following commands rely on that.            

424        */         

425        if (!mmc_host_is_spi(host)) {             

426               err = mmc_select_card(card);      

427               if (err)   

428                      goto free_card;

429        }           

430                      

431        if (!oldcard) {       

432               /*   

433               * Fetch SCR from card.     

434               */  

435               err = mmc_app_send_scr(card, card->raw_scr);  

436               if (err)   

437                      goto free_card;

438                      

439               err = mmc_decode_scr(card);      

440               if (err < 0)     

441                      goto free_card;

442                      

443               /*   

444               * Fetch switch information from card.      

445               */  

446               err = mmc_read_switch(card);     

447               if (err)   

448                      goto free_card;

449        }           

450                      

451        /*          

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.           

456        */         

457        if (mmc_host_is_spi(host)) {       

458               err = mmc_spi_set_crc(host, use_spi_crc);  

459               if (err)   

460                      goto free_card;

461        }           

462                      

463        /*          

464        * Attempt to change to high-speed (if supported)            

465        */         

466        err = mmc_switch_hs(card);        

467        if (err)          

468               goto free_card;      

469                      

470        /*          

471        * Compute bus speed.        

472        */         

473        max_dtr = (unsigned int)-1;         

474                      

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;     

480        }           

481                      

482        mmc_set_clock(host, max_dtr);          

483                      

484        /*          

485        * Switch to wider bus (if supported).        

486        */         

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);  

490               if (err)   

491                      goto free_card;

492                             

493               mmc_set_bus_width(host, MMC_BUS_WIDTH_4);          

494        }                  

495                             

496        /*                 

497        * Check if read-only switch is active.               

498        */                

499        if (!oldcard) {              

500               if (!host->ops->get_ro || host->ops->get_ro(host) < 0) {           

501                      printk(KERN_WARNING "%s: host does not "  

502                             support reading read-only

503                             switch. assuming write-enable.\n,

504                             mmc_hostname(host));

505               } else {         

506                      if (host->ops->get_ro(host) > 0)  

507                             mmc_card_set_readonly(card);

508               }

509        }    

510               

511        if (!oldcard)   

512               host->card = card;

513               

514        return 0; 

515               

516 free_card:             

517        if (!oldcard)   

518               mmc_remove_card(card);

519 err:        

520               

521        return err;      

522 }           

这段代码洋洋洒洒二百余行,着实有点难看。但是没关系,深呼吸一下继续来看代码...

349行再见了mmc_go_idle(host),话可以乱说但是代码可不能乱写。这个函数在这里不为别的,只因前面修改了ocr的值。所以必须让大家都回到idle状态。

357行还是那个熟悉的背影,依旧是为SD 2.0而生。

361行还是前面花了大力气分析过的函数,这里就不必要重申了。

 

再继续向前之前还是要去瞅瞅我们之前贴出来的那张初始化流程图,下面的时间该到获取卡的身份信息了,由此SD卡将步入identification时代,使用的命令是CMD2

368-371行我们选择err = mmc_all_send_cid(host, cid),跟踪源码:

[/core/mmc_ops.c]

177 int mmc_all_send_cid(struct mmc_host *host, u32 *cid)           

178 {           

179        int err;   

180        struct mmc_command cmd;  

181               

182        BUG_ON(!host);   

183        BUG_ON(!cid);    

184               

185        memset(&cmd, 0, sizeof(struct mmc_command));     

186               

187        cmd.opcode = MMC_ALL_SEND_CID;     

188        cmd.arg = 0;  

189        cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR;      

190               

191        err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);     

192        if (err)   

193               return err;

194               

195        memcpy(cid, cmd.resp, sizeof(u32) * 4);    

196               

197        return 0; 

198 }           

187行跟据#define MMC_ALL_SEND_CID     2可以确定,此刻的SD卡即将进入激动人心的时刻identification

195行回复的就是我们一直想得到的身份信息了。

       函数的其他内容就是炒剩饭了,所有的罪就让mmc_wait_for_cmd来背吧。

飘啊飘,总算是飘到了386mmc_alloc_card,这个函数就是为了分配一个struct mmc_card结构,相信读过card部分的朋友对她应该是不再陌生了。打个比方来说这个函数就好比领身份证SD卡都已经走到了identification这一步了,却还没有一个东西能证明他的身份的,您说她冤不冤。好了,就发个证件给她吧,于是乎聪明的内核开发者就想到了mmc_alloc_card。具体是怎么工作的就只能看源码啦!

[core/bus.c]

199 struct mmc_card *mmc_alloc_card(struct mmc_host *host, struct device_type *type)     

200 {           

201        struct mmc_card *card; 

202               

203        card = kzalloc(sizeof(struct mmc_card), GFP_KERNEL); 

204        if (!card)

205               return ERR_PTR(-ENOMEM);

206               

207        card->host = host; 

208               

209        device_initialize(&card->dev);     

210               

211        card->dev.parent = mmc_classdev(host);     

212        card->dev.bus = &mmc_bus_type;      

213        card->dev.release = mmc_release_card;

214        card->dev.type = type;  

215               

216        return card;    

217 }           

207行吃水不忘挖井人,辛辛苦苦为SD卡操劳了N久的host总算还是被struct mmc_host第一个给记下了。当然后面对这个SD卡的所有操作也就顺理成章的交给了card->host

209-214行您是否还依稀记得早在分析card目录的时候,讲到一个driver的注册,却始终未见他命中注定的那个device那么现在我以一种极其负责任的态度来告诉您,在不久以后的某个黄道吉日,您眼前的这个device将和前面那位苦苦等待他的driver一起步入婚姻的殿堂。当然为这对新人牵线搭桥的还有mmc_bus_type这条总线。这一切过后是时候返回了。

392-393行是对这个新生的card做对应的初始化。

       始终不忘的是那张动情的SD卡初始化流程图,indentification过后就到了设置RCA阶段了,mmc_send_relative_addr最终将不辱使命,内容如下:

[core/sd_ops.c]

227 int mmc_send_relative_addr(struct mmc_host *host, unsigned int *rca)           

228 {           

229        int err;   

230        struct mmc_command cmd;  

231               

232        BUG_ON(!host);   

233        BUG_ON(!rca);    

234               

235        memset(&cmd, 0, sizeof(struct mmc_command));     

236               

237        cmd.opcode = SD_SEND_RELATIVE_ADDR;  

238        cmd.arg = 0;  

239        cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;      

240               

241        err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);     

242        if (err)   

243               return err;

244               

245        *rca = cmd.resp[0] >> 16;    

246               

247        return 0; 

248 }           

237行设置的正是CMD3,这个函数过后SD卡将转入stand-by状态SD卡最终要到的西方极乐世界是transfer,现在距离他也就真的只有一步之遥了。好了,回到mmc_sd_init_card再接再厉...

 

404mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);实总线就两种模式要么open drain也就是漏极开路或者push-pull上拉。现在都开始要传输数据了,您说该是哪种模式呢。对于host总线的设置还是利用host->ops->set_ios实现的,具体代码如下:

[core/core.c]

630 void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode)      

631 {    

632        host->ios.bus_mode = mode;

633        mmc_set_ios(host);

634 }    

 

上面所做的工作全部完成以后,接下来就是通过CMD9读取卡的CSD寄存器。从CSD寄存器中,获知卡容量,支持的命令集等重要参数了。411-419为您解决了一切后顾之忧,显然mmc_send_csd是来发送csd命令的。

[core/mmc_ops.c]

310 int mmc_send_csd(struct mmc_card *card, u32 *csd)                      

311 {                         

312        int ret, i;               

313                             

314        if (!mmc_host_is_spi(card->host))                    

315               return mmc_send_cxd_native(card->host, card->rca << 16,             

316                             csd, MMC_SEND_CSD);

317                             

318        ret = mmc_send_cxd_data(card, card->host, MMC_SEND_CSD, csd, 16);                    

319        if (ret)                  

320               return ret;             

321                             

322        for (i = 0;i < 4;i++)                    

323               csd[i] = be32_to_cpu(csd[i]);       

324                             

325        return 0;               

326 }

对于我们一直跟踪的非SPI模式,315行成了整个函数的焦点。MMC_SEND_CSD对应的是CMD9mmc_send_cxd_native的内容如下:

[core/mmc_ops.c]

222 mmc_send_cxd_native(struct mmc_host *host, u32 arg, u32 *cxd, int opcode)       

223 {           

224        int err;   

225        struct mmc_command cmd;  

226               

227        BUG_ON(!host);   

228        BUG_ON(!cxd);   

229               

230        memset(&cmd, 0, sizeof(struct mmc_command));     

231               

232        cmd.opcode = opcode;  

233        cmd.arg = arg;      

234        cmd.flags = MMC_RSP_R2 | MMC_CMD_AC; 

235               

236        err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);     

237        if (err)   

238               return err;

239               

240        memcpy(cxd, cmd.resp, sizeof(u32) * 4);   

241               

242        return 0; 

243 }           

与其他设置命令类的函数一样mmc_send_cxd_native依然具有着足够清晰地脉络,有着永远不变的调用顺序。这个函数返回以后整个获取CSD的工作就做完了,结果保存在传递的cxd变量中。回到mmc_init_card...

416取出了CSD的参数,但是哪些个字段表示什么意思就得decode了,下面来看mmc_decode_csd

[core/sd.c]

90   static int mmc_decode_csd(struct mmc_card *card)                  

91   {                  

92          struct mmc_csd *csd = &card->csd;           

93          unsigned int e, m, csd_struct;       

94          u32 *resp = card->raw_csd;         

95                        

96          csd_struct = UNSTUFF_BITS(resp, 126, 2);             

97                        

98          switch (csd_struct) {            

99          case 0:           

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;

104                      

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);

109                      

110               e = UNSTUFF_BITS(resp, 47, 3);      

111               m = UNSTUFF_BITS(resp, 62, 12);   

112               csd->capacity    = (1 + m) << (e + 2);

113                      

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);   

121               break;    

122        case 1:           

123               /*   

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. 

128               */  

129               mmc_card_set_blockaddr(card);   

130                      

131               csd->tacc_ns   = 0; /* Unused */

132               csd->tacc_clks = 0; /* Unused */

133                      

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);

138                      

139               m = UNSTUFF_BITS(resp, 48, 22);   

140               csd->capacity     = (1 + m) << 10;   

141                      

142               csd->read_blkbits = 9;  

143               csd->read_partial = 0;   

144               csd->write_misalign = 0;      

145               csd->read_misalign = 0;

146               csd->r2w_factor = 4; /* Unused */      

147               csd->write_blkbits = 9; 

148               csd->write_partial = 0;  

149               break;    

150        default:         

151               printk(KERN_ERR "%s: unrecognised CSD structure version %d\n",      

152                      mmc_hostname(card->host), csd_struct);

153               return -EINVAL;   

154        }           

155                      

156        return 0;        

157 }                  

在分析上面的函数之前,首先还是来给出一张寄存器表,如下:

首先来看一下96行频频出现的UNSTUFF_BITS,其实他是个宏定义,具体的形式如下:

[core/sd.c]

44   #define UNSTUFF_BITS(resp,start,size)                                 \                          

45          ({                                                     \

46                 const int __size = size;                        \                   

47                 const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1;     \                          

48                 const int __off = 3 - ((start) / 32);               \                          

49                 const int __shft = (start) & 31;                    \                          

50                 u32 __res;                                         \     

51                                                                  \

52                 __res = resp[__off] >> __shft;                           \                   

53                 if (__size + __shft > 32)                            \                   

54                        __res |= resp[__off-1] << ((32 - __shft) % 32);   \                                 

55                 __res & __mask;                                       \     

56          })                                                    

上面一段代码纠结于C语言各种运算符,但是总的来说还是比较清晰地。为了对应背景我们就以resp[4]为例来说明。首先明确这个宏中resp[4]是当做一个4*32bit的数据来对待的,高位地址resp数组的第四个数据占据最高位,start指的是4*32bit中从哪一位起始,size是指提取几位的数据。UNSTUFF_BITS(resp, 126, 2);就是指提取resp数组中的126127位。对照上面的表可以看出取出的正是csd struct

接下来就是根据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)判断是否设置块大小,这个依据出现在这里。

136max. data transfer rate最大数据传输率定义在96-106bit,这里也就能够简单地得到了。

137card command classes指明SD卡所属的指令集,它使用的是84位以后的12bit来表示。

其他的内容就比较明确了,这里就不一一列出了。

回到mmc_init_card中接下来就该解码CID了,所用的函数即mmc_decode_cid。代码如下:

[core/sd.c]

61   static void mmc_decode_cid(struct mmc_card *card)                      

62   {                         

63          u32 *resp = card->raw_cid;                

64                               

65          memset(&card->cid, 0, sizeof(struct mmc_cid));              

66                               

67          /*                 

68          * SD doesn't currently have a version field so we will                    

69          * have to assume we can parse this.                 

70          */                

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);

83                               

84          card->cid.year += 2000; /* SD cards year offset */                  

85   }                         

CSD一样,首先来看看它的家谱图如下:

里面始终使用的是UNSTUFF_BITS这个宏定义,具体的内容参照上面的图应该比较清晰就不下详述了。

       清醒一下重新回到我们一直讨论的主旋律——SD卡初始化。依旧是那张唠叨了千遍地流程图,好了下一步我们该大步迈进选择SD卡阶段了,这个黑暗的时刻过后,SD卡将走上新的人生轨道,transfer397行判断传输模式,对于SPI而言,有一个大名鼎鼎的CS信号,所以做法就稍微有点不一样了。我们只谈if (!mmc_host_is_spi(host))成立的时候,那么走进mmc_select_card是必然的趋势了。

[core/mmc_ops.c]

48   int mmc_select_card(struct mmc_card *card)     

49   {    

50          BUG_ON(!card);

51          

52          return _mmc_select_card(card->host, card);

53   }    

目光投向_mmc_select_card,其实聪明的你早就应该猜到这个函数是怎么做的了,还是来看看源码:

[core/mmc_ops.c]

22   static int _mmc_select_card(struct mmc_host *host, struct mmc_card *card)                  

23   {                         

24          int err;                 

25          struct mmc_command cmd;                

26                               

27          BUG_ON(!host);                 

28                               

29          memset(&cmd, 0, sizeof(struct mmc_command));                   

30                               

31          cmd.opcode = MMC_SELECT_CARD;                    

32                               

33          if (card) {                    

34                 cmd.arg = card->rca << 16;         

35                 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;        

36          } else {                

37                 cmd.arg = 0;         

38                 cmd.flags = MMC_RSP_NONE | MMC_CMD_AC;          

39          }                  

40                               

41          err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);                   

42          if (err)                 

43                 return err;             

44                               

45          return 0;               

46   }                         

依旧是那张熟悉的脸,前面见多了,这里就不想在分析了。

回到mmc_sd_init_card436行开始就要获取SD卡的SCR寄存器了,SCR寄存器共64位,是关于这个SD卡的特殊功能的特性信息。关于这个用的比较少我们就不进去研究了,有兴趣的朋友可以自己看看源码。

447行是用来切换SD卡至高速模式,使用命令CMD6CMD6SD卡用来扩展功能的一条重要命令。在SD协议1.002.00的版本是,该命令主要用于切换卡进入高速模式。CMD6命令共有查询模式和设置模式两种。查询模式主要用于查询是否支持该功能,而设置模式主要用于对该功能的设置。我们采取的流程是先查询,后设置。根据SPEC,因此,我们第一次发送的命令参数应该为:0x00, 0xff, 0xff, 0xf1。该命令的作用是查询AccessMode是否支持High-Speed。命令发送完毕,这里需要注意的是CMD6并不是用命令总线,而是用数据总线来进行应答。在命令发送完毕时,我们会从数据总线上接收到64Byte的数据。根据SPEC,我们判断第17Byte的低4Bit(是否等于1。是则继续,否则表示不支持高速模式。

有了这个背景下面分析一下它相关的源码:

[core/sd.c]

188 static int mmc_read_switch(struct mmc_card *card)                 

189 {                  

190        int err;          

191        u8 *status;            

192                      

193        if (card->scr.sda_vsn < SCR_SPEC_VER_1)            

194               return 0; 

195                      

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));

200               return 0; 

201        }           

202                      

203        err = -EIO;           

204                      

205        status = kmalloc(64, GFP_KERNEL);        

206        if (!status) {          

207               printk(KERN_ERR "%s: could not allocate a buffer for "  

208                      switch capabilities.\n, mmc_hostname(card->host));

209               return -ENOMEM;

210        }           

211                      

212        err = mmc_sd_switch(card, 0, 0, 1, status);        

213        if (err) {        

214               /* If the host or the card can't do the switch,

215               * fail more gracefully. */    

216               if ((err != -EINVAL)    

217               && (err != -ENOSYS)      

218               && (err != -EFAULT))      

219                      goto out;

220                      

221               printk(KERN_WARNING "%s: problem reading switch " 

222                      capabilities, performance might suffer.\n,

223                      mmc_hostname(card->host));

224               err = 0;  

225                      

226               goto out;

227        }           

228                      

229        if (status[13] & 0x02)          

230               card->sw_caps.hs_max_dtr = 50000000;     

231                      

232 out:               

233        kfree(status);         

234                      

235        return err;             

236 }                  

193行如果通过scr判断是ver1.1版,那么这里就没有必要继续做后面的工作了。

205行根据前面的描述,cmd6会利用数据线返回64个字节的信息,这个就是为了存放读取的状态值的。

212行是整个命令设置的重点,源码如下:

[core/sd_ops.c]

302 int mmc_sd_switch(struct mmc_card *card, int mode, int group,                    

303        u8 value, u8 *resp)       

304 {                  

305        struct mmc_request mrq;             

306        struct mmc_command cmd;         

307        struct mmc_data data;          

308        struct scatterlist sg;       

309                      

310        BUG_ON(!card);         

311        BUG_ON(!card->host);       

312                      

313        /* NOTE: caller guarantees resp is heap-allocated */          

314                      

315        mode = !!mode;           

316        value &= 0xF;             

317                      

318        memset(&mrq, 0, sizeof(struct mmc_request));         

319        memset(&cmd, 0, sizeof(struct mmc_command));            

320        memset(&data, 0, sizeof(struct mmc_data));       

321                      

322        mrq.cmd = &cmd;        

323        mrq.data = &data;        

324                      

325        cmd.opcode = SD_SWITCH;       

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;       

330                      

331        data.blksz = 64;            

332        data.blocks = 1;            

333        data.flags = MMC_DATA_READ;       

334        data.sg = &sg;       

335        data.sg_len = 1;            

336                      

337        sg_init_one(&sg, resp, 64);         

338                      

339        mmc_set_data_timeout(&data, card);          

340                      

341        mmc_wait_for_req(card->host, &mrq);             

342                      

343        if (cmd.error)       

344               return cmd.error;   

345        if (data.error)        

346               return data.error;   

347                      

348        return 0;        

349 }                 

这条命令由于有数据的返回所以设计上较设置命令稍稍复杂一些,并由 mmc_wait_for_req来完成整个命令请求的。前面在分析card目录过程当中我们对数据的传输请求做了详细的分析,这里请求与之前见到的一致需要一个struct mmc_request结构,并初始化正确的struct mmc_data同时struct scatterlist散列结构也是必须的,并利用337 sg_init_one(&sg, resp, 64);初始化了一个散列入口。

339mmc_set_data_timeout(&data, card);      设置底层处理超时的参数,这个后面在分析host_ops中会提到。

341mmc_wait_for_req就是整个函数期待的核心了。如果没有错误mmc_sd_switch就带着返回的数据高高兴兴的返回到mmc_read_switch的怀抱。 

       还剩下最后要说的两行229-230,根据返回设置卡允许的最大数据传输速率

继续向下,mmc_sd_init_card 467行,前面我们说过一旦支持高速模式,那么就会利用CMD6来设置高速模式。

[core/sd.c]

241 static int mmc_switch_hs(struct mmc_card *card)                    

242 {                  

243        int err;          

244        u8 *status;            

245                      

246        if (card->scr.sda_vsn < SCR_SPEC_VER_1)            

247               return 0; 

248                      

249        if (!(card->csd.cmdclass & CCC_SWITCH))             

250               return 0; 

251                      

252        if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))       

253               return 0; 

254                      

255        if (card->sw_caps.hs_max_dtr == 0)          

256               return 0; 

257                      

258        err = -EIO;           

259                      

260        status = kmalloc(64, GFP_KERNEL);        

261        if (!status) {          

262               printk(KERN_ERR "%s: could not allocate a buffer for "  

263                      switch capabilities.\n, mmc_hostname(card->host));

264               return -ENOMEM;

265        }           

266                      

267        err = mmc_sd_switch(card, 1, 0, 1, status);        

268        if (err)          

269               goto out;

270                      

271        if ((status[16] & 0xF) != 1) {             

272               printk(KERN_WARNING "%s: Problem switching card " 

273                      into high-speed mode!\n,

274                      mmc_hostname(card->host));

275        } else {         

276               mmc_card_set_highspeed(card);   

277               mmc_set_timing(card->host, MMC_TIMING_SD_HS);    

278        }           

279                      

280 out:               

281        kfree(status);         

282                      

283        return err;             

284 }                  

前面已经说过,第二个设置阶段所做的事情还是一样,所以仍然调用了mmc_sd_switch,但是请注意传递的参数是有区别的。

271行根据返回的statue决定判断是否转化状态。

276mmc_card_set_highspeed(card);就是将这个好消息,记录在card当中。

#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)

277行就是对SD控制器进行设置了。

[core/core.c]

848 void mmc_set_timing(struct mmc_host *host, unsigned int timing)          

849 {           

850        host->ios.timing = timing;    

851        mmc_set_ios(host);

852 }           

回到mmc_sd_init_card中来,476-481行最终会得到一个合适的max_dtr。然后调用mmc_set_clock对主机控制器的时钟进行设置。

[core/core.c]

616 void mmc_set_clock(struct mmc_host *host, unsigned int hz)          

617 {           

618        WARN_ON(hz < host->f_min);   

619               

620        if (hz > host->f_max)   

621               hz = host->f_max;

622               

623        host->ios.clock = hz;    

624        mmc_set_ios(host);

625 }           

最后一段将会设置DATA总线宽度。这个依然使用我们前面所说的CMD6命令,调用的函数是mmc_app_set_bus_width,源码如下:

[core/sd_ops.c]

120 int mmc_app_set_bus_width(struct mmc_card *card, int width)       

121 {           

122        int err;   

123        struct mmc_command cmd;  

124               

125        BUG_ON(!card);  

126        BUG_ON(!card->host);

127               

128        memset(&cmd, 0, sizeof(struct mmc_command));     

129               

130        cmd.opcode = SD_APP_SET_BUS_WIDTH;     

131        cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; 

132               

133        switch (width) {    

134        case MMC_BUS_WIDTH_1:

135               cmd.arg = SD_BUS_WIDTH_1;

136               break;

137        case MMC_BUS_WIDTH_4:

138               cmd.arg = SD_BUS_WIDTH_4;

139               break;

140        default:  

141               return -EINVAL;

142        }    

143               

144        err = mmc_wait_for_app_cmd(card->host, card, &cmd, MMC_CMD_RETRIES);  

145        if (err)   

146               return err;

147               

148        return 0; 

149 }           

130行的命令正是CMD6,同样144行的代码也是我们讲过N次的老朋友了。设置完SD卡,接下来该到SD控制器了,不然两边对不上,岂不就麻烦大了....

一旦SD卡接受了这个宽总线的命运,那么SD控制器也将不得不支持,因此497行将是对SD控制器的数据宽度进行设置,调用mmc_set_bus_width如下:

[core/core.c]

639 void mmc_set_bus_width(struct mmc_host *host, unsigned int width)             

640 {           

641        host->ios.bus_width = width;

642        mmc_set_ios(host);

643 }           

最后一点细节,所有准备工作都做好了,对于SD卡是否还应该检测一下有没有写保护不然折腾了半天,最后被保护起来了那就丢大了。好了,500-508行通过调用host_ops中的检测只读函数,获取了卡的写保护状态并设置到card->state中以便日后使用。

#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卡控制器。

716行对于SD卡驱动来说有着特殊的意义.....

[core/bus.c]

222 int mmc_add_card(struct mmc_card *card)               

223 {                  

224        int ret;           

225        const char *type;          

226                      

227        dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca);   

228                      

229        switch (card->type) {           

230        case MMC_TYPE_MMC:            

231               type = "MMC";     

232               break;    

233        case MMC_TYPE_SD:        

234               type = "SD";  

235               if (mmc_card_blockaddr(card))   

236                      type = "SDHC";

237               break;    

238        case MMC_TYPE_SDIO:            

239               type = "SDIO";     

240               break;    

241        default:         

242               type = "?";     

243               break;    

244        }           

245                      

246        if (mmc_host_is_spi(card->host)) {            

247               printk(KERN_INFO "%s: new %s%s card on SPI\n",

248                      mmc_hostname(card->host),

249                      mmc_card_highspeed(card) ? "high speed " : "",

250                      type);

251        } else {         

252               printk(KERN_INFO "%s: new %s%s card at address %04x\n", 

253                      mmc_hostname(card->host),

254                      mmc_card_highspeed(card) ? "high speed " : "",

255                      type, card->rca);

256        }           

257                      

258        ret = device_add(&card->dev);           

259        if (ret)           

260               return ret;      

261                      

262 #ifdef CONFIG_DEBUG_FS                    

263        mmc_add_card_debugfs(card);           

264 #endif                  

265                      

266        mmc_card_set_present(card);       

267                      

268        return 0;        

269 }                  

如果让我选出SD卡子系统中最美丽的一个函数的话,我愿意说是mmc_add_card,但时也是最八卦的一个函数。整个函数一共50余行,却单单只说了一句有意义的话:

258        ret = device_add(&card->dev);  

还记得申请这个card时我说过的话吗?我说card->dev早晚得和他命中注定的那个她步入婚礼的殿堂,今天便是我说的那个黄道吉日。也就是因为这句话才让我们早在card中所说的res = mmc_register_driver(&mmc_driver);有了probe成功的那一天,然后才进一步加深了SD卡与块设备驱动的联系。

 

好了,再美丽的函数我们也只能欣赏到这了,循着来时的路我们走到了mmc_attach_sd的尽头,等着我们的依旧是哪个不老的传说——mmc_rescan

一旦mmc_attach_sd成功走出,我们的目光将跳转到1113....

我们知道像SD卡的这种设备,永远是个风流的主。他也许不会永远守护在你的身边,那么就需要你时时刻刻去关心一下,他是否还在你身边停留。没办法那就没隔1S钟检测一次吧。好了,这下子问题就上来了。我们知道每当调用

mmc_schedule_delayed_work(&host->detect, HZ);的时候,每过后1秒钟都会去执行mmc_rescan那么是否每隔1S正常工作的SD卡都要被初始化一次呢?要是SD卡一旦拔出,那么谁又将为这种不负责任的行为埋单呢?

       为了找到这个幕后的真凶,看来我们又不得不重入mmc_rescan的代码了。代码就不贴了,用到了再说,只要您不是太健忘,估计还是能找到他的出生地的。

1045行,第一次看这个函数的时候,我们说还用不上,但是现在情况可就不一样了,谁叫我们都是经历了初始化的人啊。在mmc_rescan调用mmc_attach_sd的过程中曾经出现了这么一个函数的身影,那便是mmc_sd_attach_bus_ops。对就是他使得我们的hostbus_ops有染,为了找出这个关联的对象我们不惜再次贴出mmc_sd_attach_bus_ops的代码。

[core/sd.c]

642 static void mmc_sd_attach_bus_ops(struct mmc_host *host)             

643 {           

644        const struct mmc_bus_ops *bus_ops;   

645               

646        if (host->caps & MMC_CAP_NONREMOVABLE)    

647               bus_ops = &mmc_sd_ops_unsafe;

648        else 

649               bus_ops = &mmc_sd_ops;

650        mmc_attach_bus(host, bus_ops);  

651 }           

bus_ops = &mmc_sd_ops;立即吸引了我们的眼球,那么干脆坚持到底,看看他是些什么东西。

[core/sd.c]

627 static const struct mmc_bus_ops mmc_sd_ops = {      

628        .remove = mmc_sd_remove,

629        .detect = mmc_sd_detect,

630        .suspend = NULL,

631        .resume = NULL,

632        .power_restore = mmc_sd_power_restore,

633 };          

好了,有了这个基础我们继续回到mmc_rescan,那么1045行也就是增加这条总线的引用计数了。

1048-1049行这时候这两行的内容就不容轻易飘过了,host->bus_ops意味这这个SD卡已经注册在案了,那么是否他还依然守候着卡槽呢?那可不一定调用host->bus_ops->detect(host);检查一下,结果就到了上面的.detect = mmc_sd_detect,进入mmc_sd_detect

[core/sd.c]

540 static void mmc_sd_detect(struct mmc_host *host)            

541 {           

542        int err;   

543               

544        BUG_ON(!host);   

545        BUG_ON(!host->card);

546               

547        mmc_claim_host(host); 

548               

549        /*   

550        * Just check if our card has been removed.

551        */  

552        err = mmc_send_status(host->card, NULL);

553               

554        mmc_release_host(host);      

555               

556        if (err) { 

557               mmc_sd_remove(host);

558               

559               mmc_claim_host(host);

560               mmc_detach_bus(host);

561               mmc_release_host(host);

562        }    

563 }           

这里检测SD卡是否存在的方法很简单,直接查询状态,如果出错,那对不起接下来发生的一切就让人难以接受了。之前初始化的一切都将付之一炬….

556行会令这张风光一时的SD卡彻底消失,代码如下:

[core/sd.c]

528 static void mmc_sd_remove(struct mmc_host *host)  

529 {    

530        BUG_ON(!host);

531        BUG_ON(!host->card);

532        

533        mmc_remove_card(host->card);

534        host->card = NULL;

535 }    

重点来看532mmc_remove_card….

 

[core/bus.c]

275 void mmc_remove_card(struct mmc_card *card)                     

276 {                         

277 #ifdef CONFIG_DEBUG_FS                           

278        mmc_remove_card_debugfs(card);                    

279 #endif                         

280                             

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));

285               } else {         

286                      printk(KERN_INFO "%s: card %04x removed\n",    

287                             mmc_hostname(card->host), card->rca);

288               }           

289               device_del(&card->dev);             

290        }                  

291                             

292        put_device(&card->dev);                   

293 }                         

289292行将SD在设备模型的中的所有记录将全部销毁,同时card目录下驱动对应的remove函数也将做相应的清理工作,这里就不详细诉了。回到mmc_sd_remove…

       最后,host解除了与card之间的约定,使得host->card = NULL;。那么悲剧的mmc_sd_remove函数也就悄悄谢幕了

       接下来就是对这条bus_ops的操作了,mmc_detach_bus相关内容如下:

[core/core.c]

993 void mmc_detach_bus(struct mmc_host *host)   

994 {    

995        unsigned long flags;

996        

997        BUG_ON(!host);

998        

999        WARN_ON(!host->claimed);

1000             WARN_ON(!host->bus_ops);

1001             

1002             spin_lock_irqsave(&host->lock, flags);

1003             

1004             host->bus_dead = 1;

1005             

1006             spin_unlock_irqrestore(&host->lock, flags);

1007             

1008             mmc_power_off(host);

1009             

1010             mmc_bus_put(host);

1011      }    

10041010行使得bus_opscard彻底绝交,伤心的card从新回到mmc_rescan….

 

1057行这时候如果成立说明卡依然存在,初始化的过程就直接跳过,进入下一轮的mmc_schedule_delayed_work(&host->detect, HZ);否则就必须开始新一轮的检测了,后面的内容就和我们之前分析的一致了。所以到这里您到可放心,只要卡不离槽,驱动是决计不会实施第二轮的初始化的。

http://m.blog.csdn.net/blog/rain0993/8476755

Logo

更多推荐