無線 dongle 認識工作

ええと、ここを見つつ続き、というか Android のコンパイルを明日のためにヤッておきます。

とりあえず

firmware が無い、という事でググッてみたら、でびあんにはパケジがある模様。

# apt-cache search zd1211
zd1211-firmware - Firmware images for the zd1211 and zd1211rw wireless drivers
#

入れてみた。

# dpkg -L zd1211-firmware
/.
/usr
/usr/lib
/usr/lib/hotplug
/usr/lib/hotplug/firmware
/usr/share
/usr/share/doc
/usr/share/doc/zd1211-firmware
/usr/share/doc/zd1211-firmware/changelog.Debian.gz
/usr/share/doc/zd1211-firmware/copyright
/usr/share/doc/zd1211-firmware/README
/lib
/lib/firmware
/lib/firmware/zd1211
/lib/firmware/zd1211/zd1211b_uphr
/lib/firmware/zd1211/zd1211b_ub
/lib/firmware/zd1211/zd1211b_ur
/lib/firmware/zd1211/zd1211b_uphm
/lib/firmware/zd1211/zd1211b_uph
/lib/firmware/zd1211/zd1211_ur
/lib/firmware/zd1211/zd1211_ub
/lib/firmware/zd1211/zd1211_uph
/lib/firmware/zd1211/zd1211_uphm
/lib/firmware/zd1211/zd1211_uphr
/usr/lib/hotplug/firmware/zd1211-WS11UPhm.fw
/usr/lib/hotplug/firmware/zd1211-WS11Ub.fw
/usr/lib/hotplug/firmware/zd1211-WS11UPh.fw
/usr/lib/hotplug/firmware/zd1211-WS11UPhR.fw
/usr/lib/hotplug/firmware/zd1211-WS11Ur.fw
#

/lib/firmware/zd1211 をまるっと持ってけば良いのかな。という事は、vendor/atmark-techno/armadillo500fx 配下に

  • zd1211rw.ko
  • 上記の /lib/firmware/zd1211

をコピーしておく方向で。

Android なイメージ作成

順に参考コンテンツを見つつチェキ。

  • system.prop は修正の必要ナシ
    • デバイスファイルが wlan0 として認識されるため
  • wifi.c は zd1211rw を使う形で修正
  • init.armadillo500fx.rc についても wpa_supplicant 関連以外の wlan0 なソレは修正不要
  • AndroidBoard.mk
    • firmware をコピる場所は元の文書とは異ります
  • dhcpcd.conf も修正不要

という事で、修正を盛り込みます。最終的な git diff の出力が以下。

diff --git a/hardware/libhardware_legacy/wifi/wifi.c b/hardware/libhardware_legacy/wifi/wifi.c
index 4b0b7a8..263f01e 100644
--- a/hardware/libhardware_legacy/wifi/wifi.c
+++ b/hardware/libhardware_legacy/wifi/wifi.c
@@ -72,6 +72,9 @@ static const char RT2X00_LIB_DRIVER_MODULE_PATH[]      = "/system/lib/modules/rt
 static const char RT2X00_LIB_USB_DRIVER_MODULE_NAME[]  = "rt2x00usb";
 static const char RT2X00_LIB_USB_DRIVER_MODULE_TAG[]   = "rt2x00usb";
 static const char RT2X00_LIB_USB_DRIVER_MODULE_PATH[]  = "/system/lib/modules/rt2x00usb.ko";
+static const char ZD1211_LIB_USB_DRIVER_MODULE_NAME[]  = "zd1211rw";
+static const char ZD1211_LIB_USB_DRIVER_MODULE_TAG[]   = "zd1211rw";
+static const char ZD1211_LIB_USB_DRIVER_MODULE_PATH[]  = "/system/lib/modules/zd1211rw.ko";
 
 static const char DRIVER_MODULE_ARG[]   = WIFI_DRIVER_MODULE_ARG;
 static const char FIRMWARE_LOADER[]     = WIFI_FIRMWARE_LOADER;
@@ -180,9 +183,7 @@ int wifi_load_driver()
         return 0;
     }
 
-    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);
+    insmod(ZD1211_LIB_USB_DRIVER_MODULE_PATH, DRIVER_MODULE_ARG);
     property_set(DRIVER_PROP_NAME, "ok");
     property_set("ctl.start", 0);
     sched_yield();
