《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > ARM-Linux中I2C總線驅動開發
ARM-Linux中I2C總線驅動開發
來源:微型機與應用2012年第5期
高非非,劉辛國
(北京建筑工程學院 電氣與信息工程學院, 北京 100044)
摘要: 針對I2C總線的特點,Linux內核中定義了I2C驅動體系結構。在分析Linux的I2C總線驅動體系結構基礎上,介紹了在S3C2410中設計I2C總線驅動的方法。
Abstract:
Key words :

摘  要: 針對I2C總線的特點,Linux內核中定義了I2C驅動體系結構。在分析Linux的I2C總線驅動體系結構基礎上,介紹了在S3C2410中設計I2C總線驅動的方法。
關鍵詞: ARM-Linux;I2C體系結構;I2C總線驅動程序

 I2C總線是一種串行數據傳輸標準總線,使用數據線SDA和時鐘線SCL就可實現設備間的數據交互,它使得電路系統結構設計簡單,具有使用方便、通信速率高等優點。因此,在嵌入式系統中,I2C總線被廣泛地應用在與RAM、EEPROM、RTC等設備間的接口電路中。近年來,隨著嵌入式系統應用不斷升溫,Linux憑借源碼開放、內核穩定以及可裁剪性強等優點成為在通信、工業控制、消費電子等領域的主流操作系統。而Linux設備驅動程序是所有Linux應用系統中不可或缺的組成部分,是現在Linux開發中的熱門領域。Linux內核已經把I2C總線協議定義為內核驅動的一部分,并形成了一種體系結構。本文正是在研究I2C總線驅動體系結構基礎上,提出了其在S3C2410中實現的基本方法。
1 I2C總線
 I2C總線是由雙向數據傳輸線SDA和時鐘線SCL構成的二線制串行總線,可構成主從和多主系統。I2C總線多采用主從雙向通信,即總線上在某一時刻只有一個主設備,總線上的其他設備都作為從設備。任何能夠進行發送和接收的設備都可以成為主設備,但是在同一時間內只能有一個設備作為主設備(通常為微控制器),其他每個I2C器件作為從設備與主設備進行通信,它們都有唯一的地址用來識別。
I2C總線的時序圖[1]如圖1所示。


 從圖1可以看到,I2C總線在傳送數據過程中使用了三種信號[2]。(1)開始信號:SCL為高電平時,SDA由高電平向低電平跳變,表示將要開始傳送數據;(2)應答信號:從設備在接收到1 B數據后,向主設備發出一個低電平脈沖應答信號,表示已收到數據,主設備根據從設備的應答信號做出是否繼續傳輸數據的操作(I2C總線每次數據傳輸時字節數不限制,但是每發送1 B都要有一個應答信號);(3)結束信號:SCL為低電平時,SDA由低電平向高電平跳變,表示數據傳送結束。
I2C總線具體的通信工作原理如下:主設備首先發出開始信號,接著發送1 B的數據,其由高7 bit地址碼和最低1 bit方向位組成(方向位表明主設備與從設備間數據的傳送方向)。系統中所有從設備將自己的地址與主設備發送到總線上的地址進行比較,如果從設備地址與總線上的地址相同,該設備就是與主設備進行數據傳輸的設備。接著進行數據傳輸,根據方向位,主設備接收從設備數據或發送數據到從設備。當數據傳送完成后,主設備發出一個停止信號,釋放I2C總線,然后所有從設備等待下一個開始信號的到來。
2 系統硬件設計
2.1 Linux驅動程序

 設備驅動程序是Linux內核的重要組成部分,是操作系統內核與底層硬件之間的接口。在ARM系統中,每個物理設備都有自己的控制器,每個硬件控制器都有自己的控制狀態寄存器(CSR),并且各不相同。這些寄存器用來啟動、停止、初始化設備,并對設備進行診斷,對硬件的控制主要是針對這些寄存器進行操作。設備驅動程序為應用程序屏蔽了硬件的底層細節,這樣在應用程序看來,硬件設備只是一個文件,應用程序通過對應的設備驅動程序中定義的通信接口(write、read和ioctl等)像操作普通文件一樣實現對硬件設備的操作,簡化了對設備的訪問,使得應用程序的編寫相對簡單。
設備驅動程序一般有以下功能[3]:對硬件設備的初始化、加載和釋放;對設備進行管理,包括實時參數設置以及提供對設備的統一操作接口;讀取應用程序傳遞給設備文件的數據或回送應用程序請求的數據;檢測或處理設備出現的錯誤等。
 Linux內核將打開、關閉、讀/寫和ioctl等所有相關操作封裝在一個結構體file_operations中,設備驅動程序利用結構體file_operations與文件系統聯系起來。另外還要使用module_init()和module_exit()兩個宏。module_init()的本質是在.initcall.init段使用空間中定義的一個指向初始化函數的指針。設備驅動程序通過調用代碼段中設備初始化函數,完成初始化硬件和向內核注冊設備驅動程序。module_exit()功能與module_init()相反。
2.2 I2C總線驅動體系結構
 直接數字頻率合成器(DDS)是一種產生模擬波形的方法,其通常是通過數字形式的時間轉換信號再執行數模轉換產生正弦波。因為DDS設備的運行基于數字,所以能夠在輸出頻率、正弦波頻率分解和運行于寬頻率頻譜之間相互轉換。本系統采用DDS AD9833作為超聲波發射單元的脈沖生成器,AD9833是可編程的,通過高速串口外圍接口(SPI),只需要一個外部時鐘去產生簡單的正弦波就可以工作了。AD9833可以在基于25 MHz的時鐘下產生0~12.5 MHz的波形[6]。
 I2C設備在Linux下完全可以作為一個字符設備,可以根據需要編寫一個字符設備驅動程序來支持I2C通信。但是由于I2C總線是一種標準總線,在PC和嵌入式系統中都得到了廣泛的應用,Linux專門為I2C總線定義了I2C驅動程序體系結構[4],使驅動程序有統一的接口,方便了驅動設計者設計,也便于移植。
在Linux系統中,I2C總線驅動體系由I2C核心、總線適配器驅動和設備驅動三部分組成。
?。?)I2C核心
 I2C核心即i2c-core.c,是Linux內核用來維護和管理的I2C總線的核心部分,實現了I2C總線驅動的框架。I2C核心為總線提供了統一的接口函數,實現了I2C總線驅動和設備驅動的注冊、注銷及通信等功能。I2C核心是I2C總線適配器驅動和設備驅動之間的橋梁。
 (2)I2C總線適配器驅動
 I2C總線適配器驅動主要包括了對應具體硬件I2C控制器的I2C總線適配器i2c_adapter以及I2C總線適配器的通信傳輸算法i2c_algorithm以及總線驅動控制適配器通信函數等,為I2C核心提供了底層支持,是與硬件相關的。需要注意的是,I2C總線驅動程序只是提供了I2C總線的讀寫方法,其本身并不進行任何通信,它只是等待設備驅動調用其函數來對具體的硬件設備進行訪問。
?。?)I2C設備驅動程序
 I2C設備驅動程序通過I2C總線適配器驅動與具體的硬件設備進行通信。I2C設備驅動程序中主要包括了數據結構i2c_driver(用于管理i2c_client)、i2c_client(掛在I2C總線上的設備驅動程序)和需要根據具體設備實現的成員函數。標準的I2C驅動程序也是一個字符設備驅動程序,通過i2c-dev.c來進行管理,包括open、release、read、write、ioctl和lseek等。
    Linux內核I2C總線驅動程序構架如圖2所示,其反映了I2C總線驅動體系間的關系。

3 S3C2410中I2C總線驅動程序的實現

 


 S3C2410處理器集成了I2C總線控制器,支持主、從模式,通過對它的4個寄存器I2CCON、I2CSTAT、I2CDS和I2CADD的操作就可以方便地對I2C總線進行控制。此外,S3C2410還為I2C總線提供了一個中斷號為27的I2C總線中斷,這樣可以在編寫數據發送和接收程序時使用中斷來完成。
由于I2C核心提供了統一的、不需要修改的接口函數,因此驅動程序開發者只需要實現特定的I2C總線適配器驅動和I2C設備驅動,這樣大大提高了嵌入式 Linux的I2C總線驅動程序的移植性[5]。
3.1 I2C總線適配器驅動的實現
 對于S3C2410上的I2C總線驅動程序,按照I2C驅動程序體系結構與硬件的對應關系,首先需要給S3C2410的I2C控制器添加對應的I2C總線適配器驅動程序,即填充結構體i2c_adapter。其通過i2c-core中的接口函數i2c_add_adapter將i2c_adapter和i2c_algorithm注冊到操作系統中。
 再者,實現S3C2410中I2C適配器的通信方法,主要實現i2c_algorithm中處理I2C消息的函數master_xfer()。master_xfer()負責S3C2410中I2C控制器的寄存器,用于產生I2C訪問周期需要的函數,以i2c_msg(即I2C消息)為單位,以此控制I2C總線發送和接收數據的方法。另外,函數需實現functionality()函數,其只返回一個algorithm所支持的通信傳輸模式,較容易實現。
3.2 設備驅動程序的實現
 首先在芯片的總線適配器驅動程序中需要實現一個i2c_driver結構并設置I2C芯片的初始化和卸載函數,實現i2c_driver中的數據成員attach_adapter和detach_client。初始化時,向系統注冊一個I2C字符設備,接著使用函數i2c_add_driver()注冊一個I2C驅動管理結構體i2c_driver,使I2C芯片相應結構中的成員attach_adapter執行,進而調用I2C核心的i2c_probe()遍歷所有的i2c_adapter,當地址參數與芯片設備地址一致時,則會調用結構i2c_driver中detach_client成員函數來初始化芯片的i2c_client結構,最后通過I2C核心提供的i2c_attach_client向I2C總線適配器i2c_adapter來注冊該芯片的I2C設備[6]。I2C總線識別這個設備后就會調用相應的i2c_driver驅動該設備。
 在應用層實現用戶程序訪問I2C設備的結構file_operations接口函數,包括打開、釋放、讀/寫和ioctl等標準文件操作的接口函數。open()和release()這兩個函數已經在內核中實現,read()和write()函數用來實現用戶和系統內核之間相互傳遞數據,進而實現對設備的讀寫操作,它們分別調用了I2C核心的i2c_master_recv()和i2c_master_send()函數來構造一條I2C消息并在一個讀寫周期內進行傳輸。ioctl()函數則用來向用戶提供一些命令以控制具體芯片設備,因為不同芯片實現數據傳遞需要的時序是不同的,針對具體的芯片,應用程序需要通過構造i2c_rdwr_ioctl_data結構體來給內核傳遞一條或數條I2C消息,從而實現控制數據傳輸的讀寫周期。
 I2C總線由于具有電路結構簡單、使用方便、通信速率高等優點,已在嵌入式系統中得到了廣泛的應用。本文在介紹了I2C總線和分析了Linux系統下I2C總線的體系結構基礎上,以S3C2410為例,給出了在其中編寫I2C總線驅動程序的基本開發過程。
