999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux下基于I2C協(xié)議的RTC驅(qū)動開發(fā)

2010-05-13 09:17:24孟令公,朱宏,楊忠孝,楊裕輝
現(xiàn)代電子技術(shù) 2009年20期

孟令公,朱 宏,楊忠孝,楊裕輝

摘 要:在嵌入式中,Linux漸漸成為一種流行操作系統(tǒng),Linux驅(qū)動開發(fā)也成為嵌入式開發(fā)中的必備環(huán)節(jié)。介紹Linux環(huán)境下基于I2C協(xié)議的RTC驅(qū)動程序開發(fā)與實現(xiàn)。首先研究了Linux環(huán)境下字符設(shè)備驅(qū)動程序框架,然后介紹I2C協(xié)議,在此基礎(chǔ)上開發(fā)基于I2C協(xié)議的RTC字符設(shè)備驅(qū)動程序。對于驅(qū)動程序,這里詳細介紹其整體架構(gòu)和各模塊實現(xiàn)細節(jié)。最終成功實現(xiàn)了基于I2C協(xié)議的RTC驅(qū)動程序,并移植到Linux操作系統(tǒng)中。

關(guān)鍵詞:嵌入式系統(tǒng);Linux;驅(qū)動程序;I2C

中圖分類號:TP316.81文獻標識碼:B

文章編號:1004-373X(2009)20-032-04

Development of RTC Driver Based on I2C under Linux

MENG Linggong,ZHU Hong,YANG Zhongxiao,YANG Yuhui

(University of Electronic Science and Technology of China,Chengdu,610054,China)

Abstract:In embedded field,Linux OS has been more and more popular,the development of Linux driver is becoming a constituent job.Reaserch and development of RTC driver based on I2C under Linux OS are introduced.First,research on the character device driver framework is given.Then,I2C protocol is introduced,RTC driver based on I2C under Linux OS is developed,the scheme and realization are proposed.Finally,RTC driver based on I2C is realized and transplanted into Linux.

Keywords:embedded system;Linux;driver;I2C

0 引 言

近年來嵌入式系統(tǒng)的研究與開發(fā)漸漸成為熱點,在嵌入式系統(tǒng)中,Linux操作系統(tǒng)以其開源、穩(wěn)定、可移植等種種優(yōu)點,漸漸成為一種流行的操作系統(tǒng)。Linux下各種驅(qū)動程序的開發(fā)經(jīng)常是軟件開發(fā)中必不可缺的環(huán)節(jié),Linux對其驅(qū)動程序提供了很好的支持框架。I2C總線是一種由Philips公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。I2C總線產(chǎn)生于在20世紀80年代,最主要的優(yōu)點是其簡單性和有效性。這里介紹Linux字符設(shè)備驅(qū)動以及I2C總線協(xié)議,并在此基礎(chǔ)上開發(fā)基于I2C總線的RTC驅(qū)動程序。

1 Linux字符設(shè)備驅(qū)動框架

在Linux內(nèi)核中每個字符驅(qū)動程序都是基于以下框架進行設(shè)計的[1,2]:

struct file_operations {

ssize_t (*read) (struct file *,char __user *,size_t,loff_t *);

ssize_t (*write) (struct file *,const char __user *,size_t,loff_t *);

int (*ioctl) (struct inode *,struct file *,unsigned int,unsigned long);

int (*open) (struct inode *,struct file *);

int (*release) (struct inode *,struct file *);

… };

其中每個驅(qū)動程序必須實現(xiàn)的函數(shù)主要有:

(1) open()

在Linux或應用程序使用設(shè)備前都會調(diào)用驅(qū)動程序的這個方法。在驅(qū)動程序中open()方法一般用于對驅(qū)動程序支持的設(shè)備進行初始化。

(2) release()

當Linux或應用程序不再使用設(shè)備時會調(diào)用驅(qū)動程序的這個方法。release()方法主要用于在使用完畢支持驅(qū)動程序的設(shè)備后,對設(shè)備進行關(guān)閉操作。

(3) read()

read()方法主要用于供應用程序或Linux從字符設(shè)備中讀取數(shù)據(jù)。read()方法讀取的數(shù)據(jù)會從內(nèi)核態(tài)拷貝到用戶態(tài),供應用程序使用[3]。

(4) write()

Linux或應用程序會調(diào)用write()方法寫多個字節(jié)數(shù)據(jù)到字符設(shè)備中。應用程序的數(shù)據(jù)會首先從用戶態(tài)拷貝到內(nèi)核態(tài),然后再傳給write()方法。

(5) ioctl()

ioctl()方法向應用程序提供了一些獨特的操作,這些操作不易通過read()方法或write()方法來實現(xiàn)[4,5]。

