嵌入式Linux系統(tǒng)中I2C總線設(shè)備的驅(qū)動(dòng)設(shè)計(jì)
發(fā)布時(shí)間:2007/8/29 0:00:00 訪問(wèn)次數(shù):423
來(lái)源:電子產(chǎn)品世界 作者:新太科技股份有限公司(廣州) 賈東耀
摘要: 本文分析了Linux系統(tǒng)中I2C驅(qū)動(dòng)程序的結(jié)構(gòu),并以AT91RM9200和X1227為例,介紹了如何在嵌入式Linux系統(tǒng)中實(shí)現(xiàn)I2C總線適配器及I2C設(shè)備驅(qū)動(dòng)。
關(guān)鍵詞: Linux;I2C總線;I2C設(shè)備;驅(qū)動(dòng)
引言
I2C總線是PHILIPS公司推出的兩線式串行總線,用于連接微控制器及其外圍設(shè)備,具有簡(jiǎn)單、高效等特點(diǎn)。由于其接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片引腳的數(shù)量,降低了互聯(lián)成本,特別適用于嵌入式產(chǎn)品。
而Linux系統(tǒng)具有開(kāi)源、免費(fèi)、網(wǎng)上資源豐富等優(yōu)點(diǎn),目前已成為嵌入式系統(tǒng)的主流選擇。因此如何在嵌入式Linux系統(tǒng)中實(shí)現(xiàn)I2C功能成為實(shí)際開(kāi)發(fā)中的問(wèn)題。
I2C總線
I2C 總線通過(guò)串行數(shù)據(jù)SDA 和串行時(shí)鐘SCL線在連接到總線的器件間傳遞信息,每個(gè)器件都有一個(gè)唯一的地址識(shí)別。根據(jù)數(shù)據(jù)傳輸時(shí)的功能不同,把器件分為主機(jī)和從機(jī)。主機(jī)是初始化總線的數(shù)據(jù)傳輸并產(chǎn)生允許傳輸?shù)臅r(shí)鐘信號(hào)的器件,通常是微控制器。此時(shí),任何被尋址的器件都被認(rèn)為是從機(jī),例如LCD驅(qū)動(dòng)器、E2PROM等。
I2C總線協(xié)議規(guī)定,各主機(jī)進(jìn)行通信時(shí)都要有起始、結(jié)束、發(fā)送數(shù)據(jù)和應(yīng)答信號(hào)。這些信號(hào)都是通信過(guò)程中的基本單元。起始信號(hào)就是在SCL線為高時(shí)SDA線從高變化到低;停止信號(hào)就是在SCL線為高時(shí)SDA線從低變化到高;應(yīng)答信號(hào)是在SCL為高時(shí)SDA為低;非應(yīng)答信號(hào)相反,是在SCL為高時(shí)SDA為高。
總線傳送的每1幀數(shù)據(jù)均是1個(gè)字節(jié)。協(xié)議規(guī)定,在啟動(dòng)總線后的第1個(gè)字節(jié)的高7位是對(duì)從機(jī)的尋址地址,第8位為方向位(“0”表示主機(jī)對(duì)從機(jī)的寫操作;“1”表示主機(jī)對(duì)從機(jī)的讀操作),其余的字節(jié)為操作數(shù)據(jù)。數(shù)據(jù)傳送過(guò)程是:在I2C總線發(fā)送起始信號(hào)后,發(fā)送從機(jī)的7位尋址地址和1位表示這次操作性質(zhì)的讀寫位,在有應(yīng)答信號(hào)后開(kāi)始傳送數(shù)據(jù),直到發(fā)送停止信號(hào)。主機(jī)每發(fā)送1個(gè)字節(jié)就要檢測(cè)SDA線上有沒(méi)有收到應(yīng)答信號(hào),有則繼續(xù)發(fā)送,否則將停止發(fā)送數(shù)據(jù)。
Linux中I2C總線驅(qū)動(dòng)結(jié)構(gòu)
Linux系統(tǒng)對(duì)I2C總線具有很好的支持。與硬件物理連接相對(duì)應(yīng)的,Linux的I2C框架中各個(gè)部分的關(guān)系如圖1所示。
圖1 Linux內(nèi)核I2C總線驅(qū)動(dòng)程序構(gòu)架
內(nèi)核中I2C相關(guān)代碼可以分為三個(gè)層次:
1. I2C core框架:提供了核心數(shù)據(jù)結(jié)構(gòu)的定義和相關(guān)接口函數(shù),用來(lái)實(shí)現(xiàn)I2C適配器驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、注銷管理,以及I2C通信方法上層的、與具體適配器無(wú)關(guān)的代碼,為系統(tǒng)中每個(gè)I2C總線增加相應(yīng)的讀寫方法。
2. I2C總線適配器驅(qū)動(dòng):定義描述具體I2C總線適配器的i2c_adapter數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)在具體I2C適配器上的I2C總線通信方法,并由i2c_algorithm數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述。
3. I2C 設(shè)備驅(qū)動(dòng):定義描述具體設(shè)備的i2c_client和可能的私有數(shù)據(jù)結(jié)構(gòu)、借助I2C core提供的函數(shù)接口完成設(shè)備在內(nèi)核的注冊(cè),并實(shí)現(xiàn)具體的功能,包括read, write以及ioctl等對(duì)用戶層操作的接口。
總體而言,Linux中I2C總線的驅(qū)動(dòng)分為兩個(gè)部分:總線驅(qū)動(dòng)(BUS)和設(shè)備驅(qū)動(dòng)(DEVICE)。I2C core與I2C總線適配器驅(qū)動(dòng)完成了硬件上的主機(jī)總線驅(qū)動(dòng)(BUS),而I2C driver則實(shí)現(xiàn)了從機(jī)設(shè)備驅(qū)動(dòng)。在設(shè)計(jì)中,I2C core提供的接口是統(tǒng)一的,不需要修改,我們只需要實(shí)現(xiàn)特定I2C總線適配器驅(qū)動(dòng)和I2C設(shè)備驅(qū)動(dòng),這樣大大提高了系統(tǒng)的可移植性。
筆者在某個(gè)產(chǎn)品中曾用AT91RM9200和X1227構(gòu)成嵌入式系統(tǒng)的時(shí)鐘模塊。在該設(shè)計(jì)中,AT91RM9200作為I2C的主機(jī)部分,X1227作為從機(jī)。下面以此為例,具體介紹這兩部分驅(qū)動(dòng)的實(shí)現(xiàn)。
AT91RM9200 I2C總線驅(qū)動(dòng)實(shí)現(xiàn)
AT91RM9200是ARM920T處理器,它提供標(biāo)準(zhǔn)的兩線接口TWI,即I2C接口,主機(jī)工作模式。通過(guò)TWI 控制寄存器TWI_CR設(shè)置I2C工作模式和狀態(tài)。時(shí)鐘由寄存器TWI_CWGR中編程值產(chǎn)生。該寄存器定義了TWCK 信號(hào),使接口適應(yīng)寬范圍時(shí)鐘。
具體在linux中AT91RM9200 I2C總線適配器驅(qū)動(dòng)的實(shí)現(xiàn),首先初始化AT91RM9200 I2C的工作模式,然后裝載I2C總線驅(qū)動(dòng),這需要兩個(gè)結(jié)構(gòu)模塊來(lái)描述:struct i2c_adapter和struct i2c_algorithm。
初始化i2c_adapter結(jié)構(gòu)成員如下:
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,
... ...
};
這個(gè)模塊并未提供讀寫函數(shù),具體的讀寫方法由第二個(gè)模塊struct i2c_algorithm提供。
static struct i2c_algorithm at91_algorithm = {
name: "at91 i2c",
id: I2C_ALGO_SMBUS,
來(lái)源:電子產(chǎn)品世界 作者:新太科技股份有限公司(廣州) 賈東耀
摘要: 本文分析了Linux系統(tǒng)中I2C驅(qū)動(dòng)程序的結(jié)構(gòu),并以AT91RM9200和X1227為例,介紹了如何在嵌入式Linux系統(tǒng)中實(shí)現(xiàn)I2C總線適配器及I2C設(shè)備驅(qū)動(dòng)。
關(guān)鍵詞: Linux;I2C總線;I2C設(shè)備;驅(qū)動(dòng)
引言
I2C總線是PHILIPS公司推出的兩線式串行總線,用于連接微控制器及其外圍設(shè)備,具有簡(jiǎn)單、高效等特點(diǎn)。由于其接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片引腳的數(shù)量,降低了互聯(lián)成本,特別適用于嵌入式產(chǎn)品。
而Linux系統(tǒng)具有開(kāi)源、免費(fèi)、網(wǎng)上資源豐富等優(yōu)點(diǎn),目前已成為嵌入式系統(tǒng)的主流選擇。因此如何在嵌入式Linux系統(tǒng)中實(shí)現(xiàn)I2C功能成為實(shí)際開(kāi)發(fā)中的問(wèn)題。
I2C總線
I2C 總線通過(guò)串行數(shù)據(jù)SDA 和串行時(shí)鐘SCL線在連接到總線的器件間傳遞信息,每個(gè)器件都有一個(gè)唯一的地址識(shí)別。根據(jù)數(shù)據(jù)傳輸時(shí)的功能不同,把器件分為主機(jī)和從機(jī)。主機(jī)是初始化總線的數(shù)據(jù)傳輸并產(chǎn)生允許傳輸?shù)臅r(shí)鐘信號(hào)的器件,通常是微控制器。此時(shí),任何被尋址的器件都被認(rèn)為是從機(jī),例如LCD驅(qū)動(dòng)器、E2PROM等。
I2C總線協(xié)議規(guī)定,各主機(jī)進(jìn)行通信時(shí)都要有起始、結(jié)束、發(fā)送數(shù)據(jù)和應(yīng)答信號(hào)。這些信號(hào)都是通信過(guò)程中的基本單元。起始信號(hào)就是在SCL線為高時(shí)SDA線從高變化到低;停止信號(hào)就是在SCL線為高時(shí)SDA線從低變化到高;應(yīng)答信號(hào)是在SCL為高時(shí)SDA為低;非應(yīng)答信號(hào)相反,是在SCL為高時(shí)SDA為高。
總線傳送的每1幀數(shù)據(jù)均是1個(gè)字節(jié)。協(xié)議規(guī)定,在啟動(dòng)總線后的第1個(gè)字節(jié)的高7位是對(duì)從機(jī)的尋址地址,第8位為方向位(“0”表示主機(jī)對(duì)從機(jī)的寫操作;“1”表示主機(jī)對(duì)從機(jī)的讀操作),其余的字節(jié)為操作數(shù)據(jù)。數(shù)據(jù)傳送過(guò)程是:在I2C總線發(fā)送起始信號(hào)后,發(fā)送從機(jī)的7位尋址地址和1位表示這次操作性質(zhì)的讀寫位,在有應(yīng)答信號(hào)后開(kāi)始傳送數(shù)據(jù),直到發(fā)送停止信號(hào)。主機(jī)每發(fā)送1個(gè)字節(jié)就要檢測(cè)SDA線上有沒(méi)有收到應(yīng)答信號(hào),有則繼續(xù)發(fā)送,否則將停止發(fā)送數(shù)據(jù)。
Linux中I2C總線驅(qū)動(dòng)結(jié)構(gòu)
Linux系統(tǒng)對(duì)I2C總線具有很好的支持。與硬件物理連接相對(duì)應(yīng)的,Linux的I2C框架中各個(gè)部分的關(guān)系如圖1所示。
圖1 Linux內(nèi)核I2C總線驅(qū)動(dòng)程序構(gòu)架
內(nèi)核中I2C相關(guān)代碼可以分為三個(gè)層次:
1. I2C core框架:提供了核心數(shù)據(jù)結(jié)構(gòu)的定義和相關(guān)接口函數(shù),用來(lái)實(shí)現(xiàn)I2C適配器驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、注銷管理,以及I2C通信方法上層的、與具體適配器無(wú)關(guān)的代碼,為系統(tǒng)中每個(gè)I2C總線增加相應(yīng)的讀寫方法。
2. I2C總線適配器驅(qū)動(dòng):定義描述具體I2C總線適配器的i2c_adapter數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)在具體I2C適配器上的I2C總線通信方法,并由i2c_algorithm數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述。
3. I2C 設(shè)備驅(qū)動(dòng):定義描述具體設(shè)備的i2c_client和可能的私有數(shù)據(jù)結(jié)構(gòu)、借助I2C core提供的函數(shù)接口完成設(shè)備在內(nèi)核的注冊(cè),并實(shí)現(xiàn)具體的功能,包括read, write以及ioctl等對(duì)用戶層操作的接口。
總體而言,Linux中I2C總線的驅(qū)動(dòng)分為兩個(gè)部分:總線驅(qū)動(dòng)(BUS)和設(shè)備驅(qū)動(dòng)(DEVICE)。I2C core與I2C總線適配器驅(qū)動(dòng)完成了硬件上的主機(jī)總線驅(qū)動(dòng)(BUS),而I2C driver則實(shí)現(xiàn)了從機(jī)設(shè)備驅(qū)動(dòng)。在設(shè)計(jì)中,I2C core提供的接口是統(tǒng)一的,不需要修改,我們只需要實(shí)現(xiàn)特定I2C總線適配器驅(qū)動(dòng)和I2C設(shè)備驅(qū)動(dòng),這樣大大提高了系統(tǒng)的可移植性。
筆者在某個(gè)產(chǎn)品中曾用AT91RM9200和X1227構(gòu)成嵌入式系統(tǒng)的時(shí)鐘模塊。在該設(shè)計(jì)中,AT91RM9200作為I2C的主機(jī)部分,X1227作為從機(jī)。下面以此為例,具體介紹這兩部分驅(qū)動(dòng)的實(shí)現(xiàn)。
AT91RM9200 I2C總線驅(qū)動(dòng)實(shí)現(xiàn)
AT91RM9200是ARM920T處理器,它提供標(biāo)準(zhǔn)的兩線接口TWI,即I2C接口,主機(jī)工作模式。通過(guò)TWI 控制寄存器TWI_CR設(shè)置I2C工作模式和狀態(tài)。時(shí)鐘由寄存器TWI_CWGR中編程值產(chǎn)生。該寄存器定義了TWCK 信號(hào),使接口適應(yīng)寬范圍時(shí)鐘。
具體在linux中AT91RM9200 I2C總線適配器驅(qū)動(dòng)的實(shí)現(xiàn),首先初始化AT91RM9200 I2C的工作模式,然后裝載I2C總線驅(qū)動(dòng),這需要兩個(gè)結(jié)構(gòu)模塊來(lái)描述:struct i2c_adapter和struct i2c_algorithm。
初始化i2c_adapter結(jié)構(gòu)成員如下:
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,
... ...
};
這個(gè)模塊并未提供讀寫函數(shù),具體的讀寫方法由第二個(gè)模塊struct i2c_algorithm提供。
static struct i2c_algorithm at91_algorithm = {
name: "at91 i2c",
id: I2C_ALGO_SMBUS,
熱門點(diǎn)擊
- PPCBoot在MPC8250上的移植方法
- 嵌入式指紋鎖的設(shè)計(jì)與實(shí)現(xiàn)
- 嵌入式微控制器MC68HC912B32背景調(diào)
- 利用TriMedia注冊(cè)表和成員管理器實(shí)現(xiàn)B
- 嵌入式頻率計(jì)的設(shè)計(jì)
- uClinux下中斷驅(qū)動(dòng)的I/O方式
- 基于FA526處理器SoC平臺(tái)的Linux操
- 基于ARM控制器LPC2214的稅控收款機(jī)系
- 基于VxWorks的產(chǎn)品映象設(shè)計(jì)
- 基于PCA82C250與MCU間的直連通信網(wǎng)
推薦技術(shù)資料
- 羅盤誤差及補(bǔ)償
- 造成羅盤誤差的主要因素有傳感器誤差、其他磁材料干擾等。... [詳細(xì)]
- PWM輸入功率驅(qū)動(dòng)器工作原理
- 隔離式 DC/DC 變換器和模
- 解讀集成4 個(gè)高效降壓 DC/
- 數(shù)字隔離功能全集成 DC/DC
- 集成低噪聲電流輸入模數(shù)轉(zhuǎn)換器 (ADC)應(yīng)用
- 128 通道20 位電流數(shù)字轉(zhuǎn)換器應(yīng)用探究
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究