Linux平台驱动设备总线模型

Linux平台驱动设备总线模型,第1张

概述Linux中的Platform总线是虚拟总线,它把驱动和设备的注册都分开来,对于他们的牵红线(匹配)过程,提供了“总线-设备-驱动”模型。 它的结构如下图所示:   为什么要这么做? 试想,如果设备和驱动不分开,那么不同设备将会产生大量驱动(代码冗余),而且维护起来工作量很大。 Platform模型则把稳定不变的部分放在driver,把尽量可变需要设置的部分放到device端,并且两边分别注册管理

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平台驱动设备总线模型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1031031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存