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

来源:互联网 发布:php 运行时间设置 编辑:程序博客网 时间:2024/04/28 18:41

 

         上篇文章说到了MMC/SD/SDIO(以下简称MMC)的驱动从大的方面来说分为主设备驱动和从设备驱动,那本文就来详细的讲述主设备驱动注册的过程。

 

        MMC主设备(也就是host)指的是集成于CPU内部的MMC controller,笔者用的是4412芯片,从datasheet可以看出,里面集成了四个MMC controller,分别是mmc0,mmc1,mmc2,mmc3。 并且从上一篇文章我们知道,WIFI模块是接在mmc3 这个host上面。

       在linux系统中,将每个host设备封装成platform_device来逐一进行注册。对于笔者所使用的内核(3.2.0版本)来说,每一个host设备所对应的platform_device文件位于目录($KERNEL_SOURCE)/arch/arm/plat-samsung下,分别为dev-hsmmc.c,dev-hsmmc1.c,dev-hsmmc2.c,dev-hsmmc3.c,为了与实际WIFI模块对应,我们重点进入dev-hsmmc3.c文件看一看

 

          从上图可以看出,该文件里面定义了一个名为s3c_device_hsmmc3的platform_device,但是定义好了的platform_device还需要有一个注册的过程,该过程就发生在文件($KERNEL_SOURCE)/arch/arm/mach-exynos/mach-$(BOARD).c中,其中有如下的一个函数调用:
                                           
 
       它的行为就是将数组skd4x12_devices里面的每一个platform_device项一一注册进系统,并且这个数组里面就包含了上面所定义的s3c_device_hsmmc3

                                     

 

    

         所以总结来说,系统化在初始化的时候,就已经将s3c_device_hsmmc3(也就是那个host  mmc3)注册进了platform总线(其他的mmc0,mmc1,mmc2都是一个道理)。

 

 

 

       当然,对于熟悉platform机制的朋友来说,此时仅仅只是注册了platform_device ,而对应的platform_driver还没有注册。下面就来说说这个platform_driver的注册,它是在$(KERNEL_SOURCE)/drivers/mmc/host目录下的sdhci-s3c.c文件中进行的,该文件中有如下的一个注册函数调用:

 

      其中的参数sdhci_s3c_driver就是上面所说的platform_driver,它也是定义在sdhci-s3c.c文件中,来看一下:

 

      在对sdhci_s3c_driver进行注册的过程中,系统会根据sdhci_s3c_driver->driver.name成员变量(此处是“s3c-sdhci”)在platform_bus 总线上寻找同名字的platform_dvice(这个过程称之为“探测”),通过上面对s3c_device_hsmmc3的注册分析,发现s3c_device_mmc3.name也刚好是“s3c-sdhci”,所以他俩刚好可以配对,探测成功,同时当大家查阅s3c_device_hsmmc,s3c_device_hsmmc1以及s3c_device_hsmmc2的时候发现他们的name成员变量都是“s3c-sdhci”,,所以会有四次成功的探测,每一次探测成功,就会调用sdhci_s3c_driver.probe函数---sdhci_s3c_probe,这个函数至关重要,在整个驱动注册过程中起着核心作用,关于它的详细内容,见下一篇文章。

原创粉丝点击