《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于WinCE的II2C驅(qū)動程序設(shè)計(jì)
基于WinCE的II2C驅(qū)動程序設(shè)計(jì)
單片機(jī)與嵌入式系統(tǒng)應(yīng)用
王小芳,王典洪,陳飛
摘要: 主要針對三星公司ARM9內(nèi)核的芯片S3C2410進(jìn)行分析,介紹在WindowsCE.net系統(tǒng)下進(jìn)行底層設(shè)備驅(qū)動開發(fā)的方法并提供I2C通信的實(shí)例
Abstract:
Key words :

引言

隨著以計(jì)算機(jī)技術(shù)、通信技術(shù)和軟件技術(shù)為核心的信息技術(shù)的迅速發(fā)展,嵌入式系統(tǒng)在各行業(yè)得到了廣泛的應(yīng)用,極大地推動了行業(yè)的滲透性應(yīng)用。嵌入式系統(tǒng)是“以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)”,由嵌入式硬件和嵌入式軟件兩部分組成。嵌入式軟件包括嵌入式操作系統(tǒng)和嵌入式應(yīng)用軟件。Microsoft的桌面操作系統(tǒng)已經(jīng)為人們熟悉和使用,嵌入式的操作系統(tǒng) Windows CE.net也日益風(fēng)行。Windows CE.net是Microsoft推出的功能強(qiáng)大的緊湊、高效、可伸縮的32位嵌入式操作系統(tǒng),主要面對各種各樣的嵌入式系統(tǒng)和產(chǎn)品。該系統(tǒng)所具有的多線程、多任務(wù)、完全搶占式的特點(diǎn)是專為各種具有嚴(yán)格資源限制的硬件系統(tǒng)所設(shè)計(jì)的。為了將操作系統(tǒng)和硬件設(shè)備連接起來,聯(lián)系硬件和軟件的驅(qū)動就顯得很重要。

下面主要針對三星公司ARM9內(nèi)核的芯片S3C2410進(jìn)行分析,介紹在Windows CE.net系統(tǒng)下進(jìn)行底層設(shè)備驅(qū)動開發(fā)的方法并提供I2C通信的實(shí)例。

1  I2C通信協(xié)議及S3C2410芯片介紹

I2C(Inter Integrated Circuit)總線是1980年由Philips公司推出的。 I2C總線用兩條線(SDA和SCL)在總線和裝置之間傳遞信息,在微控制器和外部設(shè)備之間進(jìn)行串行通信或在主設(shè)備和從設(shè)備之間進(jìn)行雙向數(shù)據(jù)傳送。兩條通信線通過上拉電阻被拉升至+5 V。在控制系統(tǒng)中的每個(gè)集成電路可以通過一個(gè)CMOS緩沖器來讀每一條線路,也可以通過一個(gè)柵極開路的FET管將每一條線的電平下拉。因此,對每個(gè)芯片來說,每條線既是輸入線,又是輸出線。

I2C總線遵從同步串行傳輸協(xié)議,即各位串行(一位接一位)發(fā)送,由時(shí)鐘(clock)線指示讀數(shù)據(jù)(data)線的時(shí)刻。每個(gè)數(shù)據(jù)包前有一個(gè)地址,以指示由哪個(gè)器件來接收該數(shù)據(jù)。

S3C2410是一款基于ARM920T的16/32位RISC微處理器,主要用于手持設(shè)備,擁有高性價(jià)比,低功耗等特點(diǎn),也是目前市面上出現(xiàn)較多的嵌入式開發(fā)板的處理器之一。芯片擁有16 KB的指令和數(shù)據(jù)緩存器,有存儲管理單元(MMU)、LCD控制器、3個(gè)串口、4路DMA、4個(gè)時(shí)鐘定時(shí)器、8路10位的A/D轉(zhuǎn)換;支持I2C、 I2S、SPI、主從USB等接口以及SD/MMC卡。

S3C2410微處理器的I2C總線可以處于下面4種模式下:主接收模式、主發(fā)送模式、從接收模式和從發(fā)送模式。處理器對I2C進(jìn)行的操作,主要是對下面的幾個(gè)寄存器進(jìn)行讀/寫:

