Linux-2.6之platform
Linux-2.6之platform
(一) Platform_device部分:1 系统初始化注册platform_device到内核:
- static void __init smdk2410_init(void)
- {
- s3c_i2c0_set_platdata(NULL);
- platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
- smdk_machine_init();
- }
- int platform_add_devices(struct platform_device **devs, int num)
- {
- int i, ret = 0;
- for (i = 0; i < num; i++) {
- ret = platform_device_register(devs[i]);
- if (ret) {
- while (--i >= 0)
- platform_device_unregister(devs[i]);
- break;
- }
- }
- return ret;
- }
- static struct platform_device *smdk2410_devices[] __initdata = {
- &s3c_device_usb,
- &s3c_device_lcd,
- &s3c_device_wdt,
- &s3c_device_i2c0,
- &s3c_device_iis,
- s3c_device_sdi,
- ......
- };
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices))函数以platform_device数组作为参数,将其中定义的所有的platform_device注册到系统中。
2 关于SD platform_device
arch/arm/plat-s3c24XX/devs.c 中定义了系统拥有的所有platform_device,其中也包括SD卡的platform_device:
- struct platform_device s3c_device_sdi = {
- .name = "s3c2410-sdi",
- .id = -1,
- .num_resources = ARRAY_SIZE(s3c_sdi_resource),
- .resource = s3c_sdi_resource,
- };
- /* SDI */
- static struct resource s3c_sdi_resource[] = {
- [0] = {
- .start = S3C24XX_PA_SDI,
- .end = S3C24XX_PA_SDI + S3C24XX_SZ_SDI - 1,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = IRQ_SDI,
- .end = IRQ_SDI,
- .flags = IORESOURCE_IRQ,
- }
- };
(二) Platform_driver部分:
设备部分在内核启动时候执行platform_device_register(devs[i]);函数之后,就会将所有定义的platform_device注册到内核系统中。
然后对于设备驱动来说,加载到内核中入口为:
- static int __init s3cmci_init(void)
- {
- platform_driver_register(&s3cmci_2410_driver);
- return 0;
- }
Platform_device定义如下所示:
- static struct platform_driver s3cmci_2410_driver = {
- .driver.name = "s3c2410-sdi",
- .driver.owner = THIS_MODULE,
- .probe = s3cmci_2410_probe,
- .remove = __devexit_p(s3cmci_remove),
- .shutdown = s3cmci_shutdown,
- .suspend = s3cmci_suspend,
- .resume = s3cmci_resume,
- };
|
评论暂时关闭