如何在Raspbian上安装实时时钟(RTC)?


9

我有:

  • Raspberry Pi与2015-05-05-raspbian-wheezy
  • 连接了ds1307(这是一个Adafruit板,未安装上拉电阻)。

我如何能:

  • 配置驱动程序
  • 确保Pi在启动时实际使用RTC时间?

据我所知,我实际上已经完成了第一部分,但是第二部分却没有运气。由于以下原因,许多信息(包括Adafruit说明)已过时:https://www.raspberrypi.org/forums/viewtopic.php?t = 97314

所以,第一步:在raspi-config中启用I2c和驱动程序,添加dtoverlay=i2c-rtc,ds1307到/boot/config.txt的末尾,您已经有了驱动程序,并且hwclock现在对我有用(显然无法运行i2cdetect,更多内容)稍后)。

现在,您需要删除fake-hwclock并进行设置,以使其在启动时实际读取rtc。我一直在尝试遵循此建议-这与我所见过的其他事情基本一致,并且是最近的-https: //www.raspberrypi.org/forums/viewtopic.php?p=842661#p842661

(这是针对其他RTC的,但是我只关注第二部分有关删除false-hwclock的信息)。

但是没有运气,我的pi上不存在“需要注释的行”。我的pi出现在1970年1月1日00:00,hwclock -r说RTC已损坏。即使自设置RTC并重新启动pi以来我没有关闭电源,所以看来它一定已被启动损坏。

我也根本无法运行i2cdetect。它抱怨设备/ dev / i2c(something)不存在-确实不存在...


临时更新

好的,我已经确定:

  • 损坏仅是时间/日期信息。如果我使用i2cset用某种模式填充nvram,则该信息不会在重新启动时被修改,但年份为0x66
  • 如果我,ds1307dtoverlay=i2c-rtc,ds1307config.txt中的行中删除,则系统启动时不会破坏RTC!这支持驱动程序本身正在破坏数据的想法。我看过驱动程序代码,它会花费时间并更改它不喜欢的内容(例如,它将12个小时更改为24个小时的格式)。因此,可能的问题是驱动程序是在I2C端口实际上尚未准备好工作时安装的(可能是由于时钟未准备好吗?)
  • 如果我在启动后执行此操作:sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'它将导致rtc_ds1307驱动程序加载,并显示/ dev / rtc0。而且时间还可以。这样就可以用作修改启动脚本的基础
  • 还有一个有趣的细节:如果我hwclock -s在写入/sys/..../new_device之后立即在脚本中使用,它将失败。sleep 0.5两者之间必须有a 或某物。

这样看来,我现在拥有可以关闭,启动并具有正确时间的系统-我会尽快对其进行正确记录。


腐败可能(或可能不会)与用ntpdate跑办... raspberrypi.org/forums/viewtopic.php?p=690492#p690492
greggo

我添加dtparam=i2c1=on到config.txt,那么在一月份工作了micksulley raspberrypi.org/forums/viewtopic.php?f=28&t=97639 -重新启动。仍然没有/ dev / i2c *,仍然没有i2cdetect。
greggo


@goldilocks-谢谢,重要的拼图。i2cdetect现在可以正常工作,并且1:0x68显示为UU。今天晚些时候将尝试其他一些东西。
greggo,2015年

1
注意 sudo invoke-rc.d hwclock.sh start什么也不做,因为/run/udev存在而退出。但是sudo invoke-rc.d hwclock.sh show读取时钟,然后sudo invoke-rc.d hwclock.sh stop将系统时钟复制到硬件时钟。
greggo

Answers:


6

这就是我的工作方式。

这里几乎所有内容都需要以超级用户身份完成,因此请使用“ sudo bash”或将sudo放在所有内容的前面(如果尚未显示)。

需要以下基本步骤:

  • 安排“ i2c”驱动程序存在(如果尚未存在);
  • rtc_ds1307有一个附加驱动程序
  • 删除假hwclock。这是一个子系统,通常在您没有网络提供时间的情况下会使用。它可以在系统关闭时将系统时间保存在一个文件中,并在启动时从同一文件中加载。因此时间不正确,但至少每次重启时它都不会恢复为零(1970年1月1日)。安装了RTC之后,即使没有网络,时间也将开始正确校正。
  • 安排系统在启动时从RTC读取时间。

请注意,这是针对版本为2015-05-05-raspian-wheezy的图像,版本为2.0'Pi 1',并且ds1307 rtc连接至扩展连接器。其中的一些或大部分应适用于其他情况(但可能不适用于较老的斜背人)。RTC损坏的问题可能是ds1307驱动程序特有的,因此对于其他芯片来说可能更简单。这个问题可能会在将来的版本中得到解决。

同样,这些说明是针对使用I2C总线#1的2型PCB编写的。如果您有rev1 PCB(在P1附近没有8针“ P5”连接器),您将把RTC连接到I2C总线#0。因此,只要您/i2c-1/在下面看到,请/i2c-0/改用。

首先,运行raspi-config,在“高级选项”下,您将找到一个启用I2C和加载I2C驱动程序的设置。启用它们。