◇ IIC控制寄存器,IICCON(物理地址0X54000000,內(nèi)存映射后的虛擬地址);

◇ IIC控制/狀態(tài)寄存器,IICSTAT(物理地址0X54000004);

◇ IIC數(shù)據(jù)寄存器,IICDS(物理地址0X54000008);

◇ IIC地址寄存器,IICADD(物理地址0X5400000C)。

 本設(shè)計(jì)主要是CPU工作在主模式下與下面的I2C接口設(shè)備進(jìn)行通信。

2  Windows CE系統(tǒng)驅(qū)動特點(diǎn)

Windows CE.net驅(qū)動有兩種模型:本機(jī)設(shè)備驅(qū)動程序和流接口驅(qū)動程序。本機(jī)設(shè)備驅(qū)動適于集成到基于Windows CE.net平臺的設(shè)備。這些設(shè)備驅(qū)動程序是一些硬件所必需的,是由原始設(shè)備制造商創(chuàng)建的,用以驅(qū)動如鍵盤、觸摸屏、音頻設(shè)備等,往往在設(shè)備售出后就不會再更換,如通用LED驅(qū)動、電源驅(qū)動、鍵盤驅(qū)動和顯示驅(qū)動等都是本機(jī)設(shè)備驅(qū)動。對于本機(jī)設(shè)備驅(qū)動程序,Platform Builder提供了一些驅(qū)動程序樣本,目的是為了方便開發(fā)人員快速開發(fā)出自己的驅(qū)動程序。當(dāng)Win CE系統(tǒng)啟動時(shí),本地設(shè)備驅(qū)動程序?qū)⒈患虞d到系統(tǒng)的內(nèi)存中。本地驅(qū)動程序的開發(fā)分為分層驅(qū)動和單片驅(qū)動程序。分層驅(qū)動要利用微軟提供的與應(yīng)用程序通信的上層,稱為模塊驅(qū)動程序?qū)覯DD(Model Device Driver)。MDD層通過設(shè)備驅(qū)動程序接口DDI(Device Driver Interface)與應(yīng)用程序通信,開發(fā)驅(qū)動程序通常不修改MDD層,主要關(guān)心與具體硬件相關(guān)的下層,依賴平臺的設(shè)備驅(qū)動程序?qū)覲DD (Platform Dependent Driver), PDD層通過設(shè)備驅(qū)動服務(wù)接口(Device Driver Service Provider Interface)直接管理硬件。流接口設(shè)備驅(qū)動程序(指可安裝的啟動程序)可以由第三方生產(chǎn)商提供,以支持添加到系統(tǒng)中的設(shè)備。Windows CE下的設(shè)備驅(qū)動程序在與應(yīng)用程序相同的保護(hù)級上工作。當(dāng)系統(tǒng)啟動時(shí),大多數(shù)驅(qū)動程序是由設(shè)備管理進(jìn)程(DEVICE.EXE)加載的,所有這些驅(qū)動程序?qū)⒐蚕硗粋€(gè)進(jìn)程地址空間。

3  I2C總線底層驅(qū)動設(shè)計(jì)

I2C總線驅(qū)動是放在Windows CE操作系統(tǒng)的內(nèi)核下層,位于OEM Adaptation Layer(OAL)層的一個(gè)真正的驅(qū)動。

3.1  初始化I2C中斷和編寫ISR例程

I2C的通信是通過操作I2C的寄存器進(jìn)行的。在I2C通信中主要對上面介紹的4個(gè)寄存器進(jìn)行讀寫。通過讀寫這些寄存器中的命令狀態(tài)字可以檢測和控制I2C總線的行為。在Windows CE.net下,首先要在文件oalintr.h添加I2C的中斷號的宏定義:

#defineSYSINTR_I2C(SYSINTR_FIRMWARE+19)

然后在文件cfw.c的文件中添加I2C中斷的初始化,禁止和復(fù)位。具體代碼如下:

在OEMInterruptEnable函數(shù)中加入

case SYSINTR_IIC:

s2410INT->rSRCPND=BIT_IIC;

if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND = BIT_IIC;

s2410INT->rINTMSK&= ~BIT_IIC;

break;

在OEMInterruptDisable函數(shù)中加入

case SYSINTR_IIC:

