Milk-V Duo 64Mでbuildrootを使ってみる

Pythonからのデバイス制御

私は新しいボードのデバイスを調べるときには、いつもこちらの python-peripheryライブラリを使います。
python-peripheryはLinuxの汎用デバイスを使うライブラリで、ほとんど全てのLinuxで使うことが出来る汎用性の非常に高 い ライブラリです。
そこで、このライブラリとこちらの ソースを使ってMilk-V Duoのデバイスを調べてみました。
Milk-V Duoのピンマップはこちらに公開されて います。
githubで提供されているbuildrootのイメージではpython3がインストールされていますが、
python-peripheryライブラリはインストールさ れていません。


RNDISによるネットワーク共有を有効にして、python-peripheryライブラリをインストールします。
# time python3 -m pip install python-periphery
Collecting python-periphery
  Downloading python_periphery-2.4.1-py2.py3-none-any.whl (36 kB)
Installing collected packages: python-periphery
Successfully installed python-periphery-2.4.1
real    3m 27.34s
user    0m 18.13s
sys     0m 23.46s

これでpython-peripheryライブラリが使えるようになります。


RNDISによるリモートファイル転送が使えるようになったので、こちらの サンプルコードを母艦側に一式クローンします。
$ git clone https://github.com/nopnop2002/python-periphery-example

次にRNDISを使って、一式Miniボード側に送り込みます。
scpはパスワードが無いアカウントを認めていません。
そこで、事前にMilk-V側にパスワードを登録しておきます。
$ scp -r python-periphery-example root@192.168.42.1:/root

Milk-V側に一式揃いました。
[root@milkv-duo]~# ls -l python-periphery-example/
total 19
-rw------- 1 root root 1088 Jun 23 00:56 LICENSE
-rw------- 1 root root 1650 Jun 23 00:56 README.md
drwxrwxrwx 2 root root 1024 Jun 23 00:56 bmp180-i2c
drwxrwxrwx 2 root root 1024 Jun 23 00:56 bmp280-i2c
drwxrwxrwx 2 root root 1024 Jun 23 00:56 bmp280-softspi
drwxrwxrwx 2 root root 1024 Jun 23 00:56 bmp280-spi
drwxrwxrwx 2 root root 1024 Jun 23 00:56 gpio
drwxrwxrwx 2 root root 1024 Jun 23 00:56 hc595
drwxrwxrwx 2 root root 1024 Jun 23 00:56 hdd44780
drwxrwxrwx 2 root root 1024 Jun 23 00:56 hdd44780-hc595
drwxrwxrwx 2 root root 1024 Jun 23 00:56 hdd44780-pcf8574
drwxrwxrwx 2 root root 1024 Jun 23 00:56 i2cscan
drwxrwxrwx 2 root root 1024 Jun 23 00:56 leds
drwxrwxrwx 2 root root 1024 Jun 23 00:56 mcp23017
drwxrwxrwx 2 root root 1024 Jun 23 00:56 pcf8574
drwxrwxrwx 2 root root 1024 Jun 23 00:56 pwm
drwxrwxrwx 2 root root 1024 Jun 23 00:56 uart

デバイスファイルを確認しますが、オンボードLEDを制御するためのledsデバイスは有りません。



i2c

i2cデバイスとしてこれらが定義されています。


BMP280の温度センサーを使用してi2cデバイスの動作を確認してみました。
BMP280は4ピン仕様(i2c専用)と6ピン仕様(i2c/SPI兼用)のモジュールが有ります。
4ピン仕様のモジュールのi2cアドレスは0x76固定となっています。
6ピン仕様のモジュールをi2cで使うときは以下の結線でi2cモジュールとして使うことができます。
BMP280 Host
VCC 3V3
GND GND
SCL SCL
SDA SDA
CSB 3.3V
SDO i2cアドレス選択
Gnd=0x76/3.3V=0x77

/dev/i2c0と/dev/i2c1をi2cとして使うことができます。
GPIO番号=508(SCL)/509(SDA)にBMP280を接続し、以下のコマンドで正しく読み出せることを確認しました。


GPIO番号=426(SCL)/425(SDA)にBMP280を接続し、以下のコマンドで正しく読み出せることを確認しました。



SPI

SPIデバイスとしてこれらが定義されています。


同じ、BMP280の温度センサーを使用してSPIデバイスの動作を確認してみました。
BMP280には4ピン仕様のモジュールと、6ピン仕様のモジュールが有ります。
SPIで使うときは6ピン仕様のモジュールを使う必要が有ります。
6ピン仕様のモジュールのピンマーキングは向って左から
SDO CSB SDA SCL Gnd Vcc
となっていますが、SPIで使う場合
MISO CS MOSI CLK Gnd Vcc
となります。
BMP280 Host
VCC 3V3
GND GND
SCL SPI SCLK
SDA SPI MOSI
CSB SPI CS
SDO SPI MISO

ピンマップによるとGPIO番号=375(SCLK)/374(MOSI)/373(MISO)/370(CS)のはずですが、
/dev/spidev0.0 も /dev/spidev1.0 も動きません。
こ ちらに解決策が公開されていますが、SPI2を有効にしたイメージを再構築する必要が有ります。
公式のbuildrootイメージで動くようにして欲しいです。


UART

UARTデバイスとしてこれらが定義されています。


/dev/ttyはデバッグポートでTX=496/RX=497です。
/dev/ttyS4はTX=378/RX=377にアサインされています。
ピン番号=378(TX)/377(RX)にUSB-TTLコンバータを接続し、WindowsのTeraTermを使って通信してみました。
TeraTerm側に「Hello World!」が表示され、TeraTermで入力した文字がMilk-V側に表示されます。



LED

オンボードLEDを制御するためのledsデバイスは定義されていません。



GPIO

以下のコマンドでGPIO495に繋いだLEDがブリンクします。
通常のGPIOとして使えるのはGPIO番号が356/494/495/502/503/504/505/506/507の9本だけです。
GPIO356はなぜか3V3が出ません。
また、GPIO371/372はUART/I2C/SPI/GPIOのいずれにもアサインされていません。
# python3 gpio.py --gpio 495


PWM

PWMデバイスとしてこれらが定義されています。
これらのデバイスがどのGPIOと結びついているかの資料が有りません。




LuckFox Pico Miniのbuildrootと比べると完成度が低いです。
LuckFox Pico MiniのbuildrootではSPIもPWMも正しく動きます。
せめてSPIは公式イメージで動いて欲しいです。

続く....