一、Linux驱动的分离与分层
1、驱动的分离
对于Linux 这样一个成熟、庞大、复杂的操作系统,代码的重用性非常重要,否则的话就 会在 Linux 内核中存在大量无意义的重复代码。尤其是驱动程序,因为驱动程序占用了 Linux 内核代码量的大头,如果不对驱动程序加以管理,任由重复的代码肆意增加,那么用不了多久 Linux 内核的文件数量就庞大到无法接受的地步。
假如现在有三个平台 A、B 和 C,这三个平台(这里的平台说的是 SOC)上都有 MPU6050 这 个 I2C 接口的六轴传感器,按照我们写裸机 I2C 驱动的时候的思路,每个平台都有一个MPU6050 的驱动,因此编写出来的最简单的驱动框架如图 54.1.1 所示:



2、驱动的分层
二、平台驱动模型
1、platform总线
match 函数很重要,单词 match 的意思就是“匹配、相配”,因此此函数就是完成设备和驱动之间匹配的,总线就是使用 match 函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数match 函数有两个参数: dev 和 drv,这两个参数分别为 device 和 device_driver 类型,也就是设备和驱动。
platform 总线是 bus_type 的一个具体实例,platform总线定义如下:
在platform平台总线匹配函数中,有四种匹配方式:
1)、OF 类型的匹配
此成员变量保存着驱动的compatible匹配表,设备树中的每个设备节点的 compatible 属性会和 of_match_table 表中的所有成员比较,查看是否有相同的条目,如果有的话就表示设备和此驱动匹配,设备和驱动匹配成功以后,驱动的 probe 函数就会执行。
2)、ACPI匹配
3)、id_table匹配
4)、 strcmp比较名字
struct platform_device设备结构体如下:
struct platform_driver结构体如下:
2、 platform驱动
总线数据类型为:bus_type。向内核注册总线使用bus_register。
向linux内核注册总线,使用bus_register函数。bus_unregister函数卸载。
总线主要工作就是完成总线下的设备和驱动之间的匹配。
驱动数据类型为device_driver,驱动程序向内核注册驱动采用driver_register。
驱动和设备匹配以后驱动里面的probe函数就会执行。使用driver_register注册驱动。
向总线注册驱动的时候,会检查当前总线下的所有设备,有没有与此驱动匹配的设备,如果有的话就执行驱动里面的probe函数。
1)、platform驱动表示
probe 函数,当驱动与设备匹配成功以后 probe 函数就会执行,非常重要的函数!!一般驱动的提供者会编写,如果自己要编写一个全新的驱动,那么 probe 就需要自行实现
driver成员,为device_driver结构体变量, Linux 内核里面大量使用到了面向对象的思维,device_driver 相当于基类,提供了最基础的驱动框架。 plaform_driver 继承了这个基类,然后在此基础上又添加了一些特有的成员变量。
id_table 表,也就是我们前面讲解 platform总线匹配驱动和设备的时候采用的第三种方法,id_table是个表(也就是数组) 每个元素的类型为platform_device_id,platform_device_id结构体内容如下:
2)、platform驱动框架
当我们定义并初始化好 platform_driver 结构体变量以后,需要在驱动入口函数里面调用platform_driver_register 函数向 Linux 内核注册一个platform驱动, platform_driver_register 函数原型如下所示:
还需要在驱动卸载函数中通过platform_driver_unregister函数卸载 platform 驱动,platform_driver_unregister 函数原型如下:
platform 驱动框架如下所示:
3、platform设备
1)、无设备树情况
根据前面的分析,驱动和设备匹配是通过bus->match函数,platform总线下的match函数就是:platform_match。
resource 表示资源,也就是设备信息,比如外设寄存器等。 Linux 内核使用 resource结构体表示资源, resource 结构体内容如下:
platform 驱动框架如下所示:
2)、有设备树情况
有设备树的时候:
②、编写 platform 驱动的时候要注意兼容属性
在使用设备树的时候 platform 驱动会通过 of_match_table 来保存兼容性值,也就是表明此驱动兼容哪些设备。所以, of_match_table 将会尤为重要,比如我们要编写led灯的platform 驱动,platform_driver 就可以按照如下所示设置:
========================
点灯设备代码leddevice.c编写
===============================
驱动代码编写leddriver.c
===========================
应用层代码编写
到此这篇linux驱动开发的人越来越少(linux驱动开发入门与实战)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/goyykf/59483.html