Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析
關(guān)于Exynos4412 IIC 裸機(jī)開發(fā)請(qǐng)看 :Exynos4412 裸機(jī)開發(fā) —— IIC總線?,下面回顧下 IIC 基礎(chǔ)概念
一、IIC 基礎(chǔ)概念
? ? ? ?IIC(Inter-Integrated Circuit)總線是一種由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。IIC總線產(chǎn)生于在80年代,最初為音頻和視頻設(shè)備開發(fā),如今主要在服務(wù)器管理中使用,其中包括單個(gè)組件狀態(tài)的通信。例如管理員可對(duì)各個(gè)組件進(jìn)行查詢,以管理系統(tǒng)的配置或掌握組件的功能狀態(tài),如電源和系統(tǒng)風(fēng)扇。可隨時(shí)監(jiān)控內(nèi)存、硬盤、網(wǎng)絡(luò)、系統(tǒng)溫度等多個(gè)參數(shù),增加了系統(tǒng)的安全性,方便了管理。
1、 IIC總線的特點(diǎn)
? ? ? ?IIC總線最主要的優(yōu)點(diǎn)是其簡(jiǎn)單性和有效性。由于接口直接在組件之上,因此IIC總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本??偩€的長(zhǎng)度可高達(dá)25英尺,并且能夠以10Kbps的最大傳輸速率支持40個(gè)組件。IIC總線的另一個(gè)優(yōu)點(diǎn)是,它支持多主控(multimastering), 其中任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主總線。一個(gè)主控能夠控制信號(hào)的傳輸和時(shí)鐘頻率。當(dāng)然,在任何時(shí)間點(diǎn)上只能有一個(gè)主控。
2、IIC總線工作原理
a -- 總線構(gòu)成
? ? ? IIC總線是由數(shù)據(jù)線SDA和時(shí)鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在CPU與被控IC之間、IC與IC之間進(jìn)行雙向傳送,最高傳送速率100kbps。各種被控制電路均并聯(lián)在這條總線上,但就像電話機(jī)一樣只有撥通各自的號(hào)碼才能工作,所以每個(gè)電路和模塊都有唯一的地址,在信息的傳輸過程中,IIC總線上并接的每一模塊電路既是主控器(或被控器),又是發(fā)送器(或接收器),這取決于它所要完成的功能。
CPU發(fā)出的控制信號(hào)分為地址碼和控制量兩部分:
1) 地址碼用來選址,即接通需要控制的電路,確定控制的種類;
2) 控制量決定該調(diào)整的類別(如對(duì)比度、亮度等)及需要調(diào)整的量。
? ? 這樣,各控制電路雖然掛在同一條總線上,卻彼此獨(dú)立,互不相關(guān)。
b --?信號(hào)類型
? ? IIC總線在傳送數(shù)據(jù)過程中共有四種類型信號(hào):
開始信號(hào):SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù);
結(jié)束信號(hào):SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù);
數(shù)據(jù)傳輸信號(hào):在開始條件以后,時(shí)鐘信號(hào)SCL的高電平周期期問,當(dāng)數(shù)據(jù)線穩(wěn)定時(shí),數(shù)據(jù)線SDA的狀態(tài)表示數(shù)據(jù)有效,即數(shù)據(jù)可以被讀走,開始進(jìn)行讀操作。在時(shí)鐘信號(hào)SCL的低電平周期期間,數(shù)據(jù)線上數(shù)據(jù)才允許改變。每位數(shù)據(jù)需要一個(gè)時(shí)鐘脈沖。
應(yīng)答信號(hào):接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個(gè)信號(hào)后,等待受控單元發(fā)出一個(gè)應(yīng)答信號(hào),CPU接收到應(yīng)答信號(hào)后,根據(jù)實(shí)際情況作出是否繼續(xù)傳遞信號(hào)的判斷。若未收到應(yīng)答信號(hào),由判斷為受控單元出現(xiàn)故障。
? ? ? 目前有很多半導(dǎo)體集成電路上都集成了IIC接口。帶有IIC接口的單片機(jī)有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外圍器件如存儲(chǔ)器、監(jiān)控芯片等也提供IIC接口。
3、總線基本操作
? ? ?IIC規(guī)程運(yùn)用主/從雙向通訊。器件發(fā)送數(shù)據(jù)到總線上,則定義為發(fā)送器,器件接收數(shù)據(jù)則定義為接收器。主器件和從器件都可以工作于接收和發(fā)送狀態(tài)。 總線必須由主器件(通常為微控制器)控制,主器件產(chǎn)生串行時(shí)鐘(SCL)控制總線的傳輸方向,并產(chǎn)生起始和停止條件。SDA線上的數(shù)據(jù)狀態(tài)僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態(tài)的改變被用來表示起始和停止條件。
a -- 控制字節(jié)
? ? ? 在起始條件之后,必須是器件的控制字節(jié),其中高四位為器件類型識(shí)別符(不同的芯片類型有不同的定義,EEPROM一般應(yīng)為1010),接著三位為片選,最后一位為讀寫位,當(dāng)為1時(shí)為讀操作,為0時(shí)為寫操作。
b -- 寫操作
? ? ? 寫操作分為字節(jié)寫和頁面寫兩種操作,對(duì)于頁面寫根據(jù)芯片的一次裝載的字節(jié)不同有所不同。關(guān)于頁面寫的地址、應(yīng)答和數(shù)據(jù)傳送的時(shí)序。
c -- 讀操作
? ? ? 讀操作有三種基本操作:當(dāng)前地址讀、隨機(jī)讀和順序讀。圖4給出的是順序讀的時(shí)序圖。應(yīng)當(dāng)注意的是:最后一個(gè)讀操作的第9個(gè)時(shí)鐘周期不是“不關(guān)心”。為了結(jié)束讀操作,主機(jī)必須在第9個(gè)周期間發(fā)出停止條件或者在第9個(gè)時(shí)鐘周期內(nèi)保持SDA為高電平、然后發(fā)出停止條件。
d -- 總線仲裁
? ? ? ?主機(jī)只能在總線空閑的時(shí)候啟動(dòng)傳輸。兩個(gè)或多個(gè)主機(jī)可能在起始條件的最小持續(xù)內(nèi)產(chǎn)生一個(gè)起始條件,結(jié)果在總線上產(chǎn)生一個(gè)規(guī)定的起始條件。
? ? ? ?當(dāng)SCL線是高電平時(shí),仲裁在SDA線發(fā)生:這樣,在其他主機(jī)發(fā)送低電平時(shí),發(fā)送高電平的主機(jī)將斷開它的數(shù)據(jù)輸出級(jí),因?yàn)榭偩€上的電平和它自己的電平不同。
? ? ? 仲裁可以持續(xù)多位。從地址位開始,同一個(gè)器件的話接著就是數(shù)據(jù)位(如果主機(jī)-發(fā)送器),或者比較相應(yīng)位(如果主機(jī)-接收器)。IIC總線的地址和數(shù)據(jù)信息由贏得仲裁的主機(jī)決定,在這個(gè)過程中不會(huì)丟失信息。
仲裁不能在下面情況之間進(jìn)行:
1)重復(fù)起始條件和數(shù)據(jù)位;
2)停止條件和數(shù)據(jù)位;
3)重復(fù)起始條件和停止條件。
4、特性總結(jié)
? ? ? IIC肯定是2線的(不算地線)IIC協(xié)議確實(shí)很科學(xué),比3/4線的SPI要好,當(dāng)然線多通訊速率相對(duì)就快了
IIC的原則是
a -- 在SCL=1(高電平)時(shí),SDA千萬別忽悠!!!否則,SDA下跳則"判罰"為"起始信號(hào)S",SDA上跳則"判罰"為"停止信號(hào)P".
b -- 在SCL=0(低電平)時(shí),SDA隨便忽悠!!!(可別忽悠過火到SCL跳高)
c -- 每個(gè)字節(jié)后應(yīng)該由對(duì)方回送一個(gè)應(yīng)答信號(hào)ACK做為對(duì)方在線的標(biāo)志.非應(yīng)答信號(hào)一般在所有字節(jié)的最后一個(gè)字節(jié)后.一般要由雙方協(xié)議簽定.
d --?SCL必須由主機(jī)發(fā)送,否則天下大亂
e -- 首字節(jié)是"片選信號(hào)",即7位從機(jī)地址加1位方向(讀寫)控制.從機(jī)收到(聽到)自己的地址才能發(fā)送應(yīng)答信號(hào)(必須應(yīng)答!!!)表示自己在線.其他地址的從機(jī)不允許忽悠!!!(當(dāng)然群呼可以忽悠但只能聽不許說話)
f -- 讀寫是站在主機(jī)的立場(chǎng)上定義的."讀"是主機(jī)接收從機(jī)數(shù)據(jù),"寫"是主機(jī)發(fā)送數(shù)據(jù)給從機(jī).
g-- 重復(fù)位主要用于主機(jī)從發(fā)送模式到接收模式的轉(zhuǎn)換"信號(hào)",由于只有2線,所以收發(fā)轉(zhuǎn)換肯定要比SPI復(fù)雜,因?yàn)镾PI可用不同的邊沿來收發(fā)數(shù)據(jù),而IIC不行.
h -- 在硬件IIC模塊,特別是MCU/ARM/DSP等每個(gè)階段都會(huì)得到一個(gè)準(zhǔn)確的狀態(tài)碼,根據(jù)這個(gè)狀態(tài)碼可以很容易知道現(xiàn)在在什么狀態(tài)和什么出錯(cuò)信息.
i -- 7位IIC總線可以掛接127個(gè)不同地址的IIC設(shè)備,0號(hào)"設(shè)備"作為群呼地址.10位IIC總線可以掛接更多的10位IIC設(shè)備.
二、 Linux下IIC驅(qū)動(dòng)架構(gòu)
? ? ? ? ?Linux定義了系統(tǒng)的IIC驅(qū)動(dòng)體系結(jié)構(gòu),在Linux系統(tǒng)中,IIC驅(qū)動(dòng)由3部分組成,即IIC核心、IIC總線驅(qū)動(dòng)和IIC設(shè)備驅(qū)動(dòng)。這3部分相互協(xié)作,形成了非常通用、可適應(yīng)性很強(qiáng)的IIC框架。
? ? ? ?上圖完整的描述了linux i2c驅(qū)動(dòng)架構(gòu),雖然I2C硬件體系結(jié)構(gòu)比較簡(jiǎn)單,但是i2c體系結(jié)構(gòu)在linux中的實(shí)現(xiàn)卻相當(dāng)復(fù)雜。
? ? ? ?那么我們?nèi)绾尉帉懱囟╥2c接口器件的驅(qū)動(dòng)程序?就是說上述架構(gòu)中的那些部分需要我們完成,而哪些是linux內(nèi)核已經(jīng)完善的或者是芯片提供商已經(jīng)提供的?
1、架構(gòu)層次分類
??第一層:提供i2c adapter的硬件驅(qū)動(dòng),探測(cè)、初始化i2c adapter(如申請(qǐng)i2c的io地址和中斷號(hào)),驅(qū)動(dòng)soc控制的i2c adapter在硬件上產(chǎn)生信號(hào)(start、stop、ack)以及處理i2c中斷。覆蓋圖中的硬件實(shí)現(xiàn)層
? ?第二層:提供i2c adapter的algorithm,用具體適配器的xxx_xferf()函數(shù)來填充i2c_algorithm的master_xfer函數(shù)指針,并把賦值后的i2c_algorithm再賦值給i2c_adapter的algo指針。覆蓋圖中的訪問抽象層、i2c核心層
??第三層:實(shí)現(xiàn)i2c設(shè)備驅(qū)動(dòng)中的i2c_driver接口,用具體的i2c device設(shè)備的attach_adapter()、detach_adapter()方法賦值給i2c_driver的成員函數(shù)指針。實(shí)現(xiàn)設(shè)備device與總線(或者叫adapter)的掛接。覆蓋圖中的driver驅(qū)動(dòng)層
?第四層:實(shí)現(xiàn)i2c設(shè)備所對(duì)應(yīng)的具體device的驅(qū)動(dòng),i2c_driver只是實(shí)現(xiàn)設(shè)備與總線的掛接,而掛接在總線上的設(shè)備則是千差萬別的,所以要實(shí)現(xiàn)具體設(shè)備device的write()、read()、ioctl()等方法,賦值給file_operations,然后注冊(cè)字符設(shè)備(多數(shù)是字符設(shè)備)。覆蓋圖中的driver驅(qū)動(dòng)層
??? ?第一層和第二層又叫i2c總線驅(qū)動(dòng)(bus),第三第四屬于i2c設(shè)備驅(qū)動(dòng)(device driver)。
? ? ?在linux驅(qū)動(dòng)架構(gòu)中,幾乎不需要驅(qū)動(dòng)開發(fā)人員再添加bus,因?yàn)閘inux內(nèi)核幾乎集成所有總線bus,如usb、pci、i2c等等。并且總線bus中的(與特定硬件相關(guān)的代碼)已由芯片提供商編寫完成,例如三星的s3c-2440平臺(tái)i2c總線bus為/drivers/i2c/buses/i2c-s3c2410.c
? ? ??第三第四層與特定device相干的就需要驅(qū)動(dòng)工程師來實(shí)現(xiàn)了。
2、Linux下I2C驅(qū)動(dòng)體系結(jié)構(gòu)三部分詳細(xì)分析
a --?IIC核心
? ? ? ?IIC 核心提供了IIC總線驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、注銷方法,IIC通信方法(即“algorithm”,筆者認(rèn)為直譯為“運(yùn)算方法”并不合適,為免引起誤解, 下文將直接使用“algorithm”)上層的、與具體適配器無關(guān)的代碼以及探測(cè)設(shè)備、檢測(cè)設(shè)備地址的上層代碼等。
? ? ?在我們的Linux驅(qū)動(dòng)的i2c文件夾下有algos,busses,chips三個(gè)文件夾,另外還有i2c-core.c和i2c-dev.c兩個(gè)文件。
? ? ?i2c-core.c文件實(shí)現(xiàn)了I2Ccore框架,是Linux內(nèi)核用來維護(hù)和管理的I2C的核心部分,其中維護(hù)了兩個(gè)靜態(tài)的List,分別記錄系統(tǒng)中的I2Cdriver結(jié)構(gòu)和I2Cadapter結(jié)構(gòu)。I2Ccore提供接口函數(shù),允許一個(gè)I2Cadatper,I2Cdriver和I2Cclient初始化時(shí)在I2Ccore中進(jìn)行注冊(cè),以及退出時(shí)進(jìn)行注銷。同時(shí)還提供了I2C總線讀寫訪問的一般接口,主要應(yīng)用在I2C設(shè)備驅(qū)動(dòng)中。
b -- IIC總線驅(qū)動(dòng)
? ? ? ?IIC總線驅(qū)動(dòng)是對(duì)IIC硬件體系結(jié)構(gòu)中適配器端的實(shí)現(xiàn),適配器可由CPU控制,甚至直接集成在CPU內(nèi)部??偩€驅(qū)動(dòng)的職責(zé),是為系統(tǒng)中每個(gè)I2C總線增加相應(yīng)的讀寫方法。但是總線驅(qū)動(dòng)本身并不會(huì)進(jìn)行任何的通訊,它只是存在那里,等待設(shè)備驅(qū)動(dòng)調(diào)用其函數(shù)。
? ???IIC總線驅(qū)動(dòng)主要包含了IIC適配器數(shù)據(jù)結(jié)構(gòu)i2c_adapter、IIC適配器的algorithm數(shù)據(jù)結(jié)構(gòu)i2c_algorithm和控制IIC適配器產(chǎn)生通信信號(hào)的函數(shù)。經(jīng)由IIC總線驅(qū)動(dòng)的代碼,我們可以控制IIC適配器以主控方式產(chǎn)生開始位、停止位、讀寫周期,以及以從設(shè)備方式被讀寫、產(chǎn)生ACK等。
Busses文件夾下的i2c-mpc.c文件實(shí)現(xiàn)了PowerPC下I2C總線適配器驅(qū)動(dòng),定義描述了具體的I2C總線適配器的i2c_adapter數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)比較底層的對(duì)I2C總線訪問的具體方法。I2Cadapter 構(gòu)造一個(gè)對(duì)I2Ccore層接口的數(shù)據(jù)結(jié)構(gòu),并通過接口函數(shù)向I2Ccore注冊(cè)一個(gè)控制器。I2Cadapter主要實(shí)現(xiàn)對(duì)I2C總線訪問的算法,iic_xfer() 函數(shù)就是I2Cadapter底層對(duì)I2C總線讀寫方法的實(shí)現(xiàn)。同時(shí)I2Cadpter 中還實(shí)現(xiàn)了對(duì)I2C控制器中斷的處理函數(shù)。
c -- IIC設(shè)備驅(qū)動(dòng)
? ? ? IIC設(shè)備驅(qū)動(dòng)是對(duì)IIC硬件體系結(jié)構(gòu)中設(shè)備端的實(shí)現(xiàn),設(shè)備一般掛接在受CPU控制的IIC適配器上,通過IIC適配器與CPU交換數(shù)據(jù)。設(shè)備驅(qū)動(dòng)則是與掛在I2C總線上的具體的設(shè)備通訊的驅(qū)動(dòng)。通過I2C總線驅(qū)動(dòng)提供的函數(shù),設(shè)備驅(qū)動(dòng)可以忽略不同總線控制器的差異,不考慮其實(shí)現(xiàn)細(xì)節(jié)地與硬件設(shè)備通訊。
? ? ? IIC設(shè)備驅(qū)動(dòng)主要包含了數(shù)據(jù)結(jié)構(gòu)i2c_driver和i2c_client,我們需要根據(jù)具體設(shè)備實(shí)現(xiàn)其中的成員函數(shù)。
? ? ?i2c-dev.c文件中實(shí)現(xiàn)了I2Cdriver,提供了一個(gè)通用的I2C設(shè)備的驅(qū)動(dòng)程序,實(shí)現(xiàn)了字符類型設(shè)備的訪問接口,實(shí)現(xiàn)了對(duì)用戶應(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ù)完成對(duì)I2C設(shè)備的讀寫操作。
? ??通過I2Cdriver提供的通用方法可以訪問任何一個(gè)I2C的設(shè)備,但是其中實(shí)現(xiàn)的read,write及ioctl等功能完全是基于一般設(shè)備的實(shí)現(xiàn),所有的操作數(shù)據(jù)都是基于字節(jié)流,沒有明確的格式和意義。為了更方便和有效地使用I2C設(shè)備,我們可以為一個(gè)具體的I2C設(shè)備開發(fā)特定的I2C設(shè)備驅(qū)動(dòng)程序,在驅(qū)動(dòng)中完成對(duì)特定的數(shù)據(jù)格式的解釋以及實(shí)現(xiàn)一些專用的功能。
3、重要的結(jié)構(gòu)體
? ? ? 因?yàn)镮IC設(shè)備種類太多,如果每一個(gè)IIC設(shè)備寫一個(gè)驅(qū)動(dòng)程序,那么顯得內(nèi)核非常大。不符合軟件工程代碼復(fù)用,所以對(duì)其層次話:
? ? ?這里簡(jiǎn)單的將IIC設(shè)備驅(qū)動(dòng)分為設(shè)備層、總線層。理解這兩個(gè)層次的重點(diǎn)是理解4個(gè)數(shù)據(jù)結(jié)構(gòu),這4個(gè)數(shù)據(jù)結(jié)構(gòu)是i2c_driver、i2c_client、i2c_algorithm、i2c_adapter。i2c_driver、i2c_client屬于設(shè)備層;i2c_algorithm、i2c_adapter屬于總線型。如下圖:
? ? 設(shè)備層關(guān)系到實(shí)際的IIC設(shè)備,總線層包括CPU中的IIC總線控制器和控制總線通信的方法。值得注意的是:一個(gè)系統(tǒng)中可能有很多個(gè)總線層,也就是包含多個(gè)總線控制器;也可能有多個(gè)設(shè)備層,包含不同的IIC設(shè)備
? ? ??? 由IIC總線規(guī)范可知,IIC總線由兩條物理線路組成,這兩條物理線路是SDA和SCL。只要連接到SDA和SCL總線上的設(shè)備都可以叫做IIC設(shè)備。
a -- i2c_client?
? ? ? ?一個(gè)IIC設(shè)備由i2c_client數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述:
[cpp]?view plaincopy
第7位是R/W位,0表示寫,2表示讀,所以I2C設(shè)備通常有兩個(gè)地址,即讀地址和寫地址;
類型器件由中間4位組成,這是由半導(dǎo)體公司生產(chǎn)的時(shí)候就已經(jīng)固化了;
自定義類型由低3位組成。由用戶自己設(shè)置;
? ? ?IIC設(shè)備還有一些重要的注意事項(xiàng):
1、i2c_client數(shù)據(jù)結(jié)構(gòu)是描述IIC設(shè)備的“模板”,驅(qū)動(dòng)程序的設(shè)備結(jié)構(gòu)中應(yīng)包含該結(jié)構(gòu);
2、adapter指向設(shè)備連接的總線適配器,系統(tǒng)可能有多個(gè)總線適配器。內(nèi)核中靜態(tài)指針數(shù)組adapters記錄所有已經(jīng)注冊(cè)的總線適配器設(shè)備;
3、driver是指向設(shè)備驅(qū)動(dòng)程序,這個(gè)驅(qū)動(dòng)程序是在系統(tǒng)檢測(cè)到設(shè)備存在時(shí)賦值的;
b --?IIC設(shè)備驅(qū)動(dòng) ? ? i2c_driver
[cpp]?view plaincopy
c -- i2c_adapter
? ? ? IIC總線適配器就是一個(gè)IIC總線控制器,在物理上連接若干個(gè)IIC設(shè)備。IIC總線適配器本質(zhì)上是一個(gè)物理設(shè)備,其主要功能是完成IIC總線控制器相關(guān)的數(shù)據(jù)通信:
[cpp]?view plaincopyd --?i2c_algorithm
? ? ? ?每一個(gè)適配器對(duì)應(yīng)一個(gè)驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序描述了適配器與設(shè)備之間的通信方法:
[cpp]?view plaincopy
? ? ? IIC設(shè)備驅(qū)動(dòng)程序大致可以分為 設(shè)備層和總線層 。設(shè)備層包括一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),i2c_client??偩€層包括兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu),分別是i2c_adapter和i2c_algorithm。一個(gè)i2c_algorithm結(jié)構(gòu)表示適配器對(duì)應(yīng)的傳輸數(shù)據(jù)方法。3個(gè)數(shù)據(jù)結(jié)構(gòu)關(guān)系:
IIC設(shè)備層次結(jié)構(gòu)較為簡(jiǎn)單,但是寫IIC設(shè)備驅(qū)動(dòng)程序卻相當(dāng)復(fù)雜。
IIC設(shè)備驅(qū)動(dòng)程序的步驟:
4、各結(jié)構(gòu)體的作用與它們之間的關(guān)系
a -- i2c_adapter與i2c_algorithm
i2c_adapter對(duì)應(yīng)與物理上的一個(gè)適配器,而i2c_algorithm對(duì)應(yīng)一套通信方法,一個(gè)i2c適配器需要i2c_algorithm中提供的(i2c_algorithm中的又是更下層與硬件相關(guān)的代碼提供)通信函數(shù)來控制適配器上產(chǎn)生特定的訪問周期。缺少i2c_algorithm的i2c_adapter什么也做不了,因此i2c_adapter中包含其使用i2c_algorithm的指針。
? ? ? ? i2c_algorithm中的關(guān)鍵函數(shù)master_xfer()用于產(chǎn)生i2c訪問周期需要的start stop ack信號(hào),以i2c_msg(即i2c消息)為單位發(fā)送和接收通信數(shù)據(jù)。
i2c_msg也非常關(guān)鍵,調(diào)用驅(qū)動(dòng)中的發(fā)送接收函數(shù)需要填充該結(jié)構(gòu)體
[cpp]?view plaincopy
b --i2c_driver和i2c_client
? ? ? i2c_driver對(duì)應(yīng)一套驅(qū)動(dòng)方法,其主要函數(shù)是attach_adapter()和detach_client()
? ? ? i2c_client對(duì)應(yīng)真實(shí)的i2c物理設(shè)備device,每個(gè)i2c設(shè)備都需要一個(gè)i2c_client來描述
? ? ? 2c_driver與i2c_client的關(guān)系是一對(duì)多。一個(gè)i2c_driver上可以支持多個(gè)同等類型的i2c_client.
c -- i2c_adapter和i2c_client
i2c_adapter和i2c_client的關(guān)系與i2c硬件體系中適配器和設(shè)備的關(guān)系一致,即i2c_client依附于i2c_adapter,由于一個(gè)適配器上可以連接多個(gè)i2c設(shè)備,所以i2c_adapter中包含依附于它的i2c_client的鏈表。
從i2c驅(qū)動(dòng)架構(gòu)圖中可以看出,linux內(nèi)核對(duì)i2c架構(gòu)抽象了一個(gè)叫核心層core的中間件,它分離了設(shè)備驅(qū)動(dòng)device driver和硬件控制的實(shí)現(xiàn)細(xì)節(jié)(如操作i2c的寄存器),core層不但為上面的設(shè)備驅(qū)動(dòng)提供封裝后的內(nèi)核注冊(cè)函數(shù),而且還為小面的硬件事件提供注冊(cè)接口(也就是i2c總線注冊(cè)接口),可以說core層起到了承上啟下的作用。
總結(jié)
以上是生活随笔為你收集整理的Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端网页字体优化指南
- 下一篇: AB_PLC编程软件RSLogix_50