天天看點

Linux驅動開發-03-驅動程式的設計思想

1. 說明

簡單介紹一下linux驅動設計的思想發展

2. 從一個裝置說起

在誇誇其談之前,先看下I2C裝置的結構。圖摘自韋東山大大的《嵌入式linux應用開發完全手冊》

Linux驅動開發-03-驅動程式的設計思想

80C51裡有一個I2C控制器,其實也就是一組寄存器,用來控制I2C的資料線和信号線上的信号(高低電平)。

I2C裝置就是挂載I2C總線的裝置,或者說負載,比如RAM PCF8570,比如EEPROM AT24C02等

這裡可以看到I2C控制器和CPU直接相連,可以認為是CPU的裝置,EEPROM是I2C的裝置,完整的I2C程式就要包括驅動I2C控制器(用來産生信号)的驅動程式,和I2C裝置(如EEPROM)的驅動程式。

3. 驅動的設計思想

3.1 裝置模型之前

下面來說驅動程式的設計思想,先從最簡單的情況說起。一些簡單的驅動程式,比如globalmem(宋寶華《Linux 裝置驅動開發詳解》中的示例裝置),不像前面說的I2C結構那麼複雜,隻用按部就班實作就行了。裝置資訊(全局記憶體的位址)在驅動中直接編碼,驅動也隻适配這一個裝置,但是一旦回過頭想,隐隐覺得這樣寫是不好的:裝置資訊寫死,驅動程式不能通用,要是一個驅動能給多個globalmem使用就好了。

3.2 裝置模型提出

核心在2.6提出了裝置模型(裝置-總線-驅動)來實作裝置驅動分層,同時形成裝置連結清單、驅動連結清單。這顯然是使用了分層和面向對象思想。裝置是一個對象,驅動是一個對象,認為裝置是挂載總線上的,總線也是一個對象。

因為不是所有的裝置都挂載總線上的,比如I2C的控制器、USB控制器等,它是直接內建在SOC中和CPU直接相連的。為了統一裝置模型,就提出了一個虛拟總線-平台總線(platform),相應的I2C控制器就成為platform_device。

這樣globalmem裝置就成為platform_device,globalmem驅動就成為platform_driver,兩者的比對通過總線的platform_match函數來比對——當然需要驅動和裝置的有一緻的資訊(比如name)。

3.3 裝置樹

繼續閱讀