Linux I2C裝置驅動學習

2021-06-12 17:00:32 字數 4141 閱讀 1278

一、i2c 簡介

1、i2c簡介:

a)優點:i2c匯流排僅用兩根訊號線(scl、sda)就實現了裝置之間的資料互動,極大簡化了對硬體資源和pcb板佈線空間的占用;

b)用途:eeprom、實時鐘、小型lcd等裝置與cpu的介面中;

2、i2c驅動體系:

i2c框架    (通用、適應性強)

^|    

|------------------------------|

---------   --------------     -------------

i2c核心、i2c匯流排驅動、i2c裝置驅動   

二、i2c 體系結構

1、i2c核心:(i2c-core.c)

提供:i2c匯流排驅動和裝置驅動的註冊、登出方法,i2c通訊方法(「algorithm」)上層的與具體介面卡無關的**以及探測裝置、檢測裝置位址的上層**等。

2、i2c匯流排驅動:

a)定義:對i2c硬體體系結構中介面卡端的實現,介面卡可由cpu控制,甚至可以直接整合在cpu內部;

b)內容:i2c介面卡資料結構i2c_adapter、i2c介面卡的algorithm資料結構i2c_algorithm和控制i2c介面卡產生通訊訊號的函式;

c)功能:控制i2c介面卡以主控方式產生開始位、停止位、讀寫週期,以及以從裝置方式被讀寫、產生ack;

3、i2c裝置驅動:    

a)定義:對i2c硬體體系結構中裝置端的實現,裝置一般掛接在受cpu控制的i2c介面卡上,通過i2c介面卡與cpu交換資料;

b)內容:資料結構i2c_driver和i2c_client,我們需要根據具體裝置實現其中的成員函式;

4、裝置檔案:

所有的i2c裝置都在sysfs檔案系統中,存於/sys/bus/i2c/目錄,以介面卡位址和晶元位址的形式列出;

# busybox ls /sys/bus/i2c/devices/

0-0051 1-0040 1-0042 1-0046 1-0060 i2c-0 i2c-1 i2c-2 i2c-3

# busybox ls /sys/bus/i2c/drivers/

dlp projector dummy rk610_hdmi rtc_hym8563

rk610_codec rk610_ctl rk610_tvout

#

5、i2c原始碼:

有關i2c原始碼位於/drivers/i2c/中;

a)i2c-core.c

功能:實現了i2c核心的功能以及/proc/bus/i2c*介面;

b)i2c-dev.c

功能:實現了i2c介面卡裝置檔案的功能,每乙個i2c介面卡都被分配乙個裝置。通過介面卡訪問裝置時的主裝置號都為 89,次裝置號為 0~255。應用程式通過「i2c-%d」(i2c-0, i2c-1,...,

i2c-10,...)檔名並使用檔案操作介面 open()、write()、read()、ioctl()和 close()等來訪問這個裝置。

i2c-dev.c並沒有針對特定的裝置而設計,只是提供了通用的 read()、write()和 ioctl()等介面,應用層可以借用這些介面訪問掛接在介面卡上的i2c裝置的儲存空間或暫存器,並控制 i2c 裝置的工作方式。

c)chips資料夾

這個目錄中包含了一些特定的i2c裝置驅動,如dallas公司的ds1337實時鐘晶元、epson公司的rtc8564實時鐘晶元和i2c介面的eeprom驅動等。

d)busses資料夾

這個檔案中包含了一些i2c匯流排的驅動,如s3c2410的i2c控制器驅動為i2c-s3c2410.c。

e)algos資料夾

實現了一些i2c匯流排介面卡的algorithm。

6、核心中的i2c.h這個標頭檔案對i2c_driver、i2c_client、i2c_adapter和i2c_algorithm這4個資料結構進行了定義。理解這4個結構體的作用十分關鍵。

i2c_adapter結構體:

struct i2c_adapter ;

i2c_algorithm結構體:

struct i2c_algorithm ;
說明:smbus大部分基於i2c匯流排規範,smbus不需增加額外引腳。與i2c匯流排相比,smbus增加了一些新的功能特性,在訪問時序也有一定的差異。

i2c_driver結構體:

struct i2c_driver ;

i2c_client結構體:

struct i2c_client ;

7、分析i2c_driver、i2c_client、i2c_adapter和i2c_algorithm這4個資料結構的作用及其盤根錯節的關係。

