S3C2440 Windows CE的RTC模塊驅動設計與實現
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。此函數必須是可重人的以防止對硬件的多次操作。對于一般用戶的操作,用戶可以不用編寫此函數。如果需要系統在特定的時間完成特定的功能就需要完成此函數的編寫。
評論