タッチパネルをAndroidに認識させるまで
タッチパネルを乗せようと思った動機は、
Android-Embedded-Japan(Googleグループ)のbeaglebordとお散歩できますを読んでから。
最近ようやく動くところまで到達したので手順をまとめます。
大きく分けて、3つの作業があります、いずれも先人のまとめサイトなど
参考にしながら試行錯誤しました。
- BealgeBoard向けAndroidの構築
- USB Displayの接続
- タッチパネルのドライバmodify
BealgeBoard向けAndroidの構築
いくつか方法があると思います。Webをさがして比較的簡単に見つかるのは
- emblinuxの解説ページ(Android-Eclair porting guide to BeagleBoard - labs.embinux.org)
- solaさんのandroid-development-environment
の2つです。
emblinuxで試してみる(失敗)
emblinuxのほうは、Android 1.6(Donut)で試したときは問題なかったのですが、
Eclairではうまく動きませんでした。
具体的にはAndroidのブート時に
Cannot load library: load_library[1051]: Library '/system/lib/libwebcore.so' not found
libwebcoreがないと怒られます*1 。
私の場合はここでemblinuxより取得するのをあきらめて、
もう片方、solaさんのページに従ってAndroid 2.1r2をビルドしました。
Android2.1r2のuImageとRFSを作成(成功)
solaさんのページで詳細が解説されていますので(有益な情報をありがとうございます!)
ここでは多少、手順の要点と注意点に触れるのみです。
今回の方法ではAndroidのソースコードを
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.1_r2
から。Linux Kernelのみemblinuxより取得します。
詳しくはandroid-development-environmentで解説されています。
「手順4.kernelをビルドする」で、
一部コードに誤りがあります。下記の通り、回避してください。
$ cd $ANDROID/kernel
$ wgwt http://android-development-environment.googlecode.com/files/sola_omap3_beagle_android_defconfig-eclair-20100213
$ mv sola_omap3_beagle_android_defconfig-eclair-20091123 arch/arm/configs/sola_omap3_beagle_android_defconfig
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- sola_omap3_beagle_android_defconfig
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- uImage
$ cp $ANDROID/kernel/arch/arm/boot/uImage $ANDROID/vendor/sola/beagle/
ここで、3行目のファイル名が異なっています(実行時にエラー吐くので、すぐ気づくと思います)。
$ mv sola_omap3_beagle_android_defconfig-eclair-20100213 arch/arm/configs/sola_omap3_beagle_android_defconfig
後、パスは解説通り、(面倒でも)通しておく必要があります。
手順の途中で、BeagleBoard用パッチを当てる際に、$ANDROIDを利用しています。
$ANDROIDがないとPathが通らないと怒られてしまいます。(というか怒られた)
とりあえず、普通にビルド&Android2.1の動作確認まで先にやるのをおすすめします*2。
USBディスプレイの接続
GeekleBoardさんのBeagleboardでUSB-LCDなAndroid
を参考にさせていただきました。タッチパネルが不要な場合、GeekleBoardさん紹介の方法で最短ビルドできます。
ちなみに私が利用したUSBディスプレイも紹介されているSANSUNG SyncMaster U-70です。
国内では九十九電機などで取り扱いがありました。(価格コム)
ほかのUSBディスプレイでは、どうやればいいのかも気になります…*3。
USBディスプレイのフリッカー(ちらつき)対策
上記手順に従い、ビルドした場合、USBディスプレイでの描画がちらつきます。
フレームバッファ処理に原因があり、修正パッチは
ビーグル板の冒険さんにて公開*4されています。
※上記修正パッチはDonut対応コードで、そのままEclairに適用できるかは不明です
今回は、安全のため手動マージしました。
ちなみにArmadillo-500FXでも似たような問題が発生しているようで、
ブリリアントサービスさんのサイトにもArmadillo向けの修正パッチが公開されています。
フリッカー対策の中身
ビーグル板の冒険さんの修正パッチ(kernel.patch)には、タッチスクリーンデバイスの追加なども一緒に格納されています。
フリッカー対策のみ必要な場合は、下記の対応を実施してください(効果確認済み)
kernel/drivers/video/displaylink/displaylink-fb.c
static struct fb_ops displaylink_fb_ops = { .fb_release = displaylink_fb_release, .fb_blank = displaylink_fb_blank, .fb_check_var = displaylink_fb_checkvar, - .fb_set_par = displaylink_fb_setpar, + //.fb_set_par = displaylink_fb_setpar, .fb_pan_display = displaylink_pan_display, };
drivers/video/fbmem.c
fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) struct fb_fix_screeninfo *fix = &info->fix; unsigned int yres = info->var.yres; int err = 0; - +/* コメントアウト if (var->yoffset > 0) { if (var->vmode & FB_VMODE_YWRAP) { if (!fix->ywrapstep || (var->yoffset % fix->ywrapstep)) @@ -864,7 +864,7 @@ fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) var->yoffset + yres > info->var.yres_virtual || var->xoffset + info->var.xres > info->var.xres_virtual) return -EINVAL; - +*/ if ((err = info->fbops->fb_pan_display(var, info))) return err; info->var.xoffset = var->xoffset;
タッチパネルの追加
今回利用したタッチパネルは
- タッチパネルコントローラー BER241-ND(CONTROLLER TOUCH SCRN USB RS232)2,878
- 7インチタッチパネル BER255-ND 5,130
いずれもdigikeyさんで購入しました。
今回も、やはり、ビーグル板の冒険さんにて公開されています。
usbtouchscreen.cあたりの変更点が参考になります。大変お世話になりますm(_ _)m
カーネル側の変更になるので、変更したら再ビルドが必要になります。
忘れがちなので注意。
usbtouchscreen.cの変更完了後、solaさんの手順に従えば
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- sola_omap3_beagle_android_defconfig
の後に
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- menuconfig
CUIのコンフィグメニューに入ります。
Device Drivers > Input Device support > Touchscreens > USB Touchscreen Driver > GenelarTouch Touchscreen device support
で、USB Touchscreen DriverとGenelarTouch Touchscreen device supportを有効にしてください。
<*> USB Touchscreen Driver [ ] eGalax, eTurboTouch CT-410/510/700 device support ・・・省略・・・ [*] GenelarTouch Touchscreen device support
Exitしたら、再度uImageを作成します
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- uImage
差分のみビルドしてくれるので初回より、かなり早いはずです。
ここまでくるとタッチパネルを繋ぐだけですね*5。
TouchScreenコントローラのつなぎかたで、わからない人がいるかもしれないので
画像を乗せておきます(画像はUSB接続の場合)
ちなみに今回利用したタッチスクリーンコントローラーはWindowsPCに直接指せば、認識して使えました*6。
自作Android、おもしろい。