硬件imx6q
系統:android M
1.參考Quick Start Guide for Driver Compilation and Installation集成驅動到內核裏
1)把driver源碼集成到drivers/net/wireless中
kernel_imx/drivers/net/wireless/rtl8188eus
2)編譯內核生成8188eu.ko
-- a/kernel_imx/drivers/net/wireless/Kconfig
+++ b/kernel_imx/drivers/net/wireless/Kconfig
@@ -215,6 +215,7 @@ config USB_NET_RNDIS_WLAN
If you choose to build a module, it'll be called rndis_wlan.
source "drivers/net/wireless/rtl818x/Kconfig"
+source "drivers/net/wireless/rtl8188eus/Kconfig"
--- a/kernel_imx/drivers/net/wireless/Makefile
+++ b/kernel_imx/drivers/net/wireless/Makefile
@@ -1,7 +1,7 @@
#
# Makefile for the Linux Wireless network device drivers.
#
-
+obj-$(CONFIG_RTL8188EU) += rtl8188eus/
--- a/kernel_imx/drivers/net/wireless/rtl8188eus/Kconfig
+++ b/kernel_imx/drivers/net/wireless/rtl8188eus/Kconfig
@@ -1,5 +1,5 @@
config RTL8188EU
- tristate "Realtek 8188E USB WiFi"
+ tristate "Realtek 8188EUS USB WiFi"
--- a/kernel_imx/drivers/net/wireless/rtl8188eus/Makefile
+++ b/kernel_imx/drivers/net/wireless/rtl8188eus/Makefile
@@ -14,7 +14,9 @@ EXTRA_CFLAGS += -Wno-unused-parameter
EXTRA_CFLAGS += -Wno-unused-function
EXTRA_CFLAGS += -Wno-unused
#EXTRA_CFLAGS += -Wno-uninitialized
-#EXTRA_CFLAGS += -Wno-error=date-time # Fix compile error on gcc 4.9 and later
+EXTRA_CFLAGS += -Wno-error=date-time # Fix compile error on gcc 4.9 and later
+EXTRA_CFLAGS += -Wno-error=implicit-function-declaration
+EXTRA_CFLAGS += -fno-pic
EXTRA_CFLAGS += -I$(src)/include
EXTRA_CFLAGS += -I$(src)/hal/phydm
@@ -75,7 +77,7 @@ CONFIG_RTW_SDIO_PM_KEEP_POWER = y
###################### MP HW TX MODE FOR VHT #######################
CONFIG_MP_VHT_HW_TX_MODE = n
###################### Platform Related #######################
-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_ANDROID_INTEL_X86 = n
CONFIG_PLATFORM_JB_X86 = n
@@ -126,6 +128,7 @@ CONFIG_PLATFORM_MOZART = n
CONFIG_PLATFORM_RTK119X = n
CONFIG_PLATFORM_NOVATEK_NT72668 = n
CONFIG_PLATFORM_HISILICON = n
+CONFIG_PLATFORM_ARM_IMX6QD = y
###############################################################
CONFIG_DRVEXT_MODULE = n
@@ -921,6 +924,17 @@ MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
INSTALL_PREFIX :=
endif
+ifeq ($(CONFIG_PLATFORM_ARM_IMX6QD), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_RADIO_WORK
+ARCH := arm
+CROSS_COMPILE :=/home/freescale/myandroid/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-
+KSRC :=/home/freescale/myandroid/kernel_imx
+
+MODULE_NAME := 8188eu
+endif
把生成的ko放在文件系統中
cp kernel_imx/drivers/net/wireless/rtl8188eus/8188eu.ko device/fsl/common/wifi/
device/fsl/imx6/imx6.mk
PRODUCT_COPY_FILES += \
device/fsl/common/wifi/8188eu.ko:system/lib/8188eu.ko \
2.修改frescale imx6 的wpa_supplicant_8
編譯後生成:system/bin/wpa_supplicant
system/bin/wpa_cli
--- a/external/wpa_supplicant_8/hostapd/Android.mk
+++ b/external/wpa_supplicant_8/hostapd/Android.mk
@@ -30,6 +30,9 @@ L_CFLAGS += -Wno-unused-parameter
# Set Android extended P2P functionality
L_CFLAGS += -DANDROID_P2P
+ifeq ($(BOARD_HOSTAPD_PRIVATE_LIB),)
+L_CFLAGS += -DANDROID_LIB_STUB
+endif
# Use Android specific directory for control interface sockets
L_CFLAGS += -DCONFIG_CTRL_IFACE_CLIENT_DIR=\"/data/misc/wifi/sockets\"
@@ -973,7 +976,9 @@ LOCAL_MODULE_TAGS := optional
ifdef CONFIG_DRIVER_CUSTOM
LOCAL_STATIC_LIBRARIES := libCustomWifi
endif
-LOCAL_STATIC_LIBRARIES += lib_driver_cmd_bcmdhd
+ifneq ($(BOARD_HOSTAPD_PRIVATE_LIB),)
+LOCAL_STATIC_LIBRARIES += $(BOARD_HOSTAPD_PRIVATE_LIB)
+endif
--- a/external/wpa_supplicant_8/wpa_supplicant/Android.mk
+++ b/external/wpa_supplicant_8/wpa_supplicant/Android.mk
@@ -1558,9 +1558,8 @@ LOCAL_MODULE := wpa_supplicant
ifdef CONFIG_DRIVER_CUSTOM
LOCAL_STATIC_LIBRARIES := libCustomWifi
endif
-LOCAL_STATIC_LIBRARIES += lib_driver_cmd_bcmdhd //這裏被寫死了如果不改會編譯出錯(坑)
-ifneq ($(BOARD_WPA_SUPPLICANT_PRIVATE_LIB_BCM),)
-LOCAL_STATIC_LIBRARIES += $(BOARD_WPA_SUPPLICANT_PRIVATE_LIB_BCM)
+ifneq ($(BOARD_WPA_SUPPLICANT_PRIVATE_LIB),)
+LOCAL_STATIC_LIBRARIES += $(BOARD_WPA_SUPPLICANT_PRIVATE_LIB)
endif
3.把產家提供的realtek/wlan放在android 源碼的hardware目錄下
編譯的條件是BOARD_WIFI_VENDOR := realtek
WPA_SUPPLICANT_VERSION := VER_0_8_X
編譯後會生成lib_driver_cmd_rtl.a 靜態庫
lib_driver_cmd_rtl.a
4.BoardConfig.mk配置加載哪一項wifi模組
device/fsl/sabresd_6dq/BoardConfig.mk
#Wifi Configuration
BOARD_WIFI_VENDOR := realtek
ifeq ($(BOARD_WIFI_VENDOR),realtek)
WPA_SUPPLICANT_VERSION := VER_0_8_X
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_USE_WIFI := rtl8188eu
BOARD_WLAN_DEVICE := rtl8188eu
WIFI_DRIVER_FW_PATH_STA := "STA"
WIFI_DRIVER_FW_PATH_AP := "AP"
WIFI_DRIVER_FW_PATH_P2P := "P2P"
WIFI_DRIVER_FW_PATH_PARAM := "/dev/null"
WIFI_DRIVER_MODULE_NAME := "8188eu"
WIFI_DRIVER_MODULE_PATH := "/system/lib/8188eu.ko"
WIFI_DRIVER_MODULE_ARG := "ifname=wlan0 if2name=p2p0"
WIFI_DRIVER_FW_PATH_STA := "STA"
WIFI_DRIVER_FW_PATH_AP := "AP"
WIFI_DRIVER_FW_PATH_P2P := "P2P"
WIFI_DRIVER_FW_PATH_PARAM := "/dev/null"
endif
5.init.rc
service p2p_supplicant /system/bin/wpa_supplicant \
-ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-I/system/etc/wifi/wpa_supplicant_overlay.conf \
-O/data/misc/wifi/sockets -puse_p2p_group_interface=1 \
-e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
service wpa_supplicant /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-I/system/etc/wifi/wpa_supplicant_overlay.conf \
-puse_p2p_group_interface=1p2p_device=1 \
-g/data/misc/wifi/sockets/p2p0 \
-O/data/misc/wifi/sockets -dd \
-e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
6.wifi.c
Android M可以不用修改,Android O修改insmod增加權限
--- a/hardware/libhardware_legacy/wifi/wifi.c
+++ b/hardware/libhardware_legacy/wifi/wifi.c
@@ -23,7 +23,7 @@
#include <sys/stat.h>
#include <unistd.h>
#include <poll.h>
-
+#include <sys/syscall.h>
#include "hardware_legacy/wifi.h"
#ifdef LIBWPA_CLIENT_EXISTS
#include "libwpa_client/wpa_ctrl.h"
@@ -73,6 +73,9 @@ static int exit_sockets[2];
static char primary_iface[PROPERTY_VALUE_MAX];
// TODO: use new ANDROID_SOCKET mechanism, once support for multiple
// sockets is in
"ifname=wlan0 if2name=p2p0"
#ifndef WIFI_DRIVER_MODULE_ARG
#define WIFI_DRIVER_MODULE_ARG ""
@@ -132,21 +135,21 @@ static char supplicant_name[PROPERTY_VALUE_MAX];
/* Is either SUPP_PROP_NAME or P2P_PROP_NAME */
static char supplicant_prop_name[PROPERTY_KEY_MAX];
-static int insmod(const char *filename, const char *args)
+int insmod(const char *filename, const char *args)
{
- void *module;
- unsigned int size;
- int ret;
-
- module = load_file(filename, &size);
- if (!module)
+ /* O_NOFOLLOW is removed as wlan.ko is symlink pointing to
+ the vendor specfic file which is in readonly location */
+ int fd = open(filename, O_RDONLY | O_CLOEXEC);
+ if (fd == -1) {
+ ALOGD("insmod: open(\"%s\") failed: %s", filename, strerror(errno));
return -1;
-
- ret = init_module(module, size, args);
-
- free(module);
-
- return ret;
+ }
+ int rc = syscall(__NR_finit_module, fd, args, 0);
+ if (rc == -1) {
+ ALOGD("finit_module for \"%s\" failed: %s", filename, strerror(errno));
+ }
+ close(fd);
+ return rc;
}
7.權限問題
針對Android N
10-01 11:49:28.170 541 541 I WifiStateMachin: type=1400 audit(0.0:18): avc: denied { sys_module } for capability=16 scontext=u:r:system_server:s0 tcontext=u:r:system_server:s0 tclass=capability permissive=1
10-01 11:49:28.170 541 541 I WifiStateMachin: type=1400 audit(0.0:19): avc: denied { module_load } for scontext=u:r:system_server:s0 tcontext=u:r:system_server:s0 tclass=system permissive=1
type=1400 audit(970404009.360:17): avc: denied { sys_module } for pid=543 comm="WifiStateMachin" capability=16 scontext=u:r:system_server:s0 tcontext=u:r:system_server:s0 tclass=capability permissive=1
init: Starting service 'p2p_supplicant'...
type=1400 audit(1980266916.550:19): avc: denied { open } for pid=1258 comm="wpa_supplicant" path="/data/misc/wifi/entropy.bin" dev="mmcblk0p4" ino=1253749 scontext=u:r:wpa:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
type=1400 audit(1980266916.560:20): avc: denied { write } for pid=1258 comm="wpa_supplicant" name="entropy.bin" dev="mmcblk0p4" ino=1253749 scontext=u:r:wpa:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
init: Service 'p2p_supplicant' (pid 1258) exited with status 255
fix:
--- a/device/fsl/imx6/sepolicy/device.te
+++ b/device/fsl/imx6/sepolicy/device.te
@@ -1,2 +1,3 @@
type caam_device, dev_type;
type pxp_device, dev_type;
+type wlan_device, dev_type;
--- a/device/fsl/imx6/sepolicy/system_server.te
+++ b/device/fsl/imx6/sepolicy/system_server.te
@@ -4,3 +4,7 @@ allow system_server system_data_file:file {relabelto rw_file_perms};
allow system_server system_data_file:dir {relabelto rw_dir_perms};
allow system_server kernel:system { syslog_read };
allow system_server debugfs_tracing:file { write };
+allow system_server system_file:system module_load;
+allow system_server kernel:key search;
+allow system_server wlan_device:chr_file rw_file_perms;
+allow system_server self:capability sys_module;
--- a/system/sepolicy/domain.te
+++ b/system/sepolicy/domain.te
@@ -468,12 +468,12 @@ neverallow {
-system_server
-system_app
-init
+ -wpa
-installd # for relabelfrom and unlink, check for this in explicit neverallow
} system_data_file:file no_w_file_perms;
device/fsl/imx6/sepolicy/wpa.te
allow wpa system_data_file:file {open write create setattr rename unlink};
allow wpa system_data_file:dir {create setattr write add_name remove_name};
allow wpa system_data_file:sock_file {create setattr write};
8.wifi 顯示x號無法上網
--- a/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -85,9 +85,9 @@ public class NetworkMonitor extends StateMachine {
// Default configuration values for captive portal detection probes.
// TODO: append a random length parameter to the default HTTPS url.
// TODO: randomize browser version ids in the default User-Agent String.
- private static final String DEFAULT_HTTPS_URL = "https://www.google.com/generate_204";
+ private static final String DEFAULT_HTTPS_URL = "https://captive.v2ex.co/generate_204";
private static final String DEFAULT_HTTP_URL =
- "http://connectivitycheck.gstatic.com/generate_204";
+ "http://captive.v2ex.co/generate_204";
或者調試的時候用
adb shell settings put global captive_portal_detection_enabled 0關閉wfif檢測然後重啓
9.內核驅動去掉打印調試信息
--- a/kernel_imx/drivers/net/wireless/rtl8188eus/include/autoconf.h
+++ b/kernel_imx/drivers/net/wireless/rtl8188eus/include/autoconf.h
@@ -318,7 +318,7 @@
/*
* Debug Related Config
*/
-#define DBG 1
+#define DBG 0
--- a/kernel_imx/drivers/net/wireless/rtl8188eus/include/rtw_debug.h
+++ b/kernel_imx/drivers/net/wireless/rtl8188eus/include/rtw_debug.h
@@ -183,8 +183,8 @@ extern void rtl871x_cedbg(const char *fmt, ...);
#define _dbgdump rtl871x_cedbg
#define _seqdump(sel, fmt, arg...) _dbgdump(fmt, ##arg)
#elif defined PLATFORM_LINUX
- #define _dbgdump printk
- #define _seqdump seq_printf
+ #define _dbgdump //printk
+ #define _seqdump //seq_printf