s2410INT->rINTMSK|= BIT_IIC;

break;

在armint.c文件中添加ISR程序,處理中斷發(fā)生后返回定義的中斷號。具體代碼如下:

在OEMInterruptHandler函數(shù)中添加

else if (IntPendVal == INTSRC_IIC) {

s2410INT->rSRCPND= BIT_IIC; /* 清除中斷 */

if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND= BIT_IIC;

s2410INT->rINTMSK|= BIT_IIC; /* I2C中斷禁止 */

return (SYSINTR_RTC_ALARM);

}

3.2  編寫流驅(qū)動程序

I2C總線驅(qū)動程序采用的是Win CE流驅(qū)動的標(biāo)準(zhǔn)形式。在IIC_Init的函數(shù)中,首先通過函數(shù)VirtualAlloc()和VirtualCopy(),把芯片中針對I2C的物理地址和操作系統(tǒng)的虛存空間聯(lián)系起來,對虛擬地址空間的操作就相當(dāng)于對芯片的物理地址進(jìn)行操作。地址映射的代碼如下:

reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);

if (reg) {

if (!VirtualCopy(reg, addr, sz, PAGE_READWRITE | PAGE_NOCACHE )) {

RETAILMSG( DEBUGMODE,( TEXT( "Initializing interrupt " ) ) );

VirtualFree(reg, sz, MEM_RELEASE);

reg = NULL;

}

}

其中sz是申請的長度,addr是申請?zhí)摂M地址空間的實(shí)際物理地址在Win CE中的映射地址。

然后對申請到的虛擬地址進(jìn)行操作,安裝Windows中的流驅(qū)動的模型進(jìn)行驅(qū)動的編寫,主要包括下面函數(shù)的編寫。

IIC_Init()

在函數(shù)中,主要是對I2C的初始化,主要語句如下:

v_pIICregs = ( volatile IICreg *)IIC_RegAlloc((PVOID)IIC_BASE, sizeof(IICreg));

v_pIOPregs = ( volatile IOPreg *)IOP_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));

v_pIOPregs->rGPEUP|= 0xc000;

v_pIOPregs->rGPECON |= 0xa00000;

v_pIICregs->rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);

v_pIICregs->rIICADD= 0x10;

v_pIICregs->rIICSTAT = 0x10;

VirtualFree( ( PVOID )v_pIOPregs,sizeof( IOPreg ),MEM_RELEASE );

v_pIOPregs = NULL;

if ( !StartDispatchThread( pIIcHead) )

{ IIC_Deinit( pIIcHead );return ( NULL );}在StartDispatchThread()函數(shù)中,主要是創(chuàng)建線程、關(guān)聯(lián)事件和中斷,主要語句如下:

InterruptInitialize( 36,pIicHead->hIicEvent,NULL,0 );//關(guān)聯(lián)時(shí)間和中斷

CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );//創(chuàng)建線程等待時(shí)間

在IicDispatchThread()函數(shù)中,主要是等待中斷的產(chǎn)生,然后去執(zhí)行:WaitReturn =  WaitForSingleObject( pIicHead->hIicEvent,INFINITE );

IicEventHandler( pIicHead );//事件處理函數(shù)

InterruptDone( 36 );

最后,在函數(shù)IIC_Open、IIC_Read、IIC_Write中,對各個(gè)寄存器進(jìn)行操作,進(jìn)行數(shù)據(jù)的賦值,得到I2C讀取的數(shù)據(jù)和發(fā)送數(shù)據(jù)。

4  I2C驅(qū)動的封裝和添加到Windows CE中

通過上面的工作,能編譯一個(gè)DLL函數(shù),但這還不能叫流接口驅(qū)動程序。因?yàn)樗慕涌诤瘮?shù)還沒有導(dǎo)出,還需要告訴鏈接程序需要輸出什么樣的函數(shù),為此要建立一個(gè)自己的def文件,可以用記事本建一個(gè),取名mydrive.Def:

LIBRARY MyDriver

EXPORTS

IIC_Close

IIC_Deinit

IIC_Init

IIC_IOControl

IIC_Open

IIC_PowerDown

IIC_PowerUp

IIC_Read

IIC_Seek

IIC_Write

