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

引言

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

下面主要針對三星公司ARM9內核的芯片S3C2410進行分析,介紹在Windows CE.net系統下進行底層設備驅動開發的方法并提供I2C通信的實例。

1  I2C通信協議及S3C2410芯片介紹

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

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

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

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

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

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

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

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

 本設計主要是CPU工作在主模式下與下面的I2C接口設備進行通信。

2  Windows CE系統驅動特點

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

3  I2C總線底層驅動設計

I2C總線驅動是放在Windows CE操作系統的內核下層,位于OEM Adaptation Layer(OAL)層的一個真正的驅動。

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

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

#defineSYSINTR_I2C(SYSINTR_FIRMWARE+19)

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

在OEMInterruptEnable函數中加入

case SYSINTR_IIC:

s2410INT->rSRCPND=BIT_IIC;

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

s2410INT->rINTMSK&= ~BIT_IIC;

break;

在OEMInterruptDisable函數中加入

case SYSINTR_IIC:

s2410INT->rINTMSK|= BIT_IIC;

break;

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

在OEMInterruptHandler函數中添加

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  編寫流驅動程序

I2C總線驅動程序采用的是Win CE流驅動的標準形式。在IIC_Init的函數中,首先通過函數VirtualAlloc()和VirtualCopy(),把芯片中針對I2C的物理地址和操作系統的虛存空間聯系起來,對虛擬地址空間的操作就相當于對芯片的物理地址進行操作。地址映射的代碼如下:

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是申請虛擬地址空間的實際物理地址在Win CE中的映射地址。

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

IIC_Init()

在函數中,主要是對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()函數中,主要是創建線程、關聯事件和中斷,主要語句如下:

InterruptInitialize( 36,pIicHead->hIicEvent,NULL,0 );//關聯時間和中斷

CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );//創建線程等待時間

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

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

InterruptDone( 36 );

最后,在函數IIC_Open、IIC_Read、IIC_Write中,對各個寄存器進行操作,進行數據的賦值,得到I2C讀取的數據和發送數據。

4  I2C驅動的封裝和添加到Windows CE中

通過上面的工作,能編譯一個DLL函數,但這還不能叫流接口驅動程序。因為它的接口函數還沒有導出,還需要告訴鏈接程序需要輸出什么樣的函數,為此要建立一個自己的def文件,可以用記事本建一個,取名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

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

[HKEY_LOCAL_MACHINEDriversBuiltInSTRINGS]

"Index"=dword:1

"Prefix"="IIC"

"Dll"="MyDriver.dll"

"Order"=dword:0

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

以上介紹了Win CE的驅動結構,并給出了基于Win CE的 I2C驅動程序部分源代碼。實驗證明該設計是可行的。

參考文獻

1  陳向群,等. Windows CE.NET系統分析及實驗教程. 北京:機械工業出版社,2003

2  周毓林,等. Windows CE.net內核定制及應用開發. 北京:電子工業出版社,2005

3  Microsoft.Windows CE設備驅動程序開發指南. 北京:北京希望電子出版社,1999

王小芳  碩士研究生,主要研究方向為智能儀器控制。

