ターゲットにしたマルチタッチディスプレイ
GeChic 15.6型 10点マルチタッチ対応 液晶ディスプレイ ON-LAP 1502
Facebookへのコメントで、マルチタッチパネルを使ってAndroidを使うといいという意見を5月ごろにいただきました。マルチタッチ対応モバイル液晶を「必要な時だけ繋ぐ」のが賢そうだ、というものです。またコミュニティの中でもKIOSK型のアプリに最適という意見がありました。それでは、技術的にどうなんだと調べを進め、ようやく実現したのでレポートします。他のUSBものをポーティングする際の参考になれば幸いです。
ドライバの入手
GeChic 10点マルチタッチ対応 液晶ディスプレイを購入してみました。ドライバのダウンロードサービスがないため、販売社のテックウインドに問い合わせたところ、ノーサポートの条件でLinux Platform用の開発者向けにAndroid OS用のドライバーソースの提供を受けました。このコラムでは、提供いただいた説明書「How to Install USB Touch Device Driver on」とはバージョンの違い等で対処方法が異なります。
なお、他のタッチパネル機種への対応についてですが、ソースにはすでに入っているという機種も多数あります。そういう場合であれば、ただ単に make menuconfig をして、対応するものにチェックをいれてビルドし直すだけで使えるようになります。
Android(4.3 Jelly Beans)へのポーティングは失敗
最初は、CuBox-iに現在デフォルトで搭載されているAndroid4.3に入れることにトライしました。Bootフォルダに入っているuImageとramdiskに入っているカーネルに変更を加えようということです。以前のコラムにもある、「CuBox-i用のカーネル作成について」で紹介したようにver3.05のカーネルを準備し、ドライバソースを組込み、必要な箇所にパッチを当てmake。できたuImageと、moduleを足して作りなおしたramdiskを戻してやるとできるのではないかと思っていました。しかしながら結果はブートしませんでした。追加して試したところ、もともとのuImageであっても一旦削除して入れ替えるとそれだけでブートしなくなりました。と、いうわけでで、ソースからのフルビルド以外には組み込めないことが判りました。このあたりの仕組みが判明したらまた別途報告します。(AndroidのuImageとramdiskに細工をして、ブートできるようにする方法はあるようです。ネット上の報告を参考にいくつかの方法を試したのですがいずれもうまくできませんでした)
Android4.3のCuBox−i用のソースを探していて、Android4.4(KitKat)のソースビルドができる趣旨の報告がSolidRunのForum(http://www.solid-run.com/community)にありました。なお、イメージも今(2014.08.12 時点)ではオフィシャルのAndroid4.4ベータ版がダウンロードできるようになったようです。(http://server.vijge.net/static/cubox/android/android-4.4.2-1.0.0-ga-aaf118bb78-gapps.img.xz)
Githubに挙げられたソースとその説明を頼りにビルドをしてみて、いくつかの問題はあったもののビルドができて、ブートすることも確認できました。それでは、ということでこのソースをもとにマルチタッチディスプレイを組込み、Android4.4ベータ版でGeChicマルチタッチ対応液晶ディスプレイも動作するようにできました。
ドライバ組込み
元の情報は提供いただいた「How to Install USB Touch Device Driver on」に基づいていますが、driversディレクトリ内のマルチタッチの分類わけが変更されていたりするのでかなり違っています。
"myandroid"に組込むLinuxカーネルがkernel_imx ですが、カーネル部分は他のアプリでも共通です。(「CuBox-i用のカーネル作成について」参照)Android以外に応用する場合にも同様なので参考になります。
最初は、このカーネルのkernel_imxを操作します。
1.“drivers/hid"の3ファイルに変更を加える
1.1 hid-ids.h に’>’の1行を追加
#define USB_VENDOR_ID_ILITEK0x222a
#define USB_DEVICE_ID_ILITEK_MULTITOUCH0x0001
> #define USB_DEVICE_ID_ILITEK_MULTITOUCH_20x001c
1.2 hid-core.c に’>’の行を追加
{ HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH) },
> { HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH_2) },
1.3 hid-multitouch.c に’>’の3行を追加
/* Ilitek dual touch panel */
{ .driver_data = MT_CLS_DEFAULT,
HID_USB_DEVICE(USB_VENDOR_ID_ILITEK,
USB_DEVICE_ID_ILITEK_MULTITOUCH) },
>{ .driver_data = MT_CLS_DEFAULT,
>HID_USB_DEVICE(USB_VENDOR_ID_ILITEK,
>USB_DEVICE_ID_ILITEK_MULTITOUCH_2) },
2. add into “drivers/input/touchscreen” folderに以下の2ファイルをコピーして追加
(このファイルは、本サイトのDLのページからダウンロードできます。
ilitek_au2v6.c
usbhid.h
3. drivers/input/touchscreen/Makefile” fileに下の1行を入れる
obj-$(CONFIG_TOUCHSCREEN_ILITEK) += ilitek_au2v6.o
4. “drivers/Kconfig” fileに下の1行を入れる
source "drivers/input/touchscreen/Kconfig"
5. “drivers/input/touchscreen/Kconfig” fileに変更を入れる
config TOUCHSCREEN_ILITEK
tristate “ILITEK USB touch screen driver”
6. drivers フォルダで make config をする
$ make imx6_cubox-i_hummingboard_defconfig
$ make menuconfig
7. < >ILITEK USB touch screen driver
の項目にチェックを入れて<*> Exitする
UBUNTU等、他のOSで使用する場合には、このままuImage とmodule のビルドをする。Androidの場合には、kernel_imx への作業は終了。9 へ飛びます
8. カーネルのビルド(Android 以外)
$ make uImage
この出来上がったuImage を、BootフォルダにあるuImageと入れ替える
続いてドライバファイルを生成します。以下のようにコマンドを入力します。
$ make modules
$ mkdir ../modules
$ export INSTALL_MOD_PATH=../modules/
$ make modules_install
$ sudo cp -rf ../modules/lib/* /mnt/lib
生成したカーネルの設置をします。
9. Androidの変更をいれる
system/core/rootdir/init.rc に1行追加
chmod 0777 /dev/ilitek_ctrl
10. myandroid へ戻って lunch と make をする
一度ビルドをしていると、make clear しない限り必要な部分のコンパイルしかしないのですぐに終わります。
マルチタッチディスプレイをHDMI と USD で接続してCuBox-i を立ち上げます。どうでしたでしょうか。画面上のアイコンにタッチして動作したら成功です。
KitKat が立ち上がったところ
HDMIとUSBの2系統で接続する。15インチ版は、電源も別にマイクロUSB入力となる。
アイコンがタッチできた