struct device platformbus busid platform deviceregisterplatformbus sysdevices sysdevicesplatform
struct device platform_bus = {. bus_id = "platform", }; device_register(&platform_bus); 完成这个调用后,我们可以在/sys/devices目录 中看到它(/sys/devices/platform),任何添加 到该总线的设备都会在/sys/devices/platform/ 显示。
例如:在luxun 9项目中所用到的Linux 2. 6. 14内核中 有这样一个结构体,代码如下所示: struct platform_device { const char * name; u 32 id; struct device dev; u 32 num_resources; struct resource * resource; }; 用它定义了一个USB设备结构体,代码如下所示:
static struct platform_device s 1 r 72 xxx_device = {. name = "s 1 r 72 v 17", . id = -1, . dev = {. platform_data = (void*)NULL, . dma_mask = &s 1 r 72 xxx_dma_mask, . coherent_dma_mask = 0 xffff, }, . num_resources = ARRAY_SIZE(s 1 r 72 xxx_resources), . resource = s 1 r 72 xxx_resources, };
然后通过下面的代码注册设备,将设备挂在虚拟总 线platform_bus上,总线类型为platform_bus_type。 platform_add_devices(luxun_devices, ARRAY_SIZE(luxun_devices)); luxun_devices是一个platform_device类型的指针 数组,定义如下所示: static struct platform_device *luxun_devices[] __initdata = { &s 1 r 72 xxx_device, &keybd_device, &d 13733 fb_device };
platform_add_devices()函数原型是: 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; }
设备驱动程序 以luxun 9 USB Controller Driver 为例,其中定 义了这样一个驱动程序结构体,代码如下所示: static struct device_driver s 1 r 72 xxx_usbcd_driver ={. name = driver_name, //"s 1 r 72 v 17". bus = &platform_bus_type, . probe = s 1 r 72 xxx_usbc_probe, . remove = __exit_p(s 1 r 72 xxx_usbc_remove), . shutdown= s 1 r 72 xxx_usbc_shutdown, . suspend = s 1 r 72 xxx_usbc_suspend, . resume = s 1 r 72 xxx_usbc_resume, };
驱动程序注册 驱动程序的注册注销函数如下所示: int driver_register(struct device_driver *drv); void driver_unregister(struct device_driver *drv); 在luxun 9 USB Controller Driver 中通过下面的代码注 册了一个USB驱动程序: i. Retval = driver_register(&s 1 r 72 xxx_usbcd_driver);
driver_register()函数原型代码如下所示: int driver_register(struct device_driver * drv) { klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put); init_completion(&drv->unloaded); return bus_add_driver(drv); } 前面两个函数完成一些锁的初始化 作,最后的 bus_add_driver()函数用于向总线上添加驱动程 序。
- Slides: 16