@@ -205,9 +206,7 @@ int wifi_unload_driver()
 {
     int count = 20; /* wait at most 10 seconds for completion */
 
-    if ((rmmod(DRIVER_MODULE_NAME) == 0) && 
-        (rmmod(RT2X00_LIB_USB_DRIVER_MODULE_NAME) == 0) && 
-        (rmmod(RT2X00_LIB_DRIVER_MODULE_NAME) == 0)) {
+    if ((rmmod(ZD1211_LIB_USB_DRIVER_DRIVER_MODULE_NAME) == 0) {
            while (count-- > 0) {
                if (!check_driver_loaded())
                        break;
diff --git a/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_ieee80211.c b/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_ieee80211.c
index d8dc41e..7682365 100644
--- a/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_ieee80211.c
+++ b/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_ieee80211.c
@@ -48,6 +48,7 @@ static const struct channel_range channel_ranges[] = {
         * 1-13. The ZyDAS devices still use the old region code but are
         * designed to allow the extra channel access in Japan. */
        { ZD_REGDOMAIN_JAPAN_ADD,       1, 15 },
+       { 0x49, 1, 15},
 };
 
 static const struct channel_range *zd_channel_range(u8 regdomain)
diff --git a/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_usb.c b/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_usb.c
index 6cdad97..0b5c503 100644
--- a/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_usb.c
+++ b/kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd_usb.c
@@ -81,6 +81,7 @@ static struct usb_device_id usb_ids[] = {
        { USB_DEVICE(0x0cde, 0x001a), .driver_info = DEVICE_ZD1211B },
        { USB_DEVICE(0x0586, 0x340a), .driver_info = DEVICE_ZD1211B },
        { USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B },
        /* "Driverless" devices that need ejecting */
        { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
        { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER },
diff --git a/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk b/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk
index 9277674..ec5d25f 100644
--- a/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk
+++ b/vendor/atmark-techno/armadillo500fx/AndroidBoard.mk
@@ -16,10 +16,8 @@ include $(BUILD_KEY_CHAR_MAP)
 # prebuilt wifi driver
 #
 PRODUCT_COPY_FILES += \
-       $(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)/rt73.bin:system/etc/firmware/rt73.bin
+       $(LOCAL_PATH)/zd1211rw.ko:system/lib/modules/zd1211rw.ko \
+       $(LOCAL_PATH)/zd1211:system/lib/firmware/zd1211
 
 # board specific init.rc
 #
diff --git a/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc b/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc
index bf74997..874e434 100644
--- a/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc
+++ b/vendor/atmark-techno/armadillo500fx/init.armadillo500fx.rc
@@ -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/wifi/wpa_supplicant 0771 wifi wifi
+    chmod 0771 /data/system/wifi/wpa_supplicant
+
     mkdir /data/misc/dhcp 0770 dhcp dhcp
     chown dhcp dhcp /data/misc/dhcp
 

ちょっと init.armadillo500fx.rc の修正が微妙です。これで make 着手。

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

さ、こんどは SurfaceView 方面について確認ス。

コンパイルエラーが出てるorz

hardware/libhardware_legacy/wifi/wifi.c: In function 'wifi_unload_driver':
hardware/libhardware_legacy/wifi/wifi.c:209: error: 'ZD1211_LIB_USB_DRIVER_DRIVER_MODULE_NAME' undeclared (first use in this function)
hardware/libhardware_legacy/wifi/wifi.c:209: error: (Each undeclared identifier is reported only once
hardware/libhardware_legacy/wifi/wifi.c:209: error: for each function it appears in.)
hardware/libhardware_legacy/wifi/wifi.c:209: error: expected ')' before '{' token
hardware/libhardware_legacy/wifi/wifi.c:221: error: expected expression before '}' token
hardware/libhardware_legacy/wifi/wifi.c:221: error: no return statement in function returning non-void
make: *** [out/target/product/armadillo500fx/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/wifi/wifi.o] エラー 1

修正して make 再実行。

又出た

ardware/libhardware_legacy/wifi/wifi.c: In function 'wifi_unload_driver':
hardware/libhardware_legacy/wifi/wifi.c:209: error: expected ')' before '{' token
hardware/libhardware_legacy/wifi/wifi.c:221: error: expected expression before '}' token
hardware/libhardware_legacy/wifi/wifi.c:221: error: no return statement in function returning non-void
make: *** [out/target/product/armadillo500fx/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/wifi/wifi.o] エラー 1

何しとるんだorz
git diff の以下の部分が駄目な部分です。

@@ -205,9 +206,7 @@ int wifi_unload_driver()
 {
     int count = 20; /* wait at most 10 seconds for completion */
 
-    if ((rmmod(DRIVER_MODULE_NAME) == 0) && 
-        (rmmod(RT2X00_LIB_USB_DRIVER_MODULE_NAME) == 0) && 
-        (rmmod(RT2X00_LIB_DRIVER_MODULE_NAME) == 0)) {
+    if ((rmmod(ZD1211_LIB_USB_DRIVER_DRIVER_MODULE_NAME) == 0) {
            while (count-- > 0) {
                if (!check_driver_loaded())
                        break;

マクロが嘘だわ括弧が多いわ。

終了

したんですが微妙。

make: *** `out/target/product/armadillo500fx/system/lib/modules/zd1211rw.ko' に必要なターゲット `vendor/atmark-techno/armadillo500fx/zd1211rw.ko' を make するルールがありません. 中止.

とほほ。ファイルコピーしてないし。

$ cp kernel/arm/imx/armadillo-500fx/drivers/net/wireless/zd1211rw/zd1211rw.ko vendor/atmark-techno/armadillo500fx/.
$ cp -r /lib/firmware/zd1211/ vendor/atmark-techno/armadillo500fx/.
$ make

これでどうかいな。

なんとかなりますように

と祈りつつ放置。