现在的位置: 首页 > 综合 > 正文

linux下MMC/SD/SDIO驱动系列之三 —- host注册过程(二)

2014年01月01日 ⁄ 综合 ⁄ 共 1556字 ⁄ 字号 评论关闭

 

   上篇文章说到了探测函数sdhci_s3c_probe,现在就来仔细分析这个函数的作用

   在分析代码之前,先简要的概括一下这个函数的功能:

    1、既然是讲host的注册,那么首先必须构造出一个host,这个host就是通过sdhci_alloc_host函数来构造出来的,它是一个struct sdhci_host类型的结构体。同时,也通过mmc_alloc_host函数构造了一个struct mmc_host的结构体变量mmc。

    2、初始化host的时钟,设置host的gpio等等其他一些“乱七八糟”的参数初始化(需要的时候再详细分析)。

    3、通过sdhci_add_host函数来注册host。

 

   下面重点来看sdhci_add_host函数

 

    该函数主要是对mmc的注册,同样mmc也有很多的参数,先来看看他的操作函数集mmc->ops = &sdhci_ops

       

       

 

     其中,request函数指针指向的函数用来处理host向从设备发送命令的请求,

               set_ios用来设置电源、时钟等等之类(需要重点关注),

               get_ro用来判断是否写保护

 

    再来看该函数里面的中断注册部分

           

           

          

           我们先看一下mmc_add_host这个函数,它的功能就是通过device_add函数将设备注册进linux设备模型,最终的结果就是在sys/bus/platform/devices目录下能见到s3c-sdhci.1,s3c-sdhci.2,s3c-sdhci.3设备节点。

          中断注册函_irq的第一个参数中断号就取自于s3c_device_hsmmc3.resource里面的irq参数,sdhci_irq就是中断服务程序,该中断函数一般在插卡、拔卡或者从设备反馈给host信息时会被调用数request

 

         中断服务程序

        

                

             程序首先读取寄存器NORINTSTSn的值,该寄存器中有两个bit分别来表示卡的插入与拔出过程(注意,必须是动态变化过程,才会让相应的两个bit置1),那么接下来的if语句就是从该寄存器的那两个bit来判断是否有卡的插入或拔出,并同时清除这两个bit,准备下一次的检测,紧接着就调用中断的下半部分函数 sdhci_tasklet_card,其实这个函数也没做什么事情,就是判读如果此时有卡的话就通过mmc_detect_chang函数调用mmc_rescan函数。从这个函数的名字都可以猜出个八九不离十,它的功能就是扫描所插入的卡

 

    扫描卡的程序

     

   这个函数我们重点关注上述两个地方,其实真正的扫描动作发生在函数mmc_rescan_try_freq函数里面,该函数的第二个参数表示以什么样的频率去进行扫描,那么可选的频率值在那个数组freqs里面,一般当用某个频率值扫描成功后,就直接退出了,否则,会以下一个更低的频率值来扫描,笔者所使用的WIFI模块就是以400KHz的频率扫描成功的。

 

       扫描过程

      

   该函数首先发送复位命令(不过该命令只有SDIO类型的卡才能够识别),然后发送CMD0,让设备进入IDLE模式,紧接着发送CMD8,获取该卡所支持的电压值,最后就是重点了(从1998-2003行),从所调用的各个函数名字可以看出,它是在试探该卡是否为SDIO? SD?
MMC?

 

     那么接下来的文章就是要分析上面的三个函数,看它是如何识别SDIO、SD、MMC的

        

抱歉!评论已关闭.