新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S3C2440 Windows CE的RTC模塊驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

S3C2440 Windows CE的RTC模塊驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2013-03-30 來(lái)源:網(wǎng)絡(luò) 收藏

  3 驅(qū)動(dòng)程序?qū)崿F(xiàn)
  
  本RTC功能的實(shí)現(xiàn)在基于嵌入式開發(fā)平臺(tái)上,通過WinCE下的的驅(qū)動(dòng)程序完成,而WinCE下RTC的驅(qū)動(dòng)是在底層實(shí)現(xiàn)的,具體要在OAL(OEM Adaption Layer)實(shí)現(xiàn)。下面對(duì)于OAL代碼層進(jìn)行簡(jiǎn)要介紹,然后分析RTC驅(qū)動(dòng)代碼,在此基礎(chǔ)上給出部分源程序。
  
  3.1 OAL概述
  
  OAL的全稱是OEM Adaption Layer,即原始設(shè)備制造商適配層。從邏輯結(jié)構(gòu)上看,它位于操作系統(tǒng)的內(nèi)核與硬件之間,是連接系統(tǒng)與硬件的樞紐;從功能上看,OAL是被鏈接到內(nèi)核的庫(kù),它可以用來(lái)創(chuàng)建內(nèi)核的可執(zhí)行文件。OAL在系統(tǒng)內(nèi)核與目標(biāo)設(shè)備之間進(jìn)行通信,隸屬于操作系統(tǒng).是操作系統(tǒng)的一部分。從存在方式上講OAL是一組函數(shù)的集合體,這些函數(shù)體現(xiàn)出OAL的功能,如圖2所示。

        圖2 OAL功能結(jié)構(gòu)關(guān)系框圖
  

  OAL層包含Startup()、OEMInit()、實(shí)時(shí)時(shí)鐘函數(shù)、串口調(diào)試函數(shù)、底層中斷處理函數(shù)、以太網(wǎng)口調(diào)試函數(shù)、KITL(Kernel Independent Transport Layer)內(nèi)核獨(dú)立傳輸層,此外,它還實(shí)現(xiàn)了包括電源管理、模塊認(rèn)證等高級(jí)功能。
  

  WinCE的啟動(dòng)過程為:CPU執(zhí)行引導(dǎo)向量,跳轉(zhuǎn)到硬件初始化代碼,即Startup函數(shù)。
  

  在Startup函數(shù)完成最小硬件環(huán)境初始化后跳轉(zhuǎn)到KernelStart函數(shù)來(lái)對(duì)內(nèi)核進(jìn)行初始化;KernelStart函數(shù)調(diào)用OEMInitDebugSerial完成對(duì)調(diào)試串口的初始化,調(diào)用OEMInit函數(shù)來(lái)完成硬件初始化工作以及設(shè)置時(shí)鐘、中斷,調(diào)用OEMGetExtensionDRAM函數(shù)來(lái)判斷是否還有另一塊DRAM。
  

  因此,實(shí)時(shí)時(shí)鐘驅(qū)動(dòng)實(shí)現(xiàn)代碼是在OAL層實(shí)現(xiàn)的,當(dāng)Windows CE啟動(dòng)時(shí),會(huì)調(diào)用實(shí)時(shí)時(shí)鐘函數(shù)來(lái)初始化系統(tǒng)時(shí)間,下面介紹這些函數(shù)的具體實(shí)現(xiàn)。

  3.2 時(shí)鐘函數(shù)

  實(shí)現(xiàn)RTC功能需要編寫3個(gè)函數(shù),分別是OEMGetRealTime()、OEMSetRealTime()與OEMSetAlarmTime()。下面對(duì)于這三個(gè)函數(shù)分別介紹。
  
  OEMGetRealTime()得到當(dāng)前時(shí)間。此函數(shù)名不可更改,是WinCE內(nèi)核規(guī)定好了的,也就是當(dāng)內(nèi)核需要知道當(dāng)前時(shí)間的時(shí)候直接調(diào)用此函數(shù)。圖3為函數(shù)OEMGetRealTime()執(zhí)行流程。
      

  由于RTC不能任意地修改,不然會(huì)造成時(shí)間的混亂,所以每次獲取時(shí)間或者設(shè)置時(shí)間完畢以后必須禁止RTC,具體是通過設(shè)置RTC使能/禁止寄存器實(shí)現(xiàn)的。而在每次讀取時(shí)間或者設(shè)置時(shí)間的時(shí)候必須先使用它。在讀取時(shí)間的時(shí)候 若讀取的“秒”為0必須重新讀取時(shí)間,因此時(shí)的“分”已經(jīng)被進(jìn)位了。
  
  OEMSetRealTime()設(shè)置時(shí)間。與OEMGetRealTime()一樣,它也不可改名,通過此函數(shù)核心可以直接修改時(shí)間。也就是說(shuō),如果用戶點(diǎn)擊WinCE任務(wù)欄中的時(shí)間以后,修改時(shí)間最終都是調(diào)用此函數(shù)。
  
OEMSetAlarmTime()設(shè)置系統(tǒng)報(bào)警時(shí)間,其參數(shù)為指向含有SYSTEMTIME結(jié)構(gòu)體緩沖區(qū)的長(zhǎng)指針。如果此函數(shù)執(zhí)行成功則返回TRUE,執(zhí)行失敗則返回FALSE。此函數(shù)必須是可重人的以防止對(duì)硬件的多次操作。對(duì)于一般用戶的操作,用戶可以不用編寫此函數(shù)。如果需要系統(tǒng)在特定的時(shí)間完成特定的功能就需要完成此函數(shù)的編寫。



關(guān)鍵詞: S3C2440 WindowsCE RTC模塊

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