wince(s3c2410)中RTC的问题

 这部分问题多多。

 

1.如何关机保持时间

 

1. 保证提供给RTC的3V电池有电;比较好就是挂个充电电池。也可以采用别的方案,我们公司就没有使用充电电池。不过个人认为还是使用充电电池好。
2. 更改2410的BSP,具体为:
在文件Platform/SMDK2410/kernel/hal/oemioctl.c中将

  1.     case IOCTL_HAL_INIT_RTC:
  2.      // The kernel has detected a cold-boot.   
  3.         if(nInBufSize >= sizeof(SYSTEMTIME)) 
  4.             return OEMSetRealTime((LPSYSTEMTIME)lpInBuf);
  5.         else
  6.             return FALSE;
  7.         break;

改为:

  1.      case IOCTL_HAL_INIT_RTC:
  2.      // The kernel has detected a cold-boot.   
  3.         if(nInBufSize >= sizeof(SYSTEMTIME)) 
  4.             return TRUE; //改这里 
  5.         else
  6.             return FALSE;
  7.         break;

这个是我遇到的第一个问题。

 

2.如何保证开机时间不会跑飞,避免USB同步无法使用。

由于没有采用充电电池,在中间调试阶段又出现新问题了。我们的方案断电比较久的话就无法保持时间,实际上在开发阶段是不会带电池的,所以第二天工作都要重新校准系统的时间,不然USB无法同步上。为了解决这个问题,研究了内核这部分代码。发现有一些BUG。做了修正。
修改timer.c中的OEMSetRealTime(LPSYSTEMTIME lpst) 函数

 

  1.  if ( firsttime == 0 )
  2.  {
  3.      OEMGetRealTime(lpst);
  4.      if (lpst->wYear >2100 || lpst->wYear <2000)
  5.      {
  6.          lpst->wYear = 2008; 
  7.          lpst->wMonth = 9; 
  8.          lpst->wDay = 1;
  9.       }
  10.       firsttime = 1;
  11.  }

主要是在第一次上电获取一下时间,并判断时间是否跑飞了。是的话给他初始化一个值。只要时间正常那么都能同步上PC。在S3C2410中rBCDYEAR虽然是uint型,但是根据CPU资料说明,他只能表示00-99这个范围的值。那么系统的时间也就只能是2000年至2099年了。改了这个,那么自然也就要把oemioctl.c中修改的代码还原,不然开机就不执行了。

 

3.修改年份超过2009年后时间获取的一个BUG。


研究过程中发现rBCDYEAR只最后一个字节有效,并且高4位表示年的十位数,低4位表示年的各位数。而在OEMGetRealTime函数中有这么一段代码

  1. if ( lpst->wSecond == 0 )
  2.  {
  3.    lpst->wSecond    = FROM_BCD(s2410RTC->rBCDSEC & 0x7f);
  4.    lpst->wMinute  = FROM_BCD(s2410RTC->rBCDMIN & 0x7f);
  5.    lpst->wHour  = FROM_BCD(s2410RTC->rBCDHOUR& 0x3f);
  6.    lpst->wDayOfWeek = (s2410RTC->rBCDDATE - 1);
  7.    lpst->wDay  = FROM_BCD(s2410RTC->rBCDDAY & 0x3f);
  8.    lpst->wMonth  = FROM_BCD(s2410RTC->rBCDMON & 0x1f);
  9.    lpst->wYear      = (2000 + s2410RTC->rBCDYEAR); 
  10.  }

其中lpst->wYear  = (2000 + s2410RTC->rBCDYEAR); 让我是在很纳闷,怎么这里就不一样了。我还记得我开始在wince平台上编程时使用GetLocalTime函数的BUG(http://blog.csdn.net/constantine/archive/2007/09/21/1794368.aspx),这个BUG就是在wSecond为0时发生的,我想问题应该出在这里了。修改一下

  1. if ( lpst->wSecond == 0 )
  2.  {
  3.   .........
  4.   lpst->wYear      = 2000 + FROM_BCD(s2410RTC->rBCDYEAR); //修改这里 
  5.  }

果然问题没有了。
关于RTC设计的问题网上并不少,但是看过之后都是一个毛病。也不知道是谁错起头的,接着大家就跟着一起犯错。或者说还有我没看清除的情况,见鬼了。

当然,现在还不到2010年,估计没多少人注意到这个问题。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值