Der nächste Schritt hängt von der Board-Revisionsnummer des RasPi ab. Beim älteren Modell (Rev. 1) verwenden Sie die Busnummer 0 beziehungsweise /dev/i2c-0, beim neueren (Rev. 2) dagegen die Busnummer 1. Der Test des Uhrenchips erfolgt wie in Listing 2, wobei sich zeigt, dass der MCP79410 auf zwei I2C-Geräteadressen anspricht: 0x57 und 0x6f. Hinter Ersterer liegt das EEPROM, ein Statusregister und ein Unique-ID Register. An der zweiten liegen der eigentliche Uhrenchip und das SRAM.
Listing 2
$ sudo i2cdetect -y Busnummer
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6f
70: -- -- -- -- -- -- -- --
Als Letztes laden und konfigurieren Sie den Kernel-Zugang zum RTC-Chip und stellen erstmalig die Uhrzeit auf die aktuelle Systemzeit im UTC-Bezug. Da das passende Kernelmodul rtc-ds1307 mehrere Chips bedient, geben Sie hier den entsprechenden Parameter an (Listing 3).
Listing 3
$ sudo modprobe rtc-ds1307 $ sudo echo "mcp7941x 0x6f" > /sys/bus/i2c/devices/i2c-bus#/new_device $ sudo hwclock --systohc -D --utc
Den Erfolg kontrollieren Sie auf einfachem Weg, indem Sie schlicht alle Register des Chips auslesen (Listing 4) und mittels der Registerübersicht (Abbildung 4) deren Inhalte gegen die Datums- beziehungsweise Zeitausgabe prüfen. Dabei gilt es immer, den Zeitbezug mit zu berücksichtigen.
Listing 4
$ sudo hwclock -r && sudo i2cdump -y -f -r 0x00-0x1f bus# 0x6f b
Fr 01 Nov 2013 21:54:14 CET -0.377799 seconds
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 94 54 20 2e 01 11 13 00 00 00 00 00 00 00 00 00
10: 01 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00
Auf Dauerbetrieb
Der Dauerbetrieb erfordert noch ein paar Arbeiten an der Konfiguration, um die manuell vorgenommenen Aktionen zu automatisieren. Deaktivieren Sie dazu in der Datei /etc/modprobe.d/raspi-blacklist.conf den Eintrag blacklist i2c-bcm2708, und tragen Sie stattdessen entweder in der Datei /etc/modprobe.d/raspi.conf die Zeile options i2c-bcm2708 baudrate=400000 oder in /etc/modules die Zeile i2c-dev ein.
Mit sudo update-rc.d fake-hwclock remove und sudo update-rc.d hwclock remove bereinigen Sie die Startskripte. Dann wenden Sie im Verzeichnis /etc/init.d den Patch aus Listing 5 mit dem folgenden Kommando auf das entsprechende Skript an:
$ patch < hwclock.sh.patch
Listing 5
--- hwclock.sh.original 2012-12-22 06:57:47.000000000 +0100
+++ hwclock.sh 2013-11-03 19:27:50.653988109 +0100
@@ -21,10 +21,10 @@
### BEGIN INIT INFO
# Provides: hwclock
-# Required-Start: mountdevsubfs
+# Required-Start: kmod
# Required-Stop: $local_fs
# Default-Start: S
-# X-Start-Before: checkroot
+# X-Start-Before:
# Default-Stop: 0 6
### END INIT INFO
@@ -33,6 +33,7 @@
HWCLOCKACCESS=yes
HWCLOCKPARS=
HCTOSYS_DEVICE=rtc0
+I2CBUS=0
# We only want to use the system timezone or else we'll get
# potential inconsistency at startup.
@@ -43,6 +44,7 @@
[ ! -x /sbin/hwclock ] && return 0
[ ! -r /etc/default/rcS ] || . /etc/default/rcS
[ ! -r /etc/default/hwclock ] || . /etc/default/hwclock
+ [ ! -r /etc/default/rtc ] || . /etc/default/rtc
. /lib/lsb/init-functions
verbose_log_action_msg() { [ "$VERBOSE" = no ] || log_action_msg "$@"; }
@@ -61,8 +63,8 @@
printf "0.0 0 0.0\n0\nUTC" > /etc/adjtime
fi
- if [ -d /run/udev ] || [ -d /dev/.udev ]; then
- return 0
+ if [ ! -c /dev/HCTOSYS_DEVICE ]; then
+ echo mcp7941x 0x6f > /sys/bus/i2c/devices/i2c-$I2CBUS/new_device
fi
if [ "$HWCLOCKACCESS" != no ]; then
Außerdem fügen Sie das neue Startskript aus Listing 6 hinzu. Beide Startskripte lesen aus der Datei in Listing 7 den zu verwendenden I2C-Bus.
Listing 6
#!/bin/sh
### BEGIN INIT INFO
# Provides: raspi-rtc-power
# Required-Start: kmod
# Required-Stop: halt
# X-Stop-After: networking
# Default-Start: S
# Default-Stop: 0
# Short-Description: on/off Raspi-RTC-Power
# Description: switching on/off power via RTC chip on Raspi extension board
### END INIT INFO
set -e
. /lib/lsb/init-functions
ALARM=0;
I2CBUS=0;
if [ -r /etc/default/rtc ]; then
. /etc/default/rtc
fi
if [ -r /etc/wakealarm ]; then
ALARM=$(cat /etc/wakealarm)
fi
case "${1:-}" in
start)
log_action_begin_msg "Switching on RasPi-RTC-Power "
modprobe i2c-dev
i2cset -f -y $I2CBUS 0x6f 0x07 0x00
ES=$?
log_action_end_msg $ES
;;
stop)
log_action_begin_msg "Switching off RasPi-RTC-Power "
/sbin/rtc-power $I2CBUS $ALARM
ES=$?
log_action_end_msg $ES
;;
*)
echo "Usage: ${0:-} {start|stop}" >&2
exit 1
;;
esac
Listing 7
# Default settings for Raspi-RTC-Power. This file is # sourced by /bin/sh from /etc/init.d/raspi-rtc-power. # Number of I2C bus hosting the RTC chip: 0 or 1 I2CBUS=bus#
Die nunmehr aktualisierten Startskripte übernehmen Sie mit den folgenden zwei Kommandos wieder in den Systembetrieb:
$ sudo update-rc.d hwclock defaults $ sudo update-rc.d raspi-rtc-power defaults
Wie erwähnt stehen im aktuellen Treiber für den MCP79410 nicht alle notwendigen Funktionen bereit. Daher braucht es noch ein eigenes Programm (siehe Listing 8), um beim Systemstopp sowohl die Weckzeit zu programmieren als auch das Control-Register so zu setzen, dass die Verzögerungszeit des Zeitgebers abläuft [5].
Setzen Sie die Weckzeit auf 0, weckt der Chip den RasPi nicht auf. Das klappt dann nur manuell oder durch Wiederkehr der Stromversorgung. Liegt die Weckzeit aber mindestens 120 Sekunden in der Zukunft, dann gilt diese, ansonsten gilt der Zeitpunkt in genau 120 Sekunden von jetzt als Weckzeit.






