Linux下I2C設(shè)備驅(qū)動開發(fā)和實(shí)現(xiàn)
發(fā)布時間:2008/8/20 0:00:00 訪問次數(shù):670
i2c總線具有結(jié)構(gòu)簡單使用方便的特點(diǎn)。本文描述了linux下i2c驅(qū)動的結(jié)構(gòu),并在此基礎(chǔ)上給出了i2c設(shè)備驅(qū)動和應(yīng)用的實(shí)現(xiàn)。
1 引言
i2c (inter-integrated circuit)總線是一種由philips公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。i2c總線最主要的優(yōu)點(diǎn)是其簡單性和有效性。由于接口直接在組件之上,因此i2c總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本。i2c總線最初為音頻和視頻設(shè)備開發(fā),現(xiàn)已應(yīng)用于各種服務(wù)與管理場合,來實(shí)現(xiàn)配置或掌握組件的功能狀態(tài),如電源、系統(tǒng)風(fēng)扇、系統(tǒng)溫度等參數(shù),增加了系統(tǒng)的安全性,方便了管理。
2 i2c總線概述
i2c總線是由數(shù)據(jù)線sda和時鐘scl構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù),每個器件都有一個惟一的地址識別。i2c 規(guī)程運(yùn)用主/從雙向通訊。器件發(fā)送數(shù)據(jù)到總線上,則定義為發(fā)送器,器件接收數(shù)據(jù)則定義為接收器。主器件和從器件都可以工作于接收和發(fā)送狀態(tài)?偩必須由主器件(通常為微控制器)控制,主器件產(chǎn)生串行時鐘(scl)控制總線的傳輸方向,并產(chǎn)生起始和停止條件。sda線上的數(shù)據(jù)狀態(tài)僅在scl為低電平的期間才能改變,scl為高電平的期間,sda狀態(tài)的改變被用來表示起始和停止條件。
i2c總線在傳送數(shù)據(jù)過程中共有三種類型信號,它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。
開始信號:scl為高電平時,sda由高電平向低電平跳變,開始傳送數(shù)據(jù)。
結(jié)束信號:scl為低電平時,sda由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。
應(yīng)答信號:接收數(shù)據(jù)的ic在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的ic發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。cpu向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應(yīng)答信號,cpu接收到應(yīng)答信號后,根據(jù)實(shí)際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。
linux中i2c總線的驅(qū)動分為兩個部分,總線驅(qū)動(bus)和設(shè)備驅(qū)動(device)。其中總線驅(qū)動的職責(zé),是為系統(tǒng)中每個i2c總線增加相應(yīng)的讀寫方法。但是總線驅(qū)動本身并不會進(jìn)行任何的通訊,它只是存在那里,等待設(shè)備驅(qū)動調(diào)用其函數(shù),參見圖。
設(shè)備驅(qū)動則是與掛在i2c總線上的具體的設(shè)備通訊的驅(qū)動。通過i2c總線驅(qū)動提供的函數(shù),設(shè)備驅(qū)動可以忽略不同總線控制器的差異,不考慮其實(shí)現(xiàn)細(xì)節(jié)地與硬件設(shè)備通訊。
linux內(nèi)核i2c總線驅(qū)動程序構(gòu)架
在我們的linux驅(qū)動的i2c文件夾下有algos,busses,chips三個文件夾,另外還有i2c-core.c和i2c-dev.c兩個文件。其中i2c-core.c文件實(shí)現(xiàn)了i2c core框架,是linux內(nèi)核用來維護(hù)和管理的i2c的核心部分,其中維護(hù)了兩個靜態(tài)的list,分別記錄系統(tǒng)中的i2c driver結(jié)構(gòu)和i2c adapter結(jié)構(gòu)。i2c core提供接口函數(shù),允許一個i2c adatper,i2c driver和i2c client初始化時在i2c core中進(jìn)行注冊,以及退出時進(jìn)行注銷。同時還提供了i2c總線讀寫訪問的一般接口,主要應(yīng)用在i2c設(shè)備驅(qū)動中。
busses文件夾下的i2c-mpc.c文件實(shí)現(xiàn)了powerpc下i2c總線適配器驅(qū)動,定義描述了具體的i2c總線適配器的i2c_adapter數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)比較底層的對i2c總線訪問的具體方法。i2c adapter 構(gòu)造一個對i2c core層接口的數(shù)據(jù)結(jié)構(gòu),并通過接口函數(shù)向i2c core注冊一個控制器。i2c adapter主要實(shí)現(xiàn)對i2c總線訪問的算法,iic_xfer() 函數(shù)就是i2c adapter底層對i2c總線讀寫方法的實(shí)現(xiàn)。同時i2c adpter 中還實(shí)現(xiàn)了對i2c控制器中斷的處理函數(shù)。
i2c-dev.c文件中實(shí)現(xiàn)了i2c driver,提供了一個通用的i2c設(shè)備的驅(qū)動程序,實(shí)現(xiàn)了字符類型設(shè)備的訪問接口,實(shí)現(xiàn)了對用戶應(yīng)用層的接口,提供用戶程序訪問i2c設(shè)備的接口,包括實(shí)現(xiàn)open,release,read,write以及最重要的ioctl等標(biāo)準(zhǔn)文件操作的接口函數(shù)。我們可以通過open函數(shù)打開 i2c的設(shè)備文件,通過ioctl函數(shù)設(shè)定要訪問從設(shè)備的地址,然后就可以通過 read和write函數(shù)完成對i2c設(shè)備的讀寫操作。
通過i2c driver提供的通用方法可以訪問任何一個i2c的設(shè)備,但是其中實(shí)現(xiàn)的read,write及ioctl等功能完全是基于一般設(shè)備的實(shí)現(xiàn),所有的操作數(shù)據(jù)都是基于字節(jié)流,沒有明確的格式和意義。為了更方便和有效地使用i2c設(shè)備,我們可以為一個具體的i2c設(shè)備開發(fā)特定的i2c設(shè)備驅(qū)動程序,在驅(qū)動中完成對特定的數(shù)據(jù)格式的解釋以及實(shí)現(xiàn)一些專用的功能。
4 linux下i2c具體驅(qū)動開發(fā)
tmp75是ti公司推出的基于i2c總線的數(shù)字溫度傳感器,具有低的功耗,高數(shù)字分辨率,廣泛應(yīng)用于電源溫度監(jiān)控,計(jì)算機(jī)外設(shè)保護(hù),筆記本和蜂窩電話中。針對該設(shè)備開發(fā)驅(qū)動程序,由于linux系統(tǒng)下已經(jīng)實(shí)現(xiàn)了i2c core框架,i2c總線適配
i2c總線具有結(jié)構(gòu)簡單使用方便的特點(diǎn)。本文描述了linux下i2c驅(qū)動的結(jié)構(gòu),并在此基礎(chǔ)上給出了i2c設(shè)備驅(qū)動和應(yīng)用的實(shí)現(xiàn)。
1 引言
i2c (inter-integrated circuit)總線是一種由philips公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。i2c總線最主要的優(yōu)點(diǎn)是其簡單性和有效性。由于接口直接在組件之上,因此i2c總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本。i2c總線最初為音頻和視頻設(shè)備開發(fā),現(xiàn)已應(yīng)用于各種服務(wù)與管理場合,來實(shí)現(xiàn)配置或掌握組件的功能狀態(tài),如電源、系統(tǒng)風(fēng)扇、系統(tǒng)溫度等參數(shù),增加了系統(tǒng)的安全性,方便了管理。
2 i2c總線概述
i2c總線是由數(shù)據(jù)線sda和時鐘scl構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù),每個器件都有一個惟一的地址識別。i2c 規(guī)程運(yùn)用主/從雙向通訊。器件發(fā)送數(shù)據(jù)到總線上,則定義為發(fā)送器,器件接收數(shù)據(jù)則定義為接收器。主器件和從器件都可以工作于接收和發(fā)送狀態(tài)?偩必須由主器件(通常為微控制器)控制,主器件產(chǎn)生串行時鐘(scl)控制總線的傳輸方向,并產(chǎn)生起始和停止條件。sda線上的數(shù)據(jù)狀態(tài)僅在scl為低電平的期間才能改變,scl為高電平的期間,sda狀態(tài)的改變被用來表示起始和停止條件。
i2c總線在傳送數(shù)據(jù)過程中共有三種類型信號,它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。
開始信號:scl為高電平時,sda由高電平向低電平跳變,開始傳送數(shù)據(jù)。
結(jié)束信號:scl為低電平時,sda由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。
應(yīng)答信號:接收數(shù)據(jù)的ic在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的ic發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。cpu向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應(yīng)答信號,cpu接收到應(yīng)答信號后,根據(jù)實(shí)際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。
linux中i2c總線的驅(qū)動分為兩個部分,總線驅(qū)動(bus)和設(shè)備驅(qū)動(device)。其中總線驅(qū)動的職責(zé),是為系統(tǒng)中每個i2c總線增加相應(yīng)的讀寫方法。但是總線驅(qū)動本身并不會進(jìn)行任何的通訊,它只是存在那里,等待設(shè)備驅(qū)動調(diào)用其函數(shù),參見圖。
設(shè)備驅(qū)動則是與掛在i2c總線上的具體的設(shè)備通訊的驅(qū)動。通過i2c總線驅(qū)動提供的函數(shù),設(shè)備驅(qū)動可以忽略不同總線控制器的差異,不考慮其實(shí)現(xiàn)細(xì)節(jié)地與硬件設(shè)備通訊。
linux內(nèi)核i2c總線驅(qū)動程序構(gòu)架
在我們的linux驅(qū)動的i2c文件夾下有algos,busses,chips三個文件夾,另外還有i2c-core.c和i2c-dev.c兩個文件。其中i2c-core.c文件實(shí)現(xiàn)了i2c core框架,是linux內(nèi)核用來維護(hù)和管理的i2c的核心部分,其中維護(hù)了兩個靜態(tài)的list,分別記錄系統(tǒng)中的i2c driver結(jié)構(gòu)和i2c adapter結(jié)構(gòu)。i2c core提供接口函數(shù),允許一個i2c adatper,i2c driver和i2c client初始化時在i2c core中進(jìn)行注冊,以及退出時進(jìn)行注銷。同時還提供了i2c總線讀寫訪問的一般接口,主要應(yīng)用在i2c設(shè)備驅(qū)動中。
busses文件夾下的i2c-mpc.c文件實(shí)現(xiàn)了powerpc下i2c總線適配器驅(qū)動,定義描述了具體的i2c總線適配器的i2c_adapter數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)比較底層的對i2c總線訪問的具體方法。i2c adapter 構(gòu)造一個對i2c core層接口的數(shù)據(jù)結(jié)構(gòu),并通過接口函數(shù)向i2c core注冊一個控制器。i2c adapter主要實(shí)現(xiàn)對i2c總線訪問的算法,iic_xfer() 函數(shù)就是i2c adapter底層對i2c總線讀寫方法的實(shí)現(xiàn)。同時i2c adpter 中還實(shí)現(xiàn)了對i2c控制器中斷的處理函數(shù)。
i2c-dev.c文件中實(shí)現(xiàn)了i2c driver,提供了一個通用的i2c設(shè)備的驅(qū)動程序,實(shí)現(xiàn)了字符類型設(shè)備的訪問接口,實(shí)現(xiàn)了對用戶應(yīng)用層的接口,提供用戶程序訪問i2c設(shè)備的接口,包括實(shí)現(xiàn)open,release,read,write以及最重要的ioctl等標(biāo)準(zhǔn)文件操作的接口函數(shù)。我們可以通過open函數(shù)打開 i2c的設(shè)備文件,通過ioctl函數(shù)設(shè)定要訪問從設(shè)備的地址,然后就可以通過 read和write函數(shù)完成對i2c設(shè)備的讀寫操作。
通過i2c driver提供的通用方法可以訪問任何一個i2c的設(shè)備,但是其中實(shí)現(xiàn)的read,write及ioctl等功能完全是基于一般設(shè)備的實(shí)現(xiàn),所有的操作數(shù)據(jù)都是基于字節(jié)流,沒有明確的格式和意義。為了更方便和有效地使用i2c設(shè)備,我們可以為一個具體的i2c設(shè)備開發(fā)特定的i2c設(shè)備驅(qū)動程序,在驅(qū)動中完成對特定的數(shù)據(jù)格式的解釋以及實(shí)現(xiàn)一些專用的功能。
4 linux下i2c具體驅(qū)動開發(fā)
tmp75是ti公司推出的基于i2c總線的數(shù)字溫度傳感器,具有低的功耗,高數(shù)字分辨率,廣泛應(yīng)用于電源溫度監(jiān)控,計(jì)算機(jī)外設(shè)保護(hù),筆記本和蜂窩電話中。針對該設(shè)備開發(fā)驅(qū)動程序,由于linux系統(tǒng)下已經(jīng)實(shí)現(xiàn)了i2c core框架,i2c總線適配
熱門點(diǎn)擊
- 存儲器的地址線(Address Line)數(shù)
- 一套數(shù)字音頻采集、播放和傳輸系統(tǒng)的實(shí)現(xiàn)
- 1-Wire總線與DS18B20應(yīng)用仿真
- 在嵌入式系統(tǒng)中應(yīng)用NAND Flash閃存作
- 韋爾推出用于超高速接口的靜電保護(hù)芯片ESDA
- 基于μPD780822型單片機(jī)的客車CAN總
- 基于USB的ARINC429總線接口模塊設(shè)計(jì)
- 賽普拉斯2Mb/8Mb nvSRAM無需電池
- ST7267單片機(jī)與SIM卡的接口設(shè)計(jì)
- 基于鐵電存儲器FM25640在電表數(shù)據(jù)存儲中
推薦技術(shù)資料
- 100A全集成電源模塊R
- Teseo-VIC6A GNSS車用精準(zhǔn)定位
- 高效先進(jìn)封裝工藝
- 模數(shù)轉(zhuǎn)換器 (Analog-to-Digit
- 集成模數(shù)轉(zhuǎn)換器(ADC)
- 128 通道20 位電流數(shù)字轉(zhuǎn)換器̴
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究