王典洪  博士生導師,主要研究方向為智能儀器控制、計算機圖像處理。

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲看片网站| 久久国产精彩视频| 香蕉av777xxx色综合一区| 在线中文字幕一区| 亚洲最新合集| 99在线观看免费视频精品观看| 亚洲第一级黄色片| 在线免费日韩片| 亚洲高清一区二区三区| 伊人天天综合| 在线观看日韩av| 极品裸体白嫩激情啪啪国产精品| 国内久久精品视频| 国产亚洲精品久久久久婷婷瑜伽| 国产日韩高清一区二区三区在线| 国产精品中文在线| 国产日韩欧美二区| 国内揄拍国内精品久久| 激情久久婷婷| 亚洲第一精品夜夜躁人人爽| 亚洲高清影视| 亚洲美女淫视频| 在线一区视频| 欧美一级大片在线观看| 欧美在线观看网站| 亚洲欧洲日产国产网站| 99国产精品| 亚洲综合视频网| 久久激情婷婷| 美女性感视频久久久| 欧美成人小视频| 久久精品国产精品亚洲综合| 亚洲欧美综合另类中字| 亚洲欧美日韩精品| 久久激情中文| 欧美成ee人免费视频| 欧美久久成人| 国产综合色精品一区二区三区| 亚洲图片欧美午夜| 亚洲一区精品视频| 欧美一区二区大片| 最新日韩中文字幕| 在线午夜精品| 欧美专区福利在线| 欧美大色视频| 国产精品老牛| 黄色成人av| 亚洲日本免费| 亚洲免费小视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲精品九九| 亚洲小说欧美另类社区| 久久精品欧洲| 欧美区一区二| 国产日韩一区二区三区在线| 1204国产成人精品视频| 在线亚洲美日韩| 久久精品夜夜夜夜久久| 亚洲视屏在线播放| 久久噜噜噜精品国产亚洲综合| 欧美看片网站| 国产在线播放一区二区三区| 亚洲国产日韩欧美在线图片| 亚洲午夜国产一区99re久久| 亚洲福利视频网站| 亚洲综合电影一区二区三区| 免费观看久久久4p| 国产麻豆91精品| 亚洲日本中文| 香港成人在线视频| 欧美视频在线播放| 亚洲激情专区| 亚洲性视频h| 亚洲日韩视频| 久久精品网址| 国产精品jizz在线观看美国| 国产亚洲一区二区三区在线播放| 亚洲三级视频在线观看| 欧美一区二区三区的| 一区二区三区高清在线观看| 玖玖国产精品视频| 国产女主播一区| 亚洲精选91| 亚洲黄色天堂| 欧美一区二区在线视频| 欧美精品在线观看| 精品999成人| 亚洲综合日韩中文字幕v在线| 日韩视频中文字幕| 老司机午夜精品| 国产日韩欧美在线观看| 一区二区三区.www| 日韩一二在线观看| 美女亚洲精品| 韩国三级电影一区二区| 亚洲女同精品视频| 亚洲欧美激情四射在线日| 欧美日韩八区| 亚洲国产精品视频| 亚洲黑丝在线| 噜噜噜躁狠狠躁狠狠精品视频 | 国产精品久久网| 日韩视频在线免费观看| 99re成人精品视频| 欧美成人精品激情在线观看 | 亚洲欧美日本日韩| 久久精品国产999大香线蕉| 亚洲视频在线观看网站| 一区二区av在线| 欧美激情亚洲综合一区| 亚洲第一精品福利| 亚洲欧洲综合| 欧美成人精品福利| 亚洲狠狠丁香婷婷综合久久久| 亚洲国产婷婷香蕉久久久久久99| 久久久免费av| 极品尤物久久久av免费看| 久久爱91午夜羞羞| 久久久之久亚州精品露出| 国模精品一区二区三区| 久久福利电影| 另类专区欧美制服同性| 亚洲东热激情| 亚洲乱码国产乱码精品精| 欧美人与性动交a欧美精品| 亚洲美女福利视频网站| 这里只有精品视频| 国产精品男女猛烈高潮激情| 亚洲一区二区在线播放| 欧美一区二区视频在线观看| 国产欧美精品va在线观看| 午夜精品福利视频| 久久亚洲私人国产精品va| 亚洲丶国产丶欧美一区二区三区| 亚洲美女精品久久| 欧美日韩一区二区三区四区五区| 亚洲视频在线看| 久久久999成人| 黄色综合网站| 亚洲激情图片小说视频| 欧美精品国产精品| aⅴ色国产欧美| 亚洲欧美在线播放| 国产一区视频在线观看免费| 亚洲第一区中文99精品| 欧美经典一区二区| 亚洲视频综合| 久久久国际精品| 亚洲欧洲一区二区三区在线观看| 正在播放欧美视频| 亚洲第一偷拍| 欧美日韩aaaaa| 亚洲国产天堂网精品网站| 亚洲视频 欧洲视频| 国产精品九九久久久久久久| 亚洲欧美清纯在线制服| 久久亚洲国产成人| 亚洲人妖在线| 午夜免费在线观看精品视频| 好吊色欧美一区二区三区四区| 亚洲美女在线观看| 国产精品欧美日韩久久| 亚洲大胆女人| 欧美视频一区二区三区在线观看| 亚久久调教视频| 欧美日本国产视频| 午夜久久一区| 欧美日韩国产成人在线| 午夜激情综合网| 欧美精品一区在线播放| 香蕉精品999视频一区二区| 欧美成人免费视频| 亚洲视频www| 欧美成黄导航| 亚洲综合色婷婷| 欧美成人激情视频免费观看| 亚洲欧美成人网| 欧美精品乱人伦久久久久久| 午夜激情一区| 欧美日韩一区在线播放| 亚洲高清免费视频| 国产精品久久久久77777| 亚洲国产另类久久久精品极度| 欧美性大战久久久久久久| 亚洲第一页自拍| 国产精品久久久久秋霞鲁丝| 亚洲激情在线视频| 国产精品亚洲综合色区韩国| 亚洲精选中文字幕| 国产一区二区日韩精品| 亚洲午夜视频在线观看| 亚洲丶国产丶欧美一区二区三区| 性欧美18~19sex高清播放| 亚洲国产另类久久精品| 久久国产主播精品| 亚洲天堂成人在线观看| 欧美日韩成人综合| 亚洲精品123区| 国产在线观看一区| 校园春色国产精品|