Linux-2.6之platform


(一) Platform_device部分:

1 系统初始化注册platform_device到内核:

  1. static void __init smdk2410_init(void)  
  2. {  
  3.  s3c_i2c0_set_platdata(NULL);  
  4.  platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));  
  5.  smdk_machine_init();  
  6. }  
  1. int platform_add_devices(struct platform_device **devs, int num)  
  2. {  
  3.  int i, ret = 0;  
  4.  for (i = 0; i < num; i++) {  
  5.   ret = platform_device_register(devs[i]);  
  6.   if (ret) {  
  7.    while (--i >= 0)  
  8.     platform_device_unregister(devs[i]);  
  9.    break;  
  10.   }  
  11.  }  
  12.  return ret;  
  13. }  
 
  1. static struct platform_device *smdk2410_devices[] __initdata = {  
  2.  &s3c_device_usb,  
  3.  &s3c_device_lcd,  
  4.  &s3c_device_wdt,  
  5.  &s3c_device_i2c0,  
  6.  &s3c_device_iis,  
  7.  s3c_device_sdi,  
  8.  ......  
  9. };  

 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:

  1. struct platform_device s3c_device_sdi = {  
  2.  .name    = "s3c2410-sdi",  
  3.  .id    = -1,  
  4.  .num_resources   = ARRAY_SIZE(s3c_sdi_resource),  
  5.  .resource   = s3c_sdi_resource,  
  6. }; 
  1. /* SDI */  
  2. static struct resource s3c_sdi_resource[] = {  
  3.  [0] = {  
  4.   .start = S3C24XX_PA_SDI,  
  5.   .end   = S3C24XX_PA_SDI + S3C24XX_SZ_SDI - 1,  
  6.   .flags = IORESOURCE_MEM,  
  7.  },  
  8.  [1] = {  
  9.   .start = IRQ_SDI,  
  10.   .end   = IRQ_SDI,  
  11.   .flags = IORESOURCE_IRQ,  
  12.  }  
  13. };  

(二) Platform_driver部分:

设备部分在内核启动时候执行platform_device_register(devs[i]);函数之后,就会将所有定义的platform_device注册到内核系统中。

然后对于设备驱动来说,加载到内核中入口为:

  1. static int __init s3cmci_init(void)  
  2. {  
  3.  platform_driver_register(&s3cmci_2410_driver);  
  4.  return 0;  
  5. }  

Platform_device定义如下所示:

  1. static struct platform_driver s3cmci_2410_driver = {  
  2.     .driver.name    = "s3c2410-sdi",  
  3.     .driver.owner   = THIS_MODULE,  
  4.     .probe      = s3cmci_2410_probe,  
  5.     .remove     = __devexit_p(s3cmci_remove),  
  6.     .shutdown   = s3cmci_shutdown,  
  7.     .suspend    = s3cmci_suspend,  
  8.     .resume     = s3cmci_resume,  
  9. };  
  • 1
  • 2
  • 下一页

相关内容