i2c只有兩條線,一條序列資料線sda,一條是時鐘線scl。
使用scl、sda這兩根資料線就實現了裝置之間的資料互動。i2c匯流排廣泛用於eeprom,實時時鐘rtc,小型lcd等裝置與cpu的介面中。
linux 的iic分3個部分組成:
i2c核心:i2c核心提供了匯流排驅動,裝置驅動的註冊、登出方法。i2c通訊方法(algorithm),與具體介面卡無關的上層**,以及探測裝置、檢測裝置位址的上層**。
i2c匯流排驅動:匯流排(介面卡adapter)是對i2c硬體體系結構中介面卡端的實現
,包括i2c硬體(暫存器、中斷、時鐘)初始化,i2c傳送與接收的處理函式。
i2c裝置驅動:i2c裝置驅動(客戶端client)是對i2c硬體體系結構中裝置端的實現,裝置一般掛接在i2c介面卡上,通過i2c介面卡與cpu互動資料。
第一層:提供i2c adapter的硬體驅動,探測、初始化i2c adapter(如申請i2c的io位址和中斷號),驅動adapter 在硬體上產生(start、stop、ack)以及處理i2c中斷。
第二層:提供i2c adapter的algorithm,用具體的介面卡***_xfer()函式來填充i2c_algorithm的master_xfer函式指標,並把賦值後的i2c_algorithm再賦值給i2c_adapter的algo指標。
第三層:實現i2c裝置驅動中的i2c_driver介面。實現裝置device與匯流排(adapter)的掛接。
第四層:實現i2c裝置對應的具體device驅動,i2c_driver只是實現裝置與匯流排的掛接,而掛接在匯流排上的i2c裝置千差萬別,所以要實現具體裝置device的write(),read(),ioctl()等方法;賦值給file_operations,然後註冊字元裝置驅動。
第一層、第二層屬於i2c匯流排驅動(bus),第三層、第四層屬於裝置驅動層(device driver)。
i2c_adapter 與i2c_algorithm
i2c_adapter對應於物理上的乙個介面卡,而i2c_algorithm對應一套通訊方法,乙個i2c介面卡需要i2c_algorithm
中提供的通訊函式來控制介面卡上產生特定的訪問週期。i2c_adapter中包含其使用的i2c_algorithm指標。
i2c_algorithm中的關鍵函式master_xfer用於產生訪問i2c裝置所用到的start、stop、ask訊號。以i2c_msg(即i2c
訊息)為單位傳送和接收通訊資料。
linux下的I2C驅動記錄
現在做的是rk平台的i2c驅動,不是說linux每個外設對應乙個裝置檔案嗎?可是找了一下一直沒找到,今天特別搞了一下。i2c裝置是註冊為platform平台驅動的。下面是我用adb命令檢視的 linux的裝置檔案不一定只在dev 這個目錄下面,像sys 目錄下面也會有一些裝置檔案的 mid下面的i2...
Linux驅動 I2C匯流排
這裡以rk3288為例子,使用的是linux4.14,根據裝置樹節點i2c 與rk3x i2c driver,match之後,就會呼叫對應的probe rk3x i2c probe 這裡主要就是註冊乙個adapt i2c add adapter 也就是i2c控制器,或者說是i2c主裝置,既然是主裝置...
Linux驅動之I2C裝置驅動
核心 4.20 晶元 hym8563 rtc 下面的 分析主要都在注釋中,會按照驅動中函式的執行順序分析。static const struct i2c device id hym8563 id module device table i2c,hym8563 id static const stru...