<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式Linux 的I2C設備驅動(dòng)程序的分析

基于嵌入式Linux 的I2C設備驅動(dòng)程序的分析

作者: 時(shí)間:2013-11-14 來(lái)源:網(wǎng)絡(luò ) 收藏

  0 引言

  由于總線(xiàn)的通用性,作為一款優(yōu)秀的嵌入式操作系統,也必須要對其要有很好的支持。在內核源碼中對總線(xiàn)的驅動(dòng)是基于總線(xiàn)模型的,其驅動(dòng)程序用到了特殊的幾個(gè)數據結構,對總線(xiàn)協(xié)議進(jìn)行了更抽象更通用的定義,極大的增加了的可移植性。要編寫(xiě)出自己的I2C 程序,必須對這種內核I2C總線(xiàn)驅動(dòng)的架構有深刻的理解。

  1 I2C總線(xiàn)的硬件構成

  I2C 總線(xiàn)協(xié)議只有兩條總線(xiàn)線(xiàn)路,一條是串行數據線(xiàn)(SDA),一條是串行時(shí)鐘線(xiàn)(SCL)。SDA 負責數據的傳輸,SCL 負責數據傳輸的時(shí)鐘同步。I2C 設備通過(guò)這兩條總線(xiàn)連接到處理器的I2C總線(xiàn)控制器上,不同設備之間通過(guò)7 位地址來(lái)區別,而且數據的傳輸是雙向的,方向的確定由1位二進(jìn)制數確定,地址位加方向位是操作I2C 設備的惟一標示,I2C 設備與CPU 的連接如圖1所示。

  

  I2C 總線(xiàn)上有3 種類(lèi)型的信號,分別是:開(kāi)始信號,結束信號和應答信號。這些信號都是由SDA和SCL上的電平變化來(lái)表示的。

  開(kāi)始信號(S):當SCL為高電平時(shí),SDA由高電平向低電平跳變,表示開(kāi)始傳輸數據。

  結束信號(P):當SCL為高電平時(shí),SDAY由低電平向高電平跳變,表示結束傳輸數據。

  相應信號(ACK):從機接收到8位數據后,在第9個(gè)時(shí)鐘周期,拉低SDA電平,表示已經(jīng)接收到數據。

  當總線(xiàn)空閑時(shí),SDA 和SCL 都處于高電平,主機檢測到總線(xiàn)空閑就可以向從機發(fā)送數據。主機首先發(fā)送開(kāi)始信號S,接著(zhù)發(fā)出8位數據(包括前7位的從機地址和1 為的方向位),然后等待從機發(fā)回確認信號ACK.

  當第8位為0時(shí),表示向從機傳輸數據,主機收到確認信號后就可以連續的向從機寫(xiě)入8 位數據;當第8 位為1時(shí),表示向從讀取數據,這時(shí)主機就可以接收來(lái)自從機的一系列數據。最后當總個(gè)數據傳輸過(guò)程完成后,由主機發(fā)送結束信號P,表示本次的數據傳輸完成。

  2 的I2C設備驅動(dòng)程序的層次結構

  因為I2C設備的種類(lèi)繁多,如果為每一款I(lǐng)2C設備都編寫(xiě)一個(gè)驅動(dòng)程序,顯然不太現實(shí)也不太可能做到。所以,Linux中是對I2C 設備驅動(dòng)采取了層次化處理,分為總線(xiàn)層和設備層。將I2C設備驅動(dòng)的一些共同屬性抽象起來(lái)歸結起來(lái)作為總線(xiàn)層,而將具體I2C設備特殊操作作為設備層。在Linux中I2C設備驅動(dòng)中用到的數據結構[4,7-8]的關(guān)系如圖2 所示。關(guān)于這部分代碼位于Linux內核源碼樹(shù)的/driver/i2c中。

  

  理解這層次結構重點(diǎn)是要理解4個(gè)數據結構,分別是屬于設備層的i2c_driver 與i2c_client,屬于總線(xiàn)層的i2c_adapter與i2c_algorithm.下面分別對這四個(gè)數據結構做簡(jiǎn)要的說(shuō)明。

  struct i2c_driver:具體的每一個(gè)I2C設備都應該對應著(zhù)的一個(gè)驅動(dòng),這個(gè)結構體里面定義了Linux設備模型中用于I2C 總線(xiàn)管理的一系列函數指針和I2C 設備的信息。其中最重要的兩個(gè)成員是適配器檢測函數指針at-tach_adapter,和設備ID表id_table.

  struct i2c_client:一個(gè)連接在SDA 和SCL 總線(xiàn)上的具體設備是由i2c_client結構體描述的,定義了兩個(gè)成員變量表示這個(gè)具體設備所對應的適配器和驅動(dòng)。

  struct i2c_adapter:此結構體表示CPU 里面具體的I2C控制器,本質(zhì)上也是對應著(zhù)一個(gè)物理設備,其中最要的成員變量是指向適配器驅動(dòng)的程序的algo 結構體指針。

  struct i2c_algorithm:里面定義了具體適配器驅動(dòng)程序的函數指針。特別是master_xfer函數指針,這個(gè)函數實(shí)現了適配器最底層的操作方法,也是I2C設備驅動(dòng)中總線(xiàn)層里面要編寫(xiě)的重要函數。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: Linux I2C 設備驅動(dòng)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>