S3C2440 Windows CE的RTC模塊驅動(dòng)設計與實(shí)現

發(fā)布時(shí)間:2010-8-6 15:49    發(fā)布者:lavida
關(guān)鍵詞: RTC , S3C2440 , Windows , 驅動(dòng)
1 引言

桌面Windows系統的時(shí)間顯示功能已為大家所熟知,它是通過(guò)BIOS上的時(shí)鐘模塊實(shí)現的。用戶(hù)通過(guò)點(diǎn)擊桌面系統任務(wù)欄右下腳的時(shí)間,可以修改當前時(shí)間、時(shí)區以及實(shí)現與Internet時(shí)間同步等功能。

目前流行的手機、PDA、HMI(人機接口設備)等嵌入式系統中,都大量移植了微軟的Windows CE操作系統。雖然WinCE系統也實(shí)現了時(shí)間顯示,但是在具體的實(shí)現中,其原理和方法與桌面系統大不相同,即使是基于不同嵌入式硬件平臺的WinCE開(kāi)發(fā),也有所不同。由于嵌入式系統的復雜性、分散性,目前嵌入式系統的實(shí)時(shí)時(shí)鐘RTC功能的實(shí)現,大部分是在基于內嵌于SoC處理器的RTC功能IP模塊的基礎上,通過(guò)軟件驅動(dòng)實(shí)現的。

S3C2440是三星公司推出的一款基于ARM920T處理器構架的低功耗、高性能的嵌入式SoC處理器,應用極為廣泛。RTC是S3C2440的一個(gè)內部功能模塊,本文首先對于S3C2440的硬件架構進(jìn)行介紹,在此基礎上對S3C2440的RTC功能模塊的工作機理進(jìn)行了分析,最后給出Windows CE.net下的RTC功能的驅動(dòng)程序設計、實(shí)現,本驅動(dòng)程序成功地應用在基于S3C2440Window CE平臺的手持GPS機實(shí)時(shí)時(shí)鐘功能的實(shí)現,對于基于Windows CE.net其它硬件平臺的RTC功能實(shí)現具有一定的借鑒作用。   

2 硬件構架

WinCE下RTC功能實(shí)現是基于RTC模塊的,在此先對S3C2440處理器作簡(jiǎn)單介紹,主要對于S3C2440的RTC的硬件結構、工作機理進(jìn)行分析,這些是Windows CE.net下RTC功能實(shí)現的基礎。

2.1 簡(jiǎn)介

S3C2440 是三星公司推出的基于A(yíng)RM920T的嵌入式處理器,主頻高達400MHz,最高可達533MHz,低功耗、高性能,廣泛地應用于PDA、便攜媒體播放器、衛星導航儀等多媒體終端,片上集成指令/數據分開(kāi)的16KCache、SDRAM控制器、LCD控制器、4通道DMA、3通道UART、IIC總線(xiàn)、IIS總線(xiàn)、SD主機接口、PWM定時(shí)器、看門(mén)狗、片上PLL時(shí)鐘發(fā)生器、8通道10位AD控制器和觸摸屏接口以及帶日歷函數的實(shí)時(shí)時(shí)鐘,極大地方便于系統開(kāi)發(fā)。   

2.2 S3C244O處理器的RTC硬件構架

S3C2440內部RTC模塊結構框圖如圖1所示。S3C2440處理器的RTC模塊依靠外部32.768kHz晶振提供基準時(shí)鐘,系統能夠在斷電的情況下由后備電池供電繼續工作,能夠將8位數據轉換為BCD碼的格式傳送給處理器。這些數據包括秒、分、時(shí)、日期、星期、月、年。

如圖1所示,RTC模塊由基準晶振的連接引腳、時(shí)鐘滴答發(fā)生器、215時(shí)鐘分頻器、控制和重置寄存器、閏年發(fā)生器、報警發(fā)生器以及BCD數字(秒、分、時(shí)、日期、星期、月、年)等幾部分組成:XTlrtc與XTortc是連接外部晶振32.768kHz的兩個(gè)引腳,為RTC內部提供輸入。215時(shí)鐘分頻器負責對基準頻率進(jìn)行分頻。時(shí)鐘滴答發(fā)生器可以產(chǎn)生時(shí)鐘滴答,它可以引起中斷。閏年發(fā)生器按照從日期、月、年得來(lái)的BCD數據決定一個(gè)月最后一天是28、29、30還是31號(也就是計算是否是閏年)。報警發(fā)生器可以根據系統設定時(shí)間和當前時(shí)間決定是否報警?刂萍拇嫫骺刂瓢ㄗx/寫(xiě)BCD寄存器使能、時(shí)鐘復位、時(shí)鐘選擇等。重置寄存器可以選擇”秒”對”分”進(jìn)位邊界,提供三個(gè)可選邊界:30、40或者50秒。   
  
