Wince系統時間設定
相關文章
本來以為系統時間設定很簡單,只要修改下RTC會記得你設定的時間,但是經過測試發現情況不是這樣的。於是研究了bsp啟動時系統時間的設定的流程。我一直認為在OAL層加入OEMSetRealTime()函式即可,但是測試了好幾次不行,於是動了真格,呵呵之前一直以為這個功能很簡單。在OEMInit加入相應的除錯資訊後,發現在我OEMSetRealTime之後,wince呼叫了一個函式OALIoCtlHalInitRTC()這個函式太關鍵了。於是看了這個函式介紹英文,看的夠嗆,不過意思都懂了,This function is called by WinCE OS to initialize the time after boot.
// Input buffer contains SYSTEMTIME structure with default time value.
// If hardware has persistent real time clock it will ignore this value
啥意思呀??也就是說這個函式是wince OS呼叫的,那什麼時候呼叫的呢?通過除錯資訊發現是在呼叫OEMIoControl時開始這個函式的呼叫的。
在bsp中有個oal_ioctl_tab.h檔案,其中有個{ IOCTL_HAL_INIT_RTC, 0, OALIoCtlHalInitRTC },定義,一切都明白了。但是很奇怪,為什麼呼叫了這個OALIoCtlHalInitRTC後系統時間有變成預設的呢??分析這個函式吧?
BOOL OALIoCtlHalInitRTC(
UINT32 code, VOID *pInpBuffer, UINT32 inpSize, VOID *pOutBuffer,
UINT32 outSize, UINT32 *pOutSize
) {
BOOL rc = FALSE;
SYSTEMTIME *pTime = (SYSTEMTIME*)pInpBuffer;
OALMSG(1, (L"+OALIoCtlHalInitRTC(...)/r/n"));
// Validate inputs
if (pInpBuffer == NULL || inpSize < sizeof(SYSTEMTIME)) {
NKSetLastError(ERROR_INVALID_PARAMETER);
OALMSG(OAL_ERROR, (
L"ERROR: OALIoCtlHalInitRTC: Invalid parameter/r/n"
));
goto cleanUp;
}
// Add static mapping for RTC alarm
OALIntrStaticTranslate(SYSINTR_RTC_ALARM, IRQ_RTC);
// Set time fxf 20100416
// rc = OEMSetRealTime(pTime);
rc = OEMGetRealTime(pTime);
cleanUp:
OALMSG(OAL_IOCTL&&OAL_FUNC, (L"-OALIoCtlHalInitRTC(rc = %d)/r/n", rc));
return rc;
}
這個函式大部分程式碼都是廢話,也就是沒有作為的程式碼。當我看到 rc = OEMSetRealTime(pTime);時我崩潰了。為什麼呢?我先前在OEMInit又被這句話設定成預設的了,於是改成 rc = OEMGetRealTime(pTime);這樣在呼叫OALIoCtlHalInitRTC時只要get一個就可以了。呵呵搞定了!小樣!