嵌入式Linux驱动开发——常见框架梳理

前言

本文主要介绍了Linux驱动开发中一些常用的驱动框架,platform、input、iic、spi等,硬件平台使用的是正点原子的imx6ull开发板。

一:Pinctrl子系统、Gpio子系统

不管什么框架最后都是要追溯到配置IO的电气属性和复用功能

嵌入式Linux驱动开发——常见框架梳理_第1张图片

嵌入式Linux驱动开发——常见框架梳理_第2张图片

如果要使用外部中断,设备树节点中还需添加相关信息,什么边沿触发

嵌入式Linux驱动开发——常见框架梳理_第3张图片

嵌入式Linux驱动开发——常见框架梳理_第4张图片

二:最简单字符驱动框架(不包含什么总线)

1:module_init和module_exit,驱动的入口和出口

嵌入式Linux驱动开发——常见框架梳理_第5张图片

2:习惯性构建一个结构体来管理相关资源(主次设备号、cdev、class、device、设备节点等)

嵌入式Linux驱动开发——常见框架梳理_第6张图片

3:file_operations结构体里面包含了该设备驱动的操作函数集合,可以按需进行实现

file_operations结构体的原型,里面都是一些函数指针

嵌入式Linux驱动开发——常见框架梳理_第7张图片

驱动实现部分操作函数 

嵌入式Linux驱动开发——常见框架梳理_第8张图片

嵌入式Linux驱动开发——常见框架梳理_第9张图片

4:init函数实现字符设备相关初始化

分配设备号、cdev_init、cdev_add、class_create、device_create

嵌入式Linux驱动开发——常见框架梳理_第10张图片

嵌入式Linux驱动开发——常见框架梳理_第11张图片

获取节点、获取gpio编号、申请gpio、设置输入输出模式

嵌入式Linux驱动开发——常见框架梳理_第12张图片

如果在某一过程申请资源失败要释放之前已经申请成功的资源

嵌入式Linux驱动开发——常见框架梳理_第13张图片

5:exit函数释放相关资源

嵌入式Linux驱动开发——常见框架梳理_第14张图片

三:定时器、中断配置

定时器和中断在驱动设备中要添加的内容

嵌入式Linux驱动开发——常见框架梳理_第15张图片 

定时器初始化

嵌入式Linux驱动开发——常见框架梳理_第16张图片

重新修改定时器计数,使得可以多次定时

嵌入式Linux驱动开发——常见框架梳理_第17张图片

外部中断

嵌入式Linux驱动开发——常见框架梳理_第18张图片

四:platform总线驱动框架

1:首先是module_init和module_exit,初始化一个platform_driver结构体,主要初始化匹配列表和probe、remove函数

嵌入式Linux驱动开发——常见框架梳理_第19张图片

嵌入式Linux驱动开发——常见框架梳理_第20张图片

驱动中对应的compatible字段

嵌入式Linux驱动开发——常见框架梳理_第21张图片

设备树中设备对应的compatible字段

嵌入式Linux驱动开发——常见框架梳理_第22张图片

当加载驱动后就会通过compatible字段查找,驱动和设备就可通过platform总线进行匹配。后面就和最简单没有总线的框架一样、其实就是套了一层皮。

五:MISC杂项驱动框架(主设备号是10)

大框架还是platform驱动框架,要添加一个miscdevice类型结构体

嵌入式Linux驱动开发——常见框架梳理_第23张图片

在probe中注册、remove中销毁,减少了分配设备号、cdev、class、device那繁琐的一套

嵌入式Linux驱动开发——常见框架梳理_第24张图片

嵌入式Linux驱动开发——常见框架梳理_第25张图片

六:INPUT(主设备都是13)子系统驱动框架

嵌入式Linux驱动开发——常见框架梳理_第26张图片

设备结构体中要添加一个输入设备

嵌入式Linux驱动开发——常见框架梳理_第27张图片

在init中申请和注册、exit中取消注册和释放

嵌入式Linux驱动开发——常见框架梳理_第28张图片

嵌入式Linux驱动开发——常见框架梳理_第29张图片

设置事件和值(type、code、value)

嵌入式Linux驱动开发——常见框架梳理_第30张图片

使用input_event函数上报事件

嵌入式Linux驱动开发——常见框架梳理_第31张图片

上报的数据可以使用hexdump观察

嵌入式Linux驱动开发——常见框架梳理_第32张图片

应用层可以使用一个input_event结构体变量来接收上报的数据

嵌入式Linux驱动开发——常见框架梳理_第33张图片

七:IIC驱动框架

首先module_init和module_exit,添加一个i2c_driver,对应init完成i2c_add_driver,exit中完成i2c_del_driver

嵌入式Linux驱动开发——常见框架梳理_第34张图片

嵌入式Linux驱动开发——常见框架梳理_第35张图片

同样的,设备和驱动匹配还是要靠compatible属性

嵌入式Linux驱动开发——常见框架梳理_第36张图片

 ​​​嵌入式Linux驱动开发——常见框架梳理_第37张图片

当设备树节点和驱动文件匹配之后,执行probe函数,会传入i2c_client类型的一个结构体指针,可以使用一个指针变量保存下来,当在i2c读写寄存器的时候会用得到。

嵌入式Linux驱动开发——常见框架梳理_第38张图片

设备中定义一个指针进行保存

嵌入式Linux驱动开发——常见框架梳理_第39张图片

嵌入式Linux驱动开发——常见框架梳理_第40张图片

I2C读数据

嵌入式Linux驱动开发——常见框架梳理_第41张图片

I2C写数据

嵌入式Linux驱动开发——常见框架梳理_第42张图片

八:SPI驱动框架

首先module_init和module_exit,创建一个spi_driver类型的结构体变量,init中spi_register_driver、exit中spi_unregister_driver

嵌入式Linux驱动开发——常见框架梳理_第43张图片

嵌入式Linux驱动开发——常见框架梳理_第44张图片

设备树相关信息

嵌入式Linux驱动开发——常见框架梳理_第45张图片

 ​​​​嵌入式Linux驱动开发——常见框架梳理_第46张图片

当执行到probe函数的时候会传入一个spi_device类型的结构体,像i2c驱动一样找一个变量存起来

嵌入式Linux驱动开发——常见框架梳理_第47张图片

设备中定义一个指针用来接收spi_device类型的指针

嵌入式Linux驱动开发——常见框架梳理_第48张图片

嵌入式Linux驱动开发——常见框架梳理_第49张图片

设置spi设备的工作模式

嵌入式Linux驱动开发——常见框架梳理_第50张图片

嵌入式Linux驱动开发——常见框架梳理_第51张图片

spi读写寄存器可以使用内核自带的spi_read和spi_write,其中都要传入类型为spi_device的参数,就是在调用probe传入的那个。

嵌入式Linux驱动开发——常见框架梳理_第52张图片

嵌入式Linux驱动开发——常见框架梳理_第53张图片

总结

以上只是对学习驱动这段时间的一个梳理和回顾,想系统学习可以阅读正点的教程。

你可能感兴趣的:(Linux,linux,驱动开发,运维,笔记,arm开发)