基于WinCE的I2C驅動程序設計
隨著以計算機技術、通信技術和軟件技術為核心的信息技術的迅速發(fā)展,嵌入式系統(tǒng)在各行業(yè)得到了廣泛的應用,極大地推動了行業(yè)的滲透性應用。
嵌入式系統(tǒng)是“以應用為中心、以計算機技術為基礎、軟硬件可裁剪、適應應用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統(tǒng)”,由嵌入式硬件和嵌入式軟件兩部分組成。嵌入式軟件包括嵌入式操作系統(tǒng)和嵌入式應用軟件。Microsoft的桌面操作系統(tǒng)已經為人們熟悉和使用,嵌入式的操作系統(tǒng)Windows CE.net也日益風行。Windows CE.net是Microsoft推出的功能強大的緊湊、高效、可伸縮的32位嵌入式操作系統(tǒng),主要面對各種各樣的嵌入式系統(tǒng)和產品。該系統(tǒng)所具有的多線程、多任務、完全搶占式的特點是專為各種具有嚴格資源限制的硬件系統(tǒng)所設計的。為了將操作系統(tǒng)和硬件設備連接起來,聯系硬件和軟件的驅動就顯得很重要。
下面主要針對三星公司ARM9內核的芯片S3C2410進行分析,介紹在Windows CE.net系統(tǒng)下進行底層設備驅動開發(fā)的方法并提供I2C通信的實例。
1 I2C通信協議及S3C2410芯片介紹
I2C總線遵從同步串行傳輸協議,即各位串行(一位接一位)發(fā)送,由時鐘(clock)線指示讀數據(data)線的時刻。每個數據包前有一個地址,以指示由哪個器件來接收該數據。
S3C2410是一款基于ARM920T的16/32位RISC微處理器,主要用于手持設備,擁有高性價比,低功耗等特點,也是目前市面上出現較多的嵌入式開發(fā)板的處理器之一。芯片擁有16 KB的指令和數據緩存器,有存儲管理單元(MMU)、LCD控制器、3個串口、4路DMA、4個時鐘定時器、8路10位的A/D轉換;支持I2C、I2S、SPI、主從USB等接口以及SD/MMC卡。
S3C2410微處理器的I2C總線可以處于下面4種模式下:主接收模式、主發(fā)送模式、從接收模式和從發(fā)送模式。處理器對I2C進行的操作,主要是對下面的幾個寄存器進行讀/寫:
- IIC控制寄存器,IICCON(物理地址0X54000000,內存映射后的虛擬地址);
- IIC控制/狀態(tài)寄存器,IICSTAT(物理地址0X54000004);
- IIC數據寄存器,IICDS(物理地址0X54000008);
- IIC地址寄存器,IICADD(物理地址0X5400000C)。
本設計主要是CPU工作在主模式下與下面的I2C接口設備進行通信。
2 Windows CE系統(tǒng)驅動特點
Windows CE.net驅動有兩種模型:本機設備驅動程序和流接口驅動程序。本機設備驅動適于集成到基于Windows CE.net平臺的設備。這些設備驅動程序是一些硬件所必需的,是由原始設備制造商創(chuàng)建的,用以驅動如鍵盤、觸摸屏、音頻設備等,往往在設備售出后就不會再更換,如通用LED驅動、電源驅動、鍵盤驅動和顯示驅動等都是本機設備驅動。對于本機設備驅動程序,Platform Builder提供了一些驅動程序樣本,目的是為了方便開發(fā)人員快速開發(fā)出自己的驅動程序。當Win CE系統(tǒng)啟動時,本地設備驅動程序將被加載到系統(tǒng)的內存中。本地驅動程序的開發(fā)分為分層驅動和單片驅動程序。分層驅動要利用微軟提供的與應用程序通信的上層,稱為模塊驅動程序層MDD(Model Device Driver)。MDD層通過設備驅動程序接口DDI(Device Driver Interface)與應用程序通信,開發(fā)驅動程序通常不修改MDD層,主要關心與具體硬件相關的下層,依賴平臺的設備驅動程序層PDD(Platform Dependent Driver), PDD層通過設備驅動服務接口(Device Driver Service Provider Interface)直接管理硬件。流接口設備驅動程序(指可安裝的啟動程序)可以由第三方生產商提供,以支持添加到系統(tǒng)中的設備。Windows CE下的設備驅動程序在與應用程序相同的保護級上工作。當系統(tǒng)啟動時,大多數驅動程序是由設備管理進程(DEVICE.EXE)加載的,所有這些驅動程序將共享同一個進程地址空間。
3 I2C總線底
層驅動設計
I2C總線驅動是放在Windows CE操作系統(tǒng)的內核下層,位于OEM Adaptation Layer(OAL)層的一個真正的驅動。
3.1 初始化I2C中斷和編寫ISR例程
I2C的通信是通過操作I2C的寄存器進行的。在I2C通信中主要對上面介紹的4個寄存器進行讀寫。通過讀寫這些寄存器中的命令狀態(tài)字可以檢測和控制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=
break;
在OEMInterruptDisable函數中加入
case SYSINTR_IIC:
s2410INT->rINTMSK|= BIT_IIC;
break;
在armint.c文件中添加ISR程序,處理中斷發(fā)生后返回定義的中斷號。具體代碼如下:
在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);
}
評論