现在,您原则上可以在/boot/config.txt:的底部添加一行dtoverlay=i2c-rtc,ds1307,这将加载ds1307驱动器;但是-正如一些人所发现的-驱动程序的加载将损坏时钟的内容,从而破坏其目的。我不知道为什么,但我查看了驱动程序源,发现启动时它会读取时钟,然后,如果发现不喜欢的内容(例如12小时制而不是24小时制),它将通过写操作“纠正”这些设置。因此,我怀疑可能发生的情况是驱动程序在I2C启动后加载得太早,可能时钟未正确设置或其他原因,并且通信已损坏。无论如何,这与我的配置不兼容,因此我们将在以后加载驱动程序。

此时,您可以重新引导,并且使用lsmod | grep i2ci2c_bcm2708驱动程序应该看到驱动程序已加载(如raspi-config中所要求的)。

接下来,运行以下命令:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

或(如果还不是超级用户):

sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'

sudo echo因为>超级用户才需要,所以将不起作用)。

这将导致rtc_ds1307驱动程序加载,并创建设备/dev/rtc0。您现在应该可以运行hwclock

sudo hwclock -r

...这显示来自RTC的时间。由于您的时钟尚未正确初始化,因此很可能会产生错误。无论如何,我们现在将其设置。

(1)确保使用设置系统时钟date。如果您在网络上,则应该已经设置好;如果没有,请拿出手机或口袋中的钟表,然后尝试类似的方法

sudo date -s '18 nov 2015 22:20:24'

当您正确设置系统时间后-小心地将其设置为正确的时区-您可以

sudo hwclock -w

将其复制到RTC。

然后hwclock -r应该可以工作,并在RTC中显示时间,如果多次阅读,您应该看到它正在前进。

Wed 18 Nov 2015 22:48:41 EST  -0.181329 seconds
Wed 18 Nov 2015 22:48:53 EST  -0.013721 seconds

注意:时钟值是相对于UTC时区存储的,但是以当地时间显示。

下一步:删除fake-hwclock。首先禁用它,并确保启用了hwclock.sh:

sudo update-rc.d hwclock.sh enable
sudo update-rc.d fake-hwclock remove

sudo apt-get remove fake-hwclock
sudo rm /etc/cron.hourly/fake-hwclock
sudo rm /etc/init.d/fake-hwclock

hwclock.sh在启动时将不会执行任何操作-它会检测到udev的存在并假定udev已完成启动工作-但它会执行一些有用的操作,这将导致在启动时将系统时间写入RTC。因此,当您确实连接到网络时,Pi时间将同步到网络,并且关闭时,您的RTC漂移将得到纠正。

还有一件事-我们需要安排在加电时读取RTC,因此将设置系统时间。udev中有一个尝试执行此操作的操作,但是由于未加载RTC驱动程序,该操作将失败或被绕过。

我设置此方法的方法是,在(顶部的/etc/rc.local右下方,注释下方)的顶部添加以下四行:

echo 'setting up RTC'
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 0.5
hwclock -s

这将确保每次系统启动时都加载驱动程序,并从硬件时钟设置系统时间。存在“ sleep 0.5”是因为我发现没有该hwclock命令将无法使用-通过写入/sys/class/i2c-adapter/i2c-1/new_device(包括使/ dev / rtc0存在)触发的操作显然需要一些时间(可能在0.5秒以下)。

就是这样。我对使用此命令并不满意/etc/rc.local-我宁愿早些设置它,因为很多事情在rc.local执行之前就发生了,最好在这些事情运行之前进行时钟设置。但这对我有用。如果找到更好的方法,我将更新此答案。

参考 https://www.raspberrypi.org/forums/viewtopic.php?t=97314 https://www.raspberrypi.org/forums/viewtopic.php?p=842661 https://www.raspberrypi.org/forums /viewtopic.php?t=85683 https://www.raspberrypi.org/blog/upcoming-board-revision/


我已经订购了RTC,并且一直在阅读RTC帖子。这是该网站上为数不多的提及RTC的网站之一。我的RTC到了,我添加dtoverlay=i2c-rtc,ds3231config.txt最新的Raspbian(Jessie)。一切似乎都正常。无需特殊配置。诚然,这是一个不同的芯片(尽管数据手册看起来非常相同,除了片上Xtal且它的工作电压为3.3V)。PS hwclock需求sudo
Milliways 2015年

1
@Milliways /etc/rc.local以root 身份运行。我不记得ds3231是否使用相同的驱动程序,而且我也不知道是什么原因导致损坏,只是它在驱动程序加载时发生。另外,正如我在上面的评论中提到的那样,我怀疑其中一些问题可能是由于初始化期间的竞争状况所致(例如,在正确设置i2c之前,rtc驱动程序可能已加载),并且可能会受到速度的相当大的影响。 SD卡。当我第一次运行Jessie时,它处于4类卡片上,并且严重损坏。奇怪的错误,它忽略了shutdown。在10级上表现很好
greggo,2015年

@Milliways,但是,是的,我强烈建议您使用ds3231,它在3.3v上运行,更加准确。如果它也使您免于这些麻烦,那将是一笔巨大的收获。
greggo 2015年

