硬件
由于项目的需要ARM嵌入式板上挂着一块EPSON的RX8010实时钟芯片为数据采集提供了可靠的时间。RX8010内置温补晶振,设计简化,不贵,所以选择了。其实选择其他用途I2C软件上的芯片问题不大,只要Linux内置了该芯片的驱动。目前Linux绝大多数已经得到了支持RTC芯片了。
如下图所示。通过一个BAT54C完成电池和DC电源供电之间的切换。设计第一板出现了严重的低级错误,即没有给出I2C总线加上上拉电阻。这源于对ARM芯片GPIO的误解,以为内置了上拉电阻。因此,在调试过程中,它被认为是普通的GPIO作为I2C使用时没有信号。一度怀疑是不是Linux下的I2C驱动有问题。最后,我终于想到了上拉电阻的问题。手动焊接两个电阻真的很容易。
软件
芯片检测
在linux下面,可以查看I2C接口设备信息:
root@MyBoard:/dev# ls
...
gpiochip0 mmcblk0p2 sequencer tty3 tty59 vhci
gpiochip1 mmcblk0p3 sequencer2 tty30 tty6 watchdog
i2c-0 mqueue shm tty31 tty60 watchdog0
i2c-1 nbd0 snd tty32 tty61 zero
i2c-2 nbd1 spidev0.0 tty33 tty62
i2c-3 nbd10 stderr tty34 tty63
initctl nbd11 stdin tty35 tty7
当挂载了RX如果确定是8010后,I2C可使用总线上的地址I2C检测工具:
root@MyBoard:/dev# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
可见挂载在i2c-0上的RX8010的地址为0x32.然后可以加载RX8010驱动了。
如果不能检测芯片,一般是硬件问题,要么是线路问题,要么是芯片问题。
驱动挂载
在Linux 4.x.y内置版本RX8010驱动只是默认编译成模块。也就是说,在linux启动时不会自动加载。如要自动编译的话linux让它和内核一起加载。这样做也很麻烦,所以就让它来吧linux启动后手动加载,最后做成脚本。
启动系统后,找到模块所在的位置在/lib/modules/4.14.111/kernel/drivers/rtc在目录下,下rtc-rx8010.ko。加载并查看以下命令:
root@MyBoard:/lib/modules/4.14.111/kernel/drivers/rtc# insmod rtc-rx8010.ko
root@MyBoard:/lib/modules/4.14.111/kernel/drivers/rtc# lsmod
Module Size Used by
rtc_rx8010 16384 0
nls_ascii 16384 1
8189es 1024000 0
brcmfmac 180224 0
brcmutil 16384 1 brcmfmac
xradio_wlan 110592 0
88XXau 1753088 0
8821cu 1683456 0
g_mass_storage 16384 0
可以看到RX8010驱动模块已加载到核心。暂时不要高兴,现在不能用了RX8010,因为不在/dev在目录下生成相应的设备文件。
还记得之间的检测RX地址(0x32)我们需要它来创建设备文件。执行以下命令
echo "rx8010 0x32" > /sys/class/i2c-adapter/i2c-0/new_device
其中rx8010为RX8010驱动注册的名称不能是其他字符,而是0x三十二是芯片I2C总线上的通信地址。上述命令将合成字符串写入new_device,然后内核会发现加载。RX8010驱动,将地址传输,然后通过驱动程序与实际芯片通信。如果通信正常,设备注册将完成,设备文件/dev/rtc1。
测试
最后,测试芯片是否能正常工作。首先,读取芯片的时间:
root@MyBoard:~# hwclock -r -f /dev/rtc1
Thu 07 Nov 2013 07:30:04 PM UTC .008031 seconds
如果能读到时间,99%表示芯片正常工作。
然后尝试写入时间,首先从网络获取最新时间:
root@MyBoard:~# /etc/init.d/ntp restart
root@MyBoard:~# ntp-wait
root@MyBoard:~# date
Thu Sep 3 09:47:39 UTC 2020
然后写入RX8010后,等一下再读:
root@MyBoard:~# hwclock -w -f /dev/rtc1
root@MyBoard:~# hwclock -r -f /dev/rtc1
Thu 03 Sep 2020 09:49:04 AM UTC .179065 seconds
可见时间成功写入,时间正常运行。