第五十五章设备树下的platform驱动编撰
上一章我们详尽的讲解了Linux下的驱动分离与分层linux网络分层,以及总线、设备和驱动这样的驱动框架。基于总线、设备和驱动这样的驱动框架linux网络分层,Linux内核提出来platform这个虚拟总线,相应的也有platform设备和platform驱动。上一章我们讲解了传统的、未采用设备树的platform设备和驱动编撰方式。最新的Linux内核早已支持了设备树,因而在设备树下怎样编撰platform驱动就变得尤为重要,本章我们就来学习一下怎样在设备树下编撰platform驱动。
55.1设备树下的platform驱动简介
platform驱动框架分为总线、设备和驱动,其中总线不须要我们这种驱动程序员去管理,这个是Linux内核提供的,我们在编撰驱动的时侯只要关注于设备和驱动的具体实现即可。在未设备树的Linux内核下,我们须要分别编撰并注册platform_device和platform_driver,分别代表设备和驱动。在使用设备树的时侯,设备的描述被放在了设备树中,因而platform_device就不须要我们去编撰了,我们只须要实现platform_driver即可。在编撰基于设备树的platform驱动的时侯我们须要注意一下几点:
1、在设备树中创建设备节点
毫无疑惑,肯定要先在设备树中创建设备节点来描述设备信息,重点是要设置好compatible属性的值,由于platform总线须要通过设备节点的compatible属性值来匹配驱动!这点要谨记。例如,我们可以编撰如下所示的设备节点来描述我们本章实验要用到的LED这个设备:
示例代码55.1.1gpioled设备节点
1gpioled{
2#address-cells=;
3#size-cells=;
4compatible="atkalpha-gpioled";
5pinctrl-names="default";
6pinctrl-0=;
7led-gpio=;
8status="okay";
9};
示例55.1.1中的gpioled节点似乎就是45.4.1.2小节中创建的gpioled设备节点,我们可以直接拿过来用。注意第4行的compatible属性值为"atkalpha-gpioled"linux操作系统下载,为此,我们一会在编撰platform驱动的时侯一定要设置of_match_table也有此值。
2、编写platform驱动的时侯要注意兼容属性
上一章早已详尽的讲解过了,在使用设备树的时侯platform驱动会通过of_match_table来保存兼容性值,也就是表明此驱动兼容什么设备。所以,of_match_table将会尤为重要,例如本解释器的platform驱动中platform_driver就可以根据如下所示设置:
示例代码55.1.2of_match_table匹配表的设置
1staticconststructof_device_idleds_of_match[]={
2{.compatible="atkalpha-gpioled"},/*兼容属性*/
3{/*Sentinel*/}
4};
5
6MODULE_DEVICE_TABLE(of,leds_of_match);
7
8staticstructplatform_driverleds_platform_driver={
9.driver={
10.name="imx6ul-led",
11.of_match_table=leds_of_match,
12},
13.probe=leds_probe,
14.remove=leds_remove,
15};
第1~4行,of_device_id表,也就是驱动的兼容表,是一个链表,每位链表元素为of_device_id类型。每位链表元素都是一个兼容属性,表示兼容的设备,一个驱动可以跟多个设备匹配。这儿我们仅仅匹配了一个设备,那就是55.1.1中创建的gpioled这个设备。第2行的compatible值为"atkalpha-gpioled",驱动中的compatible属性和设备中的compatible属性相匹配,因而驱动中对应的probe函数才会执行。注意第3行是一个空元素,在编撰of_device_id的时侯最后一个元素一定要为空!
第6行,通过MODULE_DEVICE_TABLE申明一下leds_of_match这个设备匹配表。
第11行redhat linux 9.0下载,设置platform_driver中的of_match_table匹配表为前面创建的leds_of_match,至此我们就设置好了platform驱动的匹配表了。
3、编写platform驱动
基于设备树的platform驱动和上一章无设备树的platform驱动基本一样,都是当驱动和设备匹配成功之后才会执行probe函数。我们须要在probe函数上面执行字符设备驱动那一套,当注销驱动模块的时侯remove函数都会执行,都是邯郸小异的。
55.2硬件原理图剖析
本章实验我们只使用到IMX6U-ALPHA开发板上的LED灯,为此实验硬件原理图参考8.3小节即可。
55.3实验程序编撰
本实验对应的类库路径为:开发板光碟->2、Linux驱动类库->18_dtsplatform。
本章实验我们编撰基于设备树的platform驱动,所以须要在设备树中添加设备节点,之后我们只须要编撰platform驱动即可。
55.3.1更改设备树文件
首先更改设备树文件,加上我们须要的设备信息,本章我们就使用到一个LED灯,因而可以直接使用45.4.1小节编撰的gpioled子节点即可,不须要在重复添加。
55.3.2platform驱动程序编撰
设备早已打算好了,接出来就要编撰相应的platform驱动了,新建名为"18_dtsplatform"的文件夹,之后在18_dtsplatform文件夹上面创建vscode工程,工作区命名为"dtsplatform"。新建名为leddriver.c的驱动文件,在leddriver.c中输入如下所示内容:
示例代码55.3.2.1leddriver.c文件代码段
1#include
2#include
3#include
4#include
5#include
6#include
7#include
8#include
9#include
10#include
11#include
12#include
13#include
14#include
15#include
16#include
17#include
18#include
19#include
20#include
21#include
22#include
23/***************************************************************