前回はHTTPサーバを動かしてみましたが
今回はディスプレイとキーボードを追加して手元で操作できるようにしてみます.
ディスプレイを認識させるためにYoctoを用いカーネルをビルドし
ドライバを組み込むことで実現します.
ディスプレイはSPI接続可能なILI9341ドライバを搭載したTFT-LCD ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶MSP2807 を使用します.
Yoctoをベースに開発を行うので本来であればレシピを追加してちゃんと構築すべきところでは
あるのですが今回はとりあえず動作することを目指したため行っていません.
最初にYoctoの環境構築を行い,ILI9341のドライバとUSB関連の設定を追加する方法について
解説します.
Yoctoの環境構築
環境構築するに当たりmangOH Waveshare E-Ink Linux Framebuffer driverを参考にしました.
ホームディレクトリ以下に以前作成したworkspaceに追加していきます.
まずはYoctoのプロジェクトをダウンロードします.
LegatoのリリースバージョンがR13.3なのでそれに合うLinux Distro Sourceを選びます.
https://source.sierrawireless.com/resources/airprime/software/wp76xx/wp76xx-firmware-release-13,-d-,1-components/
その後解凍し準備を行います.
$ cd ~/workspace
$ curl -O https://downloads.sierrawireless.com/AirPrime/WP76xx/Release13.3/Legato-Dist-Source-mdm9x28-SWI9X07Y_02.28.03.05.tar.bz2
$ tar -xvf Legato-Dist-Source-mdm9x28-SWI9X07Y_02.28.03.05.tar.bz2
$ cd yocto
$ export LEGATO_BUILD=0
$ make image_bin
これでYoctoの環境構築は完了です.
以降端末を起動するたびにYoctoを使用する前に以下のコマンドを実行します.
$ cd ~/workspace/yocto
$ . ./poky/oe-init-build-env ./build_bin
ディスプレイドライバの追加
そのままではSPI接続でディスプレイを表示するドライバは含まれていません.
Linux用のSPI接続によるディスプレイドライバがfbtftとしてあるので組み込みます.
今回使用しているLinuxのバージョンではバックライトを制御するオプションを有効にしていると
うまく動作しないため fbtft/Kconfig の該当する部分をコメントアウトして導入します.
$ cd ~/workspace/yocto/kernel/drivers/video/fbdev/
$ git clone https://github.com/notro/fbtft.git
$ echo "source \"drivers/video/fbdev/fbtft/Kconfig\"" >> Kconfig
$ echo "obj-y += fbtft/" >> Makefile
# fbtft/Kconfig comment out
# L9: # select FB_BACKLIGHT
$ cat << EOF >> ~/workspace/yocto/build_bin/conf/local.conf
KERNEL_MODULE_AUTOLOAD += "fbtft_device"
module_conf_fbtft_device = "options fbtft_device name=adafruit28 busnum=1 gpios=dc:78,reset:37"
KERNEL_MODULE_PROBECONF += "fbtft_device"
EOF
$
ディスプレイドライバ向けの設定を行う
カーネルの準備ができたのでビルドします.
まずは追加したディスプレイドライバに関するカーネルオプションを設定します.
ディスプレイドライバの他に表示するためのフォントも入れます.
ブート時のコマンドは改良前に動いていたカーネルコマンドを元に
必要な設定を追加したものを上書きすることで設定しました.
$ bitbake linux-quic -c do_menuconfig -f
Device Drivers -> Graphic Support -> Frame buffer Devices
<*> Support for frame buffer devices
[*] Framebuffer foreign endianness support
[*] Enable Video Mode Handling Helpers
[*] Enable Tile Blitting Support
[*] Simple framebuffer support
<*> Support for small TFT LCD display modules
-> Support for small TFT LCD display modules
<*> FB driver for the ILI9341 LCD Controller
<*> Generic FB driver for TFT LCD displays
<M> Module to for adding FBTFT devices
Device Drivers -> Graphic Support
[*] Bootup logo
-> Console display driver support
<*> Framebuffer Console support
[*] Map the console to the primary display device
[*] Framebuffer Console Rotation
Library routines
[*] Select compiled-in fonts
Boot options
Defaukt kernel command string
console=tty1 fbcon=map:10 fbcon=rotate:1 root=/dev/ram rootfs_ro=true user1_fs=ubifs verity=on ima_ready=0 lkversion=SWI9X07Y_02.28.03.05 androidboot.serialno=cd8fc005 androidboot.authorized_kernel=true quiet androidboot.baseband=msm rootfstype=ubifs rootflags=bulk_read
Kernel command line type
Always use the default kernel command string
ビルドします
$ bitbake -C compile -f linux-quic
$ bitbake linux-quic
$ bitbake -c cleansstate mdm9x28-image-minimal
$ bitbake mdm9x28-image-minimal
ビルドが終わったら実機で動かします
実際に動かす
CN3の40ピンヘッダーに配線します.
電源はLCD用の3.3VとUSBキーボード用の5Vの2系統が必要です.
LCDは6本結線します.
ビルドしたカーネルを転送します.
$ DEST_IP=192.168.2.2 ~/workspace/legatoAF/legato-19.02.0/bin/fwupdate download ~/workspace/yocto/build_bin/tmp/deploy/images/swi-mdm9x28-wp/yocto_wp76xx.4k.cwe
この状態でカーネルログやログイン画面がLCDに表示されます.
ただしキーボードを繋いでもWP7605内部の設定が有効になっていないと
使えないのでその設定を行います.
キーボードを動かすには
(今回の基板はUSB周りでエラッタがあるので多少の修正を加えました.)
WP7605でUSBデバイスを扱うためには内部の設定を書き換える必要があります.
WP7605へssh接続した後ATコマンドを入力することで変更します.
$ ssh root@192.168.2.2
# microcom /dev/ttyAT
AT!ENTERCND="A710"
AT!CUSTOM="HSICENABLE",1
AT!CUSTOM?
[Ctrl-X]
# reboot
再起動後にモジュール上のHUB3(USB microB)コネクタにOTBケーブル経由で接続すれば
LCDに表示されるログイン画面からログインしてシェルを叩けるようになります.
まとめ
Yoctoの環境構築を行うことでカーネルのビルドができるようになりました.
また,Yoctoに対して直接的な改良ではあるもののLCDを接続して
キーボードも使えるようになったので単体でシェルを叩けるようになりました.
こんな小さいモジュールでもLinuxが動きシェルを叩けるのでよくできているなと感じました.
コメント