国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

基于WinCE的I2C驅動程序設計

發布時間:2010-8-16 23:53    發布者:conniede
關鍵詞: I2C , WINCE , 驅動程序
引言

隨著以計算機技術、通信技術和軟件技術為核心的信息技術的迅速發展,嵌入式系統在各行業得到了廣泛的應用,極大地推動了行業的滲透性應用。

嵌入式系統是“以應用為中心、以計算機技術為基礎、軟硬件可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統”,由嵌入式硬件和嵌入式軟件兩部分組成。嵌入式軟件包括嵌入式操作系統和嵌入式應用軟件。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 \\n\\r" ) ) );
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 ( !S

tartDispatchThread( 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_MACHINE\Drivers\BuiltIn\STRINGS]
"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驅動程序部分源代碼。實驗證明該設計是可行的。
本文地址:http://www.qingdxww.cn/thread-21695-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲自拍偷拍网 | 午夜爱| 欧美精品成人一区二区在线观看 | 五月天视频网站 | 麻豆日韩国产精品欧美在线 | 欧美精品久久久久久久久大尺度 | 精品国产欧美一区二区 | 四虎必出精品亚洲高清 | 91福利国产在线观一区二区 | 国产一区二区免费在线 | 欧美日韩免费看 | 成人激情综合网 | 国外幻女free性zozo交 | eeuss影院www影院入口 | 亚洲国产香蕉视频欧美 | 日韩簧片 | 韩国三级美容院 | 精品欧美一区视频在线观看 | 亚洲天堂视频在线 | 日韩亚洲人成在线 | 2021色噜噜狠狠综曰曰曰 | 尹人香蕉网在线观看视频 | 亚洲图片 自拍偷拍 | 二区视频在线 | 韩日成人| 99国产牛牛视频在线网站 | 久久极品视频 | 香蕉国产人午夜视频在线观看 | 国产欧美在线观看不卡一 | 欧美精品一区二区三区在线 | 五月天国产精品 | 九九亚洲视频 | 妈妈的朋友手机在线观看 | 青久久 | 日韩国产在线观看 | 天美传媒果冻传媒星空传媒 | 99久久精品免费看国产情侣 | 精品一久久香蕉国产线看播放 | 日本中文字幕在线观看 | 中文字幕免费人成乱码中国 | 亚洲精品成人久久 |