armadillo500fx に Android のっけて無線 dongle 認識させてみた

先日 armadillo500fx に Android を入れて GW-USMicroN という無線 dongle を認識云々な機会がありましたのでメモを残しておきます。

ソースは OESF から提供されている Embedded Master 1 を使用。
ちなみに上記リポジトリには build 手順がありますので、一度はその手順に沿って kernel と Android なイメージを作って実機に導入しておく事をお勧めします。

ソース取得後

例えば以下なコマンドでソースを取得します。

$ mkdir /home/oesf/em1
$ cd $ANDROID
$ git clone git://github.com/OESF/Embedded-Master-ARM.git
$ export ANDROID=/home/oesf/em1/Embedded-Master-ARM

とりあえず git なのでブランチを作っておきましょう。

$ cd Embedded-Master-ARM
$ git checkout -b update
$ git branch
* update
  master
$

で、カーネルの make までは実行しておいて下さい。上記リポジトリでは以下のコマンドを実行しなさい、とあります。

$ cd $ANDROID/kernel/arm/imx/armadillo-500fx
$ make ARCH=arm CROSS_COMPILE=$ANDROID/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- armadillo500fx_dev_android_defconfig
$ make ARCH=arm CROSS_COMPILE=$ANDROID/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- zImage
$ make ARCH=arm CROSS_COMPILE=$ANDROID/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- modules

ここまでで事前準備は完了。

GW-USMicroN なモジュールの作成

ソースの取得

GW-USMicroN 用のドライバモジュールのソースファイルは http://www.ralinktech.com/support.php?s=2 より取得できます。ソースファイル取得後は適当な場所に展開を行なった後に、モジュールの作成を行ないます。

ソースコードの修正について

3 つのファイルに対して修正が必要となります。一つは common/rtusb_dev_id.c となります。rtusb_dev_id という配列を初期化している部分がありますが、末端に以下の一行を追加します。

	{USB_DEVICE(0x2019,0xed14)}, /* Planex GW-USMicroN */

ちなみに上記ですが、Linux 端末に無線ドングルを接続し、lsusb コマンドを実行する事で id を確認する事が可能です。以下にコマンドの実行例を引用しておきます。

$ lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 067b:aaa2 Prolific Technology, Inc. PL2303
Serial Adapter (IODATA USB-RSAQ3)
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 004: ID 0b97:7762 O2 Micro, Inc. Oz776 SmartCard Reader
Bus 002 Device 003: ID 0b97:7761 O2 Micro, Inc. Oz776 1.1 Hub
Bus 002 Device 002: ID 413c:a005 Dell Computer Corp. Internal 2.0 Hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 007: ID 2019:ed14 PLANEX
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$

以降は Makefile 関連の修正となります。一つは Makefile となりますが修正箇所が複数に及んでいますので、diff の出力を以下に引用します。

18c18
< #PLATFORM = PC
---
> PLATFORM = PC
42d41
< PLATFORM = ARMADILLO
47,51d45
< ifeq ($(PLATFORM),ARMADILLO)
< LINUX_SRC = /home/ojag/android/Embedded-Master-ARM/kernel/arm/imx/armadillo-500fx
< CROSS_COMPILE = /home/ojag/android/Embedded-Master-ARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
< endif
<

修正としては以下の三点となります。

  • PLATFORM = PC の行をコメントアウト
  • PLATFORM = ARMADILLO の行を挿入
  • ifeq (\$(PLATFORM),ARMADILL) から endif までの行を適当な場所に挿入

ちなみに LINUX_SRC や CROSS_COMPILE 等の変数に代入しているパスについては適宜各自の環境に書き換える必要がありますので気を付けて下さい。
最後に os/linux/config.mk の修正となります。こちらについても diff 出力を以下に引用しておきます。

< ifeq ($(PLATFORM),ARMADILLO)
< EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include -O3
< endif
<

上記についても config.mk の適当な場所に挿入しておけば大丈夫です。上記を略すとコンパイル時にヘッダファイルが無い、というエラーとなります。

build 手順

基本的にはソースツリーの最上位ディレクトリにおいて、make コマンドを実行すれば warning メセジは出力されますが、rt3070sta.ko というカーネルモジュールが出力されるはずです。

出力ファイルの転送

