Raspberry Pi で RV8803 (RTC)  のモジュールを使う

TamaDevice さんの下記のデバイスを Raspberry Pi で使う手順についての個人的なまとめです。下記のページと書いてあることは基本同じですが、書いてある通りの方法ではうまくいかなかった部分や、不足していると思われる情報を補足してます。

- [高精度リアルタイムクロック RV-8803-C7 評価基板（バックアップ電池付き）](https://tamadevice.co.jp/rv8803-raspi-1.htm#command)

## 前提

- Raspberry Pi 3 Model B 
- Raspbian 10.7 (desktop あり)
- [ＲＶ-8803-Ｃ7](https://tamadevice.co.jp/pdf/mc/rtc/RV8803-Raspi-board.pdf)

上記環境およびデバイスで動作することを確認済み。

## 設定のパネルで i2c を有効にする

デスクトップのメニューの「設定」「Raspberry Pi の設定」で開くウィンドウの「インターフェース」のタブのところで I2C を「有効」にしてお OK を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/efe4c5d6-06a3-8249-57b9-49d070acd2ba.png)

OK を押すと、再起動しろと言われるので、シャットダウンして電源を OFF にしておく。

## デバイスを差す

下の図の感じで、二列ある raspberry pi 3 の基板の内側のほうのピンに、この図の向きでソケットを差しこむ。外側に差したり、反対に差すと動かない(デバイスが壊れるかもしれない)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/9f4703e8-c18c-ce02-9d2b-5f71c2a5f99b.png)

差しこんだら、raspberry pi を起動する。

## デバイスが認識されていることの確認

起動したらターミナル (LXTerminal) を開いて、下記のコマンドをうつ。

```
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- 32 -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --      
```
0x32 のところが `32` と表示されていれば、RV8803 の基板が正常に差しこまれている。もし何も表示されていなければ、差しこむ場所がまちがっているか、向きが間違っているか、I2C が有効になっていないか、RV8803 基板が壊れているか、pi の GPIO が壊れているかのいずれか(多分)。

## ドライバの取得

下記のページで、ダウンロードのリクエストができる。ブラウザを使ってアクセスする。

- [MicroCrystalのドライバのページ](https://www.microcrystal.com/en/contacts/linux-driver/)

上記 URL でメールアドレスを入れると、ダウンロードできる URL のリストがメールで送られてくる。メールの中にあるリストの中から 'rv8803.zip' を選んでダウンロードする。`/home/pi` にダウンロードしたものとして、以下手順を示す。

## ファイルを展開する

```
$ unzip rv8803.zip
$ cd rv8803/rv8803
```

## 必要なライブラリをインストール

```
$ sudo apt install automake autoconf libtool raspberrypi-kernel-headers build-essential git
```

## make する

```
$ make
```

これで `rtc-rv8803.ko` ができる。

## modprobe する

ドライバを置くディレクトリを `modprobe` で調べておく。

```
$ modprobe rtc-rv8803
modprobe: FATAL: Module rtc-rv8803.ko not found in directory /lib/modules/5.4.79-v7+
```

こんな感じでエラーになるので、見つからないと言われているディレクトリ(上の場合は `/lib/modules/5.4.79-v7+`) に `rtc-rv8803.ko` をコピーする。そのあとで `depmod` する。

```
$ sudo cp rtc-rv8803.ko /lib/modules/5.4.79-v7+
$ cd /lib/modules/5.4.79-v7+
$ sudo depmod
$ sudo modprobe rtc-rv8803
$ sudo bash -c 'echo rv8803 0x32 > /sys/class/i2c-adapter/i2c-1/new_device'
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --      
```

最後の `i2cdetect` コマンドで `0x32` のところが `UU` になっていれば hwclock として認識されている(はず)。

なお、OS を再起動するたびに`bash -c` のコマンドは実行しないといけないぽい。

## 時刻を読みだす

下記コマンドでデバイスのファイルを確認しておく。

```
$ ls /dev/rtc*
/dev/rtc /dev/rtc0
```
他に RTC を使っていなければ、だいたいは `/dev/rtc0`だけができているはず。これを `hwclock` コマンドで指定すれば、下記のように時刻を読みだせる。

```
$ sudo hwclock -r --rtc /dev/rtc0
2021-01-06 01:00:00.123456+09:00
```

RV8803 は出荷時に時刻が設定されており、ボタン電池もついているため、明示的に時刻の書き込みなどの設定をしなくても、時刻を読みだすことができる。

`/etc/default/hwlock` の中にある、

```
#HCTOSYS_DEVICE=rtc0
```

の行頭の `#` をはずしておけば、デフォルトの RTC として認識されるようになり、ファイル名の指定をしなくても時刻を読み出せるようになる(多分)。

## その他

その他のことは下記をどうぞ。

- [高精度リアルタイムクロック RV-8803-C7 評価基板（バックアップ電池付き）](https://tamadevice.co.jp/rv8803-raspi-1.htm#command)
- [ＲＶ-8803-Ｃ7](https://tamadevice.co.jp/pdf/mc/rtc/RV8803-Raspi-board.pdf)