本文主要從驅動是什麼,為什麼要有驅動,以及怎麼寫一個驅動的三個角度出發,介紹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:

【NuttX】NuttX作業系統的驅動編寫

struct inode:

【NuttX】NuttX作業系統的驅動編寫

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驅動框架:

【NuttX】NuttX作業系統的驅動編寫

實驗現象:

透過hello on 以及 hello off 即可實現對led的控制

hello on LED亮

hello off LED滅

【NuttX】NuttX作業系統的驅動編寫

透過nsh終端輸入命令來控制LED

https://www。zhihu。com/video/1180625458336567296