摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。
关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB
一、Linux 设备驱动模型
Linux 设备驱动模型是理解和开发驱动的基石。它抽象了硬件设备的共性,为驱动程序提供统一的接口,简化了驱动开发的复杂度。
1.1 设备、驱动与总线
Linux 设备驱动模型的核心是设备(Device)、驱动(Driver) 和 总线(Bus) 三者的关系。
- 设备: 代表真实的物理设备,如 I2C 设备、SPI 设备、USB 设备等。
- 驱动: 是软件程序,负责管理和控制设备,实现设备的功能。
- 总线: 连接设备和驱动的桥梁,提供统一的接口规范,方便设备和驱动的匹配和通信。
1.2 kobject、kset 与子系统
- kobject: 内核对象,是驱动模型的基本单元,代表内核中的一个实体。
- kset: kobject 的集合,用于组织和管理 kobject。
- 子系统: kset 的更高层抽象,通常代表一个大的功能模块,如 I2C 子系统、SPI 子系统等。
二、Linux 内核模块开发基础
2.1 模块的结构
一个简单的内核模块代码结构如下:
#include <linux/module.h>
#include <linux/init.h>
static int __init my_module_init(void)
{
// 模块初始化代码
return 0;
}
static void __exit my_module_exit(void)
{
// 模块卸载代码
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Module Description");
2.2 编译和加载模块
- 编写Makefile:
obj-m := my_module.o
KDIR := /lib/modules/$(shell uname -r)/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
- 编译模块:
make
- 加载模块:
sudo insmod my_module.ko
- 查看模块:
lsmod
- 卸载模块:
sudo rmmod my_module
三、I2C 驱动开发实战
3.1 I2C 协议简介
I2C 是一种同步、半双工的通信协议,只有两根线:SDA(数据线) 和 SCL(时钟线)。每个连接到总线的器件都有唯一的 I2C 地址。
3.2 I2C 驱动框架
3.3 案例:读取 EEPROM 数据
以读取 AT24C02 EEPROM 数据为例,演示 I2C 驱动开发的基本流程。
1. 定义 I2C 设备结构体: