摘要: 本文分析了Linux系統中I2C驅動程序的結構,并以AT91RM9200和X1227為例,介紹了如何在嵌入式Linux系統中實現I2C總線適配器及I2C設備驅動。
關鍵詞: Linux;I2C總線;I2C設備;驅動
引言
    I2C總線是PHILIPS公司推出的兩線式串行總線,用于連接微控制器及">

欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

技術頻道

嵌入式Linux系統中I2C總線設備的驅動設計

摘要: 本文分析了Linux系統中I2C驅動程序的結構,并以AT91RM9200和X1227為例,介紹了如何在嵌入式Linux系統中實現I2C總線適配器及I2C設備驅動。
關鍵詞: Linux;I2C總線;I2C設備;驅動
引言
I2C總線是PHILIPS公司推出的兩線式串行總線,用于連接微控制器及其外圍設備,具有簡單、高效等特點。由于其接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片引腳的數量,降低了互聯成本,特別適用于嵌入式產品。
而Linux系統具有開源、免費、網上資源豐富等優點,目前已成為嵌入式系統的主流選擇。因此如何在嵌入式Linux系統中實現I2C功能成為實際開發中的問題。
I2C總線
I2C 總線通過串行數據SDA 和串行時鐘SCL線在連接到總線的器件間傳遞信息,每個器件都有一個唯一的地址識別。根據數據傳輸時的功能不同,把器件分為主機和從機。主機是初始化總線的數據傳輸并產生允許傳輸的時鐘信號的器件,通常是微控制器。此時,任何被尋址的器件都被認為是從機,例如LCD驅動器、E2PROM等。
I2C總線協議規定,各主機進行通信時都要有起始、結束、發送數據和應答信號。這些信號都是通信過程中的基本單元。起始信號就是在SCL線為高時SDA線從高變化到低;停止信號就是在SCL線為高時SDA線從低變化到高;應答信號是在SCL為高時SDA為低;非應答信號相反,是在SCL為高時SDA為高。
總線傳送的每1幀數據均是1個字節。協議規定,在啟動總線后的第1個字節的高7位是對從機的尋址地址,第8位為方向位(“0”表示主機對從機的寫操作;“1”表示主機對從機的讀操作),其余的字節為操作數據。數據傳送過程是:在I2C總線發送起始信號后,發送從機的7位尋址地址和1位表示這次操作性質的讀寫位,在有應答信號后開始傳送數據,直到發送停止信號。主機每發送1個字節就要檢測SDA線上有沒有收到應答信號,有則繼續發送,否則將停止發送數據。
Linux中I2C總線驅動結構
Linux系統對I2C總線具有很好的支持。與硬件物理連接相對應的,Linux的I2C框架中各個部分的關系如圖1所示。

圖1 Linux內核I2C總線驅動程序構架

內核中I2C相關代碼可以分為三個層次:
1. I2C core框架:提供了核心數據結構的定義和相關接口函數,用來實現I2C適配器驅動和設備驅動的注冊、注銷管理,以及I2C通信方法上層的、與具體適配器無關的代碼,為系統中每個I2C總線增加相應的讀寫方法。
2. I2C總線適配器驅動:定義描述具體I2C總線適配器的i2c_adapter數據結構、實現在具體I2C適配器上的I2C總線通信方法,并由i2c_algorithm數據結構進行描述。
3. I2C 設備驅動:定義描述具體設備的i2c_client和可能的私有數據結構、借助I2C core提供的函數接口完成設備在內核的注冊,并實現具體的功能,包括read, write以及ioctl等對用戶層操作的接口。
總體而言,Linux中I2C總線的驅動分為兩個部分:總線驅動(BUS)和設備驅動(DEVICE)。I2C core與I2C總線適配器驅動完成了硬件上的主機總線驅動(BUS),而I2C driver則實現了從機設備驅動。在設計中,I2C core提供的接口是統一的,不需要修改,我們只需要實現特定I2C總線適配器驅動和I2C設備驅動,這樣大大提高了系統的可移植性。
筆者在某個產品中曾用AT91RM9200和X1227構成嵌入式系統的時鐘模塊。在該設計中,AT91RM9200作為I2C的主機部分,X1227作為從機。下面以此為例,具體介紹這兩部分驅動的實現。
AT91RM9200 I2C總線驅動實現
AT91RM9200是ARM920T處理器,它提供標準的兩線接口TWI,即I2C接口,主機工作模式。通過TWI 控制寄存器TWI_CR設置I2C工作模式和狀態。時鐘由寄存器TWI_CWGR中編程值產生。該寄存器定義了TWCK 信號,使接口適應寬范圍時鐘。
具體在linux中AT91RM9200 I2C總線適配器驅動的實現,首先初始化AT91RM9200 I2C的工作模式,然后裝載I2C總線驅動,這需要兩個結構模塊來描述:struct i2c_adapter和struct i2c_algorithm。
初始化i2c_adapter結構成員如下:
static struct i2c_adapter at91rm9200_adapter = {
name: "AT91RM9200",
id: I2C_ALGO_SMBUS,
algo: &at91_algorithm,
algo_data: NULL,
inc_use: at91_inc,
dec_use: at91_dec,
... ...
};
這個模塊并未提供讀寫函數,具體的讀寫方法由第二個模塊struct i2c_algorithm提供。
static struct i2c_algorithm at91_algorithm = {
name: "at91 i2c",
id: I2C_ALGO_SMBUS,
smbus_xfer: at91_smbus_xfer,
master_xfer: at91_xfer,
functionality: at91_func,
};
通過調用I2C core中的接口函數i2c_add_adapter將這兩個模塊注冊到操作系統里,總線驅動就算裝上了。由此可見,i2c_algorithm實現了i2c通信具體方法。針對本文at91rm9200 I2C適配器, at91_xfer最為關鍵。分析內核可知,I2C core框架中提供給主機使用的數據傳輸接口:i2c_master_send,i2c_master_recv,i2c_transfer最終都是通過調用at91_xfer實現。
數據傳輸處理如下:數據發送主機初始化Start狀態后,向主機模式寄存器TWI_MMR中DADR發送一個7位從機地址,以通知從機器件。從機地址后的位表示傳輸方向(寫或讀)。該位為0,說明是寫操作(發送操作);若該位為1,說明為數據讀請求( 接收操作)。TWI 傳輸要求從機每收到一個字節后均要給出應答。在應答時鐘脈沖中,主機釋放數據線(HIGH),將從機拉低以產生應答。主機在該時鐘脈沖中輪詢數據線,可使用輪詢或中斷方式來檢驗狀態位。若從機未應答該字節,將置位狀態寄存器TWI_SR的NAK 位。
寫操作則發送數據至保持寄存器TWI_THR,設置TWI_CR的START 位以啟動傳輸。數據在內部移位寄存器中移位,當檢測到應答,TXRDY位置位,直到TWI_THR中有新數據寫入,才清除該位。主機產生STOP 狀態來結束傳輸。設置START 后開始讀序列。當狀態寄存器中RXRDY 位置位時,接收保持寄存器(TWI_RHR)以收到一個字符。當讀TWI_RHR 時RXRDY 位復位。
TWI接口可執行多種傳輸格式:7位從機地址和10位從機地址。通過主機模式寄存器TWI_MMR配置三個內部地址字節。若從機僅支持7 位地址,IADRSZ 必須置為0。若從機地址大于7 位,用戶必須配置地址大小IADRSZ 并在內部地址寄存器TWI_IADR中設置其他從機地址位。
X1227的設備驅動實現
X1227 是一個帶有時鐘、日歷、CPU 監控電路和兩路查詢報警的實時時鐘。時鐘使用一個低成本的32.768kHz 的晶體作為輸入,可精密地用秒、分鐘、小時、日期、星期、月、年來顯示時間,它可以自動調整閏年至2096年。同時X1227有一個看門狗定時器、3個超時時間可供選擇。另外,X1227有一個4K位的EEPROM陣列,可用作某些用戶配置數據的存儲器。下面以X1227為例,說明一個具體的I2C設備驅動程序的設計要點。
如前所述,I2C總線驅動只是提供了對一條總線的讀寫機制,本身并不會去做通信。通信是由I2C設備驅動來做的,設備驅動透過I2C總線同具體的設備進行通訊。一個設備驅動有兩個模塊來描述,struct i2c_client和struct i2c_driver。i2c_client用來描述一個具體的I2C設備,i2c_driver結構提供了i2c_adapter與i2c_client之間的通信方式。
struct i2c_driver x1227_driver = {
name: 襒1227?
id: I2C_DRIVERID_X1227,
flags: I2C_DF_NOTIFY,
attach_adapter: x1227_probe,
detach_client: x1227_detach,
command: x1227_command
};
其中:attach_adapter利用適配器驅動提供的I2C總線訪問方法,利用設備驅動程序模塊中提供的地址線索信息,檢測可能存在的設備及其地址。如果成功發現設備,則創建一個struct i2c_client來標識這個設備,并向該適配器的數據結構注冊。detach_client用于從總線上注銷設備、并釋放i2c_client及相應的私有數據結構。command是用戶接口中的ioctl功能的底層實現。
I2C設備驅動需要實現兩個方面的接口,一個是對I2C core框架的接口,設備初始化時通過函數i2c_add_driver調用,來實現驅動的注冊。這個i2c_driver一旦裝入完成,其中的attach_adapter函數就會被調用。
另一個是對用戶應用層的接口,提供用戶程序訪問I2C設備的接口,包括實現open,release,read,write以及最重要的ioctl等標準文件操作的接口函數。每個設備驅動程序都有一個稱為file_operations的數據結構,用來實現接口函數。
static struct file_operations rtc_fops = {
owner: THIS_MODULE,
ioctl: x1227_rtc_ioctl,
open: x1227_rtc_open,
release: x1227_rtc_release,
};
其中open和release用來打開和關閉X1227,x1227_rtc_ioctl則向用戶提供的一系列控制時鐘芯片的具體命令:RTC_GET_TIME(以固定的數據格式讀取實時時鐘的時間)、RTC_SET_TIME(以固定的數據格式設定實時時鐘的時間)以及E2PROM讀寫等。
對于X1227,一般注冊為一個miscdevice設備(所有miscdevice設備共同一個主設備號,不同的次設備號)。
static struct miscdevice x1227_rtc_miscdev = {
RTC_MINOR,
tc?
&rtc_fops
};
初始化時,通過misc_register (&x1227_rtc_miscdev)注冊X1227,這樣用戶程序可以通過主設備號10 次設備號 135的設備節點/dev/rtc來訪問X1227。
要測試X1227的時鐘功能,首先把AT91RM9200的I2C總線驅動模塊和X1227模塊在系統啟動時先后加載。需要指出的是,Linux將時鐘分為系統時鐘和硬件時鐘兩種。系統時鐘是指當前Linux Kernel中的時鐘,而硬件時鐘則是主板上由電池供電的那個主板硬件時鐘,也就是本文中的X1227。
在Linux中,用于時鐘查看和設置的命令主要有date、hwclock。首先設置系統時鐘,比如設置為2006年8月17日12點30分:date 081712302006,然后設置硬件時鐘為當前系統時鐘時間,使用命令/sbin/hwclock 衧ystohc,則X1227中的時間設置為當前系統時間。然后,通常在操作系統啟動時設置啟動腳本/sbin/hwclock 衕ctosys,利用X1227內的時間更新系統時鐘,然后直到重啟或關閉系統,由系統時鐘來記錄時間。
結語
本文介紹了I2C總線適配器及I2C設備驅動的實現。該設計成功用于某網絡測試設備的主控模塊上,實現了設備的實時時鐘功能,便于整個系統的監控。I2C總線在目前的嵌入式領域中應用非常廣泛,如音/視頻的控制,存儲設備的通訊等,而Linux也已成為嵌入式系統的主流。從linux內核看,I2C的驅動程序具有清晰的層次結構,為編程者開發I2C相關驅動提供了規范的框架。

