あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Compute Module 4のIOボードについてるRTCをさわる

Raspberry Pi Advent Calendar 2020の17日目です。19日目にまめもさん、21日目にgyaboが入ってくれたので、明日書いたら次回は22日目までゆっくり次のネタを考えられそうです。

adventar.org

いつまで引っ張るんだCompute Module 4ネタと言う感じですが、機能的にはまだ色々あるのでネタもたくさんあります。カメラとかまだつないでないしね。で、今日はRTCモジュールを触ります。

RTC

RTCはReal Time Clockの略で、要するに時計機能です。普通のPCにはRTCがついています(ボタン電池がPCのシステムボードにあるのはこれの時刻を維持するためです)が、Raspberry PiにはRTCが搭載されていないので、インターネット接続なしに起動するとfake-hwclockというサービスが前回のシャットダウンした時間に復元します。

Raspberry Piの初期の頃からI2C接続RTCモジュールなどが販売されていて、それを使えばRaspberry Piでも時刻の維持はできていました。

CM4のIOボードにRTCがついた

何の気まぐれかは不明ですが、Compute Module 4のIOボードにはRTCが実装されています。今までCompute ModuleのIOボードにはなかったので、今回が初です。電池はそこらで普通に買えるCR2032が使えるように電池スロットが用意されています。

f:id:Akkiesoft:20201216193736j:plain

電池の横にあるRTCチップの数字を読み取って検索するとPCF85063Aというものが使われていました。検索ワードに更にRaspberry Pi Compute Module 4を足すと、10日前のフォーラムの記事が出てきました。

www.raspberrypi.org

曰く、中の人がこのチップが採用されたことに気づいておらず、チップのドライバーが現在のカーネルに組み込まれていないので、組み込まれるまでは自分でソースをコンパイルするか、rpi-updateをするか、aptでカーネルが降ってくるまで待ってほしいとのこと。ワロタ。誰も使ってなかったのかよ。

数日前にPCIeデバイスのために実行したrpi-updateで降ってきたカーネルではすでに使えるようになっていたため、この環境で設定をやってみます。

設定する

設定の前に、現在はRTCがないことをtimedatectlコマンドで確認します。RTC timeがn/aになっているのでなさそうですね。

pi@m2ssd:~ $ timedatectl
               Local time: 水 2020-12-16 19:58:01 JST
           Universal time: 水 2020-12-16 10:58:01 UTC
                 RTC time: n/a
                Time zone: Japan (JST, +0900)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no

それでは設定していきます。PCF85063AはI2C接続なので、I2Cを有効にしておきます。

pi@m2ssd:~ $ sudo raspi-config nonint do_i2c 0

/boot/configに設定を追加します。最新のEEPROM(beta版2020-12-11 == stable版2020-12-14)を適用済みなら[cm4]セクションを作ってその中に書くと良いですが、そうでなければ最後の[all]のあとに書いても良いでしょう。おすすめは前者ですかね。

pi@m2ssd:~ $ sudo vi /boot/config.txt 
(ファイルの最後の方に移動して)

[pi4]
# Enable DRM VC4 V3D driver on top of the dispmanx display stack
dtoverlay=vc4-fkms-v3d
max_framebuffers=2

# ここから
[cm4]
dtparam=i2c_vc=on
dtoverlay=i2c-rtc,pcf85063a,i2c_csi_dsi
# ここまで

[all]
#dtoverlay=vc4-fkms-v3d
#EEPROM適用前ならここにdtparamとdtoverlayの2行をここに書く

設定を書けたら再起動して、再度timedatectlコマンドを実行します。おーRTC timeに時刻が入ってますね。

pi@m2ssd:~ $ timedatectl 
               Local time: 水 2020-12-16 19:56:22 JST
           Universal time: 水 2020-12-16 10:56:22 UTC
                 RTC time: 水 2020-12-16 10:56:23
                Time zone: Japan (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

フォーラムの記事曰く、dmesgでこのあたりを確認するのも良さそうです。

pi@m2ssd:~ $ dmesg | grep rtc
[    8.659511] rtc-pcf85063 10-0051: registered as rtc0

まとめ

Compute Module 4のIOボードについてるRTCを使う方法を紹介しました。

LANに接続されていて、インターネットにアクセスできるか、出られなくてもLAN内にNTPサーバーがあるような環境であれば、RTCがなくてもRaspberry Piが起動する時に自動的に時刻が同期されて問題なく利用できますが、そうでない環境であればRTCは有効な時刻保持手段となります。

とはいえ私も基本的にネットワークに接続して使うので、とりあえず電池を突っ込んではみたもののあまり意味はない感じです。まあ、ついてたのでやってみたかったんです。

まああとは、そんな感じの需要だから、発売後ややしばらく経ってから、実はドライバーがカーネルに含まれてねえという話が出るのかもしれませんが。apt upgradeで降ってくるカーネルにドライバーが含まれるようになるのは数週間後とのことなので、年明けにはカーネル周りの云々をせずとも、すっと設定できるようになっているかと思います。