以下の二点を EM1 のソースツリー中の vendor/atmark-techno/armadillo500fx ディレクトリにコピーしておく必要があります。

  • rt3070sta.ko
  • RT3070STA.dat

Android イメージの作成

rt3070sta.ko なデバイスファイルは ra0 となりますので、そのあたりの修正が必要となります。順にファイルを修正していきます。

system.prop の修正

vendor/atmark-techno/armadillo500fx/system.prop に関する修正については、
以下の diff 出力を参考に修正を盛り込んで下さい。

 rild.libpath=/system/lib/libreference-ril.so
 rild.libargs=-d /dev/ttyS0
-wifi.interface = wlan0
+wifi.interface = ra0
 ro.config.sync = yes
 keyguard.no_require_sim=1

wifi.c

hardware/libhardware_legacy/wifi/wifi.c の修正について。
ここでは、要求に沿ってドライバをロード、アンロードしている処理の記述がありますので、使用するドライバに合わせてソースファイルの記述を変更しておく必要があります。
まず、以下の文字列データの定義を追加しておきます。

static const char RT3070_LIB_USB_DRIVER_MODULE_NAME[]  = "rt3070sta";
static const char RT3070_LIB_USB_DRIVER_MODULE_TAG[]   = "rt3070sta";
static const char RT3070_LIB_USB_DRIVER_MODULE_PATH[]  = "/system/lib/modules/rt3070sta.ko";

次に、wifi_load_driver という手続きにおいて以下のような記述がありますので

    insmod(RT2X00_LIB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);
    insmod(RT2X00_LIB_USB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);
    insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); */

    property_set(DRIVER_PROP_NAME, "ok");

これを以下のように書き換えます。

    insmod(RT3070_LIB_USB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);

    property_set(DRIVER_PROP_NAME, "ok");

