【NuttX】NuttX作業系統的驅動編寫
本文主要從驅動是什麼,為什麼要有驅動,以及怎麼寫一個驅動的三個角度出發,介紹NuttX作業系統的驅動程式。
1 什麼是驅動?
驅動是讓硬體(可理解為裝置)正常工作,並將裝置的資料接入至OS中,以便於應用開發所用的程式。
不同的裝置有不同的驅動,原因在於裝置的型號,作用,適用條件,通訊介面都不盡相同。
而OS則提供了現有的驅動模型,抽象了不同實體的驅動,以便於統一管理。
NuttX的驅動大概分為三類:
1) 字元驅動
比如串列埠裝置、觸控式螢幕裝置、ADC/DAC、PWM、CAN、正交編碼器、Timer、RTC、Watchdog、Keyboard/Keypad等
2) 塊裝置驅動
3) 特殊裝置驅動
比如Ethernet、SPI、I2C、Frame Buffer、LCD、MTD、SDIO、USB等
2 為什麼要有驅動?
一是使硬體裝置工作,二是接入OS介面中,為應用程式(APP)所用。起著中間層的作用,乘上服務於應用程式,啟下作用於硬體裝置。
3 怎麼寫驅動?
總體來說,Nuttx中的驅動機制相對來說比較簡單,它並沒有提供像Linux系統那樣複雜的驅動模型機制,比如Device、Driver、Bus、Class等。Nuttx只是簡單的透過驅動註冊介面,將驅動註冊進檔案系統中,並實現
file_operations
操作函式集,上層應用便能透過標準的系統呼叫,進而呼叫到低層的驅動。而底層的驅動又分為了上半部分(upper_half)和下半部分(lower_half)。
以字元驅動為例,編寫led驅動。取名myled。
不管是簡單的led,還是複雜的裝置,其本質可以理解為通訊匯流排+裝置功能。
通訊匯流排有GPIO,SPI,IIC,USB,CAN等
裝置功能有感測器,量測,儲存等
主要資料結構:
struct file_operations:
struct inode:
struct file_operations這個函式集,由低層的驅動來實現,並且設定進裝置檔案對應的
inode
中,當系統呼叫操作裝置檔案時,便能根據裝置檔案對應的
inode
來找到對應的函數了。
struct inode描述了每個裝置節點的位置與資料。
主要函式介面:
int register_driver(FAR const char *path, FAR const struct file_operations *fops,
mode_t mode, FAR void *priv)
這個介面完成以下幾個操作:
根據
path
(一般對應裝置檔案,比如
/dev/xxxx
),來查詢是否存在對應的
inode
,如果沒有的話,那為
path
建立一個
inode
;
將實際驅動實現的
struct file_operations fops
更新到
path
對應的
inode
中,此外還設定許可權;
將
priv
資料設定進
inode
中,這個一般存放驅動的私有資料。
myled驅動框架:
實驗現象:
透過hello on 以及 hello off 即可實現對led的控制
hello on LED亮
hello off LED滅
透過nsh終端輸入命令來控制LED
https://www。zhihu。com/video/1180625458336567296