版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kris_fei/article/details/84777359
Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83
现象:
使用busybox hwclock -r读取rtc时间是提示:
hwclock: ioctl 0x80247009 failed: Invalid argument
kernel log提示:
[ 65.931824] rtc rtc0: read_time: fail to read: -22
原因:
硬件RTC的月份时间默认是返回-1,导致rtc_valid_tm判断失败返回错误。
rtc_valid_tm():
int rtc_valid_tm(struct rtc_time *tm)
{
if (tm->tm_year < 70
|| ((unsigned)tm->tm_mon) >= 12
|| tm->tm_mday < 1
|| tm->tm_mday > rtc_month_days(tm->tm_mon, tm->tm_year + 1900)
|| ((unsigned)tm->tm_hour) >= 24
|| ((unsigned)tm->tm_min) >= 60
|| ((unsigned)tm->tm_sec) >= 60)
return -EINVAL;
return 0;
}
解决方法:
diff --git a/drivers/rtc/rtc-rx8010.c b/drivers/rtc/rtc-rx8010.c
index b73fb92..f1b7e5d 100644
--- a/drivers/rtc/rtc-rx8010.c
+++ b/drivers/rtc/rtc-rx8010.c
@@ -139,6 +139,11 @@ static int rx8010_get_time(struct device *dev, struct rtc_time *dt)
dt->tm_year = bcd2bin(date[RX8010_YEAR - RX8010_SEC]) + 100;
dt->tm_wday = ffs(date[RX8010_WDAY - RX8010_SEC] & 0x7f);
+ //Kris, 181203, it's strange this value return -1
+ //by default, change is as 0 to avoid error.
+ if(dt->tm_mon < 0)
+ dt->tm_mon = 0;
return rtc_valid_tm(dt);
}