ジャンル不定の日記です。

Raspberry Pi用のRTCモジュール届いた

注文してたRaspberry Pi用のRTCモジュール届いたんでOrange Pi Zero LTSで試してからOrange Pi R1に゙実装した。
RTCモジュールはi2cの5pinでDS3231がのってるやつ。
10pinでDS1307がのってるモジュールも売ってるが、Orange Piのi2cは3.3vでDS3231は3.3v駆動できるから5pinなわけだが、DS1307は5vデバイスなんで5vを得るために2列10ピンになってて、信号が3.3vだからDS3231を使ったほうが良いぽいんでDS3231のモジュールにした。

Orange PiのGPIOはRaspberry Piと互換性あるんだが基板の左右反対についてるんでRaspberry用のモジュールをつけると基板の外側に飛び出す感じになるんで、
DS3231のモジュールなら1列だからピンソケットを抜いて裏表反対につけなおす可能性も考えた。

dtsを書き直してdtbを作り直したが、
&i2c0 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&i2c0_pins>;

    ds3231: rtc@68 {
        compatible = "maxim,ds3231";
        reg = <0x68>;
    };
};
こんな感じの部分と、aliases{}の中に
    aliases {
        ethernet1 = &rtl8189etv;
                rtc0 = &rtc;
                rtc1 = &ds3231;
    };
書いてAllwinner内臓のrtcが確実にrtc0になってds3231がrtc1になるようにした。

aliases{}内にR1はrtl8189etvがethernet1に設定されててZeroの方も同じ様にxr819がethernet1に設定されてて、wlanなのになぜethernet1なんだ?
思ってGoogleに聞いたら無効だから要らない言われたんだが、これ消すとmacアドレスが起動毎に変化しちゃうようなので必要な設定みたい。
なおR1にはeth1が存在するが、これはUSBデバイスだからdtsに記載がないのね。

あとbuildrootのlinux-menuconfigからCONFIG_RTC_DRV_DS1307=yにした。DS3231もDS1307のドライバでいいらしい。

起動して/dev/rtc1が出現したんで
# hwclock -f /dev/rtc1
でRTCデバイスから時刻取得
# hwclock -w -f /dev/rtc1
でシステムの時刻をRTCデバイスに書き込み。
# hwclock -s -f /dev/rtc1
でRTCからシステム時刻をセット。

ntpdが動く前に1970年に戻ってるのが問題なんでinitの最初で読み込もうかとも思ったが、シャットダウン時にntpdで修正された時刻をRTCデバイスに書き込む必要があるんで、
/etc/init.d/S00hwclock-rtc1
#!/bin/sh

case "$1" in
    start)
        if [ -e /dev/rtc1 ]; then
            hwclock -s -f /dev/rtc1
        fi
        ;;
    stop)
        if [ -e /dev/rtc1 ]; then
            hwclock -w -f /dev/rtc1
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit 0
こんな感じにした。

これでntpdが起動する前に生成されるファイルのタイムスタンプが1970年に戻らなくなった。