はじめに
遊んでいるRaspberry pi zero w があるので、何かに使えないか、と gamepi20 なるものを購入。しかし、べつにゲームだけをしたいわけじゃない。小さい筐体で画面がでて、何かボタン入力ができる装置として使えるんじゃないか、と。
そこで、最新Raspberry pi OS ( trixieベース:2025年10月版 ) にて使えるようにする設定方法を調べ、動くようにした記録を残しておく。
ちなみに、Microsoft Bing Copilotに聞いて適用した手順は全くあっていなかった。Googleで先達の情報を検索、読み取ったほうが正確。
こちらの先達の情報は、64bit対応の記録だが、 Wayland と drm/kms 対応の設定の書き方として参考になった。
手順
LCD
LCDは、ili9341 とかいうやつらしい。先達の情報を基に以下のとおり。
まずは、考え方。
mipi-dbi-spi経由のSPIディスプレイ制御を行うにあたり、次の対応が必要になっています。
/boot/firmware/config.txt に設定項目を記載
“ファームウェア”をビルドして /lib/firmware/panel.bin として保存
これらの対応で、Raspberry Pi起動後にデスクトップをそのままSPIディスプレイに表示できるようになります。
へー。
次に方法。
/boot/firmware/config.txt の末尾に、次のように記載します。
include user-config.txt
そして、おもむろに sudo vi /boot/firmware/user-config.txt と実行。
dtoverlay=mipi-dbi-spi,spi0-0,speed=96000000
dtparam=width=320,height=240
dtparam=reset-gpio=27,dc-gpio=25
dtparam=backlight-gpio=24
GPIO(Reset/DC/Backlight)は、自身の接続先に合わせて調整とのこと。 gamepi20 のピン接続は、次のサイトに情報アリ。
続けて、“ファームウェア”をビルドして配置
これが一番肝心なようです。Raspberry Pi環境で実行する場合、mipi-dbi-spiドライバは特に指定がない場合は/lib/firmware/panel.binをファームウェアとしてSPIディスプレイに適用します。
これは先達の案内を参考に、下記の手順にてビルド。
-
https://github.com/notro/panel-mipi-dbi から mipi-dbi-cmd をダウンロード。なかみはPythonのスクリプトです。
-
https://github.com/notro/panel-mipi-dbi/wiki/Displays から、使用するディスプレイのコントローラーに合わせてテキストファイルを作成する。
ILI9341の場合はこちら。rotation 180 なところに注意。
# Adafruit ILI9341 PiTFT TFT LCD Screen
# width=320,height=240
command 0x01 # Software reset
delay 128
command 0xEF 0x03 0x80 0x02
command 0xCF 0x00 0xC1 0x30
command 0xED 0x64 0x03 0x12 0x81
command 0xE8 0x85 0x00 0x78
command 0xCB 0x39 0x2C 0x00 0x34 0x02
command 0xF7 0x20
command 0xEA 0x00 0x00
command 0xc0 0x23 # Power control VRH[5:0]
command 0xc1 0x10 # Power control SAP[2:0];BT[3:0]
command 0xc5 0x3e 0x28 # VCM control
command 0xc7 0x86 # VCM control2
# Command 36h sets the read order from frame memory to the display panel
# Remember to swap width/height on 0/180 rotations
#command 0x36 0x88 # rotation 0
#command 0x36 0xE8 # rotation 90
command 0x36 0x48 # rotation 180
#command 0x36 0x28 # rotation 270
command 0x37 0x00 # Vertical scroll zero
command 0x3a 0x55 # COLMOD: Pixel Format Set
command 0xb1 0x00 0x18 # Frame Rate Control (In Normal Mode/Full Colors)
command 0xb6 0x08 0x82 0x27 # Display Function Control
command 0xF2 0x00 # 3Gamma Function Disable
command 0x26 0x01 # Gamma curve selected
# Set Gamma
command 0xe0 0x0F 0x31 0x2B 0x0C 0x0E 0x08 0x4E 0xF1 0x37 0x07 0x10 0x03 0x0E 0x09 0x00
command 0xe1 0x00 0x0E 0x14 0x03 0x11 0x07 0x31 0xC1 0x48 0x08 0x0F 0x0C 0x31 0x36 0x0F
command 0x11 # Exit Sleep
delay 120
command 0x29 # Display on
delay 120
- python mipi-dbi-cmd panel.bin ili9341.txt と実行してファームウェアをビルド
python mipi-dbi-cmd panel.bin ili9341.txt
- panel.bin を /lib/firmware にコピー
sudo cp ./panel.bin /lib/firmware
Raspberry Piを再起動
sudo reboot now
Joystick
こちらが公式のアレ。なんと、gpioに2台のジョイスティック接続もいけるらしい。
いんすとらくしょんにしたがっていんすとれいしょん
Download the installation script :
mkdir mkjoystick
cd mkjoystick
wget https://github.com/recalbox/mk_arcade_joystick_rpi/releases/download/v0.1.4/install.sh
Update your system :
sudo sh ./install.sh updatesystem
sudo reboot
リブート後 再度、引数ナシで実行 :
sudo sh ./install.sh
ドライバの読み込みと設定。gamepi20の場合、ジョイスティックは1個なのでmap=1
sudo modprobe mk_arcade_joystick_rpi map=1
つづけて、gamepi20のpinout に従って、次のとおり実行。
sudo modprobe mk_arcade_joystick_rpi map=5 gpio=38,32,40,33,37,36,16,7,31,11,15,29
ピン配置とボタン対応のgpioをカンマ区切りで並べるんだとさ。
There are 12 posible gpio with button order: Y-,Y+,X-,X+,start,select,a,b,tr,y,x,tl. Use -1 for unused pins.
その後、またリブート。これが最後のリブート。
sudo reboot
再起動後、joystickの動作確認は、次のように行える。
jstest /dev/input/js0
ボタンを押すと対応項目の表示が変わる。Axesの入力はアナログパッドだったら線形に変化するんだろうけど、デジタル入力だと0, -32768 のどちらかになる仕組みらしい。
考察
調べてるうちに、Linux OS の表示の ”DRM"とか、LCDの接続の "SPI"とか、 "フレームバッファ"とかいう言葉がでてきて、なんとなく表示LCDの制御の仕組みがわかったようなきがする。要は画面の描画はLCD上に行っているのではなくて、LCDは書き込まれた画面のコピーを張り付けられているだけ、ということらしい。
あとは、ボタンで動き、画面に何か表示するアプリケーションを作ろう。ここからはソフトウェアプログラミングのセカイ。
まとめ
Raspberry pi zero w (古くて32bitOSで動く)と、その専用デバイス、gamepi20 を、最新のRaspberry pi OS trixie ベース で扱えるようにした。