Yes, we manage to get wifi working. Here are info's in more detail, so if anybody else has problem ...
We build driver as part of the kernel:
vim kernel_imx/arch/arm/configs/imx6s_{yourdevice}_android_defconfig
CONFIG_CFG80211=y
CONFIG_MAC80211_MESH=y
CONFIG_MAC80211=y
CONFIG_HOSTAP=y
CONFIG_RTL8192CU=y
CONFIG_RTLWIFI=y
CONFIG_RTL8192C_COMMON=y
#CONFIG_RTL8723AS=m
CONFIG_USB_USBNET=y
CONFIG_NET_RADIO=y
vim device/fsl/{yourdevice}/BoardConfig.mk
BOARD_WIFI_VENDOR := realtek
WPA_SUPPLICANT_VERSION := VER_0_8_X
CONFIG_DRIVER_NL80211 := true
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl
BOARD_WLAN_DEVICE := rtl8192cu
WIFI_DRIVER_MODULE_NAME := "wlan0"
WIFI_DRIVER_MODULE_PATH := ""
WIFI_DRIVER_MODULE_ARG := ""
WIFI_FIRMWARE_LOADER := ""
WIFI_DRIVER_FW_PATH_STA := ""
WIFI_DRIVER_FW_PATH_AP := ""
WIFI_DRIVER_FW_PATH_P2P := ""
WIFI_DRIVER_FW_PATH_PARAM := ""
We disabled p2p, since we dont need it:
vim device/fsl/imx6/{yourboard}.mk
PRODUCT_COPY_FILES += \
#frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml
or
rm out/target/product/{yourboard}/system/etc/permissions/android.hardware.wifi.direct.xml
or just remount system partition:
root@{yourboard}:/ # mount -o remount, rw /system;
and remove xml:
root@{yourboard}:/ # rm /system/etc/permissions/android.hardware.wifi.direct.xml
edit:
root@{yourboard}:/ # busybox vi system/etc/permissions/required_hardware.xml
or
vim device/fsl/{yourboard}/required_hardware.xml
or
vim out/target/product/{yourboard}/system/etc/permissions/required_hardware.xml
<!--
<feature name="android.hardware.wifi.direct" />
-->
If you use it as module, you will need to add it also in PRODUCT_COPY_FILES
You need to correct init scripts, leave just this lines:
(this is from: http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html )
You can do it directly to out folder:
vim out/target/product/{yourboard}/root/init.rc
or/and (rebuild the whole system):
vim device/fsl/imx6/imx6.mk
mkdir /system/etc/wifi 0770 wifi wifi
chmod 0770 /system/etc/wifi
chmod 0660 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf
#wpa_supplicant control socket for android wifi.c (android private socket)
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
chown wifi wifi /data/misc/wifi
chown wifi wifi /data/misc/wifi/wpa_supplicant.conf
setprop wifi.interface wlan0
setprop wlan.driver.status "ok"
#setprop wifi.ap.interface wlan0
#and also remove this lines:
# mkdir /data/system/wpa_supplicant 0771 wifi wifi
# chmod 0771 /data/system/wpa_supplicant
# symlink /data/misc/wifi/wpa_supplicant /data/system/wpa_supplicant
you can read it in that blog link, about unix/android standard socket setup.
vim out/target/product/{yourboard}/root/init.freescale.rc
or/and
vim device/fsl/{yourboard}/init.rc
#this is the only supplicant service and dhcpcd service for wifi that we use:
service rtw_suppl /system/bin/wpa_supplicant -dd -iwlan0 -Dnl80211 \
-c/data/misc/wifi/wpa_supplicant.conf
socket wpa_wlan0 dgram 660 wifi wifi
class main
disabled
oneshot
service dhcpcd_wlan0 /system/bin/dhcpcd -aABKL
class main
disabled
oneshot
service iprenew_wlan0 /system/bin/dhcpcd -n
class main
disabled
oneshot
To keep it clean (it doesnt effect wifi):
vim device/fsl/imx6/imx6.mk
PRODUCT_PACKAGES += \
rtw_suppl \
We needed to make a little change in wifi_realtek.c since our jb is 4.3:
vim hardware/realtek/wlan/libhardware_legacy/wifi/wifi_realtek.c
int wifi_start_supplicant(int p2p_supported)
..
wifi_stop_supplicant(p2p_supported);
….
int wifi_stop_supplicant(int p2p_supported){
char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
int count = 50; /* wait at most 5 seconds for completion */
if (p2p_supported) {
property_get("wifi.supplicant", supplicant_name, P2P_SUPPLICANT_NAME);
snprintf(supplicant_prop_name, PROPERTY_KEY_MAX, P2P_PROP_NAME, supplicant_name);
} else {
property_get("wifi.supplicant", supplicant_name, SUPPLICANT_NAME);
snprintf(supplicant_prop_name, PROPERTY_KEY_MAX, SUPP_PROP_NAME, supplicant_name);
}
Our problem was wrong supplicant name in prop setup. And, when wifi starts it first stops supplicant, and it wasn’t able to transfer that info through system. It was quite fun tracking this problem.
vim ./frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java
mWifiNative.killSupplicant(mP2pSupported);
if(mWifiNative.startSupplicant(mP2pSupported)) {
setWifiState(WIFI_STATE_ENABLING);
if (DBG) log("Supplicant start successful");
mWifiMonitor.startMonitoring();
transitionTo(mSupplicantStartingState);
} else {
loge("Failed to start supplicant!!");
}
Here are more info:
root@{yourdevice}:/ # cat /data/misc/wifi/wpa_supplicant.conf
ctrl_interface=wlan0
update_config=1
device_name={yourdevice}
manufacturer=Freescale
model_name={YOURDEVICE}
model_number={YOURDEVICE}
serial_number=
device_type=10-0050F204-5
config_methods=physical_display virtual_push_button
network={
ssid="XXXXX"
key_mgmt=NONE
priority=1
}
and it started with:
root@{yourdevice}:/ # cat system/etc/wifi/wpa_supplicant.conf
update_config=1
ctrl_interface=wlan0
eapol_version=1
ap_scan=1
fast_reauth=1
permissions:
root@{yourdevice}:/ # ls -l /data/misc/wifi
-rw-rw---- system wifi 21 2014-05-27 12:39 entropy.bin
drwxrwx--- wifi wifi 2014-05-27 12:39 sockets
-rw------- system system 33 2014-05-27 12:39 softap.conf
-rw-rw---- wifi wifi 272 2014-05-27 12:39 wpa_supplicant.conf
root@{yourboard}:/ # ls -l /data/misc/
drwxr-s--- system shell 2014-05-27 12:39 adb
drwxrwx--- bluetooth net_bt_stack 2014-05-27 12:39 bluedroid
drwxrwx--- system system 2014-05-27 12:39 bluetooth
drwxrwx--- dhcp dhcp 2014-05-27 12:39 dhcp
drwxrwx--x system system 2014-05-27 12:39 keychain
drwx------ keystore keystore 2014-05-27 12:39 keystore
drwx------ media media 2014-05-27 12:39 media
drwxrwx--- system radio 2014-05-27 12:39 radio
drwxrwx--- system radio 2014-05-27 12:39 sms
drwx------ system system 2014-05-27 12:39 systemkeys
drwxrwx--- system vpn 2014-05-27 12:39 vpn
drwxrwx--- wifi wifi 2014-05-27 12:39 wifi
drwxrwxr-x system system 2014-05-27 12:39 zoneinfo
root@{yourboard}:/ # ls -l /system/etc/wifi
-rw-rw---- wifi wifi 77 2014-05-27 12:39 wpa_supplicant.conf
root@{yourboard}:/ # ps | grep wpa
wifi 2555 1 3104 1876 c0103edc 401a4448 S /system/bin/wpa_supplicant
root@{yourboard}:/ # cat system/etc/permissions/platform.xml | grep -i wifi
<permission name="android.permission.ACCESS_WIFI_STATE" >
<group gid="wifi" />
<permission name="android.permission.CHANGE_WIFI_STATE" >
<group gid="wifi" />
<permission name="android.permission.WIFI" >
<group gid="wifi" />
root@{yourboard}:/ # cat system/etc/permissions/required_hardware.xml | grep wifi
<feature name="android.hardware.wifi" />
root@{yourboard}:/ # getprop | grep wifi
[net.tcp.buffersize.wifi]: [524288,1048576,2097152,262144,524288,1048576]
[ro.wifi.channels]: []
[wifi.interface]: [wlan0]
root@{yourboard}:/ # getprop | grep wlan
[dhcp.wlan0.dns1]: [192.168.1.1]
[dhcp.wlan0.dns2]: []
[dhcp.wlan0.dns3]: []
[dhcp.wlan0.dns4]: []
[dhcp.wlan0.domain]: []
[dhcp.wlan0.gateway]: [192.168.1.1]
[dhcp.wlan0.ipaddress]: [192.168.1.118]
[dhcp.wlan0.leasetime]: [86400]
[dhcp.wlan0.mask]: [255.255.255.0]
[dhcp.wlan0.pid]: [2689]
[dhcp.wlan0.reason]: [REBOOT]
[dhcp.wlan0.result]: [ok]
[dhcp.wlan0.server]: [192.168.1.1]
[dhcp.wlan0.vendorInfo]: []
[init.svc.dhcpcd_wlan0]: [running]
[wifi.interface]: [wlan0]
[wlan.driver.status]: [ok]
[wlan.interface]: [wlan0]
root@{yourboard}:/ # getprop | grep suppl
[init.svc.rtw_suppl]: [running]
root@{yourboard}:/ # cat /sys/kernel/debug/usb/devices
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0bda ProdID=8176 Rev= 2.00
S: Manufacturer=Realtek
S: Product=802.11n WLAN Adapter
S: SerialNumber=00e04c000001
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 4 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtl8192cu
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=84(I) Atr=03(Int.) MxPS= 64 Ivl=125us
root@{yourboard}:/ # cat /sys/bus/usb/devices/2-1/product
802.11n WLAN Adapter
Useful commands:
disable wifi:
root@{yourboard}:/ # svc wifi disable
enable wifi:
root@{yourboard}:/ # svc wifi enable
open wifi settings panel:
root@{yourboard}:/ # am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
manually starting supplicant with debug:
root@{yourboard}:/ # wpa_supplicant -Dnl80211 -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf -dd -B
root@{yourboard}:/ # netcfg wlan0 up/down/dhcp
root@{yourboard}:/ # wpa_cli
> status
bssid=20:aa:4b:1b:a1:7c
ssid=ECTEST
id=0
mode=station
pairwise_cipher=NONE
group_cipher=NONE
key_mgmt=NONE
wpa_state=COMPLETED
ip_address=192.168.1.118
p2p_device_address=44:34:4c:8b:f2:10
address=44:34:4c:8b:f2:10
<3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=20:aa:4b:1b:a1:7c SSID=ECTEST
<3>CTRL-EVENT-CONNECTED - connection to 20:aa:4b:1b:a1:7c completed (reauth) [id=0 id_str=]
> scan
cfg80211_rtw_scan(wlan0)
OK
> no packet in tx packet buffer (0)
survey done event(14) band:0 for wlan0
<3>CTRL-EVENT-SCAN-RESULTS
> scan_results
bssid / frequency / signal level / flags / ssid
20:aa:1b:1b:a1:7c 2437 -74 [WPS][ESS] ECTEST
00:1d:3e:bd:10:05 2457 -85 [WPA-PSK-TKIP][ESS] net02
68:7f:74:03:c6:be 2432 -59 [ESS] \x00\x00\x00\x00
c8:23:73:3f:05:71 2462 -66 [ESS] Nick's router. Hands off.
root@{yourboard}:/ # ifconfig wlan0
wlan0: ip 192.168.1.118 mask 255.255.255.0 flags [up broadcast running multicast]
root@{yourboard}:/ # dhcpcd wlan0
dhcpcd[3373]: version 5.5.6 starting
dhcpcd[3373]: wlan0: rebinding lease of 192.168.1.118
dhcpcd[3373]: wlan0: acknowledged 192.168.1.118 from 192.168.1.1
dhcpcd[3373]: wlan0: leased 192.168.1.118 for 86400 seconds
dhcpcd[3373]: forked to background, child pid 3405
root@{yourboard}:/ # netcfg
lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00
eth0 UP 192.168.0.152/24 0x00001043 24:80:00:00:00:00
tunl0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
ip6tnl0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
wlan0 UP 192.168.1.118/24 0x00001043 44:34:4c:8b:f2:10
wlan1 DOWN 0.0.0.0/0 0x00001002 46:34:4c:8b:f2:10
Good luck with it and please let me know if you need more info.
problem/solution:
if you get this problem:
E/wpa_supplicant( 3159): Could not set interface wlan0 flags (UP): Unknown error 132
solution:
missing rfkill, error 132 means "operation not possible due to RFkill"
vim kernel_imx/arch/arm/mach-mx6/board-mx6sl_{yourboard}.c
static int mx6sl_shd_bt_power_change(int status){return 0;}
static struct platform_device mxc_bt_rfkill = {
.name = "mxc_bt_rfkill",
};
static struct imx_bt_rfkill_platform_data mxc_bt_rfkill_data = {
.power_change = mx6sl_shd_bt_power_change,
};
/* init function */
static void __init {yourboard}_init(void){
...
mxc_register_device(&mxc_bt_rfkill, &mxc_bt_rfkill_data);
}
problem:
E/WifiHW ( 2488): Unable to open connection to supplicant on "/data/system/wpa_supplicant/wlan0": No such file or directory
solution:
setup correctly in init.rc and init.freescale.rc scripts wifi and wpa_supplicant permissions and services.