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,
},
};取的
其他的也可以类推。
主要文件为:
\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,
},
};取的
其他的也可以类推。
相关文章推荐
- Linux Platform Device and Driver
- Linux Platform Device and Driver
- Linux Platform Device and Driver
- Linux Platform Device and Driver .
- Linux Platform Device and Driver [转]
- Linux Platform Device and Driver
- Linux Platform Device and Driver,platform_add_devices()->platform_driver_register()
- Linux Platform Device and Driver .
- Linux Platform Device and Driver
- Linux Platform Device and Driver
- Linux Platform Device and Driver
- Linux Platform Device and Driver : platform_add_devices()->platform_driver_register()
- platform driver and device学习笔记
- 操作系统_再识(Linux Platform Device and Driver)
- Linux Platform Device and Driver,platform_add_devices()->platform_driver_register()
- Linux Platform Device and Driver
- LINUX平台设备(linux platform_device and platform_driver)
- 引用 Linux Platform Device and Driver
- Linux Platform Device and Driver,platform_add_devices()->platform_driver_register()
- Linux Platform Device and Driver