S3C2440 Windows CE的RTC模塊驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
下面給出OEMGetRealTime()的源代碼僅供參考。
OEMGetRealTime(LPSYSTEMTIME lpst)
{
volatile RTCreg *s2440RTC;
s2440RTC = (RTCreg *)RTC_BASE;
//RETAILMSG(1,(_T("OEMGetRealTime ")));
//使能RTC
s2440RTC->rRTCCON =0x1;
lpst->wMilliseconds=0;
lpst->wSecond= FROM_BCD(s2440RTC->rBCDSEC0x7f);
lpst->wMinute= FROM_BCD(s2440RTC->rBCDMIN0x7f);
lpst->wHour= FROM_BCD(s2440RTC->rBCDHOUR0x3f);
lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
lpst->wDay= FROM_BCD(s2440RTC->rBCDDAY0x3f);
lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON0x1f);
//lpst->wYear=(2000+s2440RTC->rBCDYEAR);
lpst->wYear=FROM_BCD(s2440RTC->rBCDYEAR)+2000;
if(lpst->wSecond==0)
{
lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC0x7f);
lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN0x7f);
lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR0x3f);
lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY0x3f);
lpst->wMonth=FROM_BCD(s240RTC->rBCDMON0x1f);
lpst->wYear=(2000+s240RTC->rBCDYEAR);
}
//禁止RTC
s2440RTC->rRTCCON=0;
return TRUE;
}
3.3 系統(tǒng)I/O
OAL代碼層提供了與內(nèi)核交互的函數(shù),通過(guò)它內(nèi)核可以獲得硬件平臺(tái)的信息 。在OAL層中,完成此功能的函數(shù)為 OEMIOcontrol()。其函數(shù)原型如下:
Bool OEMIoContol(……)
{switch(dwIoContro1)
{case IOCTL_HAL_INIT_RTC;
if(nInBufSize>= sizeof(SYSTEMTIME))
return OEMSetRealTime((LPSYSTEMTIME)lpInBuf);
else
return FALSE;
break;
……
default: return FALSE;
}
WinCE每次啟動(dòng)時(shí)都會(huì)由KernelIoContrl()函數(shù)調(diào)用OEMIOcontrol(),完成底層硬件信息的讀取,其中參數(shù)dwIoControl為內(nèi)核與OAL通信的控制代碼,通過(guò)它可以完成硬件信息的讀取。控制代碼一般都是微軟定義好的,其中RTC模塊定義的控制代碼為IOCTL_HAL_INIT_RTC,通過(guò)它內(nèi)核可以完成底層RTC模塊的初始化。
nInBufSize是由lpInBuf(指針)指向的緩沖區(qū)的大小,緩沖區(qū)是按字節(jié)大小計(jì)算的。SYSTEMTIME是WinCE內(nèi)部定義的一個(gè)表示時(shí)間的結(jié)構(gòu)體,LPSYSTEMTIME為指向此結(jié)構(gòu)體的指針。SYSTEMTIME結(jié)構(gòu)體原型如下,原型中定義了字格式的年、月、星期、日、時(shí)、分、秒、毫秒。
typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSeeond;
WORD wMilliseconds;
}SYSTEMTIME;
在本設(shè)計(jì)中,RTC的時(shí)間分辨率為“秒”,這是因?yàn)?a class="contentlabel" href="http://m.ptau.cn/news/listbylabel/label/S3C2440">S3C2440的RTC模塊所能提供的最小時(shí)間基準(zhǔn)就是“秒”。用戶可以根據(jù)實(shí)際需求編寫(xiě)系統(tǒng)I/O下的RTC初始化代碼,也可以禁止這部分代碼。若WinCE從OAL層讀不到時(shí)鐘參數(shù)的話,它會(huì)以系統(tǒng)的默認(rèn)時(shí)間值來(lái)初始化SYSTEMTIME結(jié)構(gòu)體。
4 結(jié)束語(yǔ)
當(dāng)前比較流行的ARM嵌入式處理器,如Samsung的S3C系列、Intel的Xscale系列、Motorola的龍珠系列等幾乎都內(nèi)嵌有RTC模塊。使許多嵌入式產(chǎn)品如手機(jī)、PDA等的時(shí)間顯示豐富多彩,如具有顯示陽(yáng)歷、陰歷、萬(wàn)年歷等功能。本文給出了RTC模塊的WinCE驅(qū)動(dòng)程序?qū)崿F(xiàn),基于本設(shè)計(jì)可以進(jìn)一步開(kāi)發(fā)如時(shí)鐘界面等時(shí)鐘應(yīng)用功能,以滿足多姿多彩的嵌入式系統(tǒng)對(duì)于時(shí)鐘功能的應(yīng)用需求。
評(píng)論