2

补充答案-使用I2C工具进行故障排除

在尝试使其工作时,我发现使用i2c-tools查看RTC很有帮助,在其他讨论中您会发现很多对此的参考。我在问题中添加了一些有关发现的信息;如果有用,我已将其移至此答案。

您将需要启用I2C(raspi-config)并加载i2c-dev模块-您可以使用来强制执行此操作sudo modprobe i2c-devi2c-dev不需要使RTC正常工作,但需要使用i2c-tools。

sudo apt-get install i2c-tools如果不存在“ i2cdetect”,则可以使用来安装i2c-tools 。

如果你有一个牧师1印刷电路板:更改 i2cdetect -y 1i2cdetect -y 0,并改变所有的1 0x680 0x68i2cdump命令。

你可以做 i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

...“ 68”表示设备在地址0x68处对I2C总线上的寻址做出了响应。如果您已加载rtc_ds1307驱动程序,由于该驱动程序已保留该驱动程序,因此它将显示为“ UU”。

该命令i2cdump -y -f -r 0-6 1 0x68 c可用于转储包含时间的ds1307的前7个寄存器(仅当安装了rtc驱动程序时才需要'-f';它会覆盖保留)。

以下是开机后,由于驱动程序的加载损坏了RTC时发生的情况dtoverlay=i2c-rtc,ds307

hwclock -r 最初报告时钟设置已损坏,实际上年份是'66'。

pi@raspberrypi ~ $ sudo hwclock -r
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 50 04 00 05 01 01 66                               P?.???f         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 52 04 00 05 01 01 66                               R?.???f         
pi@raspberrypi ~ $ sudo hwclock -w
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 35 09 01 03 17 11 15                               5??????         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 37 09 01 03 17 11 15                               7??????         
pi@raspberrypi ~ $ sudo hwclock -r
Tue 17 Nov 2015 01:09:42 UTC  -0.384866 seconds
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 46 09 01 03 17 11 15                               F??????         

i2cdump中的七个数字是:[秒sec hrs,星期几,星期几,年月日],全部以bcd表示,因此最后一次是UTC时间为2015年11月17日,01:09:46。

“损坏的”时间是66年1月1日,我见过其他人也曾报道过同样的价值。


2

我在两个带Arch Linux的Raspberry Pi 2 Model B上遇到了类似的问题,一个带TinyRTC(带ds1307),另一个带电容器RTC(带ds3231)。

将NTPD作为守护程序运行会破坏两个RTC的日期并将其设置为2066/01/01。

#hwclock --debug
hwclock from util-linux 2.27
Using the /dev interface to the clock.
Last drift adjustment done at 1420070400 seconds after 1969
Last calibration done at 1420070400 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
/dev/rtc does not have interrupt functions. Waiting in loop for time from /dev/rtc to change
...got clock tick
Time read from Hardware Clock: 2066/01/01 00:01:12
Invalid values in hardware clock: 2066/01/01 00:01:12
Time since last adjustment is -1420070400 seconds
Calculated Hardware Clock drift is 0.000000 seconds
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).

设置

我在/boot/config.txt中添加了

dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds1307

要么

dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds3231

我在/etc/modules-load.d/raspberrypi.conf中添加了

i2c-bcm2708
i2c-dev

我禁用了systemd-timesyncd

# timedatectl set-ntp false

我安装了NTP

# pacman -S ntp

它是如何解决的

我发现通过在启动服务之前启动NTPD的单个实例会更新系统时间,并且不会设置RTC,但是如果在此之后启动NTPD服务,它将更新RTC日期而不损坏它。

我以为有权限问题。默认组是音频。

# ls -l /dev/rtc0
crw-rw---- 1 root audio 254, 0 Jan  1  1970 /dev/rtc0

我创建了/etc/udev/40-rtc-permissions.rules进行测试

KERNEL=="rtc0", GROUP="ntp", MODE="0666"

但是它没有帮助,所以我删除了它。

我还必须在启动时更新系统日期,因为它不是自动完成的。

我添加到了/etc/ntpd.service文件

ExecStartPre=-/usr/bin/hwclock -s
ExecStartPre=/usr/bin/ntpd -gq

并启用了NTPD服务

# systemctl enable ntpd

并且日期会更新,并且在启动过程中不会损坏。

我没有发现是什么原因导致NTPD守护程序首先启动而破坏了RTC,如果有人改进了我的解决方案,我将不胜感激,但这对我有用。


感谢您的帖子。我整天都在Raspberry Pi 3上与之抗争,您的帖子终于把最后遗漏的部分放在一起。我正在为操作系统运行Fedberry,并尝试将设备设置为IPA服务器(为什么?因为10瓦的免费IPA –味道很好,填充更少!)现在,我有一个可以正常工作的IPA服务器,它可以在电源故障中幸免无需人工干预。我使用的是ds1307 rtc,在对您确定的时钟进行故障排除时遇到了一些相同的问题。最糟糕的是启动时RTC内存损坏。我不确定dtparam = i2c_arm = on是不是把戏o
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.