a)i2c_adapter與i2c_algorithm

i2c_adapter對應於物理上的乙個介面卡,而i2c_algorithm對應一套通訊方法。

乙個i2c介面卡需要i2c_algorithm中提供的通訊函式來控制介面卡上產生特定的訪問週期。

缺少i2c_algorithm的i2c_adapter什麼也做不了,因此i2c_adapter中包含其使用

i2c_algorithm的指標。

i2c_algorithm中的關鍵函式master_xfer()用於產生i2c訪問週期需要的訊號,以i2c_msg(即i2c訊息)為單位。

struct i2c_msg ;

b)i2c_driver與i2c_client

i2c_driver對應一套驅動方法,是純粹的用於輔助作用的資料結構,它不對應於任何的物理實體i2c_client對應於真實的物理裝置,每個i2c裝置都需要乙個i2c_client來描述。i2c_client一般被包含在i2c字元裝置的私有資訊結構體中。

i2c_driver與i2c_client發生關聯的時刻在i2c_driver的attach_adapter()函式被執行時。attach_adapter()會探測物理裝置,當確定乙個client存在時,把該client使用的i2c_client 資料結構的adapter指標指向對應的i2c_adapter,driver指標指向該i2c_driver,並會呼叫i2c_adapter的client_register()函式。相反的過程發生在i2c_driver的detach_client()函式被呼叫的時候。

c)i2c_adpater與i2c_client

i2c_adpater與i2c_client的關係與i2c硬體體系中介面卡和裝置的關係一致,即i2c_client依附於i2c_adpater。由於乙個介面卡上可以連線多個i2c裝置,所以乙個i2c_adpater也可以被多個 i2c_client依附,i2c_adpater中包括依附於它的i2c_client的鍊錶。

假設i2c匯流排介面卡***上有兩個使用相同驅動程式的yyy i2c裝置,在開啟該i2c匯流排的裝置結點後相關資料結構之間的邏輯組織關係將如圖15.2所示。

8、如何編寫i2c驅動

一方面,介面卡驅動可能是linux核心本身還不包含的;另一方面,掛接在介面卡上的具體裝置驅動可能也是linux核心還不包含的。即便上述裝置驅動都存在於linux核心中,其基於的平台也可能與我們的電路板不一樣。因此,工程師要實現的主要工作如下。

a)提供i2c介面卡的硬體驅動,探測、初始化i2c介面卡(如申請i2c的i/o位址和中斷號)、驅動cpu控制的i2c介面卡從硬體上產生各種訊號以及處理i2c中斷等。

b)提供i2c介面卡的algorithm,用具體介面卡的***_xfer()函式填充i2c_algorithm的master_xfer指標,並把i2c_algorithm指標賦值給i2c_adapter的algo指標。

c)實現i2c裝置驅動與i2c_driver介面,用具體裝置yyy的yyy_attach_adapter()函式指標、yyy_detach_client()函式指標和 yyy_command()函式指標的賦值給i2c_driver的attach_ adapter、detach_adapter和detach_client指標。

d)實現i2c裝置驅動的檔案操作介面,即實現具體裝置yyy的yyy_read()、yyy_write()和yyy_ioctl()函式等。

linux I2C裝置驅動例項 EEPROM

開發板 優龍公司的fs2410 核心版本 linux2.6.28.6 開發環境 ubuntu12.04 交叉編譯器 arm none linux gnueabi gcc 4.3.2 目標 在fs2410上驅動eeprom,實現應用層對eeprom的讀寫操作 一 linux2.6.28.6 系統上 i...

Linux I2C裝置驅動編寫(一)

在linux驅動中i2c系統中主要包含以下幾個成員 i2c adapter 即i2c介面卡 i2c driver 某個i2c裝置的裝置驅動,可以以driver理解。i2c client 某個i2c裝置的裝置宣告,可以以device理解。是cpu整合或外接的i2c介面卡,用來控制各種i2c從裝置,其驅...

LinuxI2C核心 匯流排驅動與裝置驅動

i2c體系結構分為三個部分 i2c核心 匯流排驅動 裝置驅動 i2c核心 i2c核心提供了一組不依賴硬體的介面函式,i2c匯流排驅動和裝置驅動之間依賴於i2c核心作為紐帶 1 增加 刪除i2c adapter int i2c add adapter struct i2c adapter adap i...