如何写一个Linux外设驱动?
1、编写外设驱动流程
该问题为基础问题,也是大家基本功的表现,下面一起来看一下吧
写一个常见的字符设备外设驱动,主要遵循以下流程:
-
了解硬件和接口:查看外设用户手册,了解该外设使用的是什么通信接口,
IIC
、SPI
、UART
等。 -
设备树配置:遵循设备树语法,在设备树中添加该外设的设备属性信息。
-
外设
driver
结构体配置:遵循Linux
驱动框架,创建外设driver
结构体,并设定相应的回调函数,包括probe
、remove
、外设driver
和device
的匹配规则id_table
,驱动名称等信息。 -
device
和driver
匹配:通过insmod
来将外设驱动加载到总线上,按照定义好的匹配规则,触发probe
函数。 -
probe
实现:创建字符设备,以供用户层使用。字符设备创建流程如下:-
分配字符设备的主设备号和次设备号,并为字符设备创建内存空间。
-
关联字符设备结构体与文件操作结构体
ops
,创建open
、read
、write
函数 -
添加字符设备到虚拟文件系统中,包括:
profs
和sysfs
-
将外设驱动注册进入子系统中,实现统一管理。
-
-
完善文件操作接口:
open
、read
、write
为暴漏在用户层的文件操作接口,我们一般通过该接口实现对外设的功能操作。-
open
函数:一般用于初始化外设 -
read
函数:一般用于用户层读取外设信息,通过调用copy_to_user
将数据搬运到用户空间 -
write
函数:一般用于用户层向外设写入数据,通过调用copy_from_user
将用户数据搬运到内核层。
-
-
卸载驱动:
rmmod
驱动后,会调用remove
接口负责卸载驱动,包括:sysfs
、profs
的节点删除,字符设备结构体的注销,外设驱动结构体的注销。
以上就是一个简单的外设驱动的编写流程,示例外设驱动程序以及更多嵌入式知识可以看这里:
2、常见问题
Q
:设备编号的分配方式有哪些?
A
:设备号的分配方式主要有两种:动态分配和静态分配。
-
动态分配:系统自动为其分配一个未被占用的设备号
-
静态分配:自行定义设备号,注册进入系统中。
Q
:主设备号和次设备号有什么意义?
A
:设备号是用来标识设备的关键信息,主设备号用于标识设备的类型,次设备号用于区分同类型的不同设备。
Q
:设备树匹配方式有哪些?
A
:device
和driver
匹配方式有4种,如下:
-
设备树(OF)匹配方式:通过设备树中的
compatible
属性匹配 -
ACPI匹配方式:
ACPI(Advanced Configuration and Power Interface)
,通过设备ID
编号和驱动ID
编号来匹配 -
ID Table匹配方式:驱动提供
ID Table
,设备提供一个ID
变量进行匹配 -
Name匹配方式:通过比较设备名称和驱动名称来进行匹配。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)