然后同樣用記事本編寫一個(gè)注冊表文件,取名為mydrive.reg:

[HKEY_LOCAL_MACHINEDriversBuiltInSTRINGS]

"Index"=dword:1

"Prefix"="IIC"

"Dll"="MyDriver.dll"

"Order"=dword:0

最后編寫自己的CEC文件。主要是添加一個(gè)Build Method,任務(wù)是復(fù)制注冊表到Win CE的系統(tǒng)目錄下面。加一個(gè)Bib File,其主要功能是把編譯的mydrive.dll文件添加到系統(tǒng)內(nèi)核中去。保存寫好的CEC文件。打開Platform Builder,打開“File”菜單,添加剛剛編寫的CEC特征到系統(tǒng)選項(xiàng)中去。生成系統(tǒng)的時(shí)候,添加自己的CEC特性,就可以包含剛剛編寫的I2C驅(qū)動了。

以上介紹了Win CE的驅(qū)動結(jié)構(gòu),并給出了基于Win CE的 I2C驅(qū)動程序部分源代碼。實(shí)驗(yàn)證明該設(shè)計(jì)是可行的。

參考文獻(xiàn)

1  陳向群,等. Windows CE.NET系統(tǒng)分析及實(shí)驗(yàn)教程. 北京:機(jī)械工業(yè)出版社,2003

2  周毓林,等. Windows CE.net內(nèi)核定制及應(yīng)用開發(fā). 北京:電子工業(yè)出版社,2005

3  Microsoft.Windows CE設(shè)備驅(qū)動程序開發(fā)指南. 北京:北京希望電子出版社,1999

王小芳  碩士研究生,主要研究方向?yàn)橹悄軆x器控制。

