I2Cの0x03~0x07がbullseyeで使えない!?

Seeed K.K.の松岡です。
bullseyeにすると特定I2Cスレーブアドレスと通信できない、Grove Base HAT for Rasberry Piが使えない的なポストが流れてきて、気になったので確認しました。

元ネタ

このポスト。

どう使えなくなったのか?エラーは表示されるのか?など、詳しいことは分かりませんが気になります。

i2cdetect -y 10307が表示されない

まず事象が再現するか確認します。
microSDにRaspberry Pi OS buster(2021-05-07 64-bit)を書き込んで、Grove Base HAT for Raspberry Piを載せたRaspberry Pi 4で起動します。デフォルトではI2Cが無効なので、raspi-configでI2Cを有効化します。i2c-1にぶら下がっているI2Cスレーブアドレスを確認するためにi2cdetect -y 1コマンドを実行すると、

pi@raspberrypi:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- 04 -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

04が表示されました。これがGrove Base HAT for Raspberry Piに載っているマイコンSTM32F030のI2Cスレーブアドレスです。

では、OSをRaspberry Pi OS bullseye(2023-05-03 64-bit)に変更して確認します。
busterのときと同様にI2Cを有効化してi2cdetect -y 1コマンドを実行すると、

pi@raspberrypi:~ $ 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi:~ $

04が表示されませんね...。
そればかりか、I2Cスレーブアドレス0307のハイフン表示も無くなってしまいました。🤔

i2c-toolsが更新されていた

ネットを検索したところ、Raspberry Pi Forumに該当する情報がありました。

git.kernel.org

tools: restrict all addresses defined by the standard

0307は予約済のアドレスだから除外したようです。

i2cdetectコマンドのオプションでアドレス範囲を指定することができる(!)らしく、i2cdetect -y -a 1 0x03 0x77としたところ表示されました。🎉

pi@raspberrypi:~ $ i2cdetect -y -a 1 0x03 0x77
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- 04 -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi:~ $

Grove Base HAT for Raspberry Piはbullseyeでも使えるのか?

Seeed公式が案内しているGrove.pyライブラリで確認したところ(adc.pyを変更すれば)動きました。

adc.pyの変更についてはSeeed公式に注記がありまして、

Due to chip shortage, we have replaced STM32 with MM32 in the latest version of the product, and the I2C address of the corresponding product has been changed from 0x04 to 0x08 in the old version, please change the I2C address in adc.py from 0x04 to 0x08 when using the library file provided by seed for development.

この文書によると、

  • MM32のを使うときはadc.pyの0x04を0x08に書きかえろ。

ですが、実際は、

  • Grove.pyはMM32用に書きかえた。
  • STM32のを使うときはadc.pyの0x08を0x04に書きかえろ。

でした。。。

該当するOSコードネームは?

さて、どのOSコードネームから更新されたのでしょうか?

i2c-toolsのmasterブランチを見ると、v4.2以降はこの振る舞いになるようです。

Debianのパッケージ検索によるとbusterはv4.1ベース、bullseyeはv4.2ベース、bookwormはv4.3ベースでした。
結果、bullseye以降でした。

I2Cの予約アドレスは?

ついでに、I2Cの予約アドレスについても。

I2Cの予約済アドレスはUM10204 I2Cバス仕様およびユーザーマニュアルに記載がありました。0b0000xxxと0b1111xxxが予約済です。ということは、0b0001000~0b1110111(0x08~0x77)が予約されていないアドレス範囲になります。

まとめ

  • i2cdetect0307が表示されなくなった。
  • 表示されなくなったのはbullseye以降。
  • オプションを指定すれば表示させることが可能。
  • i2c-toolsの更新による影響なので、i2c-toolsを使わないI2Cアクセスには影響ない(はず)。
  • そもそも、予約済アドレスを使うのはやめよう。

参考リンク