linux中的Platform总线是虚拟总线,它把驱动和设备的注册都分开来,对于他们的牵红线(匹配)过程,提供了“总线-设备-驱动”模型。
它的结构如下图所示:
为什么要这么做?
试想,如果设备和驱动不分开,那么不同设备将会产生大量驱动(代码冗余),而且维护起来工作量很大。
Platform模型则把稳定不变的部分放在driver,把尽量可变需要设置的部分放到device端,并且两边分别注册管理。
这样做有如下好处:
平台设备都挂在一条Platform总线上 设备和驱动代码隔离,可移植性和扩展性强 适用范围适用于可选的平台资源,例如灯、按键、LCD等
常用API注册设备
int platform_device_register(struct platform_device *pdev);
注销设备
voID platform_device_unregister(struct platform_device *pdev);
注册驱动
int platform_driver_register(struct platform_driver *drv);
注销驱动
voID platform_driver_unregister(struct platform_driver *drv);
获取平台资源
struct resource *platform_get_resource(struct platform_device *dev,unsigned int type,unsigned int num);int platform_get_irq(struct platform_device *dev,unsigned int num);struct resource *platform_get_resource_byname(struct platform_device *dev,const char *name);int platform_get_irq_byname(struct platform_device *dev,const char *name);基本使用
设备端注册
1 /************************ arch/xxx/xxx_platform.c ************************/ 2 static voID device_release(struct device *dev) 3 { 4 } 5 6 static struct resource xxx_res[]={ 7 [0]={ 8 .start = 11, 9 .end = 22,10 .flags = IORESOURCE_MEM,11 },12 [1]={13 .start = 33,14 .end = 44,15 .flags = IORESOURCE_IRQ,16 },17 };18 19 struct platform_device xxx_device = {20 .ID = -1,21 .name = "xxx_device"22 .resource = xxx_res,23 .num_resources = ARRAY_SIZE(xxx_res);24 .dev = {25 .release = device_release,/* 一般要有改函数,否则驱动卸载会异常 */26 },27 };28 29 static int __init xxx_platform_init(voID)30 {31 return platform_device_register(&xxx_device);32 }33 34 static voID __exit xxx_platform_exit(voID)35 {36 platform_device_unregister(&xxx_device);37 }38 39 module_init(xxx_platform_init);40 module_exit(xxx_platform_exit);
驱动注册
1 /************************ driver/xxx/xxx_driver.c ************************/ 2 static int driver_probe(struct platform_device *dev) 3 { 4 struct resource * res = platform_get_resource(dev,IORESOURCE_MEM,0); 5 ... 6 res=platform_get_resource(dev,IORESOURCE_IRQ,0); 7 ... 8 return 0; 9 }10 11 static int driver_remove(struct platform_device *dev)12 {13 return 0;14 }15 16 static sturct platform_driver xxx_driver = {17 .probe = driver_probe,18 .remove = driver_remove,19 .driver = {20 .name = "xxx_device"21 },22 };23 24 static int __init xxx_driver_init(voID)25 {26 return platform_driver_register(&xxx_driver);27 }28 29 static voID __exit xxx_driver_exit(voID)30 {31 platform_driver_unregister(&xxx_driver);32 }33 34 module_init(xxx_driver_init);35 module_exit(xxx_driver_exit);
实现原理
TBD
总结以上是内存溢出为你收集整理的Linux平台驱动设备总线模型全部内容,希望文章能够帮你解决Linux平台驱动设备总线模型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)