陳紹貴,王新華,郭淑琴
(1.浙江工業(yè)大學(xué)信息學(xué)院,浙江杭州310023;2.浙江科技學(xué)院信息學(xué)院,浙江杭州310023)
隨著信息技術(shù)的發(fā)展,以嵌入式智能設(shè)備為核心的后PC時代已經(jīng)來臨,嵌入式技術(shù)和產(chǎn)品得到了很大的發(fā)展,美國微軟公司也發(fā)布了一系列嵌入式操作系統(tǒng),并且取得了巨大的成功。WinCE是微軟公司設(shè)計的一個開放的、可裁剪的、32位的實時窗口操作系統(tǒng),具有可靠性好、實時性高、內(nèi)核體積小等特點;擁有良好的通信能力、出色的圖形界面、靈活的電源管理,并內(nèi)置多媒體功能、支持多種CPU,所以被廣泛應(yīng)用于移動應(yīng)用產(chǎn)品、消費類電子產(chǎn)品和嵌入式智能設(shè)備的開發(fā)[1]。為了使操作系統(tǒng)與硬件很好的連接在一起,編寫硬件的驅(qū)動程序就顯得至關(guān)重要了。
IIC串行總線一般有兩根信號線,一根是雙向的數(shù)據(jù)線SDA,另一根是時鐘線SCL。所有接到IIC總線設(shè)備上的串行數(shù)據(jù)SDA都接到總線的SDA上,各設(shè)備的時鐘線SCL接到總線的SCL上。IIC總線是遵從串行傳輸協(xié)議的。當總線開始工作的時候,即各位串行(一位接一位)發(fā)送,由時鐘(clock)線指示讀數(shù)據(jù)(data)線的時刻。IIC總線數(shù)據(jù)由8位構(gòu)成,傳輸數(shù)據(jù)前首先傳輸一個地址,地址由8位組成,前7位為設(shè)備地址,第8位為傳輸方向。S3C2440A的IIC總線接口有4種工作模式:主機發(fā)送模式、主機接收模式、從機發(fā)送模式、從機接收模式。在一般嵌入式系統(tǒng)中,IIC總線一般外接一片EEPROM。EEPROM(Electrically Erasable Programmable Read-Only Memory)有8針和14針兩種封裝,我們的系統(tǒng)采用的是8針封裝的芯片。芯片上SCL和SDA兩個引腳直接連到CPU上引腳;為了可以控制EEPROM的讀寫,把WP引腳連接到VD9/GPD1引腳上,當CPU把這個引腳置高電平或低電平時,就可以控制EEPROM是可讀可寫還是可讀不可寫。A2、A1和A0是設(shè)備地址,沒有連接外設(shè)或者兼容設(shè)備時,應(yīng)該全部置低電平,這樣可以讀出EEPROM的地址。為了保護芯片,SCL、SDA和WP信號線都接4.7K的上拉電阻。芯片采用的是AT24C64N-10SI-2.7。IIC硬件連接如圖1所示。
圖1 IIC總線硬件電路
處理對IIC總線操作通過操作IIC總線寄存器完成,S3C2440A總線寄存器如下:(1)多主機IIC總線控制IICCON寄存器(物理地址0X54000000);(2)多主機IIC總線控制狀態(tài)IICSTAT寄存器(物理地址0X54000004);(3)多主機IIC總線地址IICADD寄存器(物理地址0X54000008);(4)多主機IIC總線發(fā)送接收數(shù)據(jù)移位IICDS寄存器(物理地址0X5400000C);(5)多主機IIC總線線控制IICLC寄存器(物理地址0X54000010)。
基于WinCE5.0的IIC總線驅(qū)動程序是分層驅(qū)動。Device.exe(設(shè)備管理器)調(diào)用LoadLibrary函數(shù)而引用動態(tài)鏈接庫入口函數(shù)DllEntry把i2c.dll(IIC總線驅(qū)動的動態(tài)鏈接庫的名稱)加載到內(nèi)存當中或者通過Freelibrary引用DllEntry釋放資源,然后調(diào)用I2C_Init初始化設(shè)備或者調(diào)用I2C_Deinit卸載這個設(shè)備,這些函數(shù)都位于IIC總線驅(qū)動程序的MDD,MDD層中的函數(shù)通過調(diào)用PDD層中的函數(shù)操作底層硬件。分層驅(qū)動是將驅(qū)動程序代碼分為模型設(shè)備驅(qū)動(Model Device Driver,MDD)和稱為平臺相關(guān)驅(qū)動(Platform Dependent Driver,PDD)的下層。MDD層是微軟公司提供的給定類型所有驅(qū)動程序公用的代碼,在驅(qū)動程序修改或者編寫的時候,一般不建議修改MDD層代碼,以免系統(tǒng)無法使用提供的驅(qū)動程序;PDD層是由特定于給定硬件設(shè)備或平臺的代碼組成的,MDD層調(diào)用PDD層函數(shù)來訪問硬件或者特定硬件信息[2、3]。Device.exe通過流驅(qū)動接口函數(shù)管理IIC總線設(shè)備,IIC總線的流驅(qū)動借口函數(shù)位于程序的MDD層,這個文件在移植過程中是不需要修改的。主要工作是編寫或者修改(根據(jù)設(shè)備或者芯片不同)IIC總線的PPD層。
IIC總線驅(qū)動程序代碼構(gòu)成,本文采用飛凌公司OK2440-III提供的SMDK2440A的BSP包。IIC總線的驅(qū)動程序位于%_W INCEROOT%PLATFORMSMDK2440ASrcDR IVERSIIC。里面包含了多個文件,其中drv.c和i2c.c是IIC總線的驅(qū)動程序代碼,drv.h是所需的頭文件。其中drv.c是IIC總線驅(qū)動的MDD層,而i2c.c是它的PDD層。利用PlatBuilder5.0移植驅(qū)動程序。
IIC總線驅(qū)動程序?qū)崿F(xiàn)分析,因為PDD層需要與硬件打交道,而IIC的硬件操作主要是通過操作CPU的寄存器,在S3C2440A_IIC_BUS結(jié)構(gòu)體中定義了它所有的寄存器,S3C2440A所有寄存器地址在s2440addr.h中。由于需要與I/O口打交道,我們要對I/O口進行配置,在s3c2440a_ioport.h中定義一個包含所有GPIO口寄存器的S3C2440A_IOPORT_REG結(jié)構(gòu)體。IIC的操作需要用到時鐘PCLK,在S3C2440A_CLKPWR_REG結(jié)構(gòu)體中定義了所有的S3C2440A使用到的時鐘,包括FCLK、HCLK和PCLK等。在drv.h文件中定義了一個_I2C_CONTEXT結(jié)構(gòu)體,對于IIC所有操作都指向這個結(jié)構(gòu)體,包括對IIC總線的初始化、中斷、IIC總線的狀態(tài)等。I2C_STATE枚舉結(jié)構(gòu)中枚舉了IIC的所有狀態(tài),有閑置、讀、寫等。
IIC TX/RX是通過中斷的方式完成的。在i2c.def列舉了所有的IIC總線需要實現(xiàn)的流接口函數(shù),在PPD層中有幾個一定需要實現(xiàn)的流接口函數(shù)。在Device.exe完成加載IIC總線驅(qū)動后,第一個調(diào)用的函數(shù)是I2C_Init,而這個MDD層函數(shù)這是通過調(diào)用PDD層的HW_Init函數(shù)完成,這個函數(shù)主要做以下幾方面的工作:初始化IIC主要的數(shù)據(jù)結(jié)構(gòu)體變量的結(jié)構(gòu)成員,主要是為控制流服務(wù)的;初始化IIC總線接口的寄存器,為后面IIC TX/RX做準備,這個是通過調(diào)用InitRegs函數(shù)完成的;創(chuàng)建I/O事件、創(chuàng)建IST事件、為IIC物理中斷申請相應(yīng)的邏輯中斷號、把IIC的邏輯中斷和創(chuàng)建的IST事件綁定在一起、創(chuàng)建IIC線程,這個線程用于控制IIC操作的控制流。HW_Deinit主要在完成中斷后關(guān)中斷。SyncIst主要是同步IIC中斷服務(wù)線程I2C_IST。參考AT24C64N-10SI-2.7的數(shù)據(jù)手冊,可以編寫HW_Read和HW_Write兩個函數(shù),
可以發(fā)現(xiàn)在數(shù)據(jù)手冊中,對于IIC的讀寫都是先讀寫設(shè)備地址,再讀寫數(shù)據(jù)的。I2C_IST就是響應(yīng)中斷函數(shù),其中用switch語句選擇響應(yīng)怎么樣的操作。其整個驅(qū)動程序流程圖如圖2所示:
IIC總線驅(qū)動的配置文件,在WINCE5.0中,所有的驅(qū)動,無論單層驅(qū)動還是流驅(qū)動,都是以動態(tài)鏈接庫(.dll)的形式存在的,當系統(tǒng)啟動時,這些驅(qū)動就動態(tài)的加載到系統(tǒng)當中。配置文件用來指導(dǎo)如何編譯驅(qū)動(MakeFile文件),還用來確定驅(qū)動程序最后生成的動態(tài)鏈接庫的文件名、存放目錄等(source、platform.bib、platform.reg),并把這些重要信息放在注冊表文件中提供給操作系統(tǒng),以便操作系統(tǒng)對驅(qū)動程序進行管理。Platform.bib文件中對IIC描述如下:
圖2 IIC總線驅(qū)動程序流程圖
IF BSP_NOI2C!
i2c.dll$(_FLATRELEASEDIR)i2c.dllNKSH
ENDIF BSP_NOI2C!
由此可知,i2c.dll將被加載到NK(內(nèi)核)的存儲區(qū)域,且i2c.dll具有系統(tǒng)和隱藏屬性,NK區(qū)域在config.bib中定義為NK80400000。
platform.reg是WINCE5.0的注冊表文件,系統(tǒng)根據(jù)注冊表對驅(qū)動程序的描述動態(tài)的加載驅(qū)動,它對IIC驅(qū)動程序的描述如下:
"Prefix"="I2C"http://驅(qū)動函數(shù)的前綴鍵值
"Dll"="I2C.DLL"http://動態(tài)鏈接庫的名稱
"Order"=dword:8//驅(qū)動的加載順序,這表明IIC驅(qū)動不會過早被加載
"Index"=dword:0//驅(qū)動索引
"Mode"=dword:1//Mode:0=POLLING,1=INTERRUPT
"SlaveAddress"=dword:0//Bus Driver's Slave Address
"FriendlyName"="I2C Bus Driver"
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"http://電源管理
Source文件包含一些宏定義,編譯軟件(platformbuider5.0)利用這些宏定義作為選項來決定如何編譯和鏈接源文件,IIC總線的source問價描述如下:
RELEASETYPE=PLATFORM//編譯系統(tǒng)
TARGETNAME=i2c//驅(qū)動名稱
TARGETTYPE=DYNLINK//生成動態(tài)鏈接庫
DLLENTRY=DllEntry//驅(qū)動入口函數(shù)
IIC總線驅(qū)動移植,成功的移植IIC總線驅(qū)動必須認真研讀EEPROM的手冊,對于不同的芯片,讀地址、讀操作、寫操作的時序必須分析清楚。AT24C02和AT24C64的讀寫操作時序是不一樣,在讀寫完成等待時間(延遲)也是不一樣的,延遲對于硬件移植來說是非常重要的一環(huán)。
IIC總線驅(qū)動移植結(jié)果,IIC總線驅(qū)動移植調(diào)試用一款基于WINC5.0的調(diào)試軟件,調(diào)試結(jié)果如圖3所示:
圖3 IIC驅(qū)動調(diào)試結(jié)果
本文簡單介紹了基于WINCE5.0的驅(qū)動程序的分層驅(qū)動,在此基礎(chǔ)上講解了IIC總線的驅(qū)動程序,對于移植WINCE下的IIC總線驅(qū)動有一定的作用。
[1]周毓林.Windows CE net內(nèi)核定植及應(yīng)用開發(fā)[M].北京:電子工業(yè)出版社,2005:25-23.
[2]顧崢浩,王自強,聶文華.WinCE流驅(qū)動程序設(shè)計概述[J].微處理機,2007,(3):81-83.
[3]張冬泉,譚南林,蘇樹強.Windows CE實用開發(fā)技術(shù)[M].北京:電子工業(yè)出版社,2008:272-273.
[4]張毅,王海濤.基于S3C2410的WinCE5.0下觸摸屏驅(qū)動的實現(xiàn)[J].重慶郵電大學(xué)學(xué)報,2008,20(6):742-744.
[5]楊澤輝,徐燕玲,劉碧君,等.基于嵌入式WinCE的GPIO驅(qū)動開發(fā)[J].太原科技大學(xué)學(xué)報,2010,31(6):446-447.
[6]陽開新.鐵氧體材料及應(yīng)用[J].磁性材料及器件,1996,27(3):19-23.