USB無線LANをAndroid上で動作させようと思い、ドライバのパッチをあて、
http://kaushikprajapati.com/AndroidFileChnagesforWifi.aspx
を参考に各ファイルを変更をし、GUI上でWifiのON/OFFができるようにまでなりました。
しかし固定IPを設定した場合、ネットワークに接続できる事を確認したのですがDHCPサーバからIPアドレスを自動取得しようとした場合、IPアドレ
スが取得できず、取得中は以下のようなログが繰り返し抽出されました。
wlan0:ignoring event
Error:No interface name
Error:Callback failed
DHCPサーバからIPアドレスが取得できない原因と解決方についてお教えいただけないでしょうか。
開発機器
USBモジュール:Planex GW-US54GX
Androidバージョン:1.5
アクセスポイント設定:
network={
ssid="default"
key_mgmt=NONE
priority=3
}
あの無線LANのInterfaceは何ですか。
> wlan0:ignoring event
> Error:No interface name
> Error:Callback failed
InterfaceとWiFiのドライバーがあってないことと思います。
確認するところはwifi.cとか、wpa_supplicant.confとか、dhcpcd.confとかです。
Good luck.
> あの無線LANのInterfaceは何ですか。
wlan0に設定しています。
>InterfaceとWiFiのドライバーがあってないことと思います。
>確認するところはwifi.cとか、wpa_supplicant.confとか、dhcpcd.confとかです。
確認しましたが、あっていないわけではないようです。
以下に差分を載せておきます。
--a/home/HaL/mydroid/external/wpa_supplicant/wpa_supplicant.conf.orig
++b/home/HaL/mydroid/external/wpa_supplicant/wpa_supplicant.conf
@73
# information about SDDL string format.
#
-ctrl_interface=tiwlan0
+#ctrl_interface=wlan0
+ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=system
--a/home/HaL/mydroid/hardware/libhardware_legacy/wifi/wifi.c.oprig
++b/home/HaL/mydroid/hardware/libhardware_legacy/wifi/wifi.c
@47
static char iface[PROPERTY_VALUE_MAX];
// TODO: use new ANDROID_SOCKET mechanism, once support for multiple
// sockets is in
static const char IFACE_DIR[] = "/data/system/
wpa_supplicant";
-static const char DRIVER_MODULE_NAME[] = "wlan";
-static const char DRIVER_MODULE_TAG[] = "wlan ";
-static const char DRIVER_MODULE_PATH[] = "/system/lib/modules/
wlan.ko";
+//static const char DRIVER_MODULE_NAME[] = "wlan";
+//static const char DRIVER_MODULE_TAG[] = "wlan ";
+//static const char DRIVER_MODULE_PATH[] = "/system/lib/modules/
wlan.ko";
+static const char DRIVER_MODULE_NAME[] = "zd1211rw";
+static const char DRIVER_MODULE_TAG[] = "zd1211rw ";
+static const char DRIVER_MODULE_PATH[] = "/system/lib/modules/
zd1211rw.ko";
static const char FIRMWARE_LOADER[] = "wlan_loader";
static const char DRIVER_PROP_NAME[] = "wlan.driver.status";
static const char SUPPLICANT_NAME[] = "wpa_supplicant";
static const char SUPP_PROP_NAME[] = "init.svc.wpa_supplicant";
@63
static int insmod(const char *filename)
{
void *module;
unsigned int size;
int ret;
+ LOGI("%s\n",__FUNCTION__);
module = load_file(filename, &size);
if (!module)
return -1;
@80
static int rmmod(const char *modname)
{
int ret = -1;
int maxtry = 10;
+ LOGI("%s\n",__FUNCTION__);
while (maxtry-- > 0) {
ret = delete_module(modname, O_NONBLOCK | O_EXCL);
if (ret < 0 && errno == EAGAIN)
usleep(500000);
@99
int do_dhcp_request(int *ipaddr, int *gateway, int *mask,
int *dns1, int *dns2, int *server, int *lease) {
+ LOGI("HaL1. inside %s\n",__FUNCTION__);
/* For test driver, always report success */
- if (strcmp(iface, "sta") == 0)
- return 0;
+ //if (strcmp(iface, "sta") == 0)
+ if (strcmp(iface, "wlan0") == 0)
+ {printf("HaL wlan0 == 0\n");
+ return 0;
+ }
+ printf("wlan0!=0\n");
+ LOGI("HaL2. inside %s\n", __FUNCTION__);
if (ifc_init() < 0)
return -1;
+ LOGI("HaL3. inside %s\n", __FUNCTION__);
if (do_dhcp(iface) < 0) {
ifc_close();
return -1;
}
ifc_close();
get_dhcp_info(ipaddr, gateway, mask, dns1, dns2, server, lease);
+ LOGI("HaL4. inside %s\n", __FUNCTION__);
return 0;
@117
const char *get_dhcp_error_string() {
+ LOGI("Inside %s\n",__FUNCTION__);
return dhcp_lasterror();
}
@141
while ((fgets(line, sizeof(line), proc)) != NULL) {
if (strncmp(line, DRIVER_MODULE_TAG,
strlen(DRIVER_MODULE_TAG)) == 0) {
+ LOGI("HaL driver %s has been installed
\n",DRIVER_MODULE_TAG);
fclose(proc);
return 1;
}
}
fclose(proc);
- property_set(DRIVER_PROP_NAME, "unloaded");
+ //property_set(DRIVER_PROP_NAME, "unloaded");
+ printf("property_set(DRIVER_PROP_NAME = ok)\n");
+ property_set(DRIVER_PROP_NAME, "ok");
return 0;
}
@152
int wifi_load_driver()
{
char driver_status[PROPERTY_VALUE_MAX];
int count = 100; /* wait at most 20 seconds for completion */
+ LOGI("Loading WiFi Modules");
+ sleep(1);
+ property_set(DRIVER_PROP_NAME,"ok");
if (check_driver_loaded()) {
return 0;
}
- if (insmod(DRIVER_MODULE_PATH) < 0)
- return -1;
+ //if (insmod(DRIVER_MODULE_PATH) < 0)
+ //return -1;
+ insmod(DRIVER_MODULE_PATH);
property_set("ctl.start", FIRMWARE_LOADER);
sched_yield();
while (count-- > 0) {
+ usleep(500000);
if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
if (strcmp(driver_status, "ok") == 0)
- return 0;
+ {
+ property_set("ctl.start","ifcfg_zd");
+ usleep(1000000);
+ return 0;
+ }
else if (strcmp(DRIVER_PROP_NAME, "failed") == 0)
return -1;
}
- usleep(200000);
+ //usleep(200000);
@179
int wifi_unload_driver()
{
- int count = 20; /* wait at most 10 seconds for completion */
+ //int count = 20; /* wait at most 10 seconds for completion */
+ sleep(1);
if (rmmod(DRIVER_MODULE_NAME) == 0) {
- while (count-- > 0) {
- if (!check_driver_loaded())
- break;
- usleep(500000);
- }
- if (count) {
- return 0;
- }
- return -1;
- } else
- return -1;
+ //while (count-- > 0) {
+ //if (!check_driver_loaded())
+ //break;
+ //usleep(500000);
+ //}
+ //if (count) {
+ //return 0;
+ //}
+ //return -1;
+ //} else
+ //return -1;
+ usleep(1000000);
+ }
+ else
+ {
+ LOGE("Unloading module failed \n");
+ return -1;
}
@250
#ifdef HAVE_LIBC_SYSTEM_PROPERTIES
const prop_info *pi;
unsigned serial = 0;
#endif
+ LOGI("HaL start %s",__FUNCTION__);
/* Check whether already running */
if (property_get(SUPP_PROP_NAME, supp_status, NULL)
&& strcmp(supp_status, "running") == 0) {
return 0;
}
/* Before starting the daemon, make sure its config file exists */
if (ensure_config_file_exists() < 0) {
LOGE("Wi-Fi will not be enabled");
+ LOGE("HaL Configuration file does not exist. Wi-Fi will not be
enabled");
return -1;
}
@291
if (pi != NULL) {
__system_property_read(pi, NULL, supp_status);
if (strcmp(supp_status, "running") == 0) {
+ LOGI("Wi-Fi is HaL\n");
return 0;
} else if (pi->serial != serial &&
strcmp(supp_status, "stopped") == 0)
+ LOGI("Wi-FiHaL has been stopped");
return -1;
}
}
@335
int wifi_connect_to_supplicant()
{
char ifname[256];
char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
+ LOGI("%s called",__func__);
/* Make sure supplicant is running */
if (!property_get(SUPP_PROP_NAME, supp_status, NULL)
|| strcmp(supp_status, "running") != 0) {
LOGE("Supplicant not running, cannot connect");
return -1;
}
- property_get("wifi.interface", iface, "sta");
+ //property_get("wifi.interface", iface, "sta");
+ property_get("wifi.interface", iface, "wlan0");
if (access(IFACE_DIR, F_OK) == 0) {
snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface);
} else {
@367
if (wpa_ctrl_attach(monitor_conn) != 0) {
wpa_ctrl_close(monitor_conn);
wpa_ctrl_close(ctrl_conn);
ctrl_conn = monitor_conn = NULL;
return -1;
}
+ LOGI("Connect to Supplicant done\n");
return 0;
}
@376
int wifi_send_command(struct wpa_ctrl *ctrl, const char *cmd, char
*reply, size_t *reply_len)
{
int ret;
+ LOGI("%s,cmd = %s\n",__FUNCTION__,cmd );
if (ctrl_conn == NULL) {
LOGV("Not connected to wpa_supplicant - \"%s\" command dropped.
\n", cmd);
return -1;
}
+ memset(reply,0, *reply_len);
ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), reply, reply_len,
NULL);
if (ret == -2) {
LOGD("'%s' command timed out.\n", cmd);
@455
int wifi_command(const char *command, char *reply, size_t *reply_len)
{
+ LOGI("%s called, cmd:=%s",__func__,command);
return wifi_send_command(ctrl_conn, command, reply, reply_len);
}
-- a/home/HaL/mydroid/out/target/product/generic/system/etc/dhcpcd/
dhcpcd.conf.orig
++ b/home/HaL/mydroid/out/target/product/generic/system/etc/dhcpcd/
dhcpcd.conf
@1
# dhcpcd configuration for Android Wi-Fi interface
# See dhcpcd.conf(5) for details.
- interface tiwlan0
+ interface wlan0
# dhcpcd-run-hooks uses these options.
option subnet_mask, routers, domain_name_servers
その問題を解決しましたか。
もしまたあれば、全部ログをお願いします。
一緒に分析しましょう。
1点お願いです。長大なログやコードは pastbin.com などの
コピペ共有サイトをご利用いただけると、他の参加者さんの
ご迷惑ならないかと思います。
ご配慮いただけると幸いです。
このスレッドはこのまま伸ばしていただいてかまいませんが
思いっきり組み込みの話題ですので、組み込みWGでの議論
もあわせてご検討いただけるとうれしいです。
http://groups.google.com/group/android-embedded-japan
ではでは。
返信ありがとうございます。
未だに問題の解決に至らないため、知恵をお借りしたく思います。
以下のURLにandroidが起動してからのログを載せておきます。
http://pastebin.com/CRHrDYQR
HaLです。
ご忠告ありがとうございます。
早速紹介されたサイトを活用させていただきます。
init: no such service 'wlan_loader'というエラーが出てますね。これは、
init.rc他の設定スクリプトに該当するサービスが登録されていないと発生
します。
もしかして、こちらのrootfs changesはapplyしてないんじゃないでしょ
うか?
http://kaushikprajapati.com/rootfschanges.aspx
ではでは。
HaLです。
wlan_loaderのサービスを登録して動かしてみた所、GUIでwifiをONにできなくなりました。
その時のログが以下です。
http://pastebin.com/NNbS3tBR
知恵をお借りできれば幸いです。
最悪、全ソースコードを oneshotで検索すると見つかります。
--
な
HaLです。
教えていただきありがとうございます。
早速勉強します。
○無線LAN
android(IPアドレス要求)→アクセスポイント→DHCPサーバ(IPアドレス割当て)→アクセスポイントまでは来ている
となっていて
・androidに届いていない
・androidに届いたけれども何かの処理がおかしくてIPアドレスを設定できていない
上記2つの可能性を考えています。
後者だとしたらdhcpcdで有線LAN(DHCP利用可)の方の処理がされているのではないかと推測してます。
androidのdhcpcdで有線と無線の処理がどう分岐しているのか
助言又は参考資料等を教えていただけませんか。
有線・無線の指定ですが、
init.rcに以下のようにサービスの登録がありませんか?
service dhcpcd /system/bin/dhcpcd -dd eth1
ここで使用するInterfaceを指定してあげればよいのかなと思います。
(HaL様環境ですとwlan0でしたでしょうか)
このサービスは、libhardware_legacy/wifiかframeworkのどこかから
以下のような形で起動させていると思います。
property_set("ctl.start", "dhcpcd");
私も固定IPでの動作確認まで(dhcpcdの動作は未確認)なので
間違ったこといってたらごめんなさい。
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。
>
HaLです。
指摘していただいた部分の検討をした後に
ログを確認したら
D/WifiStateTracker( 1213): DhcpHandler: DHCP request started
I/logwrapper( 1698): /system/bin/dhcpcd terminated by exit(1)
I/WifiStateTracker( 1213): DhcpHandler: DHCP request failed: Timed out
waiting for dhcpcd to start
上記のエラーが出ていたことに気づきました。
DHCP自体がまともに動いていないということで調べ直し、
dhcpcd.confファイルの設定が誤っていたので修正した後、正常な動作を確認しました。
ありがとうございました。