正月にアマゾンで「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で適切なサイズを指定して縮小処理を行うような指定にしないと、動画の表示サイズが大きい場合、再生出来ない。
こんにちは。いつも拝見させていただいています。
flexfbのinitパラメータですが、以下のルールです。
(1)以下のページによると、WaveShare 3.5inch RPi LCD (A) はili9486搭載型液晶。
http://mirage-crystal.asablo.jp/blog/2015/01/25/7552265
(2)以下のページにili9486の初期化シーケンスがあります。
https://raw.githubusercontent.com/notro/fbtft/master/fb_ili9486.c
static int default_init_sequence[] = {
/* Interface Mode Control */
-1, 0xb0, 0x0,
/* Sleep OUT */
-1, 0x11,
-2, 250,
/* Interface Pixel Format */
-1, 0x3A, 0x55,
/* Power Control 3 */
-1, 0xC2, 0x44,
/* VCOM Control 1 */
-1, 0xC5, 0x00, 0x00, 0x00, 0x00,
/* PGAMCTRL(Positive Gamma Control) */
-1, 0xE0, 0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98,
0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00,
/* NGAMCTRL(Negative Gamma Control) */
-1, 0xE1, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75,
0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00,
/* Digital Gamma Control 1 */
-1, 0xE2, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75,
0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00,
/* Sleep OUT */
-1, 0x11,
/* Display ON */
-1, 0x29,
/* end marker */
-3
(3)これは以下のINITパラ、エータと完全に一致します
init=-1,0xb0,0x0,-1,0×11,-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,0×36,0x28,-1,0×11,-1,0×29,-3
こうやって比べた方が分かりやすいですね
static int default_init_sequence[] = {
/* Interface Mode Control */
-1, 0xb0, 0x0,
/* Sleep OUT */
-1, 0x11,
-2, 250,
/* Interface Pixel Format */
-1, 0x3A, 0x55,
/* Power Control 3 */
-1, 0xC2, 0x44,
/* VCOM Control 1 */
-1, 0xC5, 0x00, 0x00, 0x00, 0x00,
/* PGAMCTRL(Positive Gamma Control) */
-1, 0xE0, 0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98,
0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00,
/* NGAMCTRL(Negative Gamma Control) */
-1, 0xE1, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75,
0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00,
/* Digital Gamma Control 1 */
-1, 0xE2, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75,
0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00,
/* Sleep OUT */
-1, 0x11,
/* Display ON */
-1, 0x29,
/* end marker */
-3
init=
-1,0xb0,0x0,
-1,0×11,
-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,0×36,0x28, –>これ不要かも
-1,0×11,
-1,0×29,-3
なるほど、そこの部分に該当するんですね。
-1がパラメータの始まりで、-3で終了、って感じの並びだったんですね
ありがとうございます