什么是驅(qū)動(dòng)?

在嵌入式開發(fā)中,驅(qū)動(dòng)(Driver) 是連接硬件設(shè)備操作系統(tǒng)或應(yīng)用程序之間的軟件橋梁。它是一段專門編寫的代碼,用于控制和管理特定的硬件外設(shè)(如傳感器、顯示屏、串口、網(wǎng)卡、攝像頭等),使上層軟件能夠以標(biāo)準(zhǔn)化的方式與硬件進(jìn)行通信。


一、什么是驅(qū)動(dòng)?

簡單定義:

驅(qū)動(dòng)是讓軟件“認(rèn)識(shí)”并“控制”硬件的程序。

類比理解:

想象你買了一個(gè)新的打印機(jī):

  • 打印機(jī)是硬件
  • 你的電腦操作系統(tǒng)(如 Linux、RTOS)本身“不認(rèn)識(shí)”這個(gè)打印機(jī)
  • 你需要安裝一個(gè)打印機(jī)驅(qū)動(dòng)程序
  • 安裝后,操作系統(tǒng)就知道如何發(fā)送數(shù)據(jù)、控制打印、獲取狀態(tài)

在嵌入式系統(tǒng)中,這個(gè)過程是一樣的,只不過驅(qū)動(dòng)通常直接編譯進(jìn)系統(tǒng)鏡像,而不是用戶后期安裝。


二、驅(qū)動(dòng)的作用(為什么需要驅(qū)動(dòng)?)

1. 屏蔽硬件差異,提供統(tǒng)一接口

不同的硬件廠商生產(chǎn)的同類設(shè)備(比如 I2C 溫度傳感器 TMP102 和 LM75)寄存器、通信時(shí)序可能不同。

驅(qū)動(dòng)的作用就是:

  • 對(duì)上層提供統(tǒng)一的 API(如 read_temperature()
  • 對(duì)下層處理具體的硬件細(xì)節(jié)(讀哪個(gè)寄存器、發(fā)什么命令)

這樣,應(yīng)用程序不需要關(guān)心用的是 TMP102 還是 LM75,只要調(diào)用同一個(gè)函數(shù)就行。

? 好處: 軟件可移植性強(qiáng),更換硬件時(shí)只需換驅(qū)動(dòng),不用改應(yīng)用。


2. 實(shí)現(xiàn)硬件初始化和配置

硬件上電后通常是“沉默”的,需要軟件進(jìn)行初始化才能工作。

例如一個(gè) LCD 顯示屏驅(qū)動(dòng)需要:

  • 配置電源引腳
  • 發(fā)送初始化命令序列(如設(shè)置分辨率、顏色格式)
  • 配置 DMA 或幀緩沖區(qū)
  • 啟動(dòng)顯示

這些復(fù)雜的操作都封裝在顯示驅(qū)動(dòng)中。


3. 處理中斷和異步事件

很多外設(shè)通過中斷通知 CPU 事件發(fā)生,比如:

  • 按鍵被按下
  • 串口收到數(shù)據(jù)
  • 觸摸屏有觸摸

驅(qū)動(dòng)負(fù)責(zé):

  • 注冊(cè)中斷處理函數(shù)(ISR)
  • 在中斷發(fā)生時(shí)讀取數(shù)據(jù)或狀態(tài)
  • 將數(shù)據(jù)傳遞給上層(如操作系統(tǒng)或應(yīng)用)

4. 管理硬件資源

驅(qū)動(dòng)需要安全地使用以下資源:

  • GPIO 引腳(控制高低電平)
  • I2C、SPI、UART 總線(通信)
  • 內(nèi)存映射寄存器(MMIO)
  • DMA 通道(高效傳輸大數(shù)據(jù))

驅(qū)動(dòng)確保這些資源不被多個(gè)程序同時(shí)占用,避免沖突。


5. 實(shí)現(xiàn)設(shè)備文件接口(在 Linux 中)

在嵌入式 Linux 系統(tǒng)中,驅(qū)動(dòng)通常會(huì)創(chuàng)建一個(gè)設(shè)備文件,如:

  • /dev/ttyS0 → 串口
  • /dev/i2c-1 → I2C 總線
  • /dev/input/event0 → 觸摸屏

應(yīng)用程序可以通過標(biāo)準(zhǔn)的 open()read()、write()、ioctl() 系統(tǒng)調(diào)用來操作硬件,就像操作文件一樣。

int fd = open("/dev/i2c-1", O_RDWR);
ioctl(fd, I2C_SLAVE, 0x48);  // 設(shè)置從機(jī)地址
read(fd, &temp, 2);          // 讀取溫度數(shù)據(jù)

這背后就是I2C 驅(qū)動(dòng)在工作。


三、驅(qū)動(dòng)的類型(常見分類)

類型 說明 示例
字符設(shè)備驅(qū)動(dòng) 按字節(jié)流訪問,無緩沖 UART、I2C、GPIO、ADC
塊設(shè)備驅(qū)動(dòng) 按塊讀寫,有緩存 SD卡、eMMC、NAND Flash
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng) 處理網(wǎng)絡(luò)數(shù)據(jù)包 以太網(wǎng)、Wi-Fi、CAN 總線
平臺(tái)驅(qū)動(dòng)(Platform Driver) 針對(duì) SoC 內(nèi)部外設(shè) 定時(shí)器、看門狗、DMA
設(shè)備樹綁定驅(qū)動(dòng) 通過設(shè)備樹(Device Tree)配置硬件 常見于 ARM Linux