2 I2C協(xié)議以及RTC芯片介紹

2.1 I2C協(xié)議

I2C總線是一種由Philips公司開發(fā)的兩線式串行總線標準,用于鏈接微控制器及其外圍設(shè)備。I2C由數(shù)據(jù)線(SDA)和時鐘線(SCL)構(gòu)成的同步串行總線,可發(fā)送和接收數(shù)據(jù)。在處理器與被控制芯片之間,芯片與芯片之間進行雙向傳送[6]。

I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號, 它們分別是開始信號、結(jié)束信號和應答信號[3]。

開始信號 SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。

結(jié)束信號 SCL為低電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。

應答信號 接收數(shù)據(jù)的設(shè)備在接收到8位數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的設(shè)備發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。

(1) 控制字節(jié)。

在起始條件之后,必須是器件控制字節(jié),其中高4位為器件類型識別符(不同芯片類型有不同定義),接著3位為地址片選,最后1位為讀寫位,當為1時讀操作,為0時寫操作。

(2) 寫操作。

在寫入時,I2C主控設(shè)備先發(fā)起起始位(S),搶占總線;然后,發(fā)送7位設(shè)備地址和1位0,表示對設(shè)備的寫入;接著就是向設(shè)備傳送數(shù)據(jù)。

(3) 讀操作。

在讀取時,要改變總線數(shù)據(jù)的傳輸方向,其流程如下:I2C主控設(shè)備發(fā)起起始位(S),搶占總線;發(fā)送7位設(shè)備地址和1位0,表示對設(shè)備寫入;發(fā)送要寫入的寄存器地址;再次發(fā)起起始位(S);發(fā)送7位的設(shè)備地址和1位1,表示對設(shè)備讀取;從設(shè)備讀取數(shù)據(jù)[7]。

2.2 RTC時鐘芯片介紹

在此,采用精密時鐘ISL1208向系統(tǒng)提供實時時間。ISL1208是Intersil公司的一款低功耗實時時鐘集成電路。ISL1208寄存器可由后備電池供電。在從地址“1101111x”之后,可以訪問,可以讀或?qū)懙降刂穂00h~13h],可以通過對任意寄存器地址直接以字節(jié)寫或頁面寫操作來修改寄存器的內(nèi)容。

寄存器分成4段,它們是:實時時鐘(7 B):地址為00h~06h;控制與狀態(tài)(5 B):地址為07h~0Bh;報警(6 B):地址為0ch~11h;用戶SRAM(2 B):地址為12h~13h。

由于只使用了其中的實時時鐘寄存器,所以只對其中用到的寄存器進行描述。實時時鐘寄存器主要包括SC(秒)、MN(分)、HR(時)、DT(日期)、MO(月)、YR(年)、DW(星期)。

2.3 IXP425網(wǎng)絡(luò)處理器對I2C協(xié)議的支持

IXP425本身沒有基于I2C協(xié)議的端口,但是ixp425有16個GPIO(GPIO0~GPIO15),即通用輸入輸出端口。這些GPIO可以由軟件控制輸出0或1,并且也可由軟件去讀取GPIO上的狀態(tài)[8]。雖然Ixp425沒有基于I2C協(xié)議的接口,但是可以采用它的GPIO來實現(xiàn)I2C信號發(fā)送與接受。具體采用:

GPIO7SDA數(shù)據(jù)信號發(fā)送與接受

GPIO6SCK時鐘信號發(fā)送

3 基于I2C協(xié)議的RTC驅(qū)動程序設(shè)計

3.1 驅(qū)動程序總體框架

整個驅(qū)動程序可以分成兩個模塊,第一個模塊是I2C協(xié)議實現(xiàn)部分,稱之為I2C協(xié)議模塊。第二個模塊負責與Linux內(nèi)核及應用程序交互,稱之為RTC驅(qū)動模塊[9],如圖1所示。

圖1 模塊圖

3.2 I2C協(xié)議實現(xiàn)模塊

該模塊中用到的宏與函數(shù):

#define I2C_SDA_BIT 7

//gpio7配置為數(shù)據(jù)信號口SDA

#define I2C_SCK_BIT6

//gpio6配置為時鐘信號口SCL

GPIO_DATA_BIT_WRITE_HIGH();

//設(shè)置GPIO狀態(tài)為高

GPIO_DATA_BIT_WRITE_LOW();

//設(shè)置GPIO狀態(tài)為底

(1) void GpioI2CStart(void)

功能:產(chǎn)生一次I2C開始信號。

實現(xiàn):在SCL為高的情況下,SDA由高電平向低電平跳變。

函數(shù)流程圖如圖2所示。

(2) void GpioI2CStop(void)

功能:產(chǎn)生一次I2C傳送結(jié)束信號。

