1. 程式人生 > >Wince系統時間設定

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一個就可以了。呵呵搞定了!小樣!