《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于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亚洲国产精品_日韩亚洲一区二区
一本大道av伊人久久综合| 午夜精品久久久久久久99樱桃 | 国产精品家教| 欧美日韩国产专区| 欧美日本在线| 欧美日韩性视频在线| 欧美人与性动交cc0o| 欧美久久婷婷综合色| 欧美精品九九| 欧美日韩国产区| 欧美日韩免费高清| 欧美日韩一区二区视频在线| 欧美小视频在线| 国产精品免费视频观看| 国产精品美女在线| 国产精品一区二区在线观看不卡 | 国产精品一区二区三区久久久 | 国产日韩欧美综合精品| 国产一区二区三区观看| 国语自产精品视频在线看抢先版结局 | 久久久久久久久久久成人| 久久精品国产精品亚洲综合| 久久久xxx| 另类欧美日韩国产在线| 欧美成人精品1314www| 欧美精品日韩一本| 国产精品福利影院| 国产色产综合产在线视频| 激情一区二区三区| 亚洲国产一区二区a毛片| 99视频精品免费观看| 亚洲女人av| 亚洲国产一区在线观看| 日韩午夜视频在线观看| 午夜精品久久久| 久久中文精品| 欧美日韩另类在线| 国产精品一区亚洲| 亚洲国产高清一区二区三区| 99精品国产高清一区二区| 亚洲欧美在线看| 亚洲精品国产拍免费91在线| 亚洲一线二线三线久久久| 久久激情网站| 欧美电影在线观看完整版| 国产精品久久久一本精品| 国产亚洲欧美在线| 91久久精品日日躁夜夜躁欧美 | 亚洲欧洲一区二区三区久久| 夜夜夜精品看看| 香蕉亚洲视频| 亚洲精选91| 欧美一区二区三区在线看| 免费成人网www| 国产精品狠色婷| 在线免费观看日本一区| 中文精品视频一区二区在线观看| 欧美一区二区三区喷汁尤物| 亚洲精品视频在线观看网站| 校园春色综合网| 欧美成人免费播放| 国产精品私人影院| 亚洲高清不卡av| 午夜精品av| 亚洲少妇一区| 免费中文字幕日韩欧美| 国产精品露脸自拍| 亚洲国产美女久久久久| 午夜影视日本亚洲欧洲精品| 日韩视频―中文字幕| 久久精品最新地址| 欧美性大战久久久久| 在线观看视频亚洲| 亚洲欧美日韩区| 亚洲婷婷综合久久一本伊一区| 久久久人人人| 国产精品一区二区在线观看不卡 | 欧美吻胸吃奶大尺度电影| 在线欧美日韩精品| 亚洲欧美日韩电影| 一区二区精品在线观看| 嫩草影视亚洲| 国产综合欧美在线看| 亚洲午夜在线观看| 99视频一区二区| 美日韩精品视频免费看| 国产午夜精品在线观看| 亚洲网站在线| 亚洲视频axxx| 欧美经典一区二区三区| 伊人久久久大香线蕉综合直播| 亚洲欧美久久久久一区二区三区| 中文在线一区| 欧美精品自拍| 亚洲国产精品第一区二区| 久久精品国产亚洲一区二区三区| 香蕉av777xxx色综合一区| 欧美三区在线视频| 亚洲精品免费在线播放| 亚洲精品一区二区三区av| 久久先锋资源| 国产亚洲欧美色| 欧美亚洲三级| 久久国产精品亚洲77777| 国产伦精品一区二区三区高清| 一区二区日韩免费看| 一区二区三区黄色| 欧美美女bb生活片| 亚洲人在线视频| 99亚洲一区二区| 欧美高清成人| 亚洲欧洲美洲综合色网| 亚洲日本va午夜在线电影| 免费成人毛片| 亚洲国产精品欧美一二99| 亚洲国产1区| 欧美freesex交免费视频| 在线免费观看日韩欧美| 亚洲区一区二| 欧美激情在线免费观看| 亚洲精品日韩在线观看| 一区二区三区四区五区视频| 欧美另类一区二区三区| 亚洲人成亚洲人成在线观看图片 | 亚洲国产精彩中文乱码av在线播放| 久久久99精品免费观看不卡| 国产一区二区剧情av在线| 欧美一区二区三区免费视频| 久久精品天堂| 伊大人香蕉综合8在线视| 亚洲国产欧美一区二区三区同亚洲| 久久综合久久久久88| 亚洲国产成人av| 日韩天堂av| 欧美无乱码久久久免费午夜一区 | 欧美精品1区| 日韩西西人体444www| 亚洲欧美视频| 国产人妖伪娘一区91| 欧美中文在线视频| 你懂的成人av| 亚洲免费久久| 亚洲免费婷婷| 国产在线视频欧美一区二区三区| 亚洲国产精品成人一区二区| 欧美成人高清视频| 一区二区动漫| 久久久国产亚洲精品| 亚洲国产99精品国自产| 亚洲视频中文| 国产一区二区久久精品| 亚洲精品国产视频| 欧美视频中文在线看| 亚洲欧美日韩一区在线| 久久影音先锋| 日韩午夜在线| 久久精品理论片| 91久久久一线二线三线品牌| 亚洲校园激情| 国外精品视频| 一区二区精品在线观看| 国产九色精品成人porny| 亚洲国产精品免费| 国产精品第三页| 亚洲高清一区二| 欧美四级剧情无删版影片| 午夜一级久久| 欧美日本簧片| 欧美在线播放视频| 欧美日韩国产影片| 欧美一区二区三区四区视频| 欧美精品在线播放| 午夜视频一区| 欧美日韩国语| 久久精品视频免费| 欧美视频一区二区三区| 亚洲第一精品夜夜躁人人爽| 欧美日韩一区自拍| 欧美专区亚洲专区| 欧美性猛片xxxx免费看久爱| 久久精品欧洲| 国产精品理论片| 99视频国产精品免费观看| 国产伪娘ts一区| 亚洲视频在线观看免费| 在线不卡视频| 欧美一区二区三区四区在线观看地址 | 性欧美精品高清| 亚洲肉体裸体xxxx137| 久久激情中文| 亚洲视频图片小说| 欧美精品久久一区| 亚洲福利视频网| 国产精品一区二区欧美| 在线一区欧美| 亚洲国产欧美国产综合一区 | 樱桃国产成人精品视频| 欧美一激情一区二区三区| 日韩网站在线| 免费一级欧美片在线播放|