linux设备树与驱动的关系
⼀开接触设备树,我就不知道设备树与驱动的关系,设备树是在内核3.0以后才有的。不过3.0以前的和3.0以后的驱动其实变化不⼤。驱动的开发⽅法可以分为三种:传统⽅法,总线⽅法,设备树⽅法。
这篇⽂章围绕点亮⼀颗LED来说明这三种⽅法。
驱动流程分为5个部分:1、分配 2、设置 3、注册file_operation 4、⼊⼝ 5、出⼝
⼀、传统⽅法
传统⽅法就是简单粗暴⽅法,就是将IO设置,驱动放在同⼀个⽂件(drv.c)。
drv.c:定义引脚信息:
linux和安卓的关系drv.c:驱动中的open函数:
drv.c:驱动中的close函数:
drv.c:file_operations结构体:
为上层应⽤提供open(),write(),read(),close()
drv.c:⼊⼝函数-申请设备号,创建设备节点:
其中register_chrdev():申请设备号。
class_create():创建⼀个设备类。
device_create():创建⼀个设备节点,路径:/dev/led
drv.c:出⼝函数-注销设备,注销设备节点:
其中unregister_chrdev():通过主设备号,注销设备号
device_destroy():注销设备节点
class_destroy():注销设备类
传统⽅法的优点:操作简单
缺点:不易扩展,每次修改需要重新编译驱动。
⼆、总线⽅法
在kernel 3.0之前都是采⽤总线的⽅法实现驱动与设备之间的联系。把驱动跟设备分开。
其主要理解⼏个结构体:
①跟设备有关的结构体:struct platform_device{};
②跟驱动有关的结构体:struct platform_driver{};
还要理解其中包含的两个结构体:struct device_driver{}; struct platform_device_id{};
要记住⼀句话:在match的时候:优先匹配id_table的name,不匹配。再匹配driver的name
其中
dev.c:进⾏设备的引脚定义
dev.c:注册platform_device结构体
dev.c:⼊⼝函数-注册设备
dev.c:出⼝函数-注销设备
对于驱动来说,需要稍微修改⼀下:
drv.c:增加probe函数和remove函数,其中函数platform_get_resource()就是过去设备中资源,⽐如引脚定义。
drv.c :⼊⼝函数和出⼝函数的修改
platform总线中的match()函数是设备与驱动匹配的函数,我们看看这个函数的实现,就是匹配设备与驱动的名字⼀不⼀致。函数如下:
总线⽅法的优点:易扩展
缺点:代码冗余多,需要重新编译设备
三、设备树⽅法
在kernel 3.0以及之后的版本,都是采⽤设备树的⽅法实现驱动与设备之间的联系。将设备改为设备树实现,解决了总线⽅法中代码冗余多的问题。
设备树⽅法只需要在总线⽅法的基础上稍微修改⼀下。
dts:添加设备节点:
drv: probe修改,其中通过函数of_property_read_s32()获取设备树的资源。
总线⽅法的优点:易扩展,不需要重新编译(替换设备树),⽆冗余代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论