參考文獻
[1] 朱瑜亮,黃曉革.數字溫度傳感器DS1621在Linux下的I2C接口驅動設計[J].電子設計工程,2011,19(2):133-136.
[2] 李俊.嵌入式Linux設備驅動開發詳解[M].北京:人民郵電出版社,2008.
[3] BECK M,BOHME H,DZIADZKA M,等.Linux內核編程指南[M].張瑜,楊繼萍,等,譯.北京:清華大學出版社,2004.
[4] 劉淼.嵌入式系統接口設計與Linux驅動程序開發[M].北京:北京航空航天大學出版社,2006.
[5] 李祥兵,鄭扣根.Linux中I2C總線驅動程序的開發[J].計算機工程與設計,2005,26(1):41-43.
[6] 宋寶華.Linux設備驅動開發詳解[M].北京:人民郵電出版社,2008.

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          夜夜嗨av一区二区三区网站四季av| 免费在线观看日韩欧美| 欧美在线视频一区二区三区| 欧美 日韩 国产在线| 午夜精品久久久久久久久久久| 国产女主播在线一区二区| 黄色成人免费观看| 日韩图片一区| 欧美在线国产精品| 久久阴道视频| 国产精品欧美一区喷水| 午夜日韩在线| 亚洲国产另类久久精品| 久久成人这里只有精品| 国产精品v日韩精品v欧美精品网站| 亚洲欧洲日产国产综合网| 亚洲黄色一区二区三区| 99精品视频免费在线观看| 性欧美1819sex性高清| 久久综合狠狠综合久久激情| 美女精品网站| 老司机精品视频一区二区三区| 欧美日韩高清在线一区| 黄网站免费久久| 久久国产主播| 亚洲视频1区2区| 欧美激情免费在线| 在线看不卡av| 国产精品视频免费观看| 在线观看免费视频综合| 亚洲精品少妇| 国产亚洲欧美日韩精品| 久久亚洲综合网| 日韩手机在线导航| 国产欧美在线观看| 性欧美暴力猛交另类hd| 欧美激情一区二区三区在线视频| 欧美视频在线观看| 美女91精品| 久久久久一区| 日韩性生活视频| 狠狠色丁香久久婷婷综合丁香| 激情成人av在线| 午夜精品久久久久久久白皮肤| 久久国产精彩视频| 今天的高清视频免费播放成人| 欧美午夜在线一二页| 亚洲一区二区三区三| 亚洲欧美日韩一区在线观看| 亚洲黄色有码视频| 卡通动漫国产精品| 国产欧美综合在线| 欧美日韩在线视频首页| 99视频一区二区三区| 国产伊人精品| 欧美日韩三级电影在线| 一区二区三区成人精品| 免费一级欧美片在线观看| 欧美福利在线观看| 国产欧美精品一区aⅴ影院| 久久精品成人一区二区三区蜜臀| 亚洲国产欧美一区| 99国产麻豆精品| 国产嫩草影院久久久久| 日韩一级视频免费观看在线| 亚洲深夜福利网站| 久久国产主播精品| 亚洲一区二区三区色| 国产欧美一区二区在线观看| aaa亚洲精品一二三区| 欧美视频日韩视频| 欧美日韩一区二区在线观看| 99精品欧美一区二区三区| 一区二区三区在线视频观看| 一二美女精品欧洲| 久久一区二区三区超碰国产精品| 欧美日本免费一区二区三区| 老鸭窝91久久精品色噜噜导演| 欧美在线免费| 亚洲国产精品99久久久久久久久| 欧美 日韩 国产精品免费观看| 韩国女主播一区| 伊人久久男人天堂| 欧美日韩国产成人在线| 亚洲第一福利社区| 依依成人综合视频| 欧美国产在线电影| 136国产福利精品导航网址| 在线成人免费视频| 久久亚洲色图| 久久亚洲不卡| 亚洲网站在线观看| 午夜精品www| 久久久久一本一区二区青青蜜月| 欧美黑人在线播放| 巨胸喷奶水www久久久免费动漫| 国产精品一区二区三区乱码| 欧美成人一区二区三区| 久久久久久免费| 香蕉视频成人在线观看| 国产精品毛片| 黄色影院成人| 国产精品视频精品视频| 亚洲一二三区在线观看| 国产精品成人一区二区网站软件| 亚洲无亚洲人成网站77777| 久久久噜久噜久久综合| 欧美激情视频一区二区三区不卡| 国产欧美在线播放| 好看不卡的中文字幕| 国产精品久在线观看| 狠狠爱综合网| 亚洲国产你懂的| 久久av免费一区| 亚洲在线观看视频| 亚洲精品九九| 蜜桃精品一区二区三区| 免费成人av资源网| 久久婷婷综合激情| 韩日欧美一区二区三区| 久久成人免费电影| 国产精品扒开腿做爽爽爽视频| 伊人精品成人久久综合软件| 一区二区三区久久久| 一本久道综合久久精品| 女人色偷偷aa久久天堂| 久久亚洲影音av资源网| 美乳少妇欧美精品| 国产欧美69| 欧美日本三区| 亚洲精品一区在线观看| 久久精品免费看| 在线免费观看日本一区| 久久久久一本一区二区青青蜜月| 99国产精品久久久久久久| 国产麻豆日韩| 日韩一级视频免费观看在线| 日韩一区二区精品| 亚洲精品欧美在线| 国产偷国产偷亚洲高清97cao| 亚洲第一精品夜夜躁人人躁| 亚洲综合精品一区二区| 亚洲福利久久| 亚洲在线中文字幕| 伊甸园精品99久久久久久| 这里只有精品丝袜| 欧美精品大片| 在线观看一区| 国产最新精品精品你懂的| 一区二区激情视频| 一本色道久久精品| 亚洲欧美日韩精品久久亚洲区| 欧美精品电影在线| 亚洲国产精品va在线观看黑人| 欧美国产日韩一区二区| 久久综合网络一区二区| 久久精品亚洲一区| 国产伦一区二区三区色一情| 欧美日韩国产综合新一区| 亚洲国产精品小视频| 久久久久一本一区二区青青蜜月| 国产精品久久久久久av福利软件| 久久久一本精品99久久精品66| 欧美极品欧美精品欧美视频| 欧美日韩国产在线播放| 亚洲区国产区| 影音先锋亚洲电影| 亚洲激情在线播放| 欧美日韩在线一区二区| 久久精品电影| 欧美成人a视频| 亚洲精品无人区| 欧美日韩人人澡狠狠躁视频| 国产亚洲视频在线观看| 国产精品卡一卡二| 午夜精品一区二区三区在线视| 欧美日韩在线亚洲一区蜜芽| 美女久久一区| 国产毛片久久| 欧美天天综合网| 久久99在线观看| 亚洲乱码久久| 亚洲电影在线免费观看| 欧美国产欧美综合| 欧美亚洲一区二区在线观看| 亚洲国产欧美国产综合一区| 欧美国产极速在线| 亚洲第一天堂无码专区| 国产精品国产三级国产专播精品人| 在线观看日韩av| 亚洲第一网站| 99热在线精品观看| 91久久综合亚洲鲁鲁五月天| 欧美成人免费一级人片100| 一区二区电影免费在线观看| 在线电影一区| 亚洲天堂成人在线观看| 黑人巨大精品欧美一区二区小视频| 欧美精品免费观看二区| 国内精品视频久久| 日韩天天综合| 99亚洲伊人久久精品影院红桃| 亚洲自拍偷拍一区| 亚洲精品视频一区二区三区| 国产精品成人一区二区| 亚洲激情小视频| 欧美在线看片a免费观看| 老司机一区二区三区| 亚洲高清资源综合久久精品| 亚洲片国产一区一级在线观看| 日韩一二三区视频| 免费国产自线拍一欧美视频| 欧美性生交xxxxx久久久| 在线免费高清一区二区三区| 新片速递亚洲合集欧美合集| 国产色综合网| 在线中文字幕一区| 在线观看中文字幕亚洲| 久久夜精品va视频免费观看| 国语自产精品视频在线看抢先版结局| 日韩亚洲成人av在线| 国产美女精品人人做人人爽| 你懂的视频欧美| 欧美色区777第一页| 欧美激情国产高清| 久久精品国产一区二区三区| 一本久久精品一区二区| 亚洲区免费影片| 一区二区三区欧美亚洲| 欧美一区二区国产| 在线成人小视频| 国产精品大片免费观看| 亚洲精品欧美精品| 国产精品有限公司| 国产精品美女一区二区在线观看| 久久精品视频va| 亚洲日本久久| 午夜精品美女自拍福到在线| 一本色道久久综合亚洲91| 国产欧美日韩精品a在线观看| 欧美一区二区三区婷婷月色| 亚洲第一福利社区| 欧美激情国产日韩精品一区18| 亚洲国产婷婷香蕉久久久久久99| 欧美大片网址| 国色天香一区二区| 一本色道**综合亚洲精品蜜桃冫| 美女尤物久久精品| 亚洲一区二区视频| 久久综合色天天久久综合图片| 一区在线电影| 国产一区二区三区av电影| 久久超碰97中文字幕| 久久精品国产999大香线蕉| 男人的天堂成人在线| 欧美一区国产二区| 亚洲天堂黄色| 国产日韩亚洲欧美| 国产精品日韩电影| 国产亚洲女人久久久久毛片| 国产精品天天摸av网| 欧美一区综合| 欧美激情性爽国产精品17p| 午夜亚洲视频| 亚洲国内精品| 亚洲三级电影全部在线观看高清| 老牛嫩草一区二区三区日本| 欧美成人亚洲| 国产一区二区三区久久精品| 激情伊人五月天久久综合| 久久精品日韩| 日韩一级免费| 日韩视频不卡中文| 欧美色欧美亚洲高清在线视频| 制服丝袜亚洲播放| 亚洲区免费影片| 香蕉乱码成人久久天堂爱免费| 国产伦理一区| 在线日韩av永久免费观看| 国产精品久久午夜| 精品动漫3d一区二区三区免费版| 亚洲国产日韩综合一区| 亚洲午夜av在线| 亚洲国产高清aⅴ视频| 亚洲欧美变态国产另类| 国产麻豆精品久久一二三| 欧美r片在线| 国产精品视频导航| 国产精品爽黄69| 国产精品成人国产乱一区| 国产精品久久久| 日韩午夜电影在线观看| 欧美日韩一区不卡| 欧美区在线观看| 一区二区三区精品久久久| 妖精视频成人观看www| 欧美国产日韩一区二区| 亚洲夜间福利| 国产精品国产三级国产普通话蜜臀| 久久亚洲精品伦理| 欧美资源在线观看| 欧美日韩另类丝袜其他| 欧美日韩国产经典色站一区二区三区| 久久久久久国产精品一区| 欧美成人官网二区| 久久久水蜜桃| 亚洲午夜精品一区二区| 久久精品人人做人人爽电影蜜月| 久久一综合视频| 亚洲图片欧美一区| 亚洲精品免费一区二区三区| 亚洲中无吗在线| 国产美女精品免费电影| 亚洲日韩欧美一区二区在线| 欧美日韩精品一区二区三区| 亚洲性线免费观看视频成熟| 韩日午夜在线资源一区二区| 久久er精品视频| 麻豆亚洲精品| 亚洲无线一线二线三线区别av| 欧美精品久久天天躁| 国产日韩欧美在线观看| 久久成人免费视频| 欧美风情在线观看| 久久久精品欧美丰满| 欧美与黑人午夜性猛交久久久| 免费欧美日韩| 在线色欧美三级视频|