ひつじのにっき

mhidakaのにっきです。たまに長文、気が向いたとき更新。

タッチパネルをAndroidに認識させるまで

タッチパネルを乗せようと思った動機は、
Android-Embedded-Japan(Googleグループ)のbeaglebordとお散歩できますを読んでから。

最近ようやく動くところまで到達したので手順をまとめます。
大きく分けて、3つの作業があります、いずれも先人のまとめサイトなど
参考にしながら試行錯誤しました。

  1. BealgeBoard向けAndroidの構築
  2. USB Displayの接続
  3. タッチパネルのドライバmodify

BealgeBoard向けAndroidの構築

いくつか方法があると思います。Webをさがして比較的簡単に見つかるのは

の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

後、パスは解説通り、(面倒でも)通しておく必要があります。

$ export ANDROID=/home/sola/android/beagle-droid

手順の途中で、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、おもしろい。

*1:なんで一緒にmakeされないんだろ・・・

*2:あとでタッチパネルを接続する際に、カーネルの再ビルドが必要になります

*3:LinuxのKernelまわりは不得手なので、トラブルを避けるために機種をあわせました

*4:kernel.patchの一部がフリッカー対策に該当します

*5:ちなみに私は20時間以上かかって到達しました・・・orz

*6:動作確認するだけならこちらがおすすめ