RTC auf dem Pandaboard mit dem MCP79410

Das Pandaboard hat zwar eine Echtzeituhr (RTC = Real Time Clock), leider fehlt dieser aber die Versorgung durch eine Batterie, falls das Board nicht über ein Netzteil versorgt wird. Es ist auch nicht möglich eine Batterie anzuschliessen. Die Anschlüsse wurden einfach nicht zugänglich gemacht. Damit ist die RTC eigentlich ziemlich sinnlos, da bei einer Unterbrechung der Stromversorgung die aktuelle Zeit verloren geht. Ein ziemliches Defizit für das Pandaboard, welches immerhin über 150€ kostet.

Abhilfe schafft die Zuschaltung einer weiteren RTC über einen der I2C Schnittstellen des Systems. Als RTC Baustein in Frage kommend ist der MCP79410 http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en550280 von Microchip eine gute Wahl. Dieser verträgt sich wegen seiner niedrigen Versogungsspannung hervorragend mit den 1.8V Pegeln des Pandaboard. Glücklicherweise gibt es bei Ebay für unter 10€ ein kleines Modul fertig bestückt zu bestellen.

Das Modul hat fünf Anschlüsse, GND, Vcc, SDA, SCL und MFP und wird mit der I2C-4 Schnittstelle mit dem Pandaboard verbunden:

MCP79410    Pandaboard
--------    ----------
GND     DGND (Pin 27 oder 28 von J3)
Vcc     VIO_1V8 (Pin 1 von J3)
SDA     I2C4_SDA (Pin 23 von J3)
SCL     I2C4_SCL (Pin 24 von J3)
MFP     -

Manuelles aktivieren der RTC

Im Forumsthread unter https://www.element14.com/community/message/58851 und auf der Wiki-Seite des Gnublin-Boards http://wiki.gnublin.org/index.php/RTC_DS1307 sind Anleitungen und Hinweise für die manuelle Aktivierung des MCP79410 zu finden.

Als Kernel-Treiber kann glücklichweise der Treiber des RTC Baustein DS1307 verwendet werden. Dieser muss (wenn nicht bereits geschehen) im Kernel mit

CONFIG_RTC_DRV_DS1307=m

eingebunden werden. Danach kann dieser verwendet werden:

modprobe rtc_ds1307
echo mcp7941x 0x6f > /sys/class/i2c-dev/i2c-4/device/new_device

Auszug aus den Kernelmeldungen: ... [ 5621.986755] rtc-ds1307 4-006f: rtc core: registered mcp7941x as rtc1 [ 5621.986785] rtc-ds1307 4-006f: 64 bytes nvram [ 5621.986816] i2c i2c-4: new_device: Instantiated device mcp7941x at 0x6f ...

Der Treiber legt /dev/rtc1 an. Dieser Pfad wird verwendet, weil /dev/rtc0 bereits durch die RTC des Pandaboardes angelegt wurde. So ist die neue Uhr mit dem Programm hwclock nicht sofort verwendbar. Es kann aber die Umleitung /dev/rtc, welche auf /dev/rtc0 verweist und von hwclock verwendet wird, gelöscht und neu verweisend auf /dev/rtc1 angelegt werden.

rm -rf /dev/rtc
ln -sn /dev/rtc1 /dev/rtc

Danach kommuniziert - bis zum Reboot - hwclock mit der neuen RTC.

Lesen und Schreiben der RTC

Mit

hwclock -r

kann die aktuelle Uhrzeit ausgelesen werden. Solle die Uhrzeit der RTC von der Systemzeit des Betriebssystems gesetzt (System --> RTC) werden, kann dies mit

hwclock -w

geschehen. Der umkehrte Weg (RTC --> System), die RTC setzt die Systemzeit, erfolgt mit

hwclock -s

Automatische Aktivierung der RTC

Ist es gewünscht das Modul dauherhaft einzusetzen, macht es Sinn diese fest im Kernel einzubinden und die "nutzlose" RTC des Pandaboard zu deaktivieren.

In der Konfiguration des Kernels wird dazu der DS1307 Treiber fest eingbebunden und der Treiber der Standard RTC des Pandaboard deaktiviert:

CONFIG_RTC_DRV_TWL4030=n
CONFIG_RTC_DRV_DS1307=y

Die Initialisierung des MCP79410 über die I2C Schnittstelle geschieht am besten durch einen Patch der Datei arch/arm/mach-omap2/board-omap4panda.c in den Kernel-Sourcen. Siehe auch die Dokumentation https://www.kernel.org/doc/Documentation/i2c/instantiating-devices.

Zur Initialisierung wird ein neues Array panda_i2c_rtc[] vom Typ i2c_board_info definiert:

static struct i2c_board_info __initdata panda_i2c_rtc[] = {
    {
       I2C_BOARD_INFO("mcp7941x", 0x6F),
    },
};

Welches in der Funktion omap4_panda_i2c_init referenziert wird:

static int __init omap4_panda_i2c_init(void)
{
    ...    
    // omap_register_i2c_bus(4, 400, NULL, 0);     
    omap_register_i2c_bus(4, 400, panda_i2c_rtc, ARRAY_SIZE(panda_i2c_rtc));
    ...
}

Kernelausgaben nach Neustart:

...
[    0.989624] rtc-ds1307 4-006f: rtc core: registered mcp7941x as rtc0
[    0.989654] rtc-ds1307 4-006f: 64 bytes nvram
[    0.989685] i2c /dev entries driver
...
[    1.342773] rtc-ds1307 4-006f: setting system clock to 2013-12-04 21:32:44 UTC (1386192764)