一 1 i2c匯流排:2線式串列匯流排介面,SDA(資料線)和SCL(時鐘訊號線),SCL一般是由主裝置控制的,用來控制資料轉送的開始、結束、以及傳輸方向(即R/W)。
2 當SCL 處於高電平時,SDA由高向低跳躍,即主裝置通過I2C發送一個開始訊號(所有從裝置處於就緒狀態);當SCL處於高電平,SDA由低向高跳躍,即主裝置通過I2C匯流排發送一個停止訊號。
3 資料轉送時,主裝置發送從裝置的地址和相應的資料(按照位元組傳輸),掛在在這條I2C匯流排上的所有從裝置都將地址和自己的地址進行匹配,如果匹配了則將接收收據(I2C裝置的連接埠(裝置驅動中已設定好)),從裝置接收到資料後要響應主裝置,如果不做響應,主裝置會認為從裝置出現故障,則將發送停止訊號。
4 資料轉送完畢時,主裝置發送停止訊號。
二 1 I2C匯流排驅動,每條I2C匯流排都有一個對應的驅動,匯流排驅動並不做任何操作,只是為這條匯流排提供讀寫的機制而已。真正的讀寫操作是有裝置驅動來完成的。
2 機器上電後,先註冊I2C匯流排驅動到核心中,然後註冊I2C裝置驅動到核心(在這過程中會將裝置註冊到系統中,通常情況下在PC機中由核心提供的模型驅動來完成)。
3 系統初始化時,調用i2c_register_board_info介面將裝置資訊添加到__i2c_board_list中,然後i2c主機(微處理器)添加adapter,adapter將掃描__i2c_board_list,逐個地將裝置註冊到匯流排上。
三 1 I2C裝置驅動,裝置驅動註冊到核心之後,會調用相應的介面來遍曆系統中所有的I2C匯流排驅動,以此來探測裝置,有可能會探測到多個裝置,因為微控制器中有可能有多個I2C匯流排介面,同時每條I2C匯流排上可以掛載多個I2C裝置(並行的掛在匯流排上),並且裝置驅動可能為多條I2C匯流排上得I2C裝置服務。
2 I2C裝置驅動探測到I2C裝置後,會建立一個struct i2c_client結構體(屬性包括,匯流排驅動、裝置驅動,裝置資訊等)來標識該裝置,這樣匯流排驅動,裝置驅動,I2C裝置就關聯起來了。之後若有通訊時,匯流排驅動會調用i2c_master_send && i2c_master_recv來向裝置寫資料或者從裝置讀取資料。
四 1 驅動,本質上來講是硬體裝置(或晶片)的軟體抽象。
2 連接埠,對CPU而言即寄存器。
五 具體的源碼可以參考 核心中 driver/i2c/i2c-core.c && driver/i2c/i2c-dev.c 源檔案