2021年6月27日日曜日

Raspberry Pi 3BでRX8900を使ってみる

 ラズパイをスタンドアロンで使うときに時計が狂うのが気になる…
ということでRTCを導入してみた。ラズパイでRTCって言うとMaximのDS1307とかDS3231が有名だと思うけど今回は秋月で売っていたEPSONのRX8900にしてみた。

秋月ではいくつかEPSONのRTCを扱ってるみたいだけどRX8900はVBAT端子が付いてるから楽かも?ということで。しかしRaspberry Pi OSではデフォルトでドライバモジュールが入っていないのでDS1307とかみたいにお手軽ではないけど…
そして結局VBATがついていてもダイオード必要なのは変わらず…

というわけで今回はバッテリバックアップRTCとして使用するので、回路的にはVBATにダイオードと抵抗(100Ω)を介してCR2032を接続する形にした。ダイオードはアプリケーションノートだとショットキーバリアを使うように指示されていたけどラズパイみたいな3.3V駆動だと電池が元気なうちは3.2Vぐらい出ている事によって内蔵ダイオードとのVFのバランスで無駄に電池消耗するんじゃないかということで低リークなスイッチングダイオードにした。
ちなみに0.1uFのコンデンサ2つは秋月の基板に内蔵されている。

お次はドライバモジュールのビルド。EpsonのダウンロードページにLinux用のドライバモジュールが公開されている。使用許諾ページを経てダウンロードページへ進むと、RX8900用のLinux用ドライバソース(rx8900_k3.8-v1.0.zip)がおいてあるんだけど、カーネルバージョンが古すぎて自分の手ではうまく修正できなかった…

ということでRX8900のアプリケーションノートを見ていると、RX8804CEあたりが評価ボード同じそうだし、レジスタが共通らしい?ということで先程のダウンロードページからRX8804CE用のドライバソース(rx8804_k4.1-v1.1.zip)をダウンロードしてみた。解凍してみると、readmeにRaspberry Pi 3が載ってるし行けそう。と思ったがそのままではビルドできなかった…
こちらのソースはカーネルバージョン4.1用なのでRX8900のやつよりは新しいんだけど、今のRaspberry Pi OSが5.10だしな…
しかしエラーメッセージを頼りに少し編集したら行けたので忘れないようにメモ。

まずはカーネルヘッダーが必要なのでapt-getでインストールする。

sudo apt-get update
sudo apt-get install raspberrypi-kernel-headers

180MBくらいあるので3分ぐらいかかった。
お次はダウンロードしたドライバソースを解凍して準備

unzip rx8804_k4.1-v1.1.zip
cd RX8804

まずはMakefileがクロスコンパイル仕様になっていたので修正。
6行目、KDIRのところを

KDIR :=/lib/modules/$(shell uname -r)/build

にする
11行目、CROSS_COMPILEから始まる行をごっそり

$(MAKE) -C $(KDIR) M=$(shell pwd) modules

に書き換える。このとき先頭のタブでインデントされてるところは消さないこと。

あとはrtc-rx8804.cの中で「rtc_irq_set_state」のある行(424行目と428行目)をコメントアウト。どうやらrtc_irq_set_stateが定義されていないとかエラーが出るし、PIE使わないからいいかと…

これでmakeすると無事ビルドが通ってrtc-rx8804.koが完成した。

make
sudo cp rtc-rx8804.ko /lib/modules/$(uname -r)/
cd /lib/modules/$(uname -r)/
sudo depmod
cd

これでモジュールのインストールは完了
本当はi2c-rtc.dtboもRX8804対応にすればconfig.txtで設定できるんだろうけども今回はよくわからなかったので起動時に読み込むようにした。これによりNTPがつながらないときにRTCに適当な時間を書き込んでしまうという減少も起きなかったし…

あとはI2Cを有効にした状態で
/etc/rc.localのexit 0の前に

sh -c 'echo rx8804 0x32 > /sys/class/i2c-adapter/i2c-1/new_device'
/sbin/hwclock --hctosys

この二行を追加して保存するだけ。
これで起動時にRTCが読み込まれるようになるので
timedatectlコマンドを実行するとRTCのところがn/aだったのが時刻が表示されるようになっていた。ネットに繋がった状態で実行したので自動で時刻も調整されていた…

しかし結局カーネルのバージョンが上がるとビルドし直しなので、ラズパイでかんたんにRTC使うならデバイスツリーに対応したデバイスがいいのかも。/boot/overlays のなかのREADMEのi2c-rtcのところにリストがある。
今の所、abx80x, bq32000, ds1307, ds1339, ds1340, ds3231, m41t62, mcp7940x, mcp7941x, pcf2127, pcf2129, pcf85063, pcf85063a, pcf8523, pcf85363, pcf8563, rv1805, rv3028, sd3078, s35390aが対応しているらしい?
この他にもレジスタが互換のやつは使えるらしい。たとえば秋月で売ってるRTC-8564NBはpcf8563で使えるらしいし。RTC-8564NBにしておけばよかったー

0 件のコメント:

コメントを投稿