1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > linux下实时时钟芯片(RTC)的读写

linux下实时时钟芯片(RTC)的读写

时间:2019-09-07 00:58:37

相关推荐

linux下实时时钟芯片(RTC)的读写

硬件

由于项目的需要在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 vhcigpiochip1 mmcblk0p3 sequencer2tty30 tty6 watchdogi2c-0 mqueue shm tty31 tty60 watchdog0i2c-1 nbd0 snd tty32 tty61 zeroi2c-2 nbd1 spidev0.0 tty33 tty62i2c-3 nbd10 stderr tty34 tty63initctlnbd11 stdintty35 tty7

当挂载了RX8010后,如果确定其在I2C总线上的地址,可以使用I2C工具来侦测:

root@MyBoard:/dev# i2cdetect 0WARNING! 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] y0 1 2 3 4 5 6 7 8 9 a b c d e f00:-- -- -- -- -- -- -- -- -- -- -- -- --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.koroot@MyBoard:/lib/modules/4.14.111/kernel/drivers/rtc# lsmodModule Size Used byrtc_rx8010 16384 0nls_ascii 16384 18189es1024000 0brcmfmac 180224 0brcmutil16384 1 brcmfmacxradio_wlan 110592 088XXau1753088 08821cu1683456 0g_mass_storage 16384 0

可以看到RX8010的驱动模块已经加载到内核了。暂时不要高兴,现在还并不能使用RX8010,因为并没有在/dev目录下生成对应的设备文件。

还记得的之间侦测RX8010时得到的地址(0x32)吧,我们需要它来创建设备文件。执行如下命令

echo "rx8010 0x32" > /sys/class/i2c-adapter/i2c-0/new_device

其中rx8010为RX8010驱动注册的名称,不能为其它字符,而0x32则为该芯片在I2C总线上的通信地址。上面的命令将合成的字符串写入new_device,然后内核就会查找到加载的RX8010驱动,将地址传入,再由驱动程序与实际芯片进行通信,如果通信正常则完成设备的注册,生成设备文件/dev/rtc1。

测试

最后测试该芯片是否能够正常工作。首先来读取芯片的时间:

root@MyBoard:~# hwclock -r -f /dev/rtc1Thu 07 Nov 07:30:04 PM UTC .008031 seconds

如果能够读到时间,就99%预示着芯片正常工作了。

然后试试时间的写入,首先从网络获取最新时间:

root@MyBoard:~# /etc/init.d/ntp restartroot@MyBoard:~# ntp-waitroot@MyBoard:~# dateThu Sep 3 09:47:39 UTC

然后写入RX8010后,等一下下再读取:

root@MyBoard:~# hwclock -w -f /dev/rtc1root@MyBoard:~# hwclock -r -f /dev/rtc1Thu 03 Sep 09:49:04 AM UTC .179065 seconds

可见成功的写入了时间,而且时间也正常运行起来了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。