S3C2440 Windows CE的RTC模組驅動設計與實現

來源:互聯網
上載者:User

1 引言

    案頭Windows系統的時間顯示功能已為大家所熟知,它是通過BIOS上的時鐘模組實現的。使用者通過點擊案頭系統工作列右下腳的時間,可以修改目前時間、時區以及實現與Internet時間同步等功能。
   
目前流行的手機、PDA、HMI(人機介面裝置)等嵌入式系統中,都大量移植了微軟的Windows
CE作業系統。雖然WinCE系統也實現了時間顯示,但是在具體的實現中,其原理和方法與案頭系統大不相同,即使是基於不同嵌入式硬體平台的WinCE開
發,也有所不同。由於嵌入式系統的複雜性、分散性,目前嵌入式系統的系統時鐘RTC功能的實現,大部分是在基於內嵌於SoC處理器的RTC功能IP模組的
基礎上,通過軟體驅動實現的。
   
S3C2440是三星公司推出的一款基於ARM920T處理器構架的低功耗、高效能的嵌入式SoC處理器,應用極為廣泛。RTC是S3C2440的一個內
部功能模組,本文首先對於S3C2440的硬體架構進行介紹,在此基礎上對S3C2440的RTC功能模組的工作機理進行了分析,最後給出Windows
CE.net下的RTC功能的驅動程式設計、實現,本驅動程式成功地應用在基於S3C2440Window
CE平台的手持GPS機系統時鐘功能的實現,對於基於Windows CE.net其它硬體平台的RTC功能實現具有一定的借鑒作用。

2 硬體構架

    WinCE下RTC功能實現是基於RTC模組的,在此先對S3C2440處理器作簡單介紹,主要對於S3C2440的RTC的硬體結構、工作機理進行分析,這些是Windows CE.net下RTC功能實現的基礎。
2.1 簡介
   
S3C2440
是三星公司推出的基於ARM920T的嵌入式處理器,主頻高達400MHz,最高可達533MHz,低功耗、高效能,廣泛地應用於PDA、便攜媒體播放
器、衛星導航儀等多媒體終端,片上整合指令/資料分開的16KCache、SDRAM控制器、LCD控制器、4通道DMA、3通道UART、IIC匯流排、
IIS匯流排、SD主機介面、PWM定時器、看門狗、片上PLL時鐘發生器、8通道10位AD控制器和觸控螢幕介面以及帶日曆函數的系統時鐘,極大地方便於系
統開發。

2.2 S3C244O處理器的RTC硬體構架
   
S3C2440內部RTC模組結構框圖1所示。S3C2440處理器的RTC模組依靠外部32.768kHz晶振提供基準時鐘,系統能夠在斷電的情況
下由後備電池供電繼續工作,能夠將8位元據轉換為BCD碼的格式傳送給處理器。這些資料包括秒、分、時、日期、星期、月、年。
   
1所示,RTC模組由基準晶振的串連引腳、時鐘滴答發生器、215時鐘分頻器、控制和重設寄存器、閏年發生器、警示發生器以及BCD數字(秒、分、
時、日期、星期、月、年)等幾部分組成:XTlrtc與XTortc是串連外部晶振32.768kHz的兩個引腳,為RTC內部提供輸入。215時鐘分頻
器負責對基準頻率進行分頻。時鐘滴答發生器可以產生時鐘滴答,它可以引起中斷。閏年發生器按照從日期、月、年得來的BCD資料決定一個月最後一天是28、
29、30還是31號(也就是計算是否是閏年)。警示發生器可以根據系統設定時間和目前時間決定是否警示。控制寄存器控制包括讀/寫BCD寄存器使能、時
鐘複位、時鐘選擇等。重設寄存器可以選擇”秒”對”分”進位邊界,提供三個可選邊界:30、40或者50秒。

 
圖1 S3C2440內部RTC模組結構圖
2.3 S3C2440處理器的RTC工作原理
    由RTC模組的結構圖可以看出,RTC模組的有三種功能:產生時鐘滴答、即時計時和作為系統的觸發喚醒器。RTC時鐘滴答可以作為即時作業系統(RTOS)的核心時鐘滴答,當時鐘滴答周期確定後,就會定時產生中斷,作業系統的中斷服務程式會即時處理這個中斷。
    RTC模組可以在處理器的掉電模式或普通模式在設定時間(由BCD資料給出)和目前時間相同時發生警示。在普通模式下,ALMINT(警示中斷)處於啟用狀態。在掉電模式下,PMWKUP(電源管理喚醒訊號)與ALMINT一起處於警示狀態。
   