文章版權歸西部工控xbgk所有,未經許可不得轉載。

欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

      9000px;">

          欧美一级理论性理论a| 中文字幕在线不卡| 亚洲靠逼com| 色香蕉成人二区免费| 一区二区三区日本| 欧美日韩中文精品| 免费欧美在线视频| 国产精品系列在线| 色94色欧美sute亚洲线路一ni | 91黄色激情网站| 午夜精品福利在线| 久久夜色精品国产噜噜av| av电影在线观看一区| 亚洲高清免费观看高清完整版在线观看| 欧美日韩一区二区电影| 精品一区二区三区免费视频| 亚洲乱码日产精品bd| 欧美成人vps| 欧洲一区在线电影| 国产精品亚洲成人| 日韩精品久久理论片| 亚洲视频一区在线观看| 久久―日本道色综合久久| 色婷婷一区二区三区四区| 国产在线不卡一区| 日韩电影免费在线观看网站| 久久综合九色综合欧美98| 99久久夜色精品国产网站| 狠狠色狠狠色综合| 午夜欧美在线一二页| 亚洲你懂的在线视频| 日本一二三四高清不卡| 日韩欧美国产综合在线一区二区三区| 成人18精品视频| 九一九一国产精品| 麻豆中文一区二区| 天堂精品中文字幕在线| 亚洲一区二区三区美女| 国产精品久久久爽爽爽麻豆色哟哟| 日韩美女一区二区三区| 欧美精品第1页| 在线免费亚洲电影| 色乱码一区二区三区88| 成人黄色电影在线| 国产电影精品久久禁18| 国产乱淫av一区二区三区| 九九视频精品免费| 精品中文av资源站在线观看| 激情深爱一区二区| 国精产品一区一区三区mba视频| 一区二区视频免费在线观看| 国产日韩精品一区| 久久久亚洲高清| 欧美电影免费观看完整版| 欧美一激情一区二区三区| 欧美性色综合网| 欧美三级乱人伦电影| 欧美区一区二区三区| 7777精品伊人久久久大香线蕉超级流畅 | 欧美大片拔萝卜| 在线不卡中文字幕播放| 日韩一级黄色大片| 欧美精品一区二区高清在线观看| 精品国内片67194| 久久亚洲精精品中文字幕早川悠里| 精品国产乱码久久久久久闺蜜| 欧美一区二区三区四区视频| 欧美电影免费观看高清完整版在线观看 | 91亚洲精品一区二区乱码| 99久久精品一区| 在线看日韩精品电影| 欧美老人xxxx18| 精品国产成人系列| 中文字幕一区二区三| 依依成人综合视频| 偷拍一区二区三区| 麻豆国产91在线播放| 福利电影一区二区| 欧美午夜理伦三级在线观看| 欧美一级精品大片| 亚洲国产精品国自产拍av| 亚洲综合在线视频| 激情六月婷婷综合| 国产成人在线视频免费播放| 色噜噜狠狠色综合中国| 精品剧情在线观看| 亚洲综合一区在线| 国产精品亚洲人在线观看| 色综合视频在线观看| 精品久久久久一区| 亚洲欧美aⅴ...| 国产一区二区三区四区五区美女 | 国产精品夜夜嗨| 欧美三区免费完整视频在线观看| 精品国内片67194| 香蕉成人伊视频在线观看| 精品一二三四区| 欧美日韩亚洲综合一区二区三区 | 成人免费av网站| 777色狠狠一区二区三区| 亚洲丝袜制服诱惑| 国产精品亚洲一区二区三区在线| 欧美日韩不卡在线| 亚洲欧美二区三区| 91视视频在线直接观看在线看网页在线看 | 精品一区二区在线免费观看| 97精品久久久午夜一区二区三区 | 久久精品人人做人人爽97| 亚洲香蕉伊在人在线观| 91亚洲精华国产精华精华液| 精品国内片67194| 日韩av中文在线观看| 97久久精品人人做人人爽| 欧美激情自拍偷拍| 国产盗摄一区二区| 久久久99精品免费观看不卡| 捆绑调教美女网站视频一区| 欧美一区二区精美| 轻轻草成人在线| 日韩欧美国产三级电影视频| 一区二区三区四区在线播放| 国产成人在线电影| 久久免费精品国产久精品久久久久| 男男gaygay亚洲| 精品处破学生在线二十三| 蜜臀av亚洲一区中文字幕| 日韩一级欧美一级| 国内久久婷婷综合| 国产嫩草影院久久久久| 国产成人丝袜美腿| 亚洲国产精品二十页| 不卡的av在线| 亚洲精品写真福利| 欧美日韩www| 久久精品av麻豆的观看方式| 久久众筹精品私拍模特| 国产成人综合精品三级| 国产精品每日更新| 色爱区综合激月婷婷| 亚洲不卡一区二区三区| 在线播放中文字幕一区| 美女在线观看视频一区二区| 日韩西西人体444www| 成人晚上爱看视频| 亚洲自拍偷拍九九九| 日韩欧美不卡在线观看视频| 精品影视av免费| 亚洲人被黑人高潮完整版| 欧美日韩国产另类一区| 麻豆91精品91久久久的内涵| 欧美激情中文字幕一区二区| 日本大香伊一区二区三区| 视频一区二区不卡| 国产欧美日韩在线看| 色女孩综合影院| 蜜桃视频在线一区| 国产精品视频免费看| 欧美三级欧美一级| 成人夜色视频网站在线观看| 一区二区三区中文字幕| 久久久久久一二三区| 欧洲在线/亚洲| 国产成人av一区| 日韩综合一区二区| 亚洲欧洲日产国码二区| 国产欧美日韩麻豆91| 国产99久久久精品| 日韩中文字幕麻豆| 亚洲欧美韩国综合色| 欧美精品一区二区高清在线观看| 91网页版在线| 国产成人精品免费一区二区| 日韩av一二三| 亚洲第一久久影院| 亚洲欧美一区二区在线观看| 日韩视频一区在线观看| 欧美最新大片在线看| 成人一区在线看| 狠狠色丁香九九婷婷综合五月| 亚洲综合成人在线视频| 中文字幕一区二区视频| 久久久精品免费免费| 日韩你懂的在线观看| 91精品国产全国免费观看| 一本大道久久a久久综合婷婷| 韩国三级中文字幕hd久久精品| 亚洲亚洲人成综合网络| 亚洲免费观看高清| 亚洲日本乱码在线观看| 欧美激情一区二区| 国产日韩欧美a| 日本一区二区三区高清不卡| 久久久精品蜜桃| 久久精品夜夜夜夜久久| 国产亚洲一二三区| 国产精品欧美综合在线| 国产精品毛片大码女人| 国产精品女人毛片| 成人免费在线视频| 一区二区三区资源|