學習韋東山視頻心得(三)

                  學習韋東山視頻心得(三)

I2C總線廣泛的用於各種傳感器中,僅僅通過SDA,SCL線實現了主機與設備之間的通信。Linux系統中I2C驅動較爲龐大。Linux系統中可以採用兩種方式實現I2C設備驅動,我們既可以把I2C設備當做普通的字符設備去操作,同時可以利用內核中龐大而錯綜複雜的框架。如果當做普通的字符設備,程序員只要把管腳模擬時序或者I2C控制器自己實現不採用內核框架,使得程序員不需去研究I2C設備驅動龐大的框架,但是,如此寫出來的驅動移植性跟單片機相差無幾,移植性能很差,優點是比較直截了當。如果採用內核驅動框架,系統比較龐大需要程序員對I2C驅動框架有一些瞭解。本設計採用Linux內核I2C驅動框架。

viewfile?f=66A91C2D59B9219710E547F38E426                                                                 

圖2.12 I2C驅動框架

I2C設備驅動有兩種組件:I2C-dev.c(通用組件),特定組件(例如:OV9650,lm75)對應於特定的設備驅動。如果是I2C-dev.c萬能接口,只創建了一個適配器類型i2c_adapter,只是註冊了一個主設備號,並沒有創建設備文件,但是在ioctl函數發送了從設備的地址,通過萬能接口調用核心層接口發送數據,然後才創建臨時的虛擬的設備文件,所以說,如果是走通用組件,只是構建了適配類型。如果走特定類型組件例如本設計中OV9650GT811電容觸摸屏,創建了i2c_client,創建設備文件。如圖2.12所示。

I2C驅動組要分爲三層,四個文件。設備驅動層(OV9650.c),核心層(I2C-core.c),總線驅動層(I2C-s3c2410.c),資源層(同一層次跟總線驅動層)dev-I2C0.c

1.I2C設備驅動層

I2C的設備驅動層中,其實相當於平臺設備機制的驅動層,構建i2c_driver,註冊i2c_driver,實現probe函數和操作方法,在probe函數中:獲取i2c_cilent,註冊主設備號,創建設備文件,註冊操作方法。

2.I2C核心層:在覈心層中提供了函數接口實現,然後封裝發送接收函數。

3.I2C總線驅動層

  由於採用平臺設備驅動機制實現,此層獲取平臺資源,實現了probe函數:獲取資源,初始哈硬件,使能時鐘,註冊中斷等等,然後構建了I2C_adapter,註冊了適配到I2C總線。最後掃描了板級信息鏈表,通過名字,如果匹配成功,創建設備文件。除此之外,在此層實現了發送數據和讀取數據的方法。

4.I2C資源層:包好基地址和大小,I2C中斷號。

5.I2C板級資源

I2C板級資源這一實現大大方便了I2C驅動移植,samsung公司的所有內核註冊平臺數據在smkdv210.c中。設置好I2C板級信息(從機地址和名字)在平臺設備大數組中註冊,最後在smdkV210_machine_init()函數中註冊到板級信息鏈表中。

2.1.4 GT811(觸摸屏)驅動

   GT811觸摸屏驅動是input子系統和I2C驅動的組合體。Gt811中主要是初始化觸摸屏,GT811調用I2C發送接口函數,配置寄存器或者從寄存器中讀取座標的值。在GT811驅動程序中:構建i2c_driver,註冊i2c_driver,實現probe函數。在probe函數中,獲取i2c_client,然後硬件初始化,包括中斷註冊,引腳初始化等。接着構建了input_dev,設置input_dev,並且註冊了input_dev。到此,我們可以看出GT811probe函數中構建了兩類設備,一是i2c_driver,二是input_dev,從中充分體現了其作爲I2C驅動和input子系統結合體的特性。下圖2.13所示,爲GT811驅動框架。

viewfile?f=66A91C2D59B9219710E547F38E426

圖2.13 GT811驅動構架

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章