Waveshare3.2インチLCDをRaspberryで動作させる

今回は、すでにAliExpressで購入したWaveshare3.2インチLCDを、FBTFTにより、Raspberry Piで動作させてみます。FBTFTは、小型TFT LCD表示モジュール用のLinuxフレームバッファドライバで、Raspberry Pi カーネルはFBTFTをサポートしています。AliExpressで購入したWaveshare3.2インチLCDは、FBTFT装置名として、”waveshare32b”が割り当てられており、画面を90度回転して横長で表示してみます。なお、AliExpressで購入したWaveshare3.2インチLCDの外観を次に示します。

Waveshare3.2インチLCD表
Waveshare3.2インチLCD裏

Raspberry Piの設定

ファイルシステムを拡張しているか確認し、拡張していない場合は拡張してください。

$ sudo raspi-config
 「Expand Filesystem」を選択して拡張する。

OSが比較的新しい(Sep 2013以降)場合は、X11関連のファイルを自動で実行させないように次のOptionの行をコメントにします。

$ sudo nano /usr/share/X11/xorg.conf.d/99-fbturbo.conf
#Option “fbdev” “/dev/fb0″

SPI機能を有効にします。

$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
 「blacklist spi-bcm2708」を削除もしくはコメントにする。

設定変更後、再起動します。

$ sudo reboot

カーネルモジュールへのFBTFTドライバのインストール

以下のコマンドで、FBTFTドライバをカーネルにインストールします。

$ sudo REPO_URI=https://github.com/notro/rpi-firmware rpi-update

インストール後、再起動します。

$ sudo reboot

起動完了後、カーネルモジュールのバージョン番号をunameコマンドで確かめます。3.12.34+でした。

# uname -a
Linux raspberrypi 3.12.34+ #1 PREEMPT Mon Dec 8 00:05:41 CET 2014 armv6l GNU/Linux

dmesg コマンドで、SPIが生成されているかを確認します。

# dmesg | grep spi
[    0.000000] Linux version 3.12.34+ (pi@raspi2) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) ) #1 PREEMPT Mon Dec 8 00:05:41 CET 2014
[    1.418596] bcm2708_spi bcm2708_spi.0: DMA channel 2 at address 0xf2007200 with irq 77
[    1.429684] bcm2708_spi bcm2708_spi.0: DMA channel 4 at address 0xf2007400 with irq 20
[    1.440748] bcm2708_spi bcm2708_spi.0: SPI Controller at 0x20204000 (irq 80)
[    1.449348] bcm2708_spi bcm2708_spi.0: SPI Controller running in dma mode

FBTFTの動作確認

次のコマンドでカーネルモジュールをロードできるか試します。(Waveshare 3.2インチ LCDの場合)

$ sudo modprobe fbtft_device name=waveshare32b rotate=90

dmesgで以下のような出力が確認できれば、ロードが完了しています。

$ dmesg|grep fbtft_device
[  160.208519] fbtft_device:  SPI devices registered:
[  160.208567] fbtft_device:      spidev spi0.0 500kHz 8 bits mode=0x00
[  160.208650] fbtft_device:      spidev spi0.1 500kHz 8 bits mode=0x00
[  160.208664] fbtft_device:  'fb' Platform devices registered:
[  160.208693] fbtft_device:      bcm2708_fb id=-1 pdata? no
[  160.208796] fbtft_device: Deleting spi0.0
[  160.209391] fbtft_device:  GPIOS used by 'waveshare32b':
[  160.209418] fbtft_device:    'reset' = GPIO27
[  160.209429] fbtft_device:    'dc' = GPIO22
[  160.209437] fbtft_device:  SPI devices registered:
[  160.209451] fbtft_device:      spidev spi0.1 500kHz 8 bits mode=0x00
[  160.209466] fbtft_device:      fb_ili9340 spi0.0 48000kHz 8 bits mode=0x00
pi@raspberrypi ~ $

以下のコマンドを実行し、起動コンソールが表示されれば成功です。

$ con2fbmap 1 1

X Window Systemを表示するには、次のコマンドを入れます。

$ FRAMEBUFFER=/dev/fb1 startx

起動時のカーネルモジュールのロードについて

/etc/modulesの一番下に以下の行を追加します。

fbtft_device name=waveshare32b rotate=90

Waveshare3.2インチLCDが表示できなくなった

今まで表示できたのですが、先日、再度組み立てて動作させたところ、表示しなくなりました。dmesgコマンドで動作状況を調べました。

