platform_device and paltform_driver

来源:互联网 发布:centos 7 nfs安装配置 编辑:程序博客网 时间:2024/06/06 09:03

在移植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,
 },
};取的

其他的也可以类推。
0 0