圖1 S3C2440內部RTC模塊結構圖
  
2.3 S3C2440處理器的RTC工作原理

由RTC模塊的結構圖可以看出,RTC模塊的有三種功能:產(chǎn)生時(shí)鐘滴答、實(shí)時(shí)計時(shí)和作為系統的觸發(fā)喚醒器。RTC時(shí)鐘滴答可以作為實(shí)時(shí)操作系統(RTOS)的內核時(shí)鐘滴答,當時(shí)鐘滴答周期確定后,就會(huì )定時(shí)產(chǎn)生中斷,操作系統的中斷服務(wù)程序會(huì )實(shí)時(shí)處理這個(gè)中斷。

RTC模塊可以在處理器的掉電模式或普通模式在設定時(shí)間(由BCD數據給出)和當前時(shí)間相同時(shí)發(fā)生報警。在普通模式下,ALMINT(報警中斷)處于激活狀態(tài)。在掉電模式下,PMWKUP(電源管理喚醒信號)與ALMINT一起處于報警狀態(tài)。

RTC最重要的功能就是顯示時(shí)間。在掉電模式下,RTC依然能夠正常工作,此時(shí),RTC模塊通過(guò)外部的電池工作。RTC時(shí)間顯示功能是通過(guò)讀/寫(xiě)寄存器來(lái)實(shí)現的。要顯示秒、分、時(shí)、日期、月、年,處理器只要讀取存在于BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON和BCDYEAR寄存器中的值即可。   

3 驅動(dòng)程序實(shí)現

本RTC功能的實(shí)現在基于S3C2440嵌入式開(kāi)發(fā)平臺上,通過(guò)WinCE下的RTC模塊的驅動(dòng)程序完成,而WinCE下RTC的驅動(dòng)是在底層實(shí)現的,具體要在OAL(OEM Adaption Layer)實(shí)現。下面對于OAL代碼層進(jìn)行簡(jiǎn)要介紹,然后分析RTC驅動(dòng)代碼,在此基礎上給出部分源程序。

3.1 OAL概述

OAL的全稱(chēng)是OEM Adaption Layer,即原始設備制造商適配層。從邏輯結構上看,它位于操作系統的內核與硬件之間,是連接系統與硬件的樞紐;從功能上看,OAL是被鏈接到內核的庫,它可以用來(lái)創(chuàng )建內核的可執行文件。OAL在系統內核與目標設備之間進(jìn)行通信,隸屬于操作系統.是操作系統的一部分。從存在方式上講OAL是一組函數的集合體,這些函數體現出OAL的功能,如圖2所示。   

  
圖2 OAL功能結構關(guān)系框圖
  
OAL層包含Startup()、OEMInit()、實(shí)時(shí)時(shí)鐘函數、串口調試函數、底層中斷處理函數、以太網(wǎng)口調試函數、KITL(Kernel Independent Transport Layer)內核獨立傳輸層,此外,它還實(shí)現了包括電源管理、模塊認證等高級功能。
  
WinCE的啟動(dòng)過(guò)程為:CPU執行引導向量,跳轉到硬件初始化代碼,即Startup函數。
  
在Startup函數完成最小硬件環(huán)境初始化后跳轉到KernelStart函數來(lái)對內核進(jìn)行初始化;KernelStart函數調用OEMInitDebugSerial完成對調試串口的初始化,調用OEMInit函數來(lái)完成硬件初始化工作以及設置時(shí)鐘、中斷,調用OEMGetExtensionDRAM函數來(lái)判斷是否還有另一塊DRAM。
  
因此,實(shí)時(shí)時(shí)鐘驅動(dòng)實(shí)現代碼是在OAL層實(shí)現的,當Windows CE啟動(dòng)時(shí),會(huì )調用實(shí)時(shí)時(shí)鐘函數來(lái)初始化系統時(shí)間,下面介紹這些函數的具體實(shí)現。   

3.2 時(shí)鐘函數

實(shí)現RTC功能需要編寫(xiě)3個(gè)函數,分別是OEMGetRealTime()、OEMSetRealTime()與OEMSetAlarmTime()。下面對于這三個(gè)函數分別介紹。

OEMGetRealTime()得到當前時(shí)間。此函數名不可更改,是WinCE內核規定好了的,也就是當內核需要知道當前時(shí)間的時(shí)候直接調用此函數。圖3為函數OEMGetRealTime()執行流程。   


  
由于RTC不能任意地修改,不然會(huì )造成時(shí)間的混亂,所以每次獲取時(shí)間或者設置時(shí)間完畢以后必須禁止RTC,具體是通過(guò)設置RTC使能/禁止寄存器實(shí)現的。而在每次讀取時(shí)間或者設置時(shí)間的時(shí)候必須先使用它。在讀取時(shí)間的時(shí)候 若讀取的“秒”為0必須重新讀取時(shí)間,因此時(shí)的“分”已經(jīng)被進(jìn)位了。

