什么是驱动?

在嵌入式开发中,驱动(Driver) 是连接硬件设备操作系统或应用程序之间的软件桥梁。它是一段专门编写的代码,用于控制和管理特定的硬件外设(如传感器、显示屏、串口、网卡、摄像头等),使上层软件能够以标准化的方式与硬件进行通信。


一、什么是驱动?

简单定义:

驱动是让软件“认识”并“控制”硬件的程序。

类比理解:

想象你买了一个新的打印机:

  • 打印机是硬件
  • 你的电脑操作系统(如 Linux、RTOS)本身“不认识”这个打印机
  • 你需要安装一个打印机驱动程序
  • 安装后,操作系统就知道如何发送数据、控制打印、获取状态

在嵌入式系统中,这个过程是一样的,只不过驱动通常直接编译进系统镜像,而不是用户后期安装。


二、驱动的作用(为什么需要驱动?)

1. 屏蔽硬件差异,提供统一接口

不同的硬件厂商生产的同类设备(比如 I2C 温度传感器 TMP102 和 LM75)寄存器、通信时序可能不同。

驱动的作用就是:

  • 对上层提供统一的 API(如 read_temperature()
  • 对下层处理具体的硬件细节(读哪个寄存器、发什么命令)

这样,应用程序不需要关心用的是 TMP102 还是 LM75,只要调用同一个函数就行。

好处: 软件可移植性强,更换硬件时只需换驱动,不用改应用。


2. 实现硬件初始化和配置

硬件上电后通常是“沉默”的,需要软件进行初始化才能工作。

例如一个 LCD 显示屏驱动需要:

  • 配置电源引脚
  • 发送初始化命令序列(如设置分辨率、颜色格式)
  • 配置 DMA 或帧缓冲区
  • 启动显示

这些复杂的操作都封装在显示驱动中。


3. 处理中断和异步事件

很多外设通过中断通知 CPU 事件发生,比如:

  • 按键被按下
  • 串口收到数据
  • 触摸屏有触摸

驱动负责:

  • 注册中断处理函数(ISR)
  • 在中断发生时读取数据或状态
  • 将数据传递给上层(如操作系统或应用)

4. 管理硬件资源

驱动需要安全地使用以下资源:

  • GPIO 引脚(控制高低电平)
  • I2C、SPI、UART 总线(通信)
  • 内存映射寄存器(MMIO)
  • DMA 通道(高效传输大数据)

驱动确保这些资源不被多个程序同时占用,避免冲突。


5. 实现设备文件接口(在 Linux 中)

在嵌入式 Linux 系统中,驱动通常会创建一个设备文件,如:

  • /dev/ttyS0 → 串口
  • /dev/i2c-1 → I2C 总线
  • /dev/input/event0 → 触摸屏

应用程序可以通过标准的 open()read()write()ioctl() 系统调用来操作硬件,就像操作文件一样。

int fd = open("/dev/i2c-1", O_RDWR);
ioctl(fd, I2C_SLAVE, 0x48);  // 设置从机地址
read(fd, &temp, 2);          // 读取温度数据

这背后就是I2C 驱动在工作。


三、驱动的类型(常见分类)

类型 说明 示例
字符设备驱动 按字节流访问,无缓冲 UART、I2C、GPIO、ADC
块设备驱动 按块读写,有缓存 SD卡、eMMC、NAND Flash
网络设备驱动 处理网络数据包 以太网、Wi-Fi、CAN 总线
平台驱动(Platform Driver) 针对 SoC 内部外设 定时器、看门狗、DMA
设备树绑定驱动 通过设备树(Device Tree)配置硬件 常见于 ARM Linux

四、驱动在系统中的位置

+---------------------+
|     应用程序         |  ← 使用标准 API(如 read/write)
+---------------------+
|   操作系统(OS)      |  ← 提供系统调用接口
+---------------------+
|     驱动程序(Driver) |  ← 直接操作硬件寄存器
+---------------------+
|     硬件(Hardware)   |  ← MCU、传感器、显示屏等
+---------------------+
  • 驱动运行在内核态(Kernel Space),有权限直接访问硬件
  • 应用运行在用户态(User Space),通过系统调用间接使用硬件

五、为什么必须要有驱动?

没有驱动 有驱动
CPU 无法控制硬件 CPU 可以精确控制硬件
硬件无法工作 硬件正常运行
软件无法获取数据 软件可读写硬件数据
系统无法扩展外设 可灵活添加新设备

💡 没有驱动,硬件就是一堆废铁。


六、举个实际例子:LED 驱动

假设你有一个 LED 连接到 GPIO 引脚:

// 没有驱动:你需要直接操作寄存器(危险且不可移植)
*((volatile uint32_t*)0x40020C00) |= (1 << 5);  // 直接写寄存器点亮 LED

// 有驱动:使用标准接口
led_open();
led_on();  // 驱动内部处理寄存器操作

驱动封装了底层细节,让你只需调用 led_on() 就能点亮 LED,无论它接在哪个引脚、哪个芯片上。


总结

问题 回答
什么是驱动? 控制硬件的软件,是软硬件之间的桥梁
为什么需要驱动? 1. 统一接口
2. 初始化硬件
3. 处理中断
4. 管理资源
5. 支持标准 API
驱动在哪运行? 通常在内核中(内核态)
谁写驱动? 嵌入式系统工程师、内核开发者
没有驱动会怎样? 硬件无法被软件使用,形同虚设

一句话总结:

驱动是让嵌入式系统“活”起来的关键——它让冰冷的硬件听懂了软件的“语言”。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容