买的天嵌IMX6Q开发板
LINUX:4.15.0
修改RTC芯片,使用rx_8025T
现象:
date -s "2022-1-2 3:4:5"
hwclock -w 能够写,
hwclock -r 能够读:2022-1-2 3:4:5
但是断电重启,date打印 1970-1-1
不断电重启,时间是对的。
设备树配置是:
*/imx6qdl-sabresd.dtsi
&i2c3 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c3>;
status = "okay";
rtc@32{
compatible = "epson,rx8025";
reg = <0x32>;
}
};
其中i2c3引脚配置:
pinctrl_i2c3: i2c3grp {
fsl,pins = <
MA6QDL_PAD_EIM_D17__I2C3_SCL 0x4001b8b1
MA6QDL_PAD_EIM_D18__I2C3_SDA 0x4001b8b1
>;
};
make menuconfig:
Device Driver ---->
Real Time Clock ---->
<*> Epson RX-8025A/NB
网上说rx_8025T的时序和rx_8025A/NB不同
可以使用DS1307。
试过,还是同样的问题,掉电重启后,时间回到1970-1-1
用示波器打i2c3的SCL和SDA引脚,用hwclock -w时,没有波形出来。
希望各位帮我找下问题所在。谢谢
已解决
1.I2C3没有工作,要把I2C3和rx8025T关联起来。
2.rx8025T和rx8025的读写不一样,需要修改读写移位
设备通病,尽量不要断电
1970-01-01对于开发者来说都是不陌生的,有些系统对于时间的处理如果不够好的话,就可能把时间显示成1970-01-01,所以经常有用户看到1970-01-01这个时间。
1970-01-01是Unix时间戳,以Unix诞生的时间为参照确定的。
rx_8025t断电重启后,跟电脑拔掉主板上的电池一样,时间是会还原成1970-01-01(断电后,芯片保存的数据清空)
据我做嵌入式的经验,有关时间的设置好多都是1970/01/01,通过临时设置,断电后时间又回到以前,如果要保持时刻正确,要么永久配置,要么对芯片引脚做特殊处理,至于怎么做,你就得查查你的芯片的这个功能了
估计是rx_8025T和rx_8025A/NB时钟芯片读写不一致。
一、于是先设置一个时间再断电重启去抓这个RTC芯片的信息:
就先随便设置一个日期:20180419
二、发现/etc/timestamp的文件内容时间正好是2028年6月18日3时41分????
再追,包含/etc/timestamp这个文件了有两个脚本分别是/etc/init.d目录下的bootmisc.sh和save-rtc.sh。
bootmisc.sh中有如下内容:
#
# This is as good a place as any for a sanity check
#
# Set the system clock from hardware clock
# If the timestamp is more recent than the current time,
# use the timestamp instead.
test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh start
if test -e /etc/timestamp
then
SYSTEMDATE=`date -u +%4Y%2m%2d%2H%2M%2S`
read TIMESTAMP < /etc/timestamp
if [ ${TIMESTAMP} -gt $SYSTEMDATE ]; then
# format the timestamp as date expects it (2m2d2H2M4Y.2S)
TS_YR=${TIMESTAMP%??????????}
TS_SEC=${TIMESTAMP#????????????}
TS_FIRST12=${TIMESTAMP%??}
TS_MIDDLE8=${TS_FIRST12#????}
date -u ${TS_MIDDLE8}${TS_YR}.${TS_SEC}
test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh stop
fi
fi
上面的脚本会判断文件/etc/timestamp存在与否,且将里面的时间与当前系统时间进行比较,如果timestamp里面的时间大于系统时间,则会使用timestamp,并将其写入RTC时间中。
脚本save-rtc.sh中有如下内容:
#! /bin/sh
/etc/init.d/hwclock.sh stop
# Update the timestamp
date +%2m%2d%2H%2M%Y > /etc/timestamp
上面的脚本会将当前时间写入timestamp中。
同时,bootmis.sh脚本被链接到rcS.d中的S55bootmis.sh中,在系统启动时执行,而脚本save-rtc.sh则被链接到rc0.d和rc6.d文 件夹中,在系统关闭和重启时执行。
三、解决方法:
找的了原因,解决的方法就简单了
1. 删除文件 /etc/timestamp。或者修改/etc/timestamp内的时间,使其小于或等于当前系统时间。
2. 正常关闭或重启系统而不是直接断电。
3. 修改 bootmisc.sh脚本里面的判断条件