OEMSetRealTime()設置時(shí)間。與OEMGetRealTime()一樣,它也不可改名,通過(guò)此函數核心可以直接修改時(shí)間。也就是說(shuō),如果用戶(hù)點(diǎn)擊WinCE任務(wù)欄中的時(shí)間以后,修改時(shí)間最終都是調用此函數。

OEMSetAlarmTime()設置系統報警時(shí)間,其參數為指向含有SYSTEMTIME結構體緩沖區的長(cháng)指針。如果此函數執行成功則返回TRUE,執行失敗則返回FALSE。此函數必須是可重人的以防止對硬件的多次操作。對于一般用戶(hù)的操作,用戶(hù)可以不用編寫(xiě)此函數。如果需要系統在特定的時(shí)間完成特定的功能就需要完成此函數的編寫(xiě)。
  
下面給出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->rBCDSEC&0x7f);
lpst->wMinute= FROM_BCD(s2440RTC->rBCDMIN&0x7f);
lpst->wHour= FROM_BCD(s2440RTC->rBCDHOUR&0x3f);
lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
lpst->wDay= FROM_BCD(s2440RTC->rBCDDAY&0x3f);
lpst->wMonth=FROM_BCD(s2440RTC->rBCDMON&0x1f);
//lpst->wYear=(2000+s2440RTC->rBCDYEAR);
lpst->wYear=FROM_BCD(s2440RTC->rBCDYEAR)+2000;
if(lpst->wSecond==0)
{
lpst->wSecond=FROM_BCD(s2440RTC->rBCDSEC&0x7f);
lpst->wMinute=FROM_BCD(s2440RTC->rBCDMIN&0x7f);
lpst->wHour=FROM_BCD(s2440RTC->rBCDHOUR&0x3f);
lpst->wDayOfWeek=(s2440RTC->rBCDDATE-1);
lpst->wDay=FROM_BCD(s2440RTC->rBCDDAY&0x3f);
lpst->wMonth=FROM_BCD(s240RTC->rBCDMON&0x1f);
lpst->wYear=(2000+s240RTC->rBCDYEAR);
}
//禁止RTC
s2440RTC->rRTCCON=0;
return TRUE;
}

3.3 系統I/O

OAL代碼層提供了與內核交互的函數,通過(guò)它內核可以獲得硬件平臺的信息 。在OAL層中,完成此功能的函數為OEMIOcontrol()。其函數原型如下:
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()函數調用OEMIOcontrol(),完成底層硬件信息的讀取,其中參數dwIoControl為內核與OAL通信的控制代碼,通過(guò)它可以完成硬件信息的讀取?刂拼a一般都是微軟定義好的,其中RTC模塊定義的控制代碼為IOCTL_HAL_INIT_RTC,通過(guò)它內核可以完成底層RTC模塊的初始化。
  
nInBufSize是由lpInBuf(指針)指向的緩沖區的大小,緩沖區是按字節大小計算的。SYSTEMTIME是WinCE內部定義的一個(gè)表示時(shí)間的結構體,LPSYSTEMTIME為指向此結構體的指針。SYSTEMTIME結構體原型如下,原型中定義了字格式的年、月、星期、日、時(shí)、分、秒、毫秒。

typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSeeond;
WORD wMilliseconds;
}SYSTEMTIME;

在本設計中,RTC的時(shí)間分辨率為“秒”,這是因為S3C2440的RTC模塊所能提供的最小時(shí)間基準就是“秒”。用戶(hù)可以根據實(shí)際需求編寫(xiě)系統I/O下的RTC初始化代碼,也可以禁止這部分代碼。若WinCE從OAL層讀不到時(shí)鐘參數的話(huà),它會(huì )以系統的默認時(shí)間值來(lái)初始化SYSTEMTIME結構體。   

4 結束語(yǔ)

當前比較流行的ARM嵌入式處理器,如Samsung的S3C系列、Intel的Xscale系列、Motorola的龍珠系列等幾乎都內嵌有RTC模塊。使許多嵌入式產(chǎn)品如手機、PDA等的時(shí)間顯示豐富多彩,如具有顯示陽(yáng)歷、陰歷、萬(wàn)年歷等功能。本文給出了RTC模塊的WinCE驅動(dòng)程序實(shí)現,基于本設計可以進(jìn)一步開(kāi)發(fā)如時(shí)鐘界面等時(shí)鐘應用功能,以滿(mǎn)足多姿多彩的嵌入式系統對于時(shí)鐘功能的應用需求。
本文地址:http://selenalain.com/thread-19890-1-1.html     【打印本頁(yè)】

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

相關(guān)在線(xiàn)工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页