1. Linux设备驱动开发入门:从零编写LED控制驱动
在嵌入式Linux开发中,设备驱动是连接硬件和操作系统的关键桥梁。作为一名长期从事Linux底层开发的工程师,我经常需要为各种外设编写驱动程序。今天,我将以最常见的LED控制为例,带你完整走一遍字符设备驱动的开发流程。这个案例虽然简单,但涵盖了驱动开发的所有核心要素,包括设备号管理、文件操作接口实现、内核模块加载等关键技术点。
为什么需要设备驱动?简单来说,Linux系统运行在保护模式下,用户空间的应用程序无法直接访问硬件寄存器。驱动的作用就是为应用层提供标准化的设备访问接口(如open/read/write等),同时完成对硬件的直接操作。以LED为例,通过编写驱动,我们可以在用户空间用简单的文件操作命令(如echo "ledon" > /dev/led)来控制硬件LED的亮灭。
2. 设备驱动基础概念解析
2.1 设备驱动的三大类型
Linux系统将设备驱动分为三大类,每种类型对应不同的硬件特性和访问方式:
-
字符设备(Character Device):数据以字节流形式顺序访问,是最常见的驱动类型。典型例子包括:
- 串口设备(/dev/ttyS*)
- 键盘(/dev/input/*)
- 我们即将实现的LED设备
-
块设备(Block Device):数据按固定大小的块随机访问,主要用于存储设备。特点是:
- 支持缓存机制
- 典型的如硬盘(/dev/sda)、U盘(/dev/sdb)
- 文件系统通常建立在块设备上
-
网络设备(Network Interface):面向数据包的设备,没有对应的设备文件,通过套接字API访问。特点包括:
- 通常以eth0、wlan0等名称管理
- 实现完整的网络协议栈
- 如网卡、WiFi模块等
2.2 设备号:主设备号与次设备号
在Linux设备模型中,每个设备都有一个唯一的设备号(dev_t),由两部分组成:
code复制主设备号(12位) | 次设备号(20位)
-
主设备号:标识设备类型,对应特定的驱动。例如:
- 3 - IDE控制器
- 4 - 串口设备
- 250-254 - 动态分配区域
-
次设备号