王典洪  博士生導(dǎo)師,主要研究方向?yàn)橹悄軆x器控制、計(jì)算機(jī)圖像處理。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
裸体丰满少妇做受久久99精品| 欧美精品在线一区| 亚洲精品久久嫩草网站秘色| 亚洲免费在线| 一本色道久久综合亚洲精品按摩 | 亚洲精品久久久久中文字幕欢迎你| 国内精品嫩模av私拍在线观看 | 欧美一区二区精品| 亚洲夜晚福利在线观看| 99精品视频免费观看| 亚洲精品在线免费| 亚洲精品久久久久久一区二区| 亚洲二区视频| 亚洲国产精品成人一区二区| 在线不卡中文字幕播放| 国产一区二区三区在线播放免费观看| 国产精品一区视频| 国产欧美日韩视频| 国产视频在线观看一区| 国产三级精品在线不卡| 国产日韩精品一区观看| 国产亚洲二区| 激情久久久久| 伊甸园精品99久久久久久| 在线成人激情黄色| 亚洲国产日韩一区二区| 亚洲精品美女在线观看播放| 亚洲精品美女久久7777777| 亚洲精品网址在线观看| 亚洲精品女人| 国产精品99久久久久久久女警| 亚洲一品av免费观看| 香蕉久久夜色精品国产使用方法| 久久se精品一区精品二区| 亚洲黄色片网站| 91久久综合| 一本色道久久综合精品竹菊| 亚洲午夜精品久久| 午夜亚洲一区| 久久精品72免费观看| 另类春色校园亚洲| 欧美精品v国产精品v日韩精品| 欧美日韩成人综合天天影院| 国产精品白丝av嫩草影院| 国产色综合久久| 尤物在线观看一区| 日韩一区二区精品视频| 亚洲欧美日韩精品一区二区| 亚洲国产婷婷| 中文一区字幕| 久久精品91久久久久久再现| 欧美成年人视频| 欧美天堂亚洲电影院在线观看 | 欧美在线国产| 亚洲久久一区| 午夜精品久久久久久久久久久| 久久深夜福利| 欧美日韩小视频| 国产一区深夜福利| 亚洲三级视频| 午夜一级在线看亚洲| 亚洲黄色尤物视频| 亚洲免费中文字幕| 久久久综合精品| 欧美日韩一区二区三区免费看| 国产日韩欧美夫妻视频在线观看| 亚洲国产精品va在线观看黑人| 亚洲五月六月| 亚洲人成绝费网站色www| 亚洲欧美经典视频| 美女啪啪无遮挡免费久久网站| 欧美视频网址| 亚洲缚视频在线观看| 一区二区三区成人| 亚洲韩日在线| 欧美在线精品一区| 欧美日本高清一区| 国产综合精品| 一区二区三区高清不卡| 亚洲国产精品黑人久久久| 亚洲在线不卡| 欧美高清不卡| 国产伪娘ts一区| 99热这里只有精品8| 亚洲激情在线激情| 欧美在线网站| 欧美日韩一区成人| 在线国产精品一区| 欧美一站二站| 亚洲欧美文学| 欧美日韩另类丝袜其他| 激情国产一区二区| 亚洲自拍三区| 亚洲视频www| 欧美激情亚洲综合一区| 狠久久av成人天堂| 亚洲摸下面视频| 中文亚洲欧美| 欧美片第1页综合| 亚洲国产高清一区| 欧美在线观看一区二区| 午夜影视日本亚洲欧洲精品| 欧美久久久久中文字幕| 国产一区 二区 三区一级| 一区二区三区 在线观看视频| 日韩性生活视频| 欧美高清你懂得| 在线成人激情黄色| 亚洲第一久久影院| 久久久亚洲午夜电影| 国产日韩欧美自拍| 亚洲欧美日本日韩| 亚洲影视九九影院在线观看| 欧美精品激情在线| 亚洲激情精品| 亚洲精品日韩综合观看成人91| 巨胸喷奶水www久久久免费动漫| 国产一区二区三区在线观看视频| 亚洲综合国产精品| 午夜国产欧美理论在线播放 | 国产午夜精品美女毛片视频| 亚洲午夜电影在线观看| 亚洲视频在线观看| 欧美日韩在线观看视频| 99精品欧美一区二区蜜桃免费| 一区二区精品国产| 欧美日韩国产高清视频| 亚洲精品中文字幕女同| 日韩亚洲欧美成人一区| 欧美人与禽猛交乱配| 亚洲精品一级| 一区二区三区精密机械公司 | 久久国产精品久久久久久| 国产精品自在在线| 午夜精品久久久久久久99水蜜桃| 欧美主播一区二区三区美女 久久精品人| 国产老女人精品毛片久久| 亚洲欧美怡红院| 久久精品中文字幕一区| 国内精品久久久久久影视8| 久久精品电影| 欧美大片免费观看在线观看网站推荐| 亚洲电影免费观看高清完整版| 亚洲美女在线看| 欧美日韩一区二区在线观看| 中国成人亚色综合网站| 香港久久久电影| 国产一区二区av| 亚洲日本久久| 欧美日精品一区视频| 亚洲影院在线| 久久网站免费| 亚洲激情av| 亚洲欧美日韩另类| 国内精品久久久久久影视8| 亚洲日本理论电影| 欧美午夜精品久久久久久人妖| 亚洲免费中文字幕| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲精美视频| 亚洲欧美中文另类| 韩国自拍一区| 一区二区黄色| 国产情侣一区| 亚洲人体1000| 国产精品日韩专区| 亚洲国产福利在线| 欧美三级电影精品| 欧美亚洲在线| 欧美激情亚洲自拍| 亚洲免费在线视频| 毛片av中文字幕一区二区| 一本色道综合亚洲| 久久久蜜桃精品| 亚洲精品亚洲人成人网| 久久www成人_看片免费不卡| 亚洲激情自拍| 欧美在线观看视频| 亚洲欧洲美洲综合色网| 欧美一区二区三区成人| 亚洲国产精品悠悠久久琪琪 | 欧美777四色影视在线| 99riav久久精品riav| 久久久噜噜噜久噜久久| 99国产精品视频免费观看| 久久久久久久波多野高潮日日| 亚洲精品久久在线| 久久影视三级福利片| 99这里只有久久精品视频| 久久综合99re88久久爱| 亚洲网站在线播放| 欧美激情精品久久久久久大尺度| 亚洲欧美国产精品专区久久| 欧美精品在线免费观看| 久久国产福利| 国产精品免费一区二区三区在线观看 | 一本色道**综合亚洲精品蜜桃冫| 久久久精品国产99久久精品芒果| 亚洲狼人精品一区二区三区| 久久久久在线观看|