四、驅(qū)動(dòng)在系統(tǒng)中的位置

+---------------------+
|     應(yīng)用程序         |  ← 使用標(biāo)準(zhǔn) API(如 read/write)
+---------------------+
|   操作系統(tǒng)(OS)      |  ← 提供系統(tǒng)調(diào)用接口
+---------------------+
|     驅(qū)動(dòng)程序(Driver) |  ← 直接操作硬件寄存器
+---------------------+
|     硬件(Hardware)   |  ← MCU、傳感器、顯示屏等
+---------------------+
  • 驅(qū)動(dòng)運(yùn)行在內(nèi)核態(tài)(Kernel Space),有權(quán)限直接訪問硬件
  • 應(yīng)用運(yùn)行在用戶態(tài)(User Space),通過系統(tǒng)調(diào)用間接使用硬件

五、為什么必須要有驅(qū)動(dòng)?

沒有驅(qū)動(dòng) 有驅(qū)動(dòng)
CPU 無法控制硬件 CPU 可以精確控制硬件
硬件無法工作 硬件正常運(yùn)行
軟件無法獲取數(shù)據(jù) 軟件可讀寫硬件數(shù)據(jù)
系統(tǒng)無法擴(kuò)展外設(shè) 可靈活添加新設(shè)備

?? 沒有驅(qū)動(dòng),硬件就是一堆廢鐵。


六、舉個(gè)實(shí)際例子:LED 驅(qū)動(dòng)

假設(shè)你有一個(gè) LED 連接到 GPIO 引腳:

// 沒有驅(qū)動(dòng):你需要直接操作寄存器(危險(xiǎn)且不可移植)
*((volatile uint32_t*)0x40020C00) |= (1 << 5);  // 直接寫寄存器點(diǎn)亮 LED

// 有驅(qū)動(dòng):使用標(biāo)準(zhǔn)接口
led_open();
led_on();  // 驅(qū)動(dòng)內(nèi)部處理寄存器操作

驅(qū)動(dòng)封裝了底層細(xì)節(jié),讓你只需調(diào)用 led_on() 就能點(diǎn)亮 LED,無論它接在哪個(gè)引腳、哪個(gè)芯片上。


總結(jié)

問題 回答
什么是驅(qū)動(dòng)? 控制硬件的軟件,是軟硬件之間的橋梁
為什么需要驅(qū)動(dòng)? 1. 統(tǒng)一接口
2. 初始化硬件
3. 處理中斷
4. 管理資源
5. 支持標(biāo)準(zhǔn) API
驅(qū)動(dòng)在哪運(yùn)行? 通常在內(nèi)核中(內(nèi)核態(tài))
誰寫驅(qū)動(dòng)? 嵌入式系統(tǒng)工程師、內(nèi)核開發(fā)者
沒有驅(qū)動(dòng)會(huì)怎樣? 硬件無法被軟件使用,形同虛設(shè)

? 一句話總結(jié):

驅(qū)動(dòng)是讓嵌入式系統(tǒng)“活”起來的關(guān)鍵——它讓冰冷的硬件聽懂了軟件的“語言”。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容