您的位置:首页 > 其它

platform_device and paltform_driver

2014-02-20 12:00 253 查看
在移植SDcard驱动的是分析了一下执行的过程,理解了一下platform_device和paltform_driver

主要文件为:

\linux-2.6.36-android\arch\arm\mach-s3c64xx\mch-mini6410.c

\linux-2.6.36-android\drivers\mmc\host\sdhci-s3c.c

\linux-2.6.36-android\drivers\mmc\host\hdsci.c

\linux-2.6.36-android\arch\arm\plat-samsung\dev-hsmmc.c

1、sdcard platform_device注册

这个过程主要分析板级文件mach-mini6410.c文件

SD卡平台设备注册:

static void __init mini6410_machine_init(void)

{

s3c_sdhci0_set_platdata(&mini6410_hsmmc0_pdata);

platform_add_devices(mini6410_devices, ARRAY_SIZE(mini6410_devices));//将platform_device项一一注册进系统

}

static struct s3c_sdhci_platdata mini6410_hsmmc0_pdata = {

.max_width = 4,

.cd_type = S3C_SDHCI_CD_INTERNAL,

};

static struct platform_device *mini6410_devices[] __initdata = {

#ifdef CONFIG_MINI6410_SD_CH0

&s3c_device_hsmmc0,

}

s3c_sdhci0_set_platdata(&mini6410_hsmmc0_pdata);函数的原型在\linux-2.6.36-android\arch\arm\plat-samsung\dev-hsmmc.c文件中

dev-hsmmc.c文件分析

(1)module_init(sdhci_s3c_init);

(2)static int __init sdhci_s3c_init(void)

{

return platform_driver_register(&sdhci_s3c_driver);

}

(3)static struct platform_driver sdhci_s3c_driver = {

.probe = sdhci_s3c_probe,

.remove = __devexit_p(sdhci_s3c_remove),

.suspend = sdhci_s3c_suspend,

.resume = sdhci_s3c_resume,

.driver = {

.owner = THIS_MODULE,

.name = "s3c-sdhci",

},

};

以上仅仅是注册了platform_device

2、platform_driver 注册

SD卡的platform_driver的注册主要通过sdhci-s3c.c实现

tatic int __init sdhci_s3c_init(void)

{

return platform_driver_register(&sdhci_s3c_driver);

}

static struct platform_driver sdhci_s3c_driver = {

.probe = sdhci_s3c_probe,

.remove = __devexit_p(sdhci_s3c_remove),

.suspend = sdhci_s3c_suspend,

.resume = sdhci_s3c_resume,

.driver = {

.owner = THIS_MODULE,

.name = "s3c-sdhci",

},

};

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

PS:平台文件中注册的平台文件一般在arch/arm/plat-XXXX/下都有自己的平台设备名称,mach-mini6410.c中的 那个

static struct platform_device *mini6410_devices[] __initdata = {

#ifdef CONFIG_MINI6410_SD_CH0

&s3c_device_hsmmc0,

}

红色的名字不是随意取的,而是根据平台文件arch/arm/plat-XXXX/下对应的设备文件取的。例如s3c_device_hsmmc0 这个名字是根据\arch\arm\plat-samsung\dev-hsmmc.c中的struct platform_device s3c_device_hsmmc0
= {

.name = "s3c-sdhci",

.id = 0,

.num_resources = ARRAY_SIZE(s3c_hsmmc_resource),

.resource = s3c_hsmmc_resource,

.dev = {

.dma_mask = &s3c_device_hsmmc_dmamask,

.coherent_dma_mask = 0xffffffffUL,

.platform_data = &s3c_hsmmc0_def_platdata,

},

};取的

其他的也可以类推。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: