12小时快了9秒,周末的时候放这里两天也快了16秒,怎么还不是均匀的快?论坛中有个人也有这个问题,但他最终没写解决办法,你们有谁遇到过怎么解决的?
我现在是3.4的kernel,由于产品做出去了货才发现有这个问题,需要尽量不要改硬件,或者少改软件。
105 void sunxi_rtc_fixup(unsigned long *org_time, unsigned long *time)
- 106 {
| 107 unsigned long delta;
| 108 unsigned long t1, t2;
| 109 bool out;
| 110
| 111 if (!time)
| 112 return;
| 113
|- 114 if (!org_time) {
|| 115 t1 = (unsigned long long)sunxi_rtc_read(SUNXI_GPDATA_REG(6)) << 32;
|| 116 t1 |= (unsigned long)sunxi_rtc_read(SUNXI_GPDATA_REG(7));
|| 117 } else
| 118 t1 = *org_time;
| 119
| 120 t2 = *time;
| 121
| 122 out = sunxi_rtc_read(SUNXI_LOSC_CTRL_REG) & RTC_SOURCE_EXTERNAL;
| 123
| 124 delta = (t2 > t1) ? (t2 - t1) : (t1 - t2);
| 125 delta = (delta * (OSC_ORG - OSC_32K)) / OSC_ORG;
| 126
| 129 if (out)
| 130 *time -= delta;
| 131 else
| 132 *time += delta;
| 133 }
另外他这个驱动这里的换算也有问题啊, delta = (delta * (OSC_ORG - OSC_32K)) / OSC_ORG;这里的乘法会导致溢出啊。最开始我们客户发现的时候就是快了1天多,就是这么来的。但现在是几个小时内也会有秒级的快。这是怎么回事啊?
离线
我之前就仔细看了这些帖子,没有实质性帮助。 你说的启动要校准下,就是我上面贴的那个算法:当用户设置时间的时候,会将时间戳的time值保存起来,等下次启动会将当前时间减去之前保存的时间再x768/32768,意思是实际硬件上寄存器的时间是以32000为计算的。这套换算没问题,只是有个溢出,可以修改,溢出会导致大概64天后比北京时间快两天。
现在最主要的问题是,平时放置着几天后会快几秒到十几秒不等。不在晶振的误差范围内。
离线
改下32.768K的匹配电容试试,还有温度补偿
电容改了几个,都差不多。温度补偿是怎么修改?
离线