一、硬件及系统信息
首先先说明硬件及系统的信息
- 核心板:周立功 A3352
- 时钟芯片:PHILIPS PCF8563
- Linux: 4.9(使用设备树配置)
二、设备树及内核驱动配置
前一篇调试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
。周立功的评估板使用的是EPSON
的RTC8025
时钟芯片,我们的底板引脚没有变化,因此直接修改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/
目录,可以看到有rtc0
和rtc1
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就行了。
当然,如果要关掉板载rtc,也可以直接把TI OMAP Real Time Clock
关掉。
如果这样改的话,上面的rtc1
也要换回rtc0
。
最后,由于程序中配置时使用的命令是rtc0,因此最好的解决方案还是关闭板载的内置RTC。如果修改为rtc1,那我们的命令需要每次加上对rtc1的指定。
Comments | NOTHING