6703|16

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

系统时间保存不了啊 [复制链接]

我用2440+Wince5.0,发现系统每次启动的时候系统时间都重置到了2049年1月1号,
与PC机联机不上,而且系统特别慢
请路过的给讲解下阿

最新回复

具体为什么要这样改,其实kacyquan已经讲得很明白了,只是我的BSP跟他的不一样,所以改动的地方也不一样 若那位兄弟,还是没有明白,可以问我,我一般在线 哈哈,最近很顺利,多谢大家的指点和帮助,给大家鞠躬了阿  详情 回复 发表于 2010-6-1 11:49
点赞 关注

回复
举报

55

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
另:系统直接断电时间就会复位,但是按reset就不会,时间也很准确,
    而且我的实时钟的后备电池也是刚换的
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
正常情况下你修改了系统的时候会把这个时间保存到CPU的RTC里,如果你关机的时候完全断电,连RTC的电都断的了,那下次启动时间肯定会复位到一个默认值。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
RTC由备用的纽扣电池供电
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
应该是你备有电池没电了吧,你的rtc的默认时间就是2049年1月1号,
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

6
 
估计还是RTC的问题。可以试试看关机然后马上开机(不是reset),看看时间变不变。继续关注。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
电池时刚换的啊,
默认时间是2049
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
关机马上开机时间就不对
但是复位的话时间是对的
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
RTC的初始化代码:
BOOL OALIoCtlHalInitRTC(
    UINT32 code, VOID *pInpBuffer, UINT32 inpSize, VOID *pOutBuffer,
    UINT32 outSize, UINT32 *pOutSize
) {
    BOOL rc = FALSE;
    SYSTEMTIME *pTime = (SYSTEMTIME*)pInpBuffer;

    OALMSG(OAL_IOCTL&&OAL_FUNC, (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
//    rc = OEMSetRealTime(pTime);                       
//      rc = OEMGetRealTime(pTime);
   
cleanUp:
    OALMSG(OAL_IOCTL&&OAL_FUNC, (L"-OALIoCtlHalInitRTC(rc = %d)\r\n", rc));
    return rc;
}
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
在BIOS里面设置呢??
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
读实时钟的代码:
BOOL OEMGetRealTime(SYSTEMTIME *pTime)
{
    BOOL rc = FALSE;
    S3C2440A_RTC_REG *pRTCReg;
    UINT32 data;
    UINT16 seconds;


    OALMSG(OAL_RTC&&OAL_FUNC, (L"+OEMGetRealTime(pTime = 0x%x)\r\n", pTime));

    if (pTime == NULL) goto cleanUp;
   
    // Get uncached virtual address
    pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
    do {
        data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
        seconds = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDYEAR);
        pTime->wYear = FROM_BCD(data) + RTC_YEAR_DATUM;
        data = INPORT32(&pRTCReg->BCDMON) & 0x1f;
        pTime->wMonth = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDDAY) & 0x3f;
        pTime->wDay = FROM_BCD(data);
        pTime->wDayOfWeek = (WORD)INPORT32(&pRTCReg->BCDDATE) - 1;
        data = INPORT32(&pRTCReg->BCDHOUR) & 0x3f;
        pTime->wHour = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDMIN) & 0x7f;
        pTime->wMinute = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
        pTime->wSecond = FROM_BCD(data);
        pTime->wMilliseconds = 0;
    } while (pTime->wSecond != seconds);

    // Done
    rc = TRUE;

cleanUp:
    OALMSG(OAL_FUNC, (L"-OEMGetRealTime(rc = %d)\r\n", rc));
    return rc;
}
更新实时钟的代码:
BOOL OEMSetRealTime(LPSYSTEMTIME pTime)
{
    BOOL rc = FALSE;
    S3C2440A_RTC_REG *pRTCReg;

    OALMSG(OAL_RTC&&OAL_FUNC, (
        L"+OEMSetRealTime(%d/%d/%d %d:%d:%d.%03d)\r\n",
        pTime->wYear, pTime->wMonth, pTime->wDay, pTime->wHour, pTime->wMinute,
        pTime->wSecond, pTime->wMilliseconds
    ));

    if (pTime == NULL) goto cleanUp;
   
    // The RTC will only support a BCD year value of 0 - 99.  The year datum is
    // 1980, so any dates greater than 2079 will fail unless the datum is
    // adjusted.
    if (pTime->wYear < RTC_YEAR_DATUM || (pTime->wYear - RTC_YEAR_DATUM) > 99) {
        OALMSG(OAL_ERROR, (L"ERROR: OEMSetRealTime: "
            L"RTC cannot support a year greater than %d or less than %d "
            L"(value %d)\r\n", (RTC_YEAR_DATUM + 99), RTC_YEAR_DATUM,
            pTime->wYear
        ));
        goto cleanUp;
    }

    // Get uncached virtual address
    pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);

    // Enable RTC control.
    SETREG32(&pRTCReg->RTCCON, 1);

    OUTPORT32(&pRTCReg->BCDSEC,  TO_BCD(pTime->wSecond));
    OUTPORT32(&pRTCReg->BCDMIN,  TO_BCD(pTime->wMinute));
    OUTPORT32(&pRTCReg->BCDHOUR, TO_BCD(pTime->wHour));
    OUTPORT32(&pRTCReg->BCDDATE, pTime->wDayOfWeek + 1);
    OUTPORT32(&pRTCReg->BCDDAY,  TO_BCD(pTime->wDay));
    OUTPORT32(&pRTCReg->BCDMON,  TO_BCD(pTime->wMonth));
    OUTPORT32(&pRTCReg->BCDYEAR, TO_BCD(pTime->wYear - RTC_YEAR_DATUM));

    // Disable RTC control.
    CLRREG32(&pRTCReg->RTCCON, 1);

    // Done
    rc = TRUE;

cleanUp:
    OALMSG(OAL_RTC&&OAL_FUNC, (L"-OEMSetRealTime(rc = %d)\r\n", rc));
    return rc;
}
设置闹铃时间:
BOOL OEMSetAlarmTime(SYSTEMTIME *pTime)
{
    BOOL rc = FALSE;
    S3C2440A_RTC_REG *pRTCReg;
    UINT32 irq;

    OALMSG(OAL_RTC&&OAL_FUNC, (
        L"+OEMSetAlarmTime(%d/%d/%d %d:%d:%d.%03d)\r\n",
        pTime->wMonth, pTime->wDay, pTime->wYear, pTime->wHour, pTime->wMinute,
        pTime->wSecond, pTime->wMilliseconds
    ));

    if (pTime == NULL) goto cleanUp;
   
    // Get uncached virtual address
    pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
   
    // Enable RTC control
    SETREG32(&pRTCReg->RTCCON, 1);

    OUTPORT32(&pRTCReg->ALMSEC,  TO_BCD(pTime->wSecond));
    OUTPORT32(&pRTCReg->ALMMIN,  TO_BCD(pTime->wMinute));
    OUTPORT32(&pRTCReg->ALMHOUR, TO_BCD(pTime->wHour));
    OUTPORT32(&pRTCReg->ALMDATE, TO_BCD(pTime->wDay));
    OUTPORT32(&pRTCReg->ALMMON,  TO_BCD(pTime->wMonth));
    OUTPORT32(&pRTCReg->ALMYEAR, TO_BCD(pTime->wYear - RTC_YEAR_DATUM));
   
    // Enable the RTC alarm interrupt
    OUTPORT32(&pRTCReg->RTCALM, 0x7F);

    // Disable RTC control.
    CLRREG32(&pRTCReg->RTCCON, 1);

    // Enable/clear RTC interrupt
    irq = IRQ_RTC;
    OALIntrDoneIrqs(1, &irq);

    // Done
    rc = TRUE;
   
cleanUp:
    OALMSG(OAL_RTC&&OAL_FUNC, (L"-OEMSetAlarmTime(rc = %d)\r\n", rc));
    return rc;
}
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

12
 
case IOCTL_HAL_INIT_RTC:
    // The kernel has detected a cold-boot.  We probably need to reset our Real Time Clock
    if( nInBufSize >= sizeof(SYSTEMTIME) )   
          return  1;     //OEMSetRealTime( (LPSYSTEMTIME)lpInBuf );fix by zb7401   
    else
          return FALSE;
    break;

这段代码注释掉就好了。初始化系统时钟到默认值。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
在OEMIOCTL.C中的代码
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
热启动不会丢失时间,软启动丢失时间,唯一的解释就是冷启动的时候重启初始化了RTC。所以我觉得把初始化RTC的代码去掉应该是可以的
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
恩,多谢kacyquan的提示
我已经解决
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
解决方案共享:
在函数
BOOL OALIoCtlHalInitRTC(
    UINT32 code, VOID *pInpBuffer, UINT32 inpSize, VOID *pOutBuffer,
    UINT32 outSize, UINT32 *pOutSize
) {
    BOOL rc = FALSE;
    SYSTEMTIME *pTime = (SYSTEMTIME*)pInpBuffer;
        DWORD retry;

    OALMSG(OAL_IOCTL&&OAL_FUNC, (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 xiao add 2010.6.1
        retry = 3;
    while (TRUE) {
                if (OEMGetRealTime(pTime))        break;
                if (!retry--)        break;
    }
        if (!retry && !rc) {
                RETAILMSG(1, (L"!!!RTC init ERROR!!!\r\n"));
               
        }
       
    rc = OEMSetRealTime(pTime);

        //add end
   
cleanUp:
    OALMSG(OAL_IOCTL&&OAL_FUNC, (L"-OALIoCtlHalInitRTC(rc = %d)\r\n", rc));
    return rc;
}
更改函数OEMSetRealTime,
BOOL OEMSetRealTime(LPSYSTEMTIME pTime)
{
    BOOL rc = FALSE;
#if 0
    S3C2440A_RTC_REG *pRTCReg;

    OALMSG(OAL_RTC&&OAL_FUNC, (
        L"+OEMSetRealTime(%d/%d/%d %d:%d:%d.%03d)\r\n",
        pTime->wYear, pTime->wMonth, pTime->wDay, pTime->wHour, pTime->wMinute,
        pTime->wSecond, pTime->wMilliseconds
    ));

    if (pTime == NULL) goto cleanUp;
   
    // The RTC will only support a BCD year value of 0 - 99.  The year datum is
    // 1980, so any dates greater than 2079 will fail unless the datum is
    // adjusted.
    if (pTime->wYear < RTC_YEAR_DATUM || (pTime->wYear - RTC_YEAR_DATUM) > 99) {
        OALMSG(OAL_ERROR, (L"ERROR: OEMSetRealTime: "
            L"RTC cannot support a year greater than %d or less than %d "
            L"(value %d)\r\n", (RTC_YEAR_DATUM + 99), RTC_YEAR_DATUM,
            pTime->wYear
        ));
        goto cleanUp;
    }

    // Get uncached virtual address
    pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);

    // Enable RTC control.
    SETREG32(&pRTCReg->RTCCON, 1);

    OUTPORT32(&pRTCReg->BCDSEC,  TO_BCD(pTime->wSecond));
    OUTPORT32(&pRTCReg->BCDMIN,  TO_BCD(pTime->wMinute));
    OUTPORT32(&pRTCReg->BCDHOUR, TO_BCD(pTime->wHour));
    OUTPORT32(&pRTCReg->BCDDATE, pTime->wDayOfWeek + 1);
    OUTPORT32(&pRTCReg->BCDDAY,  TO_BCD(pTime->wDay));
    OUTPORT32(&pRTCReg->BCDMON,  TO_BCD(pTime->wMonth));
    OUTPORT32(&pRTCReg->BCDYEAR, TO_BCD(pTime->wYear - RTC_YEAR_DATUM));

    // Disable RTC control.
    CLRREG32(&pRTCReg->RTCCON, 1);
#else
        S3C2440A_RTC_REG *pRTCReg;
        static int firsttime = 0;

        // Get uncached virtual address
    pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);

        // enable RTC control
        SETREG32(&pRTCReg->RTCCON, 1);
    if ( firsttime == 0 )
        {
                firsttime = 1;
                pTime->wYear                = FROM_BCD(pRTCReg->BCDYEAR) + 2000 ;
               
                pTime->wMonth                = FROM_BCD(pRTCReg->BCDMON   & 0x1f);
                pTime->wDay                        = FROM_BCD(pRTCReg->BCDDAY   & 0x3f);
       
                if (
                     (pTime->wDay > 31)                ||        // 0 - 31
                     (pTime->wMonth > 12)        ||        // 0 - 12, Jan:1, Feb:2, ...
                     (pTime->wMonth == 0)        ||
                     (pTime->wYear < 2010)        ||        // We have a 100 year calander (2 BCD digits) with
                     (pTime->wYear > 2049)                // a leap year generator hard-wired to year 2000.
                   )               
                        {

                         pTime->wYear = 2010;        pTime->wMonth = 6;        pTime->wDay = 1;

                         pRTCReg->BCDSEC  = (unsigned char)TO_BCD(pTime->wSecond );
                         pRTCReg->BCDMIN  = (unsigned char)TO_BCD(pTime->wMinute );
                         pRTCReg->BCDHOUR = (unsigned char)TO_BCD(pTime->wHour   );
                         pRTCReg->BCDDATE = (unsigned char)(pTime->wDayOfWeek + 1);
                         
                         pTime->wYear = 2010;        pTime->wMonth = 6;        pTime->wDay = 1;
                         pRTCReg->BCDDAY  = (unsigned char)TO_BCD(pTime->wDay    );
                         pRTCReg->BCDMON  = (unsigned char)TO_BCD(pTime->wMonth  );
                         pRTCReg->BCDYEAR = (unsigned char)TO_BCD((pTime->wYear % 100));
                        }
                // disable RTC control
                pRTCReg->RTCCON = 0; //&= ~0x1;
        }

    else
    {
                pRTCReg->BCDSEC  = (unsigned char)TO_BCD(pTime->wSecond );
                pRTCReg->BCDMIN  = (unsigned char)TO_BCD(pTime->wMinute );
                pRTCReg->BCDHOUR = (unsigned char)TO_BCD(pTime->wHour   );

                pRTCReg->BCDDATE = (unsigned char)(pTime->wDayOfWeek + 1);

                pRTCReg->BCDDAY  = (unsigned char)TO_BCD(pTime->wDay    );
                pRTCReg->BCDMON  = (unsigned char)TO_BCD(pTime->wMonth  );
                pRTCReg->BCDYEAR = (unsigned char)TO_BCD((pTime->wYear % 100));

                RETAILMSG(1,(TEXT("OEMSetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u rcnr=%Xh\n"), pTime->wYear, pTime->wMonth,pTime->wDay, pTime->wHour, pTime->wMinute,pTime->wSecond,pRTCReg->RTCCON));
                RETAILMSG(1,(TEXT("OEMSetRealTime(register): Year: %x, Month: %x, Day: %x, Hour: %x, Minute: %x, second: %x rcnr=%Xh\n"), \
                   pRTCReg->BCDYEAR, pRTCReg->BCDMON,pRTCReg->BCDDAY, pRTCReg->BCDHOUR, pRTCReg->BCDMIN,pRTCReg->BCDSEC,pRTCReg->RTCCON));

                // disable RTC control
                CLRREG32(&pRTCReg->RTCCON, 1);
       
                // Just certify heart bit
                //        timer_cnt = 0;
        }
#endif

    // Done
    rc = TRUE;

cleanUp:
    OALMSG(OAL_RTC&&OAL_FUNC, (L"-OEMSetRealTime(rc = %d)\r\n", rc));
    return rc;
}

更改宏定义:
#define RTC_YEAR_DATUM  2000  //1980

重新Build and Sysgen Current BSP, 烧写内核就可以了
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

17
 
具体为什么要这样改,其实kacyquan已经讲得很明白了,只是我的BSP跟他的不一样,所以改动的地方也不一样
若那位兄弟,还是没有明白,可以问我,我一般在线
哈哈,最近很顺利,多谢大家的指点和帮助,给大家鞠躬了阿
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表