今回は、すでに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の外観を次に示します。
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[gap height="16"]
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
今まで表示できたのですが、先日、再度組み立てて動作させたところ、表示しなくなりました。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