和菜鸟一起学android4.0.3源码之US…
来源:互联网 发布:html2fpdf.php下载 编辑:程序博客网 时间:2024/04/28 16:09
在Networkingsupport下选上
上面主要是选上相关的通信的协议,802.11啊什么的。
然后wifi的设备也要选上
选上自己的wifi设备驱动,我是选择编译进内核的,不是编译成模块的,而按照android源码中可以知道,其实是要编译成模块,不断去加载什么的。不过编译进内核后,修改下android下的源码也是可以解决问题的。
- ./iwlist
wlan0 scanning -
- ./iwconfig
wlan0 mode managed -
- ./iwconfig
wlan0 essid “你要连接的路由” -
- ./ifconfig
wlan0 要为wifi设置的静态IP netmask 255.255.255.0 up
1、
2、
3、
- mkdir
/data/misc/wifi 0777 wifi wifi -
- chmod
0777 /data/misc/wifi/wpa_supplicant.conf -
- mkdir
/wlan0 0777 wifi wifi
- #prepare
for wifi -
-
setprop wifi.interface “wlan0” -
-
setprop wlan.driver.status “ok”
在init.xxx.rc中添加下面的
- mkdir
/data/misc/wifi/sockets 0777 wifi wifi -
-
mkdir /data/misc/dhcp 0777 dhcp dhcp -
-
chmod 0777 /dev/rfkill
又和蓝牙一样,有一个rfkill,所以得给他修改下权限。
- service
wpa_supplicant /system/bin/wpa_supplicant –dd –Dwext –iwlan0 –c/data/misc/wifi/wpa_supplicant.conf -
-
class main -
-
#socket wpa_wpa_wlan0 dgram 0777 wifi wifi -
-
group system inet -
-
disabled -
-
oneshot
- service
dhcpcd_wlan0 /system/bin/dhcpcd –d –B wlan0 -
-
class main -
-
disabled -
-
oneshot
wpa_supplicant.conf加进去,里面的内容一般可以如下:
- ctrl_interface=wlan0
-
- update_config=1
-
- ap_scan=1
-
- fast_reauth=1
- static
const char IFACE_DIR[] = "/data/system/wpa_supplicant";
这个修改为
- static
const char IFACE_DIR[] = "/wlan0";
- static
int insmod(const char *filename, const char *args)
这个函数第一行就return0。因为编译进内核,没有模块。
- static
int rmmod(const char *modname)
这个函数同上。
- BOARD_WIFI_VENDOR
:=realtek -
-
WPA_SUPPLICANT_VERSION := VER_0_8_X -
-
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_drivercmd_wext -
-
BOARD_WLAN_DEVICE := rtl8192cu
Hardware/libhardware_legacy/下mm后得到了libhardware_legacy.so
external/wpa_supplicant_8/下mm后得到了wpa_cli,wpa_supplicant和libwpa_client.so
启动后,首先就是查看下底层驱动有没有运行,主要就是cat /proc/net/dev有wlan0的话,那么就说明ok了。接着就是要连接上wpa_supplicant了
- wpa_supplicant
–dd –Dwext –iwlan0 –c/data/misc/wifi/wpa_supplicant.conf &
让他后台运行着就好了。
就这就
- wpa_cli
–iwlan0 –p/wlan0
然后再
Scan (搜索网络)
接着scan_res(显示搜索结果,如果可以搜到网络的话,那么几乎就可以说是成功了)
接着就
- add_net
-
- set_net
0 ssid “相应搜到的网络” -
- set_net
0 key_mgmt NONE -
- set_net
0 priority 0 -
- list_net
-
- save_config
-
- enable_net
0
这样就可以启动了,然后再
- dhcpcd
wlan0
分配一个ip地址,接着去ping路由,就可以ping的通了,那么一直基本上告一段落。
不过这个是命令行的,得让他在UI界面出来,于是还是启动服务吧,可是一直wpa_supplicant的时候就不成功,老是有问题。跟进代码,当上层开关打开后就会调用到下面这个函数去连接wpa_supplicant
- /hardware/libhardware_legacy/wifi.c
-
- int
wifi_connect_to_supplicant() -
- {
-
-
char ifname[256]; -
-
char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; -
-
-
-
-
-
if (!property_get(SUPP_PROP_NAME, supp_status, NULL) -
-
|| strcmp(supp_status, "running") != 0) { -
-
LOGE("Supplicant not running, cannot connect"); -
-
return -1; -
-
} -
-
-
-
if (access(IFACE_DIR, F_OK) == 0) { -
-
snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface); -
-
} else { -
-
strlcpy(ifname, iface, sizeof(ifname)); -
-
} -
-
-
-
ctrl_conn = wpa_ctrl_open(ifname); -
-
if (ctrl_conn == NULL) { -
-
LOGE("Unable to open connection to supplicant on \"%s\": %s", -
-
ifname, strerror(errno)); -
-
return -1; -
-
} -
-
monitor_conn = wpa_ctrl_open(ifname); -
-
if (monitor_conn == NULL) { -
-
wpa_ctrl_close(ctrl_conn); -
-
ctrl_conn = NULL; -
-
return -1; -
-
} -
-
if (wpa_ctrl_attach(monitor_conn) != 0) { -
-
wpa_ctrl_close(monitor_conn); -
-
wpa_ctrl_close(ctrl_conn); -
-
ctrl_conn = monitor_conn= NULL; -
-
return -1; -
-
} -
-
-
-
if (socketpair(AF_UNIX, SOCK_STREAM, 0, exit_sockets) == -1) { -
-
wpa_ctrl_close(monitor_conn); -
-
wpa_ctrl_close(ctrl_conn); -
-
ctrl_conn = monitor_conn= NULL; -
-
return -1; -
-
} -
-
-
-
return 0; -
- }
继续跟进代码
- external/wpa_supplicant_8/src/common/wpa_ctrl.c
-
-
-
- #ifdef
CTRL_IFACE_SOCKET -
- int
wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len, -
-
char *reply, size_t *reply_len, -
-
void (*msg_cb)(char *msg, size_t len)) -
- {
-
-
struct timeval tv; -
-
int res; -
-
fd_set rfds; -
-
const char *_cmd; -
-
char *cmd_buf = NULL; -
-
size_t _cmd_len; -
-
-
- #ifdef
CONFIG_CTRL_IFACE_UDP -
-
if (ctrl->cookie) { -
-
char *pos; -
-
_cmd_len = os_strlen(ctrl->cookie)+ 1 + cmd_len; -
-
cmd_buf = os_malloc(_cmd_len); -
-
if (cmd_buf == NULL) -
-
return -1; -
-
_cmd = cmd_buf; -
-
pos = cmd_buf; -
-
os_strlcpy(pos, ctrl->cookie, _cmd_len); -
-
pos += os_strlen(ctrl->cookie); -
-
*pos++ = ' '; -
-
os_memcpy(pos, cmd, cmd_len); -
-
} else -
- #endif
-
-
{ -
-
_cmd = cmd; -
-
_cmd_len = cmd_len; -
-
} -
-
-
-
if (send(ctrl->s, _cmd, <</span>_cmd_len, 0) 0) { -
-
os_free(cmd_buf); -
-
return -1; -
-
} -
-
os_free(cmd_buf); -
-
-
-
for (;;) { -
-
tv.tv_sec = 10; -
-
tv.tv_usec = 0; -
-
FD_ZERO(&rfds); -
-
FD_SET(ctrl->s, &rfds); -
-
res = select(ctrl->s+ 1, &rfds, NULL, NULL, &tv); -
-
if (res <</span> 0) -
-
return res; -
-
if (FD_ISSET(ctrl->s, &rfds)) { -
-
res = recv(ctrl->s,reply, *reply_len, 0); -
-
if (res <</span> 0) -
-
return res; -
-
if (res > 0 <</span>')&& reply[0] == ' { -
-
-
-
if (msg_cb) { -
-
-
-
if ((size_t) res == *reply_len) -
-
res = (*reply_len) - 1; -
-
reply[res] = '\0'; -
-
msg_cb(reply, res); -
-
} -
-
continue; -
-
} -
-
*reply_len = res; -
-
break; -
-
} else { -
-
return -2; -
-
} -
-
} -
-
return 0; -
- }
-
- #endif
-
-
好吧,那就继续跟进吧。。。
- external/wpa_supplicant_8/wpa_supplicant/ctrl_iface_unix.c
-
-
-
- static
void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx, -
-
void *sock_ctx) -
- {
-
-
struct wpa_supplicant *wpa_s = eloop_ctx; -
-
struct ctrl_iface_priv *priv = sock_ctx; -
-
char buf[4096]; -
-
int res; -
-
struct sockaddr_un from; -
-
socklen_t fromlen = sizeof(from); -
-
char *reply = NULL; -
-
size_t reply_len = 0; -
-
int new_attached = 0; -
-
-
-
res = recvfrom(sock,buf, sizeof(buf) - 1, 0, -
-
(struct sockaddr *) &from, &fromlen); -
-
if (res <</span> 0) { -
-
perror("recvfrom(ctrl_iface)"); -
-
return; -
-
} -
-
buf[res] = '\0'; -
-
-
-
if (os_strcmp(buf, "ATTACH") == 0) { -
-
if (wpa_supplicant_ctrl_iface_attach(priv, &from, fromlen)) -
-
reply_len = 1; -
-
else { -
-
new_attached = 1; -
-
reply_len = 2; -
-
} -
-
} else if (os_strcmp(buf, "DETACH") == 0) { -
-
if (wpa_supplicant_ctrl_iface_detach(priv, &from, fromlen)) -
-
reply_len = 1; -
-
else -
-
reply_len = 2; -
-
} else if (os_strncmp(buf, "LEVEL ", 6) == 0) { -
-
if (wpa_supplicant_ctrl_iface_level(priv, &from, fromlen, -
-
buf + 6)) -
-
reply_len = 1; -
-
else -
-
reply_len = 2; -
-
} else { -
-
reply = wpa_supplicant_ctrl_iface_process(wpa_s,buf, -
-
&reply_len); -
-
} -
-
-
-
if (reply) { -
-
sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from, -
-
fromlen); -
-
os_free(reply); -
-
} else if (reply_len == 1) { -
-
sendto(sock, "FAIL\n", 5, 0, (struct sockaddr *) &from, -
-
fromlen); -
-
} else if (reply_len == 2) { -
-
sendto(sock, "OK\n", 3, 0, (struct sockaddr *) &from, -
-
fromlen); -
-
} -
-
-
-
if (new_attached) -
-
eapol_sm_notify_ctrl_attached(wpa_s->eapol); -
- }
- external/wpa_supplicant_8/hostapd/src/utrls/os-unix.c
-
-
-
- int
os_program_init(void) -
- {
-
- #ifdef
ANDROID -
-
-
-
gid_t groups[] = { AID_INET, AID_WIFI, AID_KEYSTORE }; -
-
struct __user_cap_header_struct header; -
-
struct __user_cap_data_struct cap; -
-
-
-
setgroups(sizeof(groups)/sizeof(groups[0]), groups); -
-
-
-
prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); -
-
-
-
setgid(AID_WIFI); -
-
setuid(AID_WIFI); -
-
-
-
header.version = _LINUX_CAPABILITY_VERSION; -
-
header.pid = 0; -
-
cap.effective = cap.permitted= -
-
(1 <</span><</span> CAP_NET_ADMIN) | <</span><</span>(1 CAP_NET_RAW); -
-
cap.inheritable = 0; -
-
capset(&header, &cap); -
- #endif
-
-
-
- #ifdef
WPA_TRACE -
-
dl_list_init(&alloc_list); -
- #endif
-
-
return 0; -
- }
补充:
关于IP的自动获取不成功的问题,下午找了下原因还是那个恶心的权限问题,因为我是用的unix标准的sockets,而不是android内部的sockets,所以出问题了。只要在
External/dhcpcd/dhcpcd.c中头文件的位置加上以下几句,然后再mm生成的dhcpcd就可以了
- #ifdef
ANDROID -
- #undef
ANDROID -
- #endif
ok,至此,USBwifi的移植就完全成功了。好好回去休息吧,又是周末了。。
- 和菜鸟一起学android4.0.3源码之US…
- 和菜鸟一起学android4.0.3源码之US…
- 和菜鸟一起学android4.0.3源码之鼠标光标绘制简略版
- 和菜鸟一起学android4.0.3源码之touchscreen配置+调试记录
- 和菜鸟一起学android4.0.3源码之红外遥控器适配
- 和菜鸟一起学android4.0.3源码之bluetooth移植心得
- 和菜鸟一起学android4.0.3源码之USB wifi移植心得
- 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节
- 和菜鸟一起学android4.0.3源码之vibrator振动器移植心得
- 和菜鸟一起学android4.0.3源码之按键驱动短长按功能
- 和菜鸟一起学android4.0.3源码之bluetooth移植心得
- 和菜鸟一起学android4.0.3源码之传感器的简单移植
- 和菜鸟一起学android4.0.3源码之硬件gps简单移植
- 和菜鸟一起学android4.0.3源码之wifi的简单分析
- 和菜鸟一起学android4.0.3源码之wifi direct的简单分析
- 和菜鸟一起学android4.0.3源码之硬件gps简单移植
- 和菜鸟一起学android4.0.3源码之touchscreen配置+调试记录
- 我和菜鸟一起学android4.0.3源码之硬件gps简单移植
- android移植wifis
- android移植wifis
- Wireless tools for Linux介绍
- Wireless tools for Linux介绍
- 和菜鸟一起学android4.0.3源码之US…
- 和菜鸟一起学android4.0.3源码之US…
- port wifi to ICS(4.0.3)
- port wifi to ICS(4.0.3)
- wifi 驱动 进阶11
- wifi 驱动 进阶11
- WLan
- WLan
- Realtek 8192cu 驱动移…
- Realtek 8192cu 驱动移…