WG217 wifi模块的芯片是RTL8811CU,在不开启蓝牙功能支持的情况下,RTL8811CU的驱动源码与RTL8821CU的驱动源码是兼容的,也就是说在不开启蓝牙支持的情况下,用RTL8821CU驱动也能使得RTL8811CU正常工作。
RTL8811CU驱动源码的链接:https://github.com/axiomware/RTL8821CU_driver_v5.4.1
下载完源码之后,找到并修改Makefile,修改如下:
CONFIG_PLATFORM_HI3531A = y //添加相关平台的宏,这里添加海思平台的hi3531a,并设置为y
CONFIG_PLATFORM_I386_PC = n //修改CONFIG_PLATFORM_I386_PC为n
...
在原来的 ifeq ($(CONFIG_PLATFORM_I386_PC), y) 前插入以下代码:
ifeq ($(CONFIG_PLATFORM_HI3531A), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH = arm
CROSS_COMPILE = /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-
KSRC := /disk2/SVN/mywork/work/HisiSDK/Hi3531A_SDK_V1.0.5.0/osdrv/opensource/kernel/linux-3.10.y
MODDESTDIR := /disk2/SVN/mywork/work/HisiSDK/Hi3531A_SDK_V1.0.5.0/osdrv/opensource/kernel/linux-3.10.y/drivers/net/wireless/
INSTALL_PREFIX :=
STAGINGMODDIR := /disk2/SVN/mywork/work/HisiSDK/Hi3531A_SDK_V1.0.5.0/osdrv/opensource/kernel/linux-3.10.y/drivers/staging
endif
CROSS_COMPILE
为编译链的路径,KSRC
为内核源码路径,剩下的MODDESTDIR
、STAGINGMODDIR
路径随便设置。
在terminal终端输入make
命令实现编译,生成ko文件。
1)cfg80211(cfg80211是Linux 802.11配置API, 用于对无线设备进行配置管理)
2)master模式(配置wifi的AP热点模式时需要改模式的支持)
生成了相关的ko文件后,并不代表insmod就一定成功了,因为RTL8821CU驱动需要cfg80211的支持,另外在后面设置wifi的AP热点模式下的名字时,kernel必须要支持master模式,否则热点模式无法设置成功,手机无法搜索到相应的热点。如果你原本的kernel中已经将cfg80211以及master的支持编译进了内核,则可以直接insmod了,又或者去图形界面把相关的驱动编译成ko,在开发板上加载了cfg80211.ko等驱动后再加载8821cu.ko才可以成功。
在terminal终端输入make menuconfig
进入图形界面,配置相应的选项:
1. cfg80211的选项所在位置
Symbol: CFG80211 [=y] │
│ Type : tristate│
│ Prompt: cfg80211 - wireless configuration API │
│ Location: │
│ -> Networking support (NET [=y])│
│ -> Wireless (WIRELESS [=y]) │
│ Defined at net/wireless/Kconfig:19│
│ Depends on: NET [=y] && WIRELESS [=y] && (RFKILL [=n] || !RFKILL [=n])
即选择位置如下:
Networking support ---> Wireless ---> cfg80211 - wireless configuration API
2. master的选项所在位置
│ Symbol: HOSTAP [=n] │
│ Type : tristate│
│ Prompt: IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)│
│ Location: │
│ -> Device Drivers │
│ -> Network device support (NETDEVICES [=y]) │
│ -> Wireless LAN (WLAN [=y]) │
│ Defined at drivers/net/wireless/hostap/Kconfig:1 │
│ Depends on: NETDEVICES [=y] && WLAN [=y] │
│ Selects: WIRELESS_EXT [=n] && WEXT_SPY [=n] && WEXT_PRIV [=n] && CRYPTO [=y] && CRYPTO_ARC4 [=y] && CRYPTO_ECB [=n] && CRYPTO_AES [=y] && CRYPTO_MICHAEL_MIC [=n] && \│
│ CRYPTO_ECB [=n] && CRC32 [=y] && LIB80211 [=n] && LIB80211_CRYPT_WEP [=n] && LIB80211_CRYPT_TKIP [=n] && LIB80211_CRYPT_CCMP [=n]
即选择位置如下:
Device Drivers ---> Network device support ---> Wireless LAN ---> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)
3. 编译内核
配置完相关选项后退出保存,然后编译,最后将编译生成的内核文件(我这里是uImage)烧录到开发板。
1. 加载驱动模块
烧录完kernel之后,在开发板通过insmod命令加载RTL8821CU.ko,此时可能会出现一些ERROR的打印信息,但是只要出现
RTW: rtw_regsty_chk_target_tx_power_valid return _FALSE for band:0, path:0, rs:0, t:-1
RTW: rtw_ndev_init(wlan0) if1 mac_addr=30:eb:1f:04:ec:55
usbcore: registered new interface driver rtl8821cu
RTW: module init ret=0
这几行打印信息,就说明模块初始化成功,不影响使用。
2. 开启wifi功能并配置ip
在开发板分别输入以下命令:
ifconfig wlan0 up
ifconfig wlan0 192.168.30.1
3. 测试驱动模块
可以通过在开发板上输入命令:cat /proc/net/wireless
来查看,如果出现以下打印信息则说明模块成功,且功能正常:
Inter-| sta-| Quality| Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
wlan0: 00001.1.0. 0 0 0 0 00
4. 配置wifi
wifi配置主要有:
要实现以上操作,需要用到hostapd和udhcpd这两个工具,这两个工具的编译过程省略,自行百度或谷歌。
1)创建hostapd.conf
文件,内容如下:
interface=wlan0
driver=rtl871xdrv
ssid=stonkamavs
channel=9
hw_mode=g
ignore_broadcast_ssid=0
auth_algs=1
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
bridge=br0
wpa_pairwise=TKIP
rsn_pairwise=CCMP
2)创建udhcpd.conf
文件,内容如下:
start 192.168.40.2
end 192.168.40.200
interface wlan0
opt dns 8.8.8.8
option subnet 255.255.255.0
opt router 192.168.2.1
opt wins 192.168.10.10
option dns 129.219.13.81
option domain local
option lease 864000
option msstaticroutes 10.0.0.0/8 10.127.0.1
option staticroutes 10.0.0.0/8 10.127.0.1, 10.11.12.0/24 10.11.12.1
option 0x08 01020304 # option 8: "cookie server IP addr: 1.2.3.4"
3)将以上2个conf文件拷贝到开发板,在开发板分别输入以下命令:
./hostapd hostapd.conf -B
udhcpd udhcpd.conf
此时wifi热点已经开启,并可以正常使用。