RTC最重要的功能就是顯示時間。在掉電模式下,RTC依然能夠正常工作,此時,RTC模組通過外部的電池工作。RTC時間顯示功能是通過讀/寫寄存器來
實現的。要顯示秒、分、時、日期、月、年,處理器只要讀取存在於BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、
BCDMON和BCDYEAR寄存器中的值即可。

3 驅動程式實現

   
本RTC功能的實現在基於S3C2440嵌入式開發平台上,通過WinCE下的RTC模組的驅動程式完成,而WinCE下RTC的驅動是在底層實現的,具
體要在OAL(OEM Adaption Layer)實現。下面對於OAL代碼層進行簡要介紹,然後分析RTC驅動代碼,在此基礎上給出部分來源程式。
3.1 OAL概述
   
OAL的全稱是OEM Adaption
Layer,即原始裝置製造商適配層。從邏輯結構上看,它位於作業系統的核心與硬體之間,是串連系統與硬體的樞紐;從功能上看,OAL是被連結到核心的
庫,它可以用來建立核心的可執行檔。OAL在系統核心與目標裝置之間進行通訊,隸屬於作業系統.是作業系統的一部分。從存在方式上講OAL是一組函數的
集合體,這些函數體現出OAL的功能,2所示。

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

3.2 時鐘函數
    實現RTC功能需要編寫3個函數,分別是OEMGetRealTime()、OEMSetRealTime()與OEMSetAlarmTime()。下面對於這三個函數分別介紹。
    OEMGetRealTime()得到目前時間。此函數名不可更改,是WinCE核心規定好了的,也就是當核心需要知道目前時間的時候直接調用此函數。圖3為函數OEMGetRealTime()執行流程。

 
   
由於RTC不能任意地修改,不然會造成時間的混亂,所以每次擷取時間或者設定時間完畢以後必須禁止RTC,具體是通過設定RTC使能/禁止寄存器實現的。
而在每次讀取時間或者設定時間的時候必須先使用它。在讀取時間的時候 若讀取的“秒”為0必須重新讀取時間,因此時的“分”已經被進位了。
    OEMSetRealTime()設定時間。與OEMGetRealTime()一樣,它也不可改名,通過此函數核心可以直接修改時間。也就是說,如果使用者點擊WinCE工作列中的時間以後,修改時間最終都是調用此函數。
   
OEMSetAlarmTime()設定系統警示時間,其參數為指向含有SYSTEMTIME結構體緩衝區的長指標。如果此函數執行成功則返回TRUE,
執行失敗則返回FALSE。此函數必須是可重人的以防止對硬體的多次操作。對於一般使用者的操作,使用者可以不用編寫此函數。如果需要系統在特定的時間完成特
定的功能就需要完成此函數的編寫。
    下面給出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代碼層提供了與核心互動的函數,通過它核心可以獲得硬體平台的資訊 。在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每次啟動時都會由KernelIoContrl()函數調用OEMIOcontrol(),完成底層硬體資訊的讀取,其中參數
dwIoControl為核心與OAL通訊的控制碼,通過它可以完成硬體資訊的讀取。控制碼一般都是微軟定義好的,其中RTC模組定義的控制碼為
IOCTL_HAL_INIT_RTC,通過它核心可以完成底層RTC模組的初始化。
   
nInBufSize是由lpInBuf(指標)指向的緩衝區的大小,緩衝區是按位元組大小計算的。SYSTEMTIME是WinCE內部定義的一個表示時
間的結構體,LPSYSTEMTIME為指向此結構體的指標。SYSTEMTIME結構體原型如下,原型中定義了字格式的年、月、星期、日、時、分、秒、
毫秒。
typedef struct _SYSTEMTIME
{
 WORD wYear;
 WORD wMonth;
 WORD wDayOfWeek;
 WORD wDay;
 WORD wHour;
 WORD wMinute;
 WORD wSeeond;
 WORD wMilliseconds;
}SYSTEMTIME;
   
在本設計中,RTC的時間解析度為“秒”,這是因為S3C2440的RTC模組所能提供的最小時間基準就是“秒”。使用者可以根據實際需求編寫系統I/O下
的RTC初始化代碼,也可以禁止這部分代碼。若WinCE從OAL層讀不到時鐘參數的話,它會以系統的預設時間值來初始化SYSTEMTIME結構體。

4 結束語

   
當前比較流行的ARM嵌入式處理器,如Samsung的S3C系列、Intel的Xscale系列、Motorola的龍珠系列等幾乎都內嵌有RTC模
塊。使許多嵌入式產品如手機、PDA等的時間顯示豐富多彩,如具有顯示陽曆、陰曆、萬年曆等功能。本文給出了RTC模組的WinCE驅動程式實現,基於本
設計可以進一步開發如時鐘介面等時鐘應用功能,以滿足多姿多彩的嵌入式系統對於時鐘功能的應用需求。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.