Ubuntu 20.04 on Raspberry pi 3 B+ でRTC（DS1307）を設定

# やり方

必要なパッケージをインストールします。

```shell
sudo apt update
sudo apt install i2c-tools libraspberrypi-bin
```

`/boot/firmware/syscfg.txt`を開いて、i2cが有効化されているか確認します。

```/boot/firmware/syscfg.txt
# This file is intended to be modified by the pibootctl utility. User
# configuration changes should be placed in "usercfg.txt". Please refer to the
# README file for a description of the various configuration files on the boot
# partition.

enable_uart=1
dtparam=audio=on
dtparam=i2c_arm=on
dtparam=spi=on
cmdline=cmdline.txt
```

`dtparam=i2c_arm=on`となっていればOKと思います。たぶん。

DS1307をI2Cのピンに配線します。

DS1307が認識されているか確認します。

```shell
sudo i2cdetect -y 1
```

そうすると、こんな感じに表示されると思います。

```
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
```

`0x68`が今回接続したDS1307のアドレスになります。問題なく接続されていそうです。

`/boot/firmware/usercfg.txt`に以下の一行を追加します。

```/boot/firmware/usercfg.txt
dtoverlay=i2c-rtc,ds1307
```

再起動します。

```shell
sudo reboot
```

DS1307がOSの管理下に入ったか確認します。

```shell
i2cdetect -y 1
```

そうると、こんな感じに表示されると思います。

```
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
```

DS1307のアドレス`0x68`が`UU`に変わりました。
これで、DS1307がOSの管理下に入った意味となります。

こうなると、`hwclock`コマンドが使えるようになります。

```shell
sudo hwclock      # RTC時刻の表示
sudo hwclock -w   # システム時刻をRTCに書き込み
sudo hwclock -s   # RTC時刻をシステム時刻に書き込み
```

`timedatectl`コマンドでもRTC時刻を確認できます。

NTPに接続しているシステムであれば、基本的にシステム時刻は正しいと思うので、cronとか使ってたまにDS1307にシステム時刻を書き込んであげれば良いと思いますが、今回特に何もしなくてもDS1307の時刻がシステム時刻と同期されていたので、timedatectlなどが何か自動的にやってくれているのかもしれません。ひとまずcronには何も設定しないでおきます。


起動時にDS1307の時刻を反映させるために、`/etc/udev/rules.d/85-hwclock.rules`というファイルを新規作成して以下の内容を書き込みます。

```
KERNEL=="rtc0", RUN+="/sbin/hwclock --rtc=$root/$name -s"
```

再起動して`/var/log/syslog`を確認してみると

```
Jan 24 10:33:53 localhost kernel: [    3.066602] rtc-ds1307 1-0068: registered as rtc0
Jan 24 10:33:53 localhost systemd[1]: Starting Create Static Device Nodes in /dev...
Jan 24 10:33:53 localhost kernel: [    3.067799] rtc-ds1307 1-0068: setting system clock to 2023-01-24T01:33:27 UTC (1674524007)
･･･
Jan 24 10:36:21 localhost systemd-timesyncd[608]: Initial synchronization to time server xxx.xxx.xxx.xxx:xxx (xxx.jp).
･･･
```

のようになっていたので、起動直後にシステム時刻をDS1307の時刻に一旦合わせたあとに、インターネット接続が確立されてからNTP時刻を参照しているような動作になったようです。

あとは、任意にはなりますが、紛らわしい時刻に万が一にもなってほしくない場合は`fake-hwclock`をアンインストールしておくと良いと思います。

```shell
sudo apt -y remove fake-hwclock
sudo dpkg --purge fake-hwclock
```

# 参考にしたページ
* [https://www.indoorcorgielec.com/resources/raspberry-pi/rpz-powermgr-rtc/](https://www.indoorcorgielec.com/resources/raspberry-pi/rpz-powermgr-rtc/)
* [https://tshell.hatenablog.com/entry/2021/03/04/205346](https://tshell.hatenablog.com/entry/2021/03/04/205346)
*