1. 程式人生 > >應用層提供相應的操作介面和應用層程式碼

應用層提供相應的操作介面和應用層程式碼

(1)三根通訊線:SCL、SDA、GND (2)同步、序列、電平、低速、近距離 (3)匯流排式結構,支援多個裝置掛接在同一條總線上 (4)主從式結構,通訊雙方必須一個為主(master)一個為從(slave),主裝置掌握每次通訊的主動權,從裝置按照主裝置的節奏被動響應。每個從裝置在匯流排中有唯一的地址(slave address),主裝置通過從地址找到自己要通訊的從裝置(本質是廣播)。 (5)I2C主要用途就是主SoC和外圍裝置之間的通訊,最大優勢是可以在總線上擴充套件多個外圍裝置的支援。常見的各種物聯網感測器晶片(如gsensor、溫度、溼度、光強度、酸鹼度、煙霧濃度、壓力等)均使用I2C介面和主SoC進行連線。 (6)電容觸控式螢幕晶片的多個引腳構成2個介面。一個介面是I2C的,負責和主SoC連線(本身作為從裝置),主SoC通過該介面初始化及控制電容觸控式螢幕晶片、晶片通過該介面向SoC彙報觸控事件的資訊(觸控座標等),我們使用電容觸控式螢幕時重點關注的是這個介面;另一個介面是電容觸控板的管理介面,電容觸控式螢幕晶片通過該介面來控制觸控板硬體。該介面是電容觸控式螢幕公司關心的,他們的觸控式螢幕晶片內部韌體程式設計要處理這部分,我們使用電容觸控式螢幕的人並不關心這裡。

http://www.fenlei168.com/store-232407/ http://xn.ssjzw.com/job/2012065248.html http://jn.ssjzw.com/job/2012055796.html http://zz.ssjzw.com/job/2012065720.html http://xa.ssjzw.com/job/2012065837.html http://ty.ssjzw.com/job/2012065881.html linux核心的I2C驅動框架總覽 (1)I2C驅動框架的主要目標是:讓驅動開發者可以在核心中方便的新增自己的I2C裝置的驅動程式,從而可以更容易的在linux下驅動自己的I2C介面硬體 (2)原始碼中I2C相關的驅動均位於:drivers/i2c目錄下。

linux系統提供2種I2C驅動實現方法:

job.sddp.net/job/index.php?c=comapply&id=982 job.sddp.net/job/index.php?c=comapply&id=981 job.sddp.net/job/index.php?c=comapply&id=986 job.sddp.net/job/index.php?c=comapply&id=985 job.sddp.net/job/index.php?c=comapply&id=984

第一種叫i2c-dev,對應drivers/i2c/i2c-dev.c,這種方法只是封裝了主機(I2C master,一般是SoC中內建的I2C控制器)的I2C基本操作,並且嚮應用層提供相應的操作介面,應用層程式碼需要自己去實現對slave的控制和操作,所以這種I2C驅動相當於只是提供給應用層可以訪問slave硬體裝置的介面,

job.sddp.net/job/index.php?c=comapply&id=972 job.sddp.net/job/index.php?c=comapply&id=976 job.sddp.net/job/index.php?c=comapply&id=977 job.sddp.net/job/index.php?c=comapply&id=975 job.sddp.net/job/index.php?c=comapply&id=980 job.sddp.net/job/index.php?c=comapply&id=979 job.sddp.net/job/index.php?c=comapply&id=978 job.sddp.net/job/index.php?c=comapply&id=983本身並未對硬體做任何操作,應用需要實現對硬體的操作,因此寫應用的人必須對硬體非常瞭解,其實相當於傳統的驅動中乾的活兒丟給應用去做了,所以這種I2C驅動又叫做“應用層驅動”,這種方式並不主流,它的優勢是把差異化都放在應用中,這樣在裝置比較難纏(尤其是slave是非標準I2C時)時不用動驅動,而只需要修改應用就可以實現對各種裝置的驅動。這種驅動在驅動層很簡單(就是i2c-dev.c)我們就不分析了。 第二種I2C驅動是所有的程式碼都放在驅動層實現,直接嚮應用層提供最終結果。應用層甚至不需要知道這裡面有I2C存在,譬如電容式觸控式螢幕驅動,直接嚮應用層提供/dev/input/event1的操作介面,應用層程式設計的人根本不知道event1中涉及到了I2C。這種是我們後續分析的重點。

