M5Stack MP135のGPIO・i2c調査

# はじめに

M5Stack MP135にM5_CoreMP135_debian12_20240628のイメージを書き込んで起動して、GPIOやi2cがどのように認識されてるか調査しました。

# GPIOの調査

Port CのGPIOが使いやすそうなので、どのGPIOにつながっているか、[ドキュメント](https://docs.m5stack.com/en/core/M5CoreMP135)でみてみるとPC6,PC7となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/1a7244fc-12b9-8633-5e15-09e72d7bc231.png)

PC7がGPIOの何番か調べた結果

```
pin 38 (PC6) 6:GPIOC
pin 39 (PC7) 7:GPIOC
```

<details><summary>調べ方</summary>

```
root@CoreMP135:/sys/class/gpio# cat /sys/kernel/debug/pinctrl/*/pins
registered pins: 135
pin 0 (PA0) 0:GPIOA
pin 1 (PA1) 1:GPIOA
pin 2 (PA2) 2:GPIOA
pin 3 (PA3) 3:GPIOA
pin 4 (PA4) 4:GPIOA
pin 5 (PA5) 5:GPIOA
pin 6 (PA6) 6:GPIOA
pin 7 (PA7) 7:GPIOA
pin 8 (PA8) 8:GPIOA
pin 9 (PA9) 9:GPIOA
pin 10 (PA10) 10:GPIOA
pin 11 (PA11) 11:GPIOA
pin 12 (PA12) 12:GPIOA
pin 13 (PA13) 13:GPIOA
pin 14 (PA14) 14:GPIOA
pin 15 (PA15) 15:GPIOA
pin 16 (PB0) 0:GPIOB
pin 17 (PB1) 1:GPIOB
pin 18 (PB2) 2:GPIOB
pin 19 (PB3) 3:GPIOB
pin 20 (PB4) 4:GPIOB
pin 21 (PB5) 5:GPIOB
pin 22 (PB6) 6:GPIOB
pin 23 (PB7) 7:GPIOB
pin 24 (PB8) 8:GPIOB
pin 25 (PB9) 9:GPIOB
pin 26 (PB10) 10:GPIOB
pin 27 (PB11) 11:GPIOB
pin 28 (PB12) 12:GPIOB
pin 29 (PB13) 13:GPIOB
pin 30 (PB14) 14:GPIOB
pin 31 (PB15) 15:GPIOB
pin 32 (PC0) 0:GPIOC
pin 33 (PC1) 1:GPIOC
pin 34 (PC2) 2:GPIOC
pin 35 (PC3) 3:GPIOC
pin 36 (PC4) 4:GPIOC
pin 37 (PC5) 5:GPIOC
pin 38 (PC6) 6:GPIOC
pin 39 (PC7) 7:GPIOC
pin 40 (PC8) 8:GPIOC
pin 41 (PC9) 9:GPIOC
pin 42 (PC10) 10:GPIOC
pin 43 (PC11) 11:GPIOC
pin 44 (PC12) 12:GPIOC
pin 45 (PC13) 13:GPIOC
pin 46 (PC14) 14:GPIOC
pin 47 (PC15) 15:GPIOC
pin 48 (PD0) 0:GPIOD
pin 49 (PD1) 1:GPIOD
pin 50 (PD2) 2:GPIOD
pin 51 (PD3) 3:GPIOD
pin 52 (PD4) 4:GPIOD
pin 53 (PD5) 5:GPIOD
pin 54 (PD6) 6:GPIOD
pin 55 (PD7) 7:GPIOD
pin 56 (PD8) 8:GPIOD
pin 57 (PD9) 9:GPIOD
pin 58 (PD10) 10:GPIOD
pin 59 (PD11) 11:GPIOD
pin 60 (PD12) 12:GPIOD
pin 61 (PD13) 13:GPIOD
pin 62 (PD14) 14:GPIOD
pin 63 (PD15) 15:GPIOD
pin 64 (PE0) 0:GPIOE
pin 65 (PE1) 1:GPIOE
pin 66 (PE2) 2:GPIOE
pin 67 (PE3) 3:GPIOE
pin 68 (PE4) 4:GPIOE
pin 69 (PE5) 5:GPIOE
pin 70 (PE6) 6:GPIOE
pin 71 (PE7) 7:GPIOE
pin 72 (PE8) 8:GPIOE
pin 73 (PE9) 9:GPIOE
pin 74 (PE10) 10:GPIOE
pin 75 (PE11) 11:GPIOE
pin 76 (PE12) 12:GPIOE
pin 77 (PE13) 13:GPIOE
pin 78 (PE14) 14:GPIOE
pin 79 (PE15) 15:GPIOE
pin 80 (PF0) 0:GPIOF
pin 81 (PF1) 1:GPIOF
pin 82 (PF2) 2:GPIOF
pin 83 (PF3) 3:GPIOF
pin 84 (PF4) 4:GPIOF
pin 85 (PF5) 5:GPIOF
pin 86 (PF6) 6:GPIOF
pin 87 (PF7) 7:GPIOF
pin 88 (PF8) 8:GPIOF
pin 89 (PF9) 9:GPIOF
pin 90 (PF10) 10:GPIOF
pin 91 (PF11) 11:GPIOF
pin 92 (PF12) 12:GPIOF
pin 93 (PF13) 13:GPIOF
pin 94 (PF14) 14:GPIOF
pin 95 (PF15) 15:GPIOF
pin 96 (PG0) 0:GPIOG
pin 97 (PG1) 1:GPIOG
pin 98 (PG2) 2:GPIOG
pin 99 (PG3) 3:GPIOG
pin 100 (PG4) 4:GPIOG
pin 101 (PG5) 5:GPIOG
pin 102 (PG6) 6:GPIOG
pin 103 (PG7) 7:GPIOG
pin 104 (PG8) 8:GPIOG
pin 105 (PG9) 9:GPIOG
pin 106 (PG10) 10:GPIOG
pin 107 (PG11) 11:GPIOG
pin 108 (PG12) 12:GPIOG
pin 109 (PG13) 13:GPIOG
pin 110 (PG14) 14:GPIOG
pin 111 (PG15) 15:GPIOG
pin 112 (PH0) 0:GPIOH
pin 113 (PH1) 1:GPIOH
pin 114 (PH2) 2:GPIOH
pin 115 (PH3) 3:GPIOH
pin 116 (PH4) 4:GPIOH
pin 117 (PH5) 5:GPIOH
pin 118 (PH6) 6:GPIOH
pin 119 (PH7) 7:GPIOH
pin 120 (PH8) 8:GPIOH
pin 121 (PH9) 9:GPIOH
pin 122 (PH10) 10:GPIOH
pin 123 (PH11) 11:GPIOH
pin 124 (PH12) 12:GPIOH
pin 125 (PH13) 13:GPIOH
pin 126 (PH14) 14:GPIOH
pin 128 (PI0) 0:GPIOI
pin 129 (PI1) 1:GPIOI
pin 130 (PI2) 2:GPIOI
pin 131 (PI3) 3:GPIOI
pin 132 (PI4) 4:GPIOI
pin 133 (PI5) 5:GPIOI
pin 134 (PI6) 6:GPIOI
pin 135 (PI7) 7:GPIOI
root@CoreMP135:/sys/class/gpio#
```
</details>

GPIOを使ってみる

[/sys/class/gpioを通してGPIOにアクセス](http://forestofazumino.web.fc2.com/turtlereal/turtlereal_gpio.html)を参考にGPIOが使えるか試して見る

```bash
root@CoreMP135:/# echo 39 > /sys/class/gpio/export
-bash: echo: write error: Invalid argument
```
うまくいかない。

dmesgを確認するとserialポートとして使われているので、使えないというエラー。確かにPC7はPORT Cでシリアルポートとして使われているので、正しい。
```bash
[134733.553210] stm32mp135-pinctrl soc:pinctrl@50002000: pin PC7 already requested by 44003000.serial; cannot claim for GPIOC:39
[134733.553315] stm32mp135-pinctrl soc:pinctrl@50002000: pin-39 (GPIOC:39) status -22
```

シリアルポートを停止して、GPIOを使えないか、いろいろ試みてみましたが、うまく行かない。
次のコマンドを実行すると、帰ってこない。
```bash
root@CoreMP135:/# systemctl stop sys-devices-platform-soc-44003000.serial-tty-ttySTM0.device
```

状態を確認してみると、stoppingがTimed outしてる。止める機能が実装されてないのね。

```bash
root@CoreMP135:/# systemctl status sys-devices-platform-soc-44003000.serial-tty-ttySTM0.device
● sys-devices-platform-soc-44003000.serial-tty-ttySTM0.device - /sys/devices/platform/soc/44003000.serial/tty/ttySTM0
     Loaded: loaded
     Active: active (plugged) since Thu 2024-09-05 12:40:42 UTC; 1 day 13h ago
     Device: /sys/devices/platform/soc/44003000.serial/tty/ttySTM0

Sep 06 12:33:56 CoreMP135 systemd[1]: sys-devices-platform-soc-44003000.serial-tty-ttySTM0.device: Job sys-devices-plat>
Sep 06 12:33:56 CoreMP135 systemd[1]: Timed out stopping sys-devices-platform-soc-44003000.serial-tty-ttySTM0.device - >
Sep 06 12:33:56 CoreMP135 systemd[1]: sys-devices-platform-soc-44003000.serial-tty-ttySTM0.device: Job sys-devices-plat>
root@CoreMP135:/#
```

結論
- GPIOの認識はできている
- デバイスツリーでシリアルポートを無効にすれば使えそう
- [Overlay Device Trees support](https://docs.m5stack.com/en/guide/linux/coremp135/dtbo)でデバイスツリーの追加はできそう

# I2C調査

M5STACK-U171をつないで検出されるか確認
ドキュメントによれば、PORTAのi2cは、/dev/i2c-1。番号は１番の様子。

```
root@CoreMP135:/sys/class/gpio# 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: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
root@CoreMP135:/sys/class/gpio#
```

取り外すと、68,76が表示されなくなるので、確かに検知されてる。
これは問題なく使えそう。