I2C驅動情景分析 怎樣控制I2C時序

2021-06-22 00:32:31 字數 1442 閱讀 8930

部落格:

核心版本:linux-3.4.2

源程式:    linux-3.4.2\drivers\i2c\busses\i2c-s3c2410.c

這次要解決的問題是:如何配置soc的i2c模組,輸出想要的時序波形?

匯流排驅動層:驅動soc內部的i2c模組,也稱之為介面卡(adapter)驅動。覆蓋圖中硬體驅動層。

裝置驅動層:實現i2c裝置的device驅動(如eeprom的驅動),使用i2c驅動的介面,編寫字元裝置(多數是字元裝置)。覆蓋圖中的driver驅動層。

核心層:是連線「匯流排驅動層」和「裝置驅動層」的介面。如匯流排驅動層向核心層註冊乙個使用匯流排的驅動,裝置驅動呼叫這個匯流排驅動,控制對應的函式。由於

linux能夠支援多種i2c匯流排和多種i2c裝置,因此採用了匯流排平台驅動。採用了分層和分離的思想,使乙個i2c裝置可以使用任意一條i2c匯流排。

圖1. linux的i2c驅動框架圖

簡要地回顧完i2c驅動的架構,回到主題——怎樣產生i2c時序?

在匯流排驅動層裡實現了產生i2c時序,註冊乙個master_xfer()方法,使用soc的內部i2c模組收發資料。我找了乙個i2c匯流排的例項

進行說明:linux-3.4.2\drivers\i2c\busses\i2c-s3c2410.c

static int __init i2c_adap_s3c_init(void)

static struct platform_driver s3c24xx_i2c_driver = ,

};static int s3c24xx_i2c_probe(struct platform_device *pdev)

/* i2c bus registration info */

static const struct i2c_algorithm s3c24xx_i2c_algorithm = ;

當程式來到了master_xfer這一步,接下來就是硬體相關的部分了(和soc內部的i2c模組相關的部分)。master_xfer會根據函式的引數,找到

對應的介面卡,傳送資料。看看master_xfer的引數:

static int s3c24xx_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg *msgs, int num)

adap:指定需要用到的介面卡(linux驅動能夠同時管理多個介面卡)

msgs:需要傳送的訊息

num: 訊息的長度

至此,已經用程式解了「怎樣產生i2c時序」:在master_xfer函式裡設定好如何傳送乙個i2c時序。當需要傳送i2c時序時,呼叫core層的介面,指定使用哪一條匯流排、傳送什麼資料,即可產生想要的i2c時序。

Linux驅動程式設計 基於I2C子系統的I2C驅動

中,我新增了很多注釋,應該不難理解,有錯誤大家可以指出來,我再改正 include include include include include include include define i2c major 365 主裝置號 define i2c minor 0 從裝置號 define i2c...

i2c裝置驅動

1,i2c 裝置註冊 static struct i2c board info i2c2 devices i2c裝置一般在板級 中註冊 static void msm8916 add i2c deivces void 2,i2c驅動註冊 include static const struct i2c...

I2C驅動(2) 讀寫eeprom

include include include include include include include include include static unsigned short ignore static unsigned short normal addr 位址值是7位 改為0x60的話...