Linux设备驱动模型3——platform平台总线工作原理
来源:互联网 发布:俄罗斯知乎 编辑:程序博客网 时间:2024/06/07 02:07
以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。
四、platform平台总线工作原理1
1、何为平台总线?
(1)属于总线中的一种,相对于usb、pci、i2c等物理总线来说,platform总线是虚拟的、抽象出来的。
(2)CPU与外部通信的2种方式:地址总线式连接和专用接口式连接(比如nand和cpu的连接)。
- 平台总线对应地址总线式连接设备(也就是SoC内部集成的各种内部外设)。
(3)思考:为什么要有平台总线?
- 为了管理上的方便和统一。
2、平台总线下管理的2员大将
(1)platform工作体系都定义在drivers/base/platform.c中。
(2)两个结构体:platform_device和platform_driver。
struct platform_device{const char * name; // 平台总线下设备的名字int id;struct device dev; // 所有设备通用的属性部分u32 num_resources;// 设备使用到的resource(IO或者中断号等)的个数struct resource* resource;// 设备使用到的资源数组的首地址const struct platform_device_id* id_entry;// 设备ID表,很多个类似的同系列的产品,可以用同一个驱动/* arch specific additions */struct pdev_archdata archdata;// 自留地,用来提供扩展性的};
struct platform_driver {int (*probe) (struct platform_device *);// 驱动探测函数int (*remove) (struct platform_device *);// 去掉一个设备void (*shutdown)(struct platform_device *);// 关闭一个设备int (*suspend) (struct platform_device *, pm_message_t state);//挂起int (*resume) (struct platform_device *);//唤醒struct device_driver driver;// 所有设备共用的一些属性const struct platform_device_id *id_table;// 设备ID表};
(3)两个接口函数
- platform_device_register(但好像一般不使用这个,而是使用platform_driver_register中的probe函数?),用来注册设备。
- platform_driver_register,用来注册驱动。
五、platform平台总线工作原理2
1、平台总线体系的工作流程
(1)第一步:系统启动时,在bus系统中注册platform;(使得在/sys/bus/目录有platform)
(2)第二步:内核移植(把硬件的信息写到软件里)的人负责提供platform_device;(即提供板文件,文件里有设备信息。比如Mach-x210.c)
(3)第三步:写驱动的人负责提供platform_driver;(主要是填充结构体并register)
(4)第四步:platform的match函数发现driver和device匹配后(通过name来匹配),调用driver的probe函数来完成驱动的初始化和安装,然后设备就工作起来了。(这个是自动的)
2、代码分析:platform本身注册
(1)每种总线(不光是platform,usb、i2c那些也是)都会带一个match方法,用来对总线下的device和driver进行匹配。
- 理论上每种总线的匹配算法是不同的,但是实际上一般都是看name的。
(2)platform_match函数就是平台总线的匹配方法。
- 如果有id_table,则说明驱动可能支持多个设备;
- 这时候要去对比id_table中所有的name,只要找到一个相同的就匹配上了不再找了,如果找完id_table都还没找到就说明没有匹配上。
- 如果没有id_table或者没有匹配上,那就直接对比device和driver的name,如果还没匹配上那就匹配失败。
(3)完成了第一步。下面完成第二第三步。
六、platform平台总线工作原理3
1、platform设备和驱动的注册过程(参考leds-s3c24xx.c文件)
(1)platform_driver_register,驱动部分:
(2)platform_device_register,设备部分
- 如何找设备部分?即在板文件定义的设备信息?
- 通过名字,即搜索名字。举个例子如下(某个设备的信息):
- 众多设备组成一个数组,然后逐个注册。(不能有一个出错!)
- 对于linux2.6 arm平台而言,对platform_device的定义通常在bsp的板文件中实现。板文件将设备归纳为一个数组,最终通过platform_add_devices()函数统一注册
2、platform_data怎么玩
- platform_data其实就是设备注册时提供的、与设备有关的一些数据(譬如设备对应的gpio、使用到的中断号、设备名称……);
- 这些数据在设备和驱动match之后,会由设备方转给驱动方(probe的第一句代码)。驱动拿到这些数据后,通过这些数据得知设备的具体信息,然后来操作设备。
- 这样做的好处是:驱动源码中不携带数据,只负责算法(对硬件的操作方法)。
- 现代驱动设计理念就是算法和数据分离,这样最大程度保持驱动的独立性和适应性。
- 注意:leds-s3c24xx是驱动文件,是不会有设备信息的,设备信息在板文件中定义。
3、match函数的调用轨迹
4、probe函数的功能和意义
- Linux设备驱动模型3——platform平台总线工作原理
- LINUX设备驱动模型之PLATFORM(平台)总线详解
- Linux设备驱动模型之platform(平台)总线详解
- Linux设备驱动模型之platform总线
- Linux设备驱动模型之platform总线
- Linux设备驱动模型之platform总线
- linux驱动platform平台设备总线
- Linux设备驱动模型4——平台总线实践
- linux设备总线驱动模型 之 platform总线驱动
- linux设备总线驱动模型 之 platform总线驱动
- linux设备总线驱动模型 之 platform总线驱动
- Linux学习:platform平台总线、平台设备、平台驱动
- 总线设备驱动模型——platform篇
- 总线设备驱动模型---platform
- linux设备驱动模型——总线、设备、设备驱动
- Linux平台总线驱动设备模型
- Linux平台总线驱动设备模型
- Linux平台总线驱动设备模型
- JAVA微信扫码支付模式二功能实现以及回调
- 机器学习中导数最优化方法
- shiro MD5
- 存储过程简单实例
- 微信小程序页面间的通信
- Linux设备驱动模型3——platform平台总线工作原理
- synergy1.4.10配置
- HDU1372 Knight Moves (BFS)
- 一起来讨论讨论Java多线程技术-20170716
- Toast和menu的用法
- [分享]常用的链接
- JavaScript学习(四)
- 考试程序 DAY3 T3
- python opencv运动检测