mr-library中的GPIO是怎么封裝的?完整拆解+實戰(zhàn)思路
MR 框架
(1)宏定義部分:模式操作封裝
#define PIN_MODE_SET(_pin, _number, _mode)
do {
MR_BIT_CLR((_pin)->pins[(_number) / 8], (0xf << (((_number) % 8) * 4)));
MR_BIT_SET((_pin)->pins[(_number) / 8], ((_mode) << (((_number) % 8) * 4)));
} while (0)#define PIN_MODE_GET(_pin, _number)
((int)(((_pin)->pins[(_number) / 8] >> (((_number) % 8) * 4)) & 0xf))
解讀:
使用 pins[] 來壓縮存儲每個 GPIO 引腳的模式值,每個引腳占用 4bit。
相當(dāng)于 8 個引腳共用一個 32 位整型單元。
SET/GET 宏本質(zhì)上是位操作技巧,屬于輕量級狀態(tài)映射機制,避免使用結(jié)構(gòu)體數(shù)組。
(2)內(nèi)部封裝接口:pin_set_mode() & pin_get_mode()
int pin_set_mode(struct mr_pin *pin, int number, struct mr_pin_config config)
校驗引腳編號合法性;
調(diào)用底層平臺實現(xiàn)的 configure() 函數(shù)進行實際模式配置;
再通過 PIN_MODE_SET 記錄設(shè)置狀態(tài)。
該函數(shù)不僅設(shè)置了底層硬件,還更新了上層狀態(tài)緩存,是對 狀態(tài)同步封裝 的經(jīng)典做法。
int pin_get_mode(struct mr_pin *pin, int number, struct mr_pin_config *config)
只讀取本地緩存的模式狀態(tài);
并未從底層硬件重新讀取,高效但不完全精準(zhǔn),需確保狀態(tài)同步一致。
(3)設(shè)備接口實現(xiàn)部分
int mr_pin_close(struct mr_dev *dev)
當(dāng)關(guān)閉設(shè)備時,自動將所有使用過的引腳設(shè)置為 NONE;
避免引腳懸空或占用;
條件編譯宏 MR_USING_PIN_AUTO_DISABLE 控制是否啟用自動 disable 功能;
使用 PIN_MODE_GET 查狀態(tài)再決定是否關(guān)閉該引腳。
這是一個安全性加強設(shè)計,有助于系統(tǒng)資源釋放。
ssize_t mr_pin_write(struct mr_dev *dev, const void *buf, size_t count)
與 read 對稱:寫入指定引腳的電平值;
仍基于 dev->position 表示當(dāng)前操作的引腳編號;
每個字節(jié)寫入一個值。
int mr_pin_ioctl(struct mr_dev *dev, int cmd, void *args)
是控制命令接口,支持動態(tài)配置與查詢模式:
MR_IOC_PIN_SET_MODE:設(shè)置某個引腳模式;
MR_IOC_PIN_GET_MODE:讀取某個引腳當(dāng)前模式;
本質(zhì)是平臺中對 GPIO 控制功能的“高級指令接口”;
具備通用擴展能力,未來可以支持如設(shè)置上拉、開漏、中斷等新指令。
ssize_t mr_pin_isr(struct mr_dev *dev, int event, void *args)
響應(yīng)中斷事件(如外部中斷 EXTI);
當(dāng)前僅實現(xiàn)了 MR_ISR_PIN_EXTI_INT,返回中斷引腳號;
可作為平臺中斷通知機制與上層事件處理系統(tǒng)之間的橋梁。
(4)注冊接口:mr_pin_register
int mr_pin_register(struct mr_pin *pin, const char *path, struct mr_drv *drv)
該函數(shù)將 pin 注冊到系統(tǒng)設(shè)備樹中;
使用的是 mr_dev_register(通用設(shè)備注冊函數(shù));
傳入統(tǒng)一的設(shè)備操作結(jié)構(gòu)體 ops;
注冊成功后還會調(diào)用 _mr_fast_pin_init(),進行引腳快速訪問初始化。
這是真正把引腳納入設(shè)備系統(tǒng)管理的入口函數(shù)。
(5)整體架構(gòu)總結(jié)圖示(邏輯調(diào)用流程)
+---------------------------+| 應(yīng)用層 |
| (調(diào)用 pin 讀寫函數(shù)) |
+------------+-------------+
|
v
+---------------------------+| mr_dev 操作接口 |
| mr_pin_read/write/ioctl |
+------------+-------------+
|
v
+---------------------------+| struct mr_pin_ops |
| -> read / write / config |
| (平臺相關(guān)的底層操作) |
+------------+-------------+
|
v
+---------------------------+| 硬件寄存器操作(HAL) |
+---------------------------+
總結(jié)亮點設(shè)計
特性 | 實現(xiàn)方式說明 |
模式管理高效 | pins[] 使用位操作壓縮記錄所有引腳模式,快速讀寫 |
安全性設(shè)計 | 配置合法性檢查、自動 disable、assert 保護 |
與設(shè)備框架深度整合 | 實現(xiàn)設(shè)備標(biāo)準(zhǔn)接口 read/write/ioctl/close |
抽象 + 多態(tài) | 所有操作通過 mr_pin_ops 實現(xiàn)平臺無關(guān) |
支持多引腳統(tǒng)一管理 | 通過 dev->position 定位目標(biāo)引腳,實現(xiàn)統(tǒng)一操作 |
可擴展 IOCTL 命令 | SET_MODE/GET_MODE 只是開始,可擴展為完整控制指令集 |
開源代碼:
https://gitee.com/MacRsh/mr-library/tree/master
評論