《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于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網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          狠狠色狠狠色综合日日小说| 1024成人网色www| 国产亚洲一区精品| 亚洲国产另类 国产精品国产免费| 亚洲在线成人精品| 欧美性一区二区| 亚洲视频在线视频| 136国产福利精品导航| 欧美视频在线观看免费| 欧美激情综合在线| 性欧美18~19sex高清播放| 久久综合九色九九| 国产精品国产a级| 欧美午夜不卡在线观看免费| 国内伊人久久久久久网站视频| 国产精品久久7| 欧美日韩视频在线观看一区二区三区| 一区二区三区欧美日韩| 久久久久88色偷偷免费| 精品成人一区| 久久久亚洲精品一区二区三区| 亚洲一区在线观看视频| 欧美午夜精品一区二区三区| 国产啪精品视频| 亚洲电影第三页| 国产精品推荐精品| 亚洲国产精品成人| 欧美精品 国产精品| 一区二区在线观看av| 久久精品日韩| 国产亚洲精品v| 欧美日韩中文字幕日韩欧美| 一本色道久久综合亚洲精品婷婷| 国产欧美丝祙| 欧美成人国产一区二区| 亚洲午夜精品网| 国产精品久久久久久久久久ktv| 国产视频观看一区| 亚洲欧美综合v| 亚洲精品影院| 亚洲欧美日韩中文视频| 老司机午夜免费精品视频| 久久午夜色播影院免费高清| 亚洲激情av| 亚洲美女少妇无套啪啪呻吟| 久久综合久色欧美综合狠狠| 亚洲国内精品| 欧美一区二区三区免费视频| 欧美永久精品| 国产日产欧美一区| 午夜一区二区三区不卡视频| 麻豆精品精华液| 亚洲一区视频在线| 亚洲午夜精品福利| 欧美国产视频在线观看| 欧美大秀在线观看| 久久久久国产免费免费| 欧美顶级少妇做爰| 99精品国产在热久久婷婷| 国产精品羞羞答答xxdd| 男男成人高潮片免费网站| 久久久久九九视频| 欧美制服丝袜第一页| 欧美日韩在线播放三区| 国产农村妇女毛片精品久久麻豆| 久久亚洲一区二区| 亚洲欧美www| 中文av字幕一区| 欧美激情第10页| 99国内精品久久久久久久软件| 在线观看欧美一区| 亚洲巨乳在线| 国产精品热久久久久夜色精品三区| 亚洲欧美中文日韩v在线观看| 国产亚洲精品久久久| 亚洲欧美视频一区二区三区| 尤物yw午夜国产精品视频明星| 午夜精品久久久久久久白皮肤| 亚洲国产视频直播| 国产在线精品成人一区二区三区| 欧美欧美在线| 欧美精品福利视频| 欧美sm极限捆绑bd| 欧美视频免费在线观看| 亚洲激情在线观看视频免费| 一本色道综合亚洲| 国精品一区二区三区| 一本色道久久精品| 国产亚洲人成a一在线v站| 免费亚洲电影在线| 亚洲精品女av网站| 亚洲一区二区三| 噜噜噜噜噜久久久久久91| 欧美日韩第一区日日骚| 久久精品中文字幕免费mv| 久久女同精品一区二区| 国产欧美日韩免费看aⅴ视频| 亚洲欧洲偷拍精品| 最新成人av在线| 亚洲最新视频在线播放| 欧美日韩国产欧美日美国产精品| 亚洲一区二区三区在线看| 亚洲精品久久久久久一区二区| 国产免费一区二区三区香蕉精| 国产精品白丝黑袜喷水久久久| 国产一区99| 一区二区视频免费在线观看| 欧美影院视频| 久久久91精品国产一区二区精品| 国产日韩亚洲欧美综合| 影音先锋亚洲电影| 一本色道久久综合狠狠躁篇怎么玩| 一区二区在线视频| 国产精品xnxxcom| av成人国产| 欧美日韩成人| 欧美日韩在线一区| 国产一区二区在线免费观看| 91久久国产自产拍夜夜嗨| 老色鬼精品视频在线观看播放| 亚洲午夜激情免费视频| 欧美1区2区视频| 久久综合色婷婷| 欧美图区在线视频| 欧美jizzhd精品欧美喷水| 亚洲综合色网站| 欧美国产91| 国产精品一香蕉国产线看观看| 国产一区二区三区高清| 欧美成人一区二区三区片免费| 国产一区二区高清不卡| 欧美国产精品v| 先锋资源久久| 欧美激情国产精品| 欧美在线三级| 欧美大片网址| 一区二区三区日韩欧美精品| 国产精品免费网站在线观看| 欧美日韩国产在线看| 国产精品欧美一区喷水| 欧美在线高清视频| 红桃视频国产精品| 欧美日本国产视频| 亚洲免费观看高清在线观看| 欧美日韩一区二区视频在线| 欧美激情影音先锋| 欧美精品导航| 国产精品久久久久久久久久三级| 夜夜夜久久久| 毛片基地黄久久久久久天堂| 免费国产一区二区| 中日韩视频在线观看| 一区二区三区四区精品| 韩国av一区二区三区| 久久久久国产一区二区三区| 亚洲女ⅴideoshd黑人| 在线一区欧美| 国产日韩欧美一区在线| 国产精品成人免费| 久久国产精品99国产精| 国产欧美精品| 国产伦精品一区二区三区视频孕妇| 欧美大成色www永久网站婷| 韩国一区二区三区美女美女秀| 欧美日韩国产成人在线91| 欧美视频四区| 国产精品啊啊啊| 亚洲欧美日韩在线| 久久午夜羞羞影院免费观看| 欧美日韩二区三区| 久久伊人一区二区| 国产小视频国产精品| 欧美一级网站| 久久亚洲精品一区| 激情五月婷婷综合| 激情五月婷婷综合| 欧美一区二区私人影院日本| 国产精品区一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲精选久久| 亚洲精品日韩在线观看| 欧美一区二区精品久久911| 国产精品一区二区在线观看不卡| 国产一区成人| 国产精品女同互慰在线看| 国产精品久久网| 麻豆精品精品国产自在97香蕉| 欧美三级特黄| 国产综合色精品一区二区三区| 久久久av网站| 欧美精品一区二| 狠狠色香婷婷久久亚洲精品| 一区二区视频免费完整版观看| 欧美激情a∨在线视频播放| 久久狠狠一本精品综合网| 午夜国产精品影院在线观看| 久久色在线播放| 日韩网站在线观看| 老司机精品视频一区二区三区| 国产综合香蕉五月婷在线| 狠狠色丁香婷婷综合影院| 韩国亚洲精品| 亚洲人成网站影音先锋播放| 国产精品成人观看视频国产奇米| 欧美日韩亚洲一区二区三区四区| 欧美中文在线视频| 精久久久久久| 极品中文字幕一区| 影音先锋在线一区| 欧美天天视频| 国产色产综合色产在线视频| 韩国三级电影一区二区| 欧美中日韩免费视频| 欧美日韩不卡在线| 一本色道婷婷久久欧美| 欧美日韩国产精品一卡| 午夜久久久久久久久久一区二区| 在线一区二区三区做爰视频网站| 欧美一区二区三区电影在线观看| 米奇777在线欧美播放| 中日韩男男gay无套| 欧美一区二区三区电影在线观看| 久久免费视频观看| 亚洲人妖在线| 午夜精品一区二区三区四区| 久久久免费精品视频| 欧美成人亚洲成人| 欧美日韩国产综合视频在线观看| 欧美特黄一级大片| 国产亚洲高清视频| 亚洲欧美日本日韩| 欧美午夜精品久久久久免费视| 久久精品人人做人人爽| 日韩手机在线导航| 亚洲精品日日夜夜| 极品尤物一区二区三区| 国产欧美一区二区精品性| 鲁大师成人一区二区三区| 午夜日韩视频| 99综合视频| 亚洲激情亚洲| 在线观看欧美日韩国产| 久久综合久久88| 激情综合色丁香一区二区| 欧美激情一区二区三区成人| 久久综合色播五月| 国产女人aaa级久久久级| 国产午夜亚洲精品理论片色戒| 精品69视频一区二区三区| 狠狠色综合播放一区二区| 欧美搞黄网站| 国产情侣一区| 欧美二区乱c少妇| 亚洲视频在线观看网站| 久久婷婷激情| 国产精品乱码妇女bbbb| 欧美国产日本高清在线| 国产美女精品免费电影| 欧美婷婷在线| 欧美日韩aaaaa| 国产精品久久久久秋霞鲁丝| 久久精品国产免费看久久精品| 亚洲欧洲精品一区二区| 在线观看欧美黄色| 亚洲国产天堂久久综合| 亚洲精品网站在线播放gif| 在线播放中文字幕一区| 国产精品高潮呻吟久久av黑人| 亚洲欧美国产精品专区久久| 西西人体一区二区| 中文亚洲免费| 国产伦精品一区二区三区在线观看| 亚洲欧美在线看| 亚洲在线观看| 亚洲精品午夜精品| 亚洲精品日韩综合观看成人91| 国产精品人人做人人爽| 免费成人小视频| 欧美激情中文字幕在线| 国产精品激情av在线播放| 亚洲国产美女| 99热免费精品在线观看| 日韩一级成人av| 欧美一区二区三区喷汁尤物| 国产精品女人久久久久久| 久久中文在线| 欧美亚洲视频在线看网址| 国产日韩欧美不卡| 原创国产精品91| 亚洲国产高清一区| 免费观看30秒视频久久| 夜夜爽av福利精品导航| 国产精品一区二区a| 亚洲手机成人高清视频| 日韩视频―中文字幕| 免费成人黄色| 午夜在线电影亚洲一区| 激情久久中文字幕| 国产欧美日韩一区二区三区在线| 欧美成人一区二免费视频软件| 午夜精品亚洲| 国产在线精品自拍| 亚洲精品少妇30p| 久久五月婷婷丁香社区| 亚洲自拍啪啪| 国产精品第2页| 能在线观看的日韩av| 亚洲三级电影在线观看| 国模私拍一区二区三区| 亚洲专区在线视频| 欧美四级剧情无删版影片| 99国产精品99久久久久久粉嫩| 国内在线观看一区二区三区| 欧美色精品天天在线观看视频| 亚洲精品国产日韩| 国产精品日韩专区| 国产乱码精品一区二区三区不卡| 99视频在线观看一区三区| 国产精品v一区二区三区| 欧美久久精品午夜青青大伊人| 国产日韩欧美黄色| 美日韩精品免费| 一本久久知道综合久久| 亚洲一二三区视频在线观看| 久久亚洲高清| 夜夜狂射影院欧美极品| 亚洲尤物精选| 99精品国产在热久久下载|