I2C子系統的4個關鍵結構體 (1)struct i2c_adapter            I2C介面卡(主機) (2)struct i2c_algorithm            I2C演算法(時序控制) (3)struct i2c_client            I2C(從機)裝置資訊 (4)struct i2c_driver            I2C(從機)裝置驅動

i2c-core.c初步分析 (1)smbus程式碼略過 (2)模組載入和解除安裝:bus_register(&i2c_bus_type); I2C匯流排的匹配機制 (1)match函式 (2)probe函式 總結:I2C總線上有2條分支:i2c_client鏈和i2c_driver鏈,當任何一個driver或者client去註冊時,I2C匯流排都會呼叫match函式去對client.name和driver.id_table.name進行迴圈匹配。如果driver.id_table中所有的id都匹配不上則說明client並沒有找到一個對應的driver,沒了;如果匹配上了則標明client和driver是適用的,那麼I2C匯流排會呼叫自身的probe函式,自身的probe函式又會呼叫driver中提供的probe函式,driver中的probe函式會對裝置進行硬體初始化和後續工作。 核心層開放給其他部分的註冊介面 (1)i2c_add_adapter/i2c_add_numbered_adapter        註冊adapter的 (2)i2c_add_driver                                註冊driver的 (3)i2c_new_device                                註冊client的Linux的I2C體系結構分為3個組成部分。 (1) I2C核心 I2C核心提供了I2C匯流排驅動和裝置驅動的註冊、登出方法, I2C通訊方法(即Algorithm)上層的與具體介面卡無關的程式碼以及探測裝置、檢測裝置地址的上層程式碼等,如圖15.1所示。 (2) I2C匯流排驅動 I2C匯流排驅動是對I2C硬體體系結構中介面卡端的實現,介面卡可由CPU控制,甚至可以直接整合在CPU內部。I2C匯流排驅動主要包含I2C介面卡資料結構i2c_adapter、 I2C介面卡的Algorithm資料結構i2c_algorithm和控制I2C介面卡產生通訊訊號的函式。 經由I2C匯流排驅動的程式碼,我們可以控制I2C介面卡以主控方式產生開始位、停止位、讀寫週期,以及以從裝置方式被讀寫、產生ACK等。 (3) I2C裝置驅動 I2C裝置驅動(也稱為客戶驅動)是對I2C硬體體系結構中裝置端的實現,裝置一般掛接在受CPU控制的I2C介面卡上,通過I2C介面卡與CPU交換資料。I2C裝置驅動主要包含資料結構i2c_driver和i2c_client,我們需要根據具體裝置實現其中的成員函式

I2C體系結構在Linux中的實現複雜。

當工程師拿到實際的電路板時,面對複雜的Linux I2C子系統,應該如何下手寫驅動呢?究竟有哪些是需要親自做的,哪些是核心已經提供 的呢?理清這個問題非常有意義,可以使我們在面對具體問題時迅速抓住重點。

介面卡驅動可能是Linux核心本身還不包含的; 掛接在介面卡上的具體裝置驅動可能也是Linux核心還不包含的 因此,工程師要實現的主要工作如下。

提供 I2C介面卡的硬體驅動, 探測、初始化I2C介面卡(如申請I2C的I/O地址和中斷號)、 驅動CPU控制的I2C介面卡從硬體上產生各種訊號以及處理I2C中斷等。 提供 I2C介面卡的Algorithm,用具體介面卡的xxx_xfer()函式填充i2c_algorithm的master_xfer指標,並把i2c_algorithm指標賦值給i2c_adapter的algo指標。