platform 总线、设备与驱动

上传人:ldj****22 文档编号:28938718 上传时间:2018-01-21 格式:DOC 页数:6 大小:61KB
返回 下载 相关 举报
platform 总线、设备与驱动_第1页
第1页 / 共6页
platform 总线、设备与驱动_第2页
第2页 / 共6页
platform 总线、设备与驱动_第3页
第3页 / 共6页
platform 总线、设备与驱动_第4页
第4页 / 共6页
platform 总线、设备与驱动_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《platform 总线、设备与驱动》由会员分享,可在线阅读,更多相关《platform 总线、设备与驱动(6页珍藏版)》请在金锄头文库上搜索。

1、 platform 总线、设备与驱动 2013-09-04 17:38:36分类: LINUXLinux2.6 的设备驱动模型中,关心总线、设备和驱动 3 个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反,在系统每次注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。Linux 发明了一种虚拟的总线,称为 platform 总线,相应的设备称为platform_device,而驱动称为 platform_driver。platform_device 结构体:点击(此处)折叠或打开1. struct platform_device 2. const c

2、har * name;3. u32 id;4. struct device dev;5. u32 num_resources;6. struct resource * resource;7. ;platform_driver 结构体:点击(此处)折叠或打开1. struct platform_driver 2. int (*probe)(struct platform_device *);3. int (*remove)(struct platform_device *);4. void (*shutdown)(struct platform_device *);5. int (*suspen

3、d)(struct platform_device *, pm_message_t state);6. int (*suspend_late)(struct platform_device *, pm_message_t state);7. int (*resume_early)(struct platform_device *);8. int (*resume)(struct platform_device *);9. struct device_driver driver;10. ;系统中为 platform 总线定义了一个 bus_type 的实例 platform_bus_type:点

4、击(此处)折叠或打开1. struct bus_type platform_bus_type = 2. .name = platform,3. .dev_attrs = platform_dev_attrs,4. .match = platform_match,5. .uevent = platform_uevent,6. .suspend = platform_suspend,7. .suspend_late = platform_suspend_late,8. .resume_early = platform_resume_early,9. .resume = platform_resum

5、e,10. ;下面就以 2.6.22.6 内核和 DM9000 为例,介绍下 platform 总线、设备与驱动在代码中的实现,DM9000 驱动部分,依照嵌入式 Linux 应用开发完全手册进行配置,配置如下:archarmplat-s3c24xxcommon-smdk.c 文件中添加,对应的是platform_device 这个结构体:点击(此处)折叠或打开1. #include 2. 3. static struct resource s3c_dm9k_resource = 4. 0 = 5. .start = S3C2410_CS4, /ADDR2 = 0 ,发 送 地 址 时 使 用

6、 这 个 地 址6. .end = S3C2410_CS4 + 3,7. .flags = IORESOURCE_MEM,8. ,9. 1 = 10. .start = S3C2410_CS4 + 4, /ADDR2 = 1 ,发 送 数 据 时 使 用 这 个 地 址11. .end = S3C2410_CS4 + 4 + 3,12. .flags = IORESOURCE_MEM,13. ,14. 2 = 15. .start = IRQ_EINT7, /IRQ_DM900016. .end = IRQ_EINT7, /IRQ_DM900017. .flags = IORESOURCE_I

7、RQ,18. 19. 20. ;21. 22. static struct dm9000_plat_data s3c_dm9k_platdata = 23. .flags = DM9000_PLATF_16BITONLY, /数 据 总 线 宽 度 为 1624. ;25. 26. static struct platform_device s3c_device_dm9k = 27. .name = dm9000,28. .id = 0,29. .num_resources = ARRAY_SIZE(s3c_dm9k_resource),30. .resource = s3c_dm9k_res

8、ource,31. .dev = 32. .platform_data = &s3c_dm9k_platdata,33. 34. ;35. 36. 37. static struct platform_device _initdata *smdk_devs = 38. 39. &s3c_device_dm9k,40. ;那么很显然有 platform_device 就对应应该有个 platform_driver,其在dm9000.c 文件中:点击(此处)折叠或打开1. static struct platform_driver dm9000_driver = 2. .driver = 3. .

9、name = dm9000,4. .owner = THIS_MODULE,5. ,6. .probe = dm9000_probe,7. .remove = dm9000_drv_remove,8. .suspend = dm9000_drv_suspend,9. .resume = dm9000_drv_resume,10. ;那么具体去加载 platform_device 和 platform_driver 到函数是什么呢?在内核代码中可以找到:点击(此处)折叠或打开1. static int _init dm9000_init(void)2. 3. 4. return platform

10、_driver_register( /* search board andregister */5. 6. module_init(dm9000_init);7.8. void _init smdk_machine_init(void)9. 10. 11. platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs);12. 13. 有一点需要注明:对 platform_device 的定义通常是在 BSP 的板文件中实现,在板文件中,platform_device 归纳为一个数组,最终通过platform_add_devices(struct p

11、latform_device *devs, int num)函数统一注册。接下来就分析下 platform_device_register 和 platform_driver_register 这两个函数的流程:点击(此处)折叠或打开1. platform_device_register(devsi)2. platform_device_add(pdev);3. device_add(4. bus_add_device(dev) /将 设 备 加 载 到 总 线5. bus_attach_device(dev); /在 总 线 上 查 找 对 应 的 驱 动6. device_attach(d

12、ev);7. bus_for_each_drv(dev-bus, NULL, dev, _device_attach);8. while (drv = next_driver(&i) & !error)9. error = fn(drv, data); /fn _device_attach10. driver_probe_device(drv, dev);11. if (drv-bus-match & !drv-bus-match(dev, drv) 12. goto done;13. really_probe(dev, drv);14. drv-probe(dev);15. 16. 17. platform_driver_register(struct platform_driver *drv)18. drv-driver.bus = 19. driver_register(&drv-driver)20. bus_add_driver(drv);21. driver_attach(drv);22. bus_for_each_dev(drv-bus, NULL, drv, _driver_attach);23. while (dev = next_device(&i) & !error)24.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号