Ich habe:
- Raspberry Pi mit 2015-05-05-raspbian-wheezy
- ds1307 angeschlossen (es ist eine Adafruit-Platine, Pullup-Widerstände nicht installiert).
Wie mache ich:
- Treiber konfigurieren
- Stellen Sie sicher, dass der Pi beim Start tatsächlich die RTC-Zeit verwendet.
Ich habe den ersten Teil gemacht, soweit ich das beurteilen kann, aber mit dem zweiten kein Glück. Viele der dortigen Informationen, einschließlich der Adafruit-Anweisungen, sind aus diesem Grund veraltet: https://www.raspberrypi.org/forums/viewtopic.php?t=97314
Also, erster Schritt: Sie aktivieren das I2c und die Treiber in raspi-config, fügen dtoverlay=i2c-rtc,ds1307
sie am Ende von /boot/config.txt hinzu, und Sie haben Treiber und hwclock
arbeiten anscheinend jetzt für mich (i2cdetect kann nicht mehr ausgeführt werden) dazu später).
Sie müssen jetzt fake-hwclock entfernen und so einrichten, dass der RTC beim Start tatsächlich gelesen wird. Ich habe versucht, diesen Rat zu befolgen - der weitgehend mit anderen Dingen übereinstimmt, die ich gesehen habe und der sehr neu ist - https://www.raspberrypi.org/forums/viewtopic.php?p=842661#p842661
(das ist für eine andere RTC, aber ich folge nur dem zweiten Teil über das Entfernen von Fake-Hwclock und so weiter).
Aber kein Glück, und die 'zu kommentierenden Zeilen' existieren auf meinem Pi nicht. Mein Pi kommt mit 1. Januar 1970 00:00 und hwclock -r
sagt, dass die RTC beschädigt ist. Auch wenn ich mich seit dem Einstellen der RTC und dem Neustart des Pi nicht ausgeschaltet habe, scheint es, dass es durch den Start beschädigt wurde.
Ich konnte i2cdetect auch überhaupt nicht ausführen. Es beschwert sich, dass die Geräte / dev / i2c (etwas) nicht existieren - und tatsächlich nicht ...
Zwischenupdate
OK, ich habe festgestellt, dass:
- Die Beschädigung bezieht sich nur auf die Uhrzeit- / Datumsinformationen. Wenn ich i2cset verwende, um das NVRAM mit einem Muster zu füllen, werden diese Informationen beim Neustart nicht geändert, aber das Jahr geht auf 0x66
- Wenn ich das
,ds1307
aus der Zeiledtoverlay=i2c-rtc,ds1307
in config.txt entferne, wird das System gestartet, ohne die RTC zu beschädigen! Dies unterstützt die Idee, dass der Treiber selbst die Daten beschädigt. Ich habe mir den Treibercode angesehen, und er geht durch die Zeit und ändert Dinge, die er nicht mag (z. B. ändert er das 12-Stunden- bis 24-Stunden-Format). Vielleicht liegt das Problem darin, dass der Treiber zu einem Zeitpunkt installiert wird, an dem der I2C-Port nicht betriebsbereit ist (möglicherweise weil die Uhren nicht bereit sind?). - Wenn ich dies nach dem Start
sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'
mache: Der Treiber rtc_ds1307 wird geladen und / dev / rtc0 wird angezeigt. Und die Zeit ist noch in Ordnung. Und das kann als Grundlage für das Modifizieren der Init-Skripte verwendet werden - Noch ein lustiges Detail: Wenn ich es
hwclock -s
direkt nach dem Schreiben in /sys/..../new_device in einem Skript verwende, schlägt es fehl. Es muss einsleep 0.5
oder etwas dazwischen geben.
Es scheint also, dass ich jetzt ein System habe, das heruntergefahren und gestartet werden kann und die richtige Zeit hat - ich werde dies bald richtig aufschreiben.
quelle
dtparam=i2c1=on
zu config.txt wie für micksulley im Januar arbeitete raspberrypi.org/forums/viewtopic.php?f=28&t=97639 - Reboot. Immer noch kein / dev / i2c *, immer noch kein i2cdetect.sudo invoke-rc.d hwclock.sh start
macht nichts, es wird beendet, weil es/run/udev
existiert. Abersudo invoke-rc.d hwclock.sh show
liest die Uhr, undsudo invoke-rc.d hwclock.sh stop
kopiert die Systemuhr auf Hardware - Uhr.Antworten:
Hier ist, wie ich es zum Laufen gebracht habe.
Fast alles hier muss als Superuser erledigt werden, also benutze 'sudo bash' oder setze sudo vor alles (falls nicht bereits gezeigt).
Die folgenden grundlegenden Schritte sind erforderlich:
Bitte beachten Sie, dass dies für das Image 2015-05-05-raspian-wheezy auf einer Version 2.0 'Pi 1' und einem am Erweiterungsanschluss angebrachten ds1307 rtc gilt. Einige oder viele davon sollten für andere Situationen gelten (aber wahrscheinlich nicht für ältere Raspianer). Es ist möglich, dass das Problem mit der beschädigten RTC spezifisch für den ds1307-Treiber ist, sodass es für andere Chips einfacher sein könnte. Und dieses Problem wird möglicherweise in einer zukünftigen Version behoben.
Diese Anweisungen gelten auch für die Leiterplatte Modell 2, auf der der I2C-Bus Nr. 1 verwendet wird. Wenn Sie eine rev1-Platine haben (die keinen 8-poligen P5-Anschluss in der Nähe von P1 hat), schließen Sie die RTC an den I2C-Bus Nr. 0 an. Wenn Sie also
/i2c-1/
unten sehen, verwenden Sie/i2c-0/
stattdessen.Führen Sie zunächst raspi-config aus. Unter 'Erweiterte Optionen' finden Sie eine Einstellung zum Aktivieren des I2C und zum Laden von I2C-Treibern. Aktiviere sie.
Jetzt können Sie im Prinzip eine Zeile am unteren Rand von
/boot/config.txt
:dtoverlay=i2c-rtc,ds1307
einfügen, die das Laufwerk ds1307 lädt. Aber - wie mehrere festgestellt haben - das Laden des Treibers wird den Inhalt der Uhr beschädigen und seinen Zweck zunichte machen. Ich habe keine Ahnung warum, aber ich habe mir die Treiberquelle angesehen und festgestellt, dass sie beim Start die Uhr liest und dann, wenn sie Dinge findet, die sie nicht mag (wie ein 12-Stunden-Format anstelle von 24), diese 'korrigiert' diese Einstellungen mit Schreibvorgängen. Ich vermute also, dass der Treiber möglicherweise zu früh nach dem Start des I2C geladen wird und die Uhren möglicherweise nicht richtig eingerichtet sind oder so, und die Kommunikation ist beschädigt. In jedem Fall funktioniert das nicht mit der Konfiguration, die ich habe, und so werden wir den Treiber später laden.Zu diesem Zeitpunkt können Sie neu starten, und bei Verwendung
lsmod | grep i2c
sollte deri2c_bcm2708
Treiber geladen sein (wie in raspi-config gefordert).Führen Sie als Nächstes diesen Befehl aus:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
oder (falls noch nicht Superuser):
sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'
(Funktioniert
sudo echo
nicht, da dies der>
Superuser sein muss).Dies sollte dazu führen, dass der
rtc_ds1307
Treiber geladen wird, und erstellt ein Gerät/dev/rtc0
. Sie sollten jetzt in der Lage seinhwclock
:sudo hwclock -r
... Hier wird die Uhrzeit von der RTC angezeigt. Es kann durchaus zu einem Fehler kommen, da Ihre Uhr noch nicht richtig initialisiert wurde. In jedem Fall werden wir es jetzt einstellen.
(1) Stellen Sie sicher, dass die Systemuhr mit eingestellt ist
date
. Wenn Sie sich in einem Netzwerk befinden, sollte es bereits festgelegt sein. Wenn nicht, holen Sie Ihr Telefon oder Ihre Taschenuhr heraus und probieren Sie so etwas aussudo date -s '18 nov 2015 22:20:24'
Wenn Sie die Systemzeit richtig eingestellt haben - achten Sie darauf, dass sie für die Zeitzone richtig ist -, können Sie dies tun
sudo hwclock -w
welches es in die RTC kopiert.
Und dann
hwclock -r
sollte das funktionieren und die Zeit in der RTC anzeigen, und Sie sollten sehen, wie es voranschreitet, wenn Sie es mehr als einmal lesen.Hinweis: Der Uhrwert wird relativ zur UTC-Zeitzone gespeichert, jedoch in Ortszeit angezeigt.
Nächster Schritt: Fake-Hwclock entfernen. Deaktivieren Sie es zuerst und stellen Sie sicher, dass die Datei hwclock.sh aktiviert ist:
hwclock.sh
wird beim Start nichts tun - es erkennt das Vorhandensein von udev und geht davon aus, dass udev die Startarbeit erledigt hat - aber es tut etwas Nützliches, das bewirkt, dass die Systemzeit beim Einschalten in die RTC geschrieben wird. Wenn Sie also eine Verbindung zu einem Netzwerk herstellen, wird die Pi-Zeit mit dem Netzwerk synchronisiert und Ihre RTC-Drift wird beim Herunterfahren korrigiert.Eines bleibt übrig - wir müssen dafür sorgen, dass die RTC beim Einschalten gelesen wird, damit die Systemzeit eingestellt wird. udev enthält eine Funktion, die dies versucht, die jedoch fehlschlägt oder umgangen wird, weil der RTC-Treiber nicht geladen ist.
Die Art und Weise, wie ich dies eingerichtet habe, besteht darin, diese vier Zeilen oben
/etc/rc.local
(ganz oben, unterhalb der Kommentare) hinzuzufügen :Dadurch wird sichergestellt, dass bei jedem Systemstart der Treiber geladen und die Systemzeit von der Hardware-Uhr eingestellt wird. Der 'sleep 0.5' ist da, weil ich festgestellt habe, dass der
hwclock
Befehl ohne ihn nicht funktioniert - die Aktion, die durch das Schreiben in/sys/class/i2c-adapter/i2c-1/new_device
(einschließlich der Existenz von / dev / rtc0) ausgelöst wird, dauert anscheinend einige Zeit (wahrscheinlich deutlich unter 0,5 Sekunden).Und das ist es. Ich bin nicht wirklich zufrieden mit dieser Verwendung von
/etc/rc.local
- ich würde es lieber viel früher einrichten lassen, da eine Mengerc.local
Dinge passieren, bevor sie ausgeführt werden, und es viel besser wäre, die Uhr einzustellen, bevor diese Dinge laufen. Aber es funktioniert für mich. Ich werde diese Antwort aktualisieren, wenn ich einen besseren Weg finde.Referenzen 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/
quelle
dtoverlay=i2c-rtc,ds3231
bisconfig.txt
auf neueste Raspbian (Jessie). Alles scheint in Ordnung zu sein. Keine spezielle Konfiguration erforderlich. Zugegeben, dies ist ein anderer Chip (obwohl das Datenblatt, abgesehen vom On-Chip Xtal, sehr ähnlich aussieht und mit 3,3 V betrieben wird). PShwclock
brauchtsudo
/etc/rc.local
läuft als root. Ich erinnere mich nicht, ob der ds3231 denselben Treiber verwendet, und ich weiß sowieso nicht, was die Beschädigung verursacht, nur dass es passiert, wenn der Treiber geladen wird. Wie ich oben in einem Kommentar erwähnt habe, vermute ich, dass einige dieser Probleme auf die Rennbedingungen während der Initialisierung zurückzuführen sind (z. B. kann der RTC-Treiber geladen werden, bevor der i2c ordnungsgemäß eingerichtet wurde) und erheblich von der Geschwindigkeit von beeinflusst werden die SD-Karte. Als ich Jessie zum ersten Mal laufen ließ, war es auf einer Karte der Klasse 4 und es war ernsthaft kaputt; seltsame Fehler, und es ignoriertshutdown
. War in Ordnung auf einer Klasse 10Ergänzende Antwort - Fehlerbehebung mit I2C-Tools
Während ich versuchte, es zum Laufen zu bringen, fand ich es hilfreich, i2c-tools zu verwenden, um die RTC zu betrachten, und Sie werden in anderen Diskussionen viele Hinweise darauf finden. Ich hatte der Frage, was ich damit fand, einige Informationen hinzugefügt. Ich habe es auf diese Antwort verschoben, falls es nützlich ist.
Sie müssen I2C aktiviert (raspi-config) und das i2c-dev-Modul geladen haben - Sie können dies mit a erzwingen
sudo modprobe i2c-dev
.i2c-dev
wird nicht benötigt, damit die RTC funktioniert, aber es wird benötigt, um i2c-Tools zu verwenden.Sie können i2c-tools mit installieren
sudo apt-get install i2c-tools
, wenn 'i2cdetect' nicht vorhanden ist.Wenn Sie eine PCB Rev. 1: Änderung
i2cdetect -y 1
zui2cdetect -y 0
, und das alles zu ändern ,1 0x68
um0 0x68
in deni2cdump
Befehlen.Du kannst tun
i2cdetect -y 1
... die '68' zeigt an, dass ein Gerät unter der Adresse 0x68 auf die Adressierung auf dem I2C-Bus geantwortet hat. Wenn Sie den Treiber rtc_ds1307 geladen haben, wird er als 'UU' angezeigt, da er vom Treiber reserviert wird.
Der Befehl
i2cdump -y -f -r 0-6 1 0x68 c
kann verwendet werden, um die ersten 7 Register des ds1307 zu sichern, die die Zeit enthalten (das '-f' wird nur benötigt, wenn Sie den rtc-Treiber installiert haben; es überschreibt die Reservierung).Nachfolgend sehen Sie, was nach dem Einschalten passiert, wenn die RTC durch das Laden des Treibers durch beschädigt wird
dtoverlay=i2c-rtc,ds307
.hwclock -r
meldet zunächst, dass die Uhreinstellung beschädigt ist und das Jahr tatsächlich '66' ist.Die sieben Zahlen von i2cdump sind: [Sek. Min. Std. Wochentag Tag Monat Jahr], alle in bcd, also das letzte Mal ist der 17. November 2015, 01:09:46 UTC.
Die "beschädigte" Zeit ist der 1. Januar 66, und ich habe andere gesehen, die den gleichen Wert gemeldet haben.
quelle
Ich hatte ein ähnliches Problem bei zwei Raspberry Pi 2 Model B mit Arch Linux, einem mit einem TinyRTC (mit dem ds1307) und einem mit einem Kondensator RTC (mit dem ds3231).
Das Ausführen von NTPD als Daemon hat das Datum beider RTC beschädigt und auf 2066/01/01 gesetzt.
Die Einrichtung
Ich habe in /boot/config.txt hinzugefügt
oder
Ich habe in /etc/modules-load.d/raspberrypi.conf hinzugefügt
Ich habe systemd-timesyncd deaktiviert
Ich habe NTP installiert
Wie es es gelöst hat
Ich habe festgestellt, dass durch Starten einer einzelnen Instanz des NTPD vor dem Starten des Dienstes die Systemzeit aktualisiert wird und die RTC nicht festgelegt wird. Wenn ich den NTPD-Dienst danach starte, wird das RTC-Datum aktualisiert, ohne es zu beschädigen.
Ich dachte, es gibt ein Berechtigungsproblem. Die Standardgruppe ist Audio.
Ich habe /etc/udev/40-rtc-permissions.rules erstellt, um es zu testen
aber es hat nicht geholfen, also habe ich es gelöscht.
Ich musste auch das Systemdatum beim Start aktualisieren, da dies nicht automatisch erfolgt.
Ich habe der Datei /etc/ntpd.service hinzugefügt
und aktivierte den NTPD-Dienst
und das Datum wird aktualisiert und während des Startvorgangs nicht beschädigt.
Ich habe nicht herausgefunden, warum der NTPD-Dämon die RTC beschädigt, wenn er zuerst gestartet wird, und würde mich freuen, wenn jemand meine Lösung verbessert, aber das funktioniert für mich.
quelle