<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í)間:2014-01-22 來(lái)源:網(wǎng)絡(luò ) 收藏

  i2c_dev 里面定義了讀寫(xiě)I2C 設備應用層的讀寫(xiě)接口,但由于其缺少通用性,一般很少用到所以并不做詳細的介紹。

  i2c_core在驅動(dòng)框架中起到了承上啟下的作用,里面定義了許多重要的函數。例如:adapter注冊/注銷(xiāo)函數,增加/刪除設備驅動(dòng)函數,增加/刪除的函數,I2C傳輸,發(fā)送和接收函數。這些函數都是在編寫(xiě)中必須要用到的接口函數,正是由于這些通用的接口函數才使得代碼具有很強的可移植性和重用性。

  3 編寫(xiě)驅動(dòng)的思路

  在了解中I2C設備驅動(dòng)的基本框架后,要編寫(xiě)自己的設備驅動(dòng)首先要弄清楚的一個(gè)問(wèn)題是到底內核已經(jīng)實(shí)現了那部分,需要實(shí)現的又是那部分。因為I2C設備驅動(dòng)是基于總線(xiàn)設備驅動(dòng)模型的,一般而言在移植操作系統中,內核已經(jīng)對總線(xiàn)部分已經(jīng)有了很好的實(shí)現,所以總線(xiàn)部分的驅動(dòng)一般可以不必關(guān)心。

  在此需要實(shí)現的是設備層的i2c_driver與i2c_client結構體,并利用I2C 子系統提供的接口函數掛接到I2C 總線(xiàn)上。

  每一個(gè)I2C設備驅動(dòng),必須首先創(chuàng )造一個(gè)i2c_driver結構體對象,該結構體包含了I2C設備探測和注銷(xiāo)的一些基本方法和信息。其中包括設備驅動(dòng)的名字,適配器的掛接/取消函數指針等。一個(gè)例子如下所示,name字段標識本驅動(dòng)的名稱(chēng)(不要超過(guò)31 個(gè)字符),at-tach_adapter和detach_client字段為函數指針,這兩個(gè)函數在I2C設備注冊的時(shí)候會(huì )自動(dòng)調用,需要自己實(shí)現這兩個(gè)函數。

嵌入式Linux下的I2C設備驅動(dòng)程序設計

  上面定義的i2c_driver對象,抽象為一個(gè)I2C的驅動(dòng)模型,提供對I2C設備的探測和注銷(xiāo)方法,接下來(lái)就是要定義i2c_client 結構體,其代表著(zhù)一個(gè)具體的I2C 設備,該結構體有一個(gè)data指針,可以指向任何私有的設備數據,在復雜點(diǎn)的驅動(dòng)中可能會(huì )用到。

  每一個(gè)I2C設備芯片,都通過(guò)硬件連接設定好了該設備的I2C設備地址。因此,I2C設備的探測一般是靠設備地址來(lái)完成的。那么,首先要在驅動(dòng)代碼中聲明你要探測的I2C設備地址列表以及一個(gè)宏,示例如下:

嵌入式Linux下的I2C設備驅動(dòng)程序設計

  有了i2c_client結構體代表了具體的設備和設備ID后就可以實(shí)現attach_adapter 和detach_client 函數。這兩個(gè)函數是系統自動(dòng)調用的,它的實(shí)現是有一定的框架的,可以在linux內核源碼的驅動(dòng)例子中找到,由于代碼過(guò)長(cháng)這里不做具體的分析。針對不同的設備函數的實(shí)現會(huì )略有不同,一般attach_adapte需要完成的工作是對i2c_client結構體成員賦值和調用接口函i2c_attach_cli-ent把設備掛接到適配其中。而detach_client 函數則是完成相反的工作。

  最后的一步是編寫(xiě)模塊的初始化與退出函數把驅動(dòng)加進(jìn)I2C驅動(dòng)子系統中,示例可以是:

嵌入式Linux下的I2C設備驅動(dòng)程序設計

  至此,I2C設備的驅動(dòng)已經(jīng)完成了,但是到了這一步本驅動(dòng)并沒(méi)有實(shí)際的用處,它僅僅提供的是一個(gè)設備的管理框架,所以必須還要進(jìn)行兩方面的補充。

  第一方面是,利用I2C總線(xiàn)讀寫(xiě)外部芯片的控制/狀態(tài)寄存器;第二方面是,向應用層提供I2C設備的讀寫(xiě)接口,令應用程序可以對設備節點(diǎn)的讀寫(xiě)實(shí)現對I2C具體物理設備的讀寫(xiě)。為了實(shí)現I2C 設備寄存器的讀寫(xiě)操作,必須要用到Linux的I2C子系統提供的讀寫(xiě)接口函數:

嵌入式Linux下的I2C設備驅動(dòng)程序設計

  利用這兩個(gè)函數根據芯片的讀寫(xiě)時(shí)序進(jìn)行封裝,就可以讀寫(xiě)芯片內部的寄存器,以寫(xiě)芯片寄存器為例,必須寫(xiě)往總線(xiàn)上寫(xiě)寄存器的地址,然后寫(xiě)入要往寄存器里寫(xiě)入的數據,示例代碼如下所示。讀寄存器的時(shí)序則是則是先寫(xiě)入要讀寄存器的地址,然后接受總線(xiàn)上的數據,區別不大,不做示例。

嵌入式Linux下的I2C設備驅動(dòng)程序設計

  要想向應用層提供讀寫(xiě)接口,則必須再對I2C設備驅動(dòng)進(jìn)行一次簡(jiǎn)單字符設備驅動(dòng)的封裝,將I2C設備作為一個(gè)簡(jiǎn)單字符設備,依次實(shí)現字符設備文件操作函數結構體file_operation 里面的函數指針所對應的接口函數,這里只給出了大體的框架,具體的實(shí)現對于不同的芯片有很大的不同。

  定義一個(gè)字符設備結構體cdev,將I2C 設備當做一個(gè)普通的字符設備處理。

嵌入式Linux下的I2C設備驅動(dòng)程序設計

  定義一個(gè)文件操作函數結構體,填寫(xiě)里面函數指針,指出設備操作所對應的具體函數,一般的例子是:

嵌入式Linux下的I2C設備驅動(dòng)程序設計

  接著(zhù)就是編寫(xiě)file_operations所對應的具體函數。

  最后一步是在模塊的初始化和退出函數中增加對簡(jiǎn)單字符設備的注冊和注銷(xiāo)操作,包括設備號申請與注銷(xiāo),設備注冊與注銷(xiāo)兩方面。

  至此,將編譯好的模塊加載進(jìn)內核后就可以在用戶(hù)空間利用文件系統的API對設備文件進(jìn)行各種操作。

  4 結語(yǔ)

  I2C總線(xiàn)在電子系統設計中是十分普遍的一種接口技術(shù),而Linux又是十分流行的操作系統。編寫(xiě)Linux下I2C總線(xiàn)設備的驅動(dòng)開(kāi)發(fā)中十分重要的一項技術(shù),不容忽視。本文首先講述了Linux系統I2C設備驅動(dòng)程序的總體框架,然后給出了編寫(xiě)I2C設備驅動(dòng)的總體思路與框架,希望給讀者理清思路,加深對編寫(xiě)I2C設備驅動(dòng)的理解??偠灾?,利用I2C總線(xiàn)通信可以達到很高的速率,而且總線(xiàn)上可以?huà)旖佣鄠€(gè)節點(diǎn),每個(gè)節點(diǎn)都由惟一的地址確定。

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

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

評論


相關(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>