一、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...