正月にアマゾンで「Kuman Raspberry Pi 3 2用ディスプレイ タッチパネル 3.5インチ 320*480 SPI インターフェース Raspberry Pi Model B B+ A+ A SC06」というのがタイムセールで売っていたので買ってみた。
買ったまましまってあったのをすっかり忘れていたので、今頃になって使ってみた。
この製品はWaveshareの「3.5inch RPi LCD (A), 320×480」のコピー製品。
なので、情報はWaveshare側で追う必要がある。
いろいろ面倒な試行錯誤があったのですが、最終結果を書いておきます。
2017/04/10の時点では、液晶表示はできました。
タッチパネル動作については、まだ全然できていません。
Orange Pi PCでSPI接続の液晶で表示をする場合に必要な設定
インストールしておくもの
フレームバッファの動作チェックに使うfbiコマンド
apt install fbi
X-Windowを今回のLCDに出力するために使う
apt install xserver-xorg-video-fbdev
モジュールを読み込むための /etc/modules-load.d/waveshare.conf の内容
flexfb
fbtft_device
上記で指定したモジュールのパラメータ指定 /etc/modprobe.d/waveshare.conf の内容
options flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
options fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:2,dc:71
X-Windowで表示させるための /usr/share/X11/xorg.conf.d/98-fbdev.conf の内容
Section "Device"
Identifier "myfb"
Driver "fbdev"
Option "fbdev" "/dev/fb8"
EndSection
注: /dev/fb8 は環境によっては番号が変わるはずです
これで再起動することで、LCDに表示されるようになりました….
ただ・・・時々、うまく表示されないことがあるのが謎です・・・
armbianフォーラムの「[SOLVED] Orange PI PC H3 Winner, compiled with igorpecovnik jessie desktop」に/boot/bin/orangepipc.binをfexに変換し、[disp_init]と[hdmi_para]にある下記項目を変更する、という話があった。
[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 3
screen0_output_mode = 5
screen1_output_type = 3
screen1_output_mode = 5
fb0_width = 800
fb0_height = 480
fb1_width = 800
fb1_height = 480
[hdmi_para]
hdmi_used = 1
hdmi_x = 800
hdmi_y = 480
hdmi_power = "vcc-hdmi-18"
hdmi_cts_compatibility = 1
この情報を元に関連する記述を下記の様に書き換えたところ、安定して表示されるようになった。
[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 3
screen0_output_mode = 5
screen1_output_type = 3
screen1_output_mode = 5
fb0_format = 0
fb0_width = 320
fb0_height = 480
fb1_format = 0
fb1_width = 320
fb1_height = 480
hdcp_enable = 1
hdmi_cts_compatibility = 0
[hdmi_para]
hdmi_used = 1
hdmi_power = "vcc-hdmi-18"
hdcp_enable = 0
hdmi_cts_compatibility = 1
hdmi_x = 320
hdmi_y = 480
もちろん、元のbinファイルを「bin2fex orangepipc.bin orangepipc.fex」でテキスト形式のfexファイルに変換し、編集したあと、
「fex2bin orangepipc.fex orangepi.bin」でbinファイルに戻すという手順も行っています。
参考にしたサイト
・Raspberry PiとOrange PiのGPIO指定の違いについて
「RaspBerry Piで遊んでみる」の「WiringPiとWiringOP」の記載と
このページで紹介されていた「WiringOP」
実際に実行してみて得られた下記の実行結果からGPIOの番号を得ました
osakanataro@orangepipc:/work/lcd/LCD-show$ gpio readall
+-----+-----+----------+------+---+-Orange Pi+---+---+------+---------+-----+--+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 12 | 8 | SDA.0 | ALT5 | 0 | 3 || 4 | | | 5V | | |
| 11 | 9 | SCL.0 | ALT5 | 0 | 5 || 6 | | | 0v | | |
| 6 | 7 | GPIO.7 | ALT3 | 0 | 7 || 8 | 0 | ALT3 | TxD3 | 15 | 13 |
| | | 0v | | | 9 || 10 | 0 | ALT3 | RxD3 | 16 | 14 |
| 1 | 0 | RxD2 | ALT3 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1 | 1 | 110 |
| 0 | 2 | TxD2 | ALT3 | 1 | 13 || 14 | | | 0v | | |
| 3 | 3 | CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4 | 4 | 68 |
| | | 3.3v | | | 17 || 18 | 0 | ALT3 | GPIO.5 | 5 | 71 |
| 64 | 12 | MOSI | ALT4 | 0 | 19 || 20 | | | 0v | | |
| 65 | 13 | MISO | ALT4 | 0 | 21 || 22 | 0 | ALT3 | RTS2 | 6 | 2 |
| 66 | 14 | SCLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | CE0 | 10 | 67 |
| | | 0v | | | 25 || 26 | 0 | ALT3 | GPIO.11 | 11 | 21 |
| 19 | 30 | SDA.1 | ALT4 | 0 | 27 || 28 | 0 | ALT4 | SCL.1 | 31 | 18 |
| 7 | 21 | GPIO.21 | ALT3 | 0 | 29 || 30 | | | 0v | | |
| 8 | 22 | GPIO.22 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | RTS1 | 26 | 200 |
| 9 | 23 | GPIO.23 | ALT3 | 0 | 33 || 34 | | | 0v | | |
| 10 | 24 | GPIO.24 | ALT3 | 0 | 35 || 36 | 0 | ALT3 | CTS1 | 27 | 201 |
| 20 | 25 | GPIO.25 | ALT3 | 0 | 37 || 38 | 0 | ALT3 | TxD1 | 28 | 198 |
| | | 0v | | | 39 || 40 | 0 | ALT3 | RxD1 | 29 | 199 |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+-Orange Pi+---+------+----------+-----+-----+
osakanataro@orangepipc:/work/lcd/LCD-show$
・Waveshare 3.5インチTFTパネルのメーカ公式情報
「3.5inch RPi LCD (A), 320×480 製品ページ」と「3.5inch RPi LCD (A)情報ページ」
最終的には、ピンをどのような用途で使っているか、しか参考になる情報は無かった。
・Waveshare 3.5インチTFTパネルを汎用のflexfbで認識させるパラメータ
「おっさんエンジニアの実験室」の「Waveshare 3.5 Spotpear TFTパネルをRPi2に付けて・・」で紹介されているfbtftのIssue#215「Support for Waveshare 3.5 Spotpear」の「fergie4000さんのコメント」
modprobe flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
modprobe fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24
fbtft_deviceのgpios指定はRaspberry Piの場合で、そのままOrange Pi PCで使うとセグメンテーションフォルト。
WiringOPを実行(gpio readall)して、resetで使う22ピンのRST、dcで使う18ピンのLCD_RSがOrange Pi PCでは何番にあたるかを確認。
wPiなら「gpios=reset:6,dc:19」、BCMなら「gpios=reset:2,dc:71」ということで、試してみた結果、後者の「gpios=reset:2,dc:71」となった、
・fbtft_deviceとflexfbのパラメータの意味
「fbtft_device」と「flexfb」
とはいえ、flexfbのinitパラメータに関しては完全に呪文
・fbtftの表示動作確認で使えるコマンド
fbtft公式の「Framebuffer use」。
fbiコマンドで画像出力する、というのが簡単。
・armbianでのモジュールパラメータの設定方法
「Allwinner(Generic)のEnable Hardware Features」の「Connect your LCD Display」
・Waveshare 3.5インチTFTパネルのタッチパネルを認識させるパラメータ
fbtftのIssue#215「Support for Waveshare 3.5 Spotpear」の「pykoonさんのコメント
fbtft wikiの「Touchpanel」
ただし、armbian環境ではads7846_device が無く、ads7846 しかない。
ラズパイではoverlaysで制御するようだが、armbian wikiの「Allwinner DT overlays」にあるarmbian-add-overlayを実行しようとしても無いので、使えなさそう・・・
armbian forumの「ads7846 / Banana pro」を見ると使えそうなことが書いてあるんですが・・・
99-calibration.confのサンプル
Section "InputClass"
Identifier "calibration"
MatchProduct "ADS7846 Touchscreen"
Option "Calibration" "3932 300 294 3801"
Option "SwapAxes" "1"
EndSection
・バックライト関連
fbtftのwikiに「Backlight」という項目はあるのだが、製品ページのピン配列を見ると該当しそうなものが見当たらない。
制御できないのではないか?
2017/05/05追記
・タッチパネル続報
三日坊主な私がいつまでブログやれるか...( ̄~ ̄;)の「Raspberry Pi でタッチパネル」に、下記でads7846_device単体でのコンパイルができる、という記載を発見
git clone https://github.com/notro/fbtft_tools.git
cd ~/fbtft_tools/ads7846_device; make && sudo make install
これを試してみると、armbian環境でもコンパイルできた。
調整の手法については、
特に縛りなくの「ebayで購入した3.2インチTFT液晶をRaspberry Piで使ってみる」と、fbtft公式の「ads7846_deviceのマニュアル」
をあわせてみて試したところ、下記でとりあえず、タッチパネルの認識ができることを確認
insmod /lib/modules/3.4.113-sun8i/extra/ads7846_device.ko gpio_pendown=1 cs=0 verbose=2 x_min=270 x_max=3830 y_min=340 y_max=3900
しかし、fbtft_deviceとバッティングするようで、どちらかしか利用できない状態
どうすればいいのかなぁ・・・
・動画再生
armbianのmplayはmplay2なので
sudo SDL_VIDEODRIVER=fbcon SDL_FBDEV=/dev/fb8 mplayer -vo sdl -framedrop -vf scale=360:240 動画.mpg
-vf scaleで適切なサイズを指定して縮小処理を行うような指定にしないと、動画の表示サイズが大きい場合、再生出来ない。