又、同様に wifi_unload_driver という手続きについても同様に

    if ((rmmod(DRIVER_MODULE_NAME) == 0) &&
        (rmmod(RT2X00_LIB_USB_DRIVER_MODULE_NAME) == 0) &&
        (rmmod(RT2X00_LIB_USB_DRIVER_MODULE_NAME) == 0) &&
        (rmmod(RT2X00_LIB_DRIVER_MODULE_NAME) == 0)) {

という記述について以下のように修正します。

	if(rmmod(RT3070_LIB_USB_DRIVER_MODULE_NAME) == 0) {

これで wifi.c の修正は完了です。

init.armadillo500fx.rc

vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc については diff 出力を以下に引用しておきます。

@@ -114,7 +114,12 @@ loglevel 3
     #WIFI
     mkdir /data/misc/wifi 0770 wifi wifi
     mkdir /data/misc/wifi/sockets 0770 wifi wifi
-    mkdir /data/system/wifi/wpa_supplicant 0770 wifi wifi
+    chmod 0770 /data/misc/wifi
+    chmod 0660 /data/misc/wifi/wpa_supplicant.conf
+#    mkdir /data/system/wifi/wpa_supplicant 0770 wifi wifi
+    mkdir /data/system/wpa_supplicant 0771 wifi wifi
+    chmod 0771 /data/system/wpa_supplicant wifi wifi
+
     mkdir /data/misc/dhcp 0770 dhcp dhcp
     chown dhcp dhcp /data/misc/dhcp

@@ -344,11 +352,11 @@ service keystore /system/bin/keystore
     socket keystore stream 666

 service wpa_supplicant /system/bin/wpa_supplicant \
-    -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf -dd
+    -Dwext -ira0 -c /system/etc/wifi/wpa_supplicant.conf -dd
+#    -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf -dd
     disabled
     group wifi

-service dhcpcd /system/bin/dhcpcd -d wlan0
+# service dhcpcd /system/bin/dhcpcd -d wlan0
+service dhcpcd /system/bin/dhcpcd -d ra0
     disabled
     oneshot
     #group system dhcp
@@ -363,7 +371,7 @@ service pppd /system/etc/init.bluetooth-pppd
     disabled
     oneshot

-service ifcfg_ralink /system/bin/ifconfig wlan0 up
+# service ifcfg_ralink /system/bin/ifconfig wlan0 up
+
+service ifcfg_ralink /system/bin/ifconfig ra0 up

 on property:init.svc.wpa_supplicant=stopped
     stop dhcpcd

修正内容としては

  • wpa_supplicant の設定ファイル類について属性の変更など
    • /data/misc/wifi ディレクトリの属性変更
    • /data/misc/wifi/wpa\_supplicant.conf の属性変更
    • /data/system/wpa\_supplicant ディレクトリの作成
    • /data/system/wpa\_supplicant ディレクトリの属性変更
  • service wpa_supplicant についてインターフェースの変更
  • service dpchcd についてインターフェースの変更
  • service ifcfg_ralink についてインターフェースの変更

の四点となります。

AndroidBoard.mk

vendor/atmark-techno/armadillo500fx/AndroidBoard.mk については make 中にモジュール類の必要となるファイルの転送コマンドの部分の修正となりますので、以下となっているものについて

        $(LOCAL_PATH)/rt73usb.ko:system/lib/modules/rt73usb.ko \
        $(LOCAL_PATH)/rt2x00usb.ko:system/lib/modules/rt2x00usb.ko \
        $(LOCAL_PATH)/rt2x00lib.ko:system/lib/modules/rt2x00lib.ko \

以下の形に書き換えます。

       $(LOCAL_PATH)/rt3070sta.ko:system/lib/modules/rt3070sta.ko \
       $(LOCAL_PATH)/RT3070STA.dat:system/etc/Wireless/RT2870STA/RT2870STA.dat \

dhcpcd.conf

vendor/atmark-techno/armadillo500fx/dhcpcd.conf についても以下に diff 出力を引用しておきます。修正としてはインターフェースの修正となります。

 # dhcpcd configuration for Android Wi-Fi interface
 # See dhcpcd.conf(5) for details.

-interface wlan0
+#interface wlan0
+interface ra0

 # dhcpcd-run-hooks uses these options.
 option subnet_mask, routers, domain_name_servers

Android の make

make の方法については上記 EM1 のリポジトリにて記述されている Android の make の方法に沿う事でイメージの作成が可能となっています。

make コマンド

冗長となりますが、投入が必要な make コマンドについては以下に引用しておきます。

$ cd $ANDROID
$ source ./build/envsetup.sh
$ choosecombo 1 1 armadillo500fx 3
$ make

make が正常に終了したら out/target/product/armadillo500fx ディレクトリ配下に root 及び system というディレクトリが作成されます。これらが Android のルートファイルシステム配下に必要なファイルとなります。

実機への転送

カーネルと Android イメージの転送方法は異なります。

  • カーネルについては hermit コマンドで直接シリアル転送を行ないます
  • Android イメージについては SDCard などのデバイスを用いて転送を行ないます

カーネルについては以下の要領で転送を行います。

  • 実機の JP4 をショートさせた状態で起動を行う
  • フラッシュメモリを hermit コマンドで書き換える

転送コマンドについては以下に実行例を引用しておきます。

# hermit download --input-file linux.bin.gz --region kernel --port /dev/ttyUSB0

また、Android の rootfs のイメージについては以下の要領にてファイルを作成
し、SDCard 経由で転送を行って下さい (下記の記述については若干不適切です)。

# mkdir -p $ANDROID/vendor/sola/a500fx/image/android
# cp -Rdpf $ANDROID/out/target/product/a500fx/root/* $ANDROID/vendor/sola/a500fx/image/android/
# cp -Rdpf $ANDROID/out/target/product/a500fx/system/* $ANDROID/vendor/sola/a500fx/image/android/system/
# chmod 777 -R $ANDROID/vendor/sola/a500fx/image/android/system/usr/keychars
# chmod 777 -R $ANDROID/vendor/sola/a500fx/image/android/system/usr/keylayout
# cd $ANDROID/vendor/sola/a500fx/image/
# tar zcvf android.tar.gz android

実際にはコピー先のディレクトリは無い場合もありますので、コピー先は適当な場所にディレクトリを作成して下さい。基本的には android というディレクトリを作成して、その中に root および system ディレクトリの中身をコピーする形となります。

実機の起動

ファイルを /mnt にマウントされた SSD 領域にコピーした後には以下の要領で Android を起動します。

# cd /mnt
# tar zxvf android.tar.gz
# stty -F /dev/ttyUSB0 4800
# chroot /mnt/android /init

おわりに

本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。
また、Linux なドライバがある無線 dongle であれば GW-USMicroN 以外のものでも同様の方法で認識は可能と思われます。

avatar

About yamanetoshi

λ 好きだよ λ