實現(xiàn):在SCL為高的情況下,SDA由低電平向高電平跳變。

函數(shù)流程圖如圖3所示。

圖2 函數(shù)流程圖(一)

圖3 函數(shù)流程圖(二)

(3) void GpioI2CSendByte(BYTE ucData)

功能:在I2C總線上發(fā)送一個字節(jié)(8位數(shù)據(jù))。

參數(shù):BYTE ucData 要發(fā)送的字節(jié)(8位數(shù)據(jù))

實現(xiàn):現(xiàn)在總線上寫一個8位數(shù)據(jù),然后等待ACK。函數(shù)流程如圖4所示。

圖4 函數(shù)流程圖(三)

(4) UINT8 GpioI2CReceiveByte(void)

功能:在I2C總線上讀取一個字節(jié)(8位數(shù)據(jù))。

返回值:在I2C總線上讀取到的數(shù)據(jù)。

實現(xiàn):在總線上等待數(shù)據(jù)的讀取。

函數(shù)流程如圖5所示。

3.3 RTC驅(qū)動實現(xiàn)模塊

RTC驅(qū)動模塊主要實現(xiàn)struct file_operations結(jié)構(gòu)框架。這里主要實現(xiàn)了該框架的read,write,ioctl,release幾個函數(shù)成員。其中主要功能在ioctl中實現(xiàn)。

圖5 函數(shù)流程圖(四)

該結(jié)構(gòu)的定義如下[10]:

struct file_operations I2C_rtc_fops =

{

.open = I2CRtcDrvOpen,

.release = I2CRtcDrvClose,

.read= I2CRtcDrvRead,

.write= I2CRtcDrvWrite,

.ioctl = I2CRtcDrvIoctl,

};

由于所有功能都在ioctl函數(shù)成員中實現(xiàn),所以以下將主要介紹ioctl函數(shù)成員。

(1) ioctl函數(shù)用到的數(shù)據(jù)結(jié)構(gòu)與調(diào)用的函數(shù)

typedef struct

{

unsigned char second;//秒

unsigned char minute;//分鐘

unsigned char hour;//小時

unsigned char date;//日

unsigned char month;//月

unsigned char year;//年

}I2C_RTC_DATA_T;

該結(jié)構(gòu)表示系統(tǒng)時間。在I2C驅(qū)動中,主要用來存儲從I2C總線上讀取的RTC時間。I2C協(xié)議模塊把從RTC時鐘中讀取的時間轉(zhuǎn)化為該類型,然后傳給RTC驅(qū)動模塊。RTC驅(qū)動模塊再把該類型的系統(tǒng)時間傳給用戶態(tài)。

INT32 GpioI2CRead(UINT8 * address,UINT16 rom_address,UINT16 count);

INT32 GpioI2CWrite(UINT8 * address,UINT16 rom_address,UINT16 count);

這兩個函數(shù)用于讀和寫RTC時鐘上的寄存器,其中address參數(shù)為內(nèi)存區(qū)緩沖地址,rom_address為RTC上寄存器地址,count為要讀取的字節(jié)數(shù)。它們是基于I2C協(xié)議的調(diào)用來實現(xiàn)的。在以下函數(shù)中將會用到。

(2) int I2CRtcDrvIoctl(struct inode *inode,struct file *file,UINT32 cmd,unsigned long arg)

功能:這個是I2C驅(qū)動模塊中的ioctl函數(shù)成員。

參數(shù)描述如表1所示。

表1 函數(shù)的參數(shù)描述

參數(shù)名類型說明

cmdUINT32用戶態(tài)向內(nèi)核態(tài)傳入的命令

argunsigned long用戶態(tài)向內(nèi)核態(tài)傳入的參數(shù)

cmd中傳入的命令:

RTC_RD_TIME 讀取RTC時鐘時間

RTC_SET_TIME 設(shè)置RTC時鐘時間

arg參數(shù)為一個指向I2C_RTC_DATA_T類型的指針,用于存取時間。

函數(shù)流程如圖6所示,圖中I2C_RTC_DATA_T gI2cRtcData;全局數(shù)據(jù),表示時間。

圖6 函數(shù)流程圖(五)

該函數(shù)讀取用戶傳入的命令(cmd),如果用戶要獲取時間,則調(diào)用底層函數(shù)讀RTC寄存器,獲取時間。如果用戶要設(shè)置時間,則調(diào)用底層函數(shù)寫RTC寄存器,設(shè)置時間。

4 結(jié) 語

這里介紹了Linux操作系統(tǒng)下基于I2C協(xié)議的RTC驅(qū)動程序的開發(fā),主要介紹了I2C協(xié)議以及Linux字符設(shè)備驅(qū)動程序框架,并在此基礎(chǔ)上給出了基于IXP425處理器、I2C協(xié)議的RTC字符設(shè)備驅(qū)動程序。該設(shè)備驅(qū)動程序包括最底層的協(xié)議開發(fā),以及上層的驅(qū)動程序框架,具有很強的移植性。最終成功開發(fā)并實現(xiàn)了該驅(qū)動程序。

參考文獻

[1]劉名博,鄧中亮.基于ARM的嵌入式Linux操作系統(tǒng)移植的研究[J].計算機系統(tǒng)應用,2006,44(11):87-88.

[2]劉軍芳,胡和智.基于ARM的嵌入式 Linux操作系統(tǒng)移植研究[J].科技信息:學術(shù)版,2006,22(5):29-31.

[3]王淑貞.U-Boot在S3C2410上的移植[J].微計算機應用,2008,29(4):95-97.

[4]劉廣路.基于ARM的μCLinux片級移植[J].現(xiàn)代計算機,2008,33(1):131-133.

[5]孫紀坤,張小全.嵌入式Linux系統(tǒng)技術(shù)開發(fā)詳解——基于ARM[M].北京:人民郵電出版社,2006.

[6]周立功,陳明計,陳渝.ARM嵌入式Linux系統(tǒng)構(gòu)建與驅(qū)動開發(fā)范例[M].北京:北京航空航天大學出版社,2006.

[7]許振山,劉崢嶸.嵌入式Linux系統(tǒng)應用開發(fā)詳解[M].北京:電力工業(yè)出版社,2007.

[8]李駒光,鄭秋,江澤明.嵌入式Linux系統(tǒng)技術(shù)開發(fā)詳解基于EP93XX系列ARM[M].北京:清華大學出版社,2006.

[9]Daniel P Bovet,Marco Cesa.深入理解Linux內(nèi)核[M].2版.陳莉君,馮銳,牛欣源,譯.北京:中國電子出版社,2004.

[10]陳渝,李明,楊曄.源碼開放的嵌入式系統(tǒng)軟件分析與實踐[M].北京:北京航空航天大學出版社,2004.

主站蜘蛛池模板: 99免费视频观看| 熟女成人国产精品视频| 亚洲天堂成人在线观看| 国产理论精品| 99精品免费欧美成人小视频 | 国产精品视频3p| 日本在线欧美在线| 久久天天躁夜夜躁狠狠| 这里只有精品在线播放| 在线日本国产成人免费的| 成色7777精品在线| 亚洲最大福利网站| 久一在线视频| 色老头综合网| 狠狠五月天中文字幕| 色综合a怡红院怡红院首页| 黄色a一级视频| av在线5g无码天天| 青草视频在线观看国产| 成人欧美日韩| 亚洲成a人片在线观看88| 免费国产高清视频| 中文字幕人成人乱码亚洲电影| 激情网址在线观看| 日本免费一级视频| 2020最新国产精品视频| 日韩欧美中文在线| 国产精品福利导航| www.91在线播放| 中文字幕日韩丝袜一区| 超清无码熟妇人妻AV在线绿巨人| 人妻丝袜无码视频| 国产丝袜第一页| 欧美中文字幕在线播放| 成人一级黄色毛片| 青草视频网站在线观看| 视频二区中文无码| 日本不卡在线视频| 欧美一区二区三区欧美日韩亚洲| 99九九成人免费视频精品| 伊人成人在线| 免费人欧美成又黄又爽的视频| 日韩视频福利| 大乳丰满人妻中文字幕日本| AV色爱天堂网| 在线不卡免费视频| 欧美精品导航| 国产黄在线免费观看| 国产福利一区视频| 亚洲自拍另类| 国产无码网站在线观看| 欧美有码在线观看| 曰AV在线无码| 国产精品亚洲专区一区| 无码一区中文字幕| 亚洲第一国产综合| 亚洲人成影院午夜网站| 中文字幕色在线| 在线观看欧美精品二区| 色噜噜综合网| 国产成人永久免费视频| 国产成人午夜福利免费无码r| 国产拍在线| 国产一区二区视频在线| 丰满人妻中出白浆| 夜夜操狠狠操| 女人18毛片一级毛片在线 | 2024av在线无码中文最新| 国产乱人乱偷精品视频a人人澡| 在线观看免费人成视频色快速| 国产成人精品高清不卡在线| 婷婷成人综合| 亚洲AⅤ无码国产精品| 98超碰在线观看| 最新国产网站| 18禁不卡免费网站| 成人福利在线视频免费观看| 超级碰免费视频91| 青草视频网站在线观看| 亚洲高清中文字幕在线看不卡| 蜜桃臀无码内射一区二区三区| 久久久久亚洲精品成人网|