【Linux】RTC时钟功能调试

发布于 2020-10-29  120 次阅读


一、硬件及系统信息

首先先说明硬件及系统的信息
- 核心板:周立功 A3352
- 时钟芯片:PHILIPS PCF8563
- Linux: 4.9(使用设备树(DTS)配置)

二、设备树及内核驱动配置

前一篇调试PHY芯片的文章中有提到,设备树的相关介绍文档在Documentation/devicetree 路径下,可以直接搜索PCF8563查看相关说明

grep -rn "PCF8563"

搜索到的文档说明如下

* Philips PCF8563/Epson RTC8564 Real Time Clock

Philips PCF8563/Epson RTC8564 Real Time Clock

Required properties:
see: Documentation/devicetree/bindings/i2c/trivial-devices.txt

Optional property:
- #clock-cells: Should be 0.
- clock-output-names:
  overwrite the default clock name "pcf8563-clkout"

Example:

pcf8563: pcf8563@51 {
    compatible = "nxp,pcf8563";
    reg = <0x51>;
    #clock-cells = <0>;
};

device {
...
    clocks = <&pcf8563>;
...
};

可以看出RTC时钟芯片也是通过I2C来与核心板进行通讯的。

查看引脚信息并在设备树中配置RTC。周立功的评估板使用的是EPSONRTC8025时钟芯片,我们的底板引脚没有变化,因此直接修改I2C中的配置就行了。
设备树相关配置如下。

...
143 
144     i2c1_pins_default: pinmux_i2c1_pins {
145         pinctrl-single,pins = <
146             AM33XX_IOPAD(SPI0_D1,  PIN_INPUT_PULLUP | MUX_MODE2)    /* spi0_d1.i2c1_sda */
147             AM33XX_IOPAD(SPI0_CS0, PIN_INPUT_PULLUP | MUX_MODE2)    /* spi0_cs0.i2c1_scl */
148         >;
149     };
150 
...
489 &i2c1 {
490     pinctrl-names = "default";
491     pinctrl-0 = <&i2c1_pins_default>;
492 
493     status = "okay";
494     clock-frequency = <400000>;
495 
496     /* audio codec */
497     tlv320aic3101: tlv320aic3101@18 {
498     compatible = "ti,tlv320aic3x";
499         reg = <0x18>;
500 
501         status = "disabled";
502     };
503 
504     /* RX-8025/JYRTC-1 */
505     //rtc_rx8025: rx8025@32 {
506     //    compatible = "epson,rtc-rx8025";
507     //    reg = <0x32>;
508     //    status = "okay";
509     //};
510 
511 
512     /* pcf RTC */
513     rtc_pcf8563: pcf8563@51 {
514         compatible = "nxp,pcf8563";
515         reg = <0x51>;
516         #clock-cells = <0>;
517         status = "okay";
518     };
519 
520 };
...

查看dev/目录,可以看到有rtc0rtc1

rtc0是3352内置rtc,而rtc1就是我们的pcf8563,可以使用如下指令指定rtc设备

hwclock -f /dev/rtc1

但是报如下错误

 low voltage detected, date/time is not reliable. 
 hwclock: RTC_RD_TIME: Invalid argument

按照字面意思,就是电压不够,无法使用

后面检查开机时的内核启动日志,也有这些输出信息

[    2.370059] rtc-pcf8563 1-0051: low voltage detected, date/time is not reliable.
[    2.380171] rtc-pcf8563 1-0051: rtc core: registered rtc-pcf8563 as rtc1

于是对电路进行了检测,也尝试了重新焊接晶振之类的,但是没有什么用。

终于,在对rtc1尝试使用写入命令后

hwclock -w -f /dev/rtc1

居然生效了,而且关机后重新再使用 -f 参数指定rtc1后,还可以正常读取时间。

原来外部的rtc芯片需要先写入一次才能进行读取,否则报错电压过低日期不可靠。

但是这个错误的误导性太强,导致一开始完全没有找对方向,最后还是通过告科学找到问题所在。

现在启动日志也正常了

[    2.370729] rtc rtc1: invalid alarm value: 2020-8-18 45:85:0
[    2.377010] rtc-pcf8563 1-0051: rtc core: registered rtc-pcf8563 as rtc1
......
[    3.041719] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:00:01 UTC (946684801)

目前剩余的问题就是,如何屏蔽掉rtc0,或者将我们的外部rtc芯片配置为rtc0,这样就可以正常使用了。因为后面有一句setting system clock to 2000-01-01 00:00:01 UTC (946684801),很明显还是使用的内部时钟。

把DTS翻烂了都没有找到哪里可以设置,快要绝望的时候,突然想到如果在内核中把自带的rtc关掉就行了。

结果一进入到menu config,原来在这里面可以直接设置使用哪一个rtc,之前都没看到。

按Y进入输入框,改成rtc1就行了。

image-20200818175052341.png

当然,如果要关掉板载rtc,也可以直接把TI OMAP Real Time Clock关掉。

image-20200818175123026.png

如果这样改的话,上面的rtc1也要换回rtc0

最后,由于程序中配置时使用的命令是rtc0,因此最好的解决方案还是关闭板载的内置RTC。如果修改为rtc1,那我们的命令需要每次加上对rtc1的指定。

Comments


来自像素世界的代码家,创造第九艺术!