[   12.462996] fbtft: module is from the staging directory, the quality is unknown, you have been warned.
[   12.501845] fbtft_device: module is from the staging directory, the quality is unknown, you have been warned.
[   12.531227] fbtft_device:  SPI devices registered:
[   12.550826] fbtft_device:      spidev spi0.0 500kHz 8 bits mode=0x00
[   12.567886] fbtft_device:      spidev spi0.1 500kHz 8 bits mode=0x00
[   12.581761] fbtft_device:  'fb' Platform devices registered:
[   12.599380] fbtft_device:      bcm2708_fb id=-1 pdata? no
[   12.615951] fbtft_device: Deleting spi0.0
[   12.629931] fbtft_device:  GPIOS used by 'waveshare32b':
[   12.660911] fbtft_device:    'dc' = GPIO22
[   12.674727] fbtft_device:    'reset' = GPIO27
[   12.685849] fb_ili9340: module is from the staging directory, the quality is unknown, you have been warned.
[   12.702094] fbtft_device:  SPI devices registered:
[   12.713304] fbtft_device:      spidev spi0.1 500kHz 8 bits mode=0x00
[   12.740699] fbtft_device:      fb_ili9340 spi0.0 48000kHz 8 bits mode=0x00
[   13.274622] graphics fb1: fb_ili9340 frame buffer, 240x320, 150 KiB video memory, 4 KiB DMA buffer memory, fps=20, spi0.0 at 48 MHz

Web上で正常に動作しているものの動作状況を検索してみると、次のようになっています。

fbtft_request_gpios: 'reset' =GPIO025
fbtft_request_gpios: 'dc' =GPIO024
flexfb_verify_gpios_dc()
fbtft_init_display()
fbtft_reset()
init: write(0xB0) 0x00
init: write(0x11)
init: mdelay(250)
init: write(0x3A) 0x55
init: write(0xC2) 0x44
init: write(0xC5) 0x00 0x00 0x00 0x00
init: write(0xE0) 0x0F 0x1F 0x1C 0x0C 0x0F 0x08 0x48 0x98 0x37 0x0A 0x13 0x04 0x11 0x0D 0x00
init: write(0xE1) 0x0F 0X32 0x2E 0x0B 0x0D 0x05 0x47 0x75 0x37 0x06 0x10 0x03 0x24 0x20 0x00
init: write(0xE2) 0x0F 0X32 0x2E 0x0B 0x0D 0x05 0x47 0x75 0x37 0x06 0x10 0x03 0x24 0x20 0x00
init: write(0x36) 0x28
init: write(0x11)
init: write(0x29)
Display update: 1691kB/s (177.354ms),fps=0 (0.000 ms) 
fbtft_register_backlight()
fbtft_register_backlight(): led pin not set, exiting
graphics fb1: flexb frame buffer, 480x320, 300kiB video memory, 4 kiB DMA buffer memory, fps=20, spi0.0 at 16MHz
fbtft_device: spidev spi0.1 500kHZ 8 bits mode=0x00
fbtft_device: flexfb spi0.0 16000kHZ 8 bits mode=0x00

それぞれのログで表示の仕方が違っていますが、「fb_ili9340: module is from the staging directory, the quality is unknown, you have been warned.」がログされているのが気になります。本来この部分でそれぞれのドライバの関数が呼ばれて、それ状態がログされるのではないでしょうか。最後に/etc/modulesの内容を示します。不具合調査のために、先に示した内容から少し触っています。

fbtft_device name=waveshare32b gpios=dc:22,reset:27 speed=48000000
waveshare32b width=240 height=320 buswidth=8 init=-1,0xCB,0x39,0x2C,0x00,0x34,0x02,-1,0xCF,0x00,0XC1,0X30,-1,0xE8,0x85,0x00,0x78,-1,0xEA,0x00,0x00,-1,0xED,0x64,0x03,0X12,0X81,-1,0xF7,0x20,-1,0xC0,0x23,-1,0xC1,0x10,-1,0xC5,0x3e,0x28,-1,0xC7,0x86,-1,0x36,0x28,-1,0x3A,0x55,-1,0xB1,0x00,0x18,-1,0xB6,0x08,0x82,0x27,-1,0xF2,0x00,-1,0x26,0x01,-1,0xE0,0x0F,0x31,0x2B,0x0C,0x0E,0x08,0x4E,0xF1,0x37,0x07,0x10,0x03,0x0E,0x09,0x00,-1,0XE1,0x00,0x0E,0x14,0x03,0x11,0x07,0x31,0xC1,0x48,0x08,0x0F,0x0C,0x31,0x36,0x0F,-1,0x11,-2,120,-1,0x29,-1,0x2c,-3