IMX6Q: rtc:使用的rx_8025t芯偏,断电重启date 显示1970-1-1

买的天嵌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

img


看到打印信息读写寄存器都正常。现在断电重启再抓这个芯片的信息:

img


可以看出一开始读取并设置的时间是正确的, 可是后面又被设置成了2028年的日期?是跑到系统里面才做的操作?跟底层无关?
于是去系统里面搜索关键字2028:

img

二、发现/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脚本里面的判断条件