目录
1 开发环境
1、主控芯片:NT9856x
2、wifi芯片:RTL818FU(USB接口)
3、Linux内核版本:4.19.91
4、交叉编译链:arm-ca9-linux-uclibcgnueabihf-gcc (version 8.4.0)
2 内核配置
2.1 配置支持USB设备
Location:
Device Drivers
[*] USB support --->
<*> Support for Host-side USB // 主机端(Host-side)USB支持.
[*] Enable USB persist by default // 根据USB规范,当USB总线被挂起(休眠)后,它必须继续提供挂起电流(1-5毫安),以确保USB设备能保持其内部状态,并且USB集线器(HUB)能够检测连接变化(设备插入和拔出).
<*> EHCI HCD (USB 2.0) support
[*] Root Hub Transaction Translators // 兼容USB1.1
[*] Improved Transaction Translator scheduling //改变周期性调度代码的工作方式,当多个USB1.1设备连接在同一个USB2.0集线器上时,可以获得更高的运行速度.建议选"Y"
[*] NVTIM EHCI support
<*> USB Wireless Device Management support
2.2 配置支持 wifi 设备
Location:
Device Drivers
[*] Network device support ---> // 网络设备
<*> USB Network Adapters ---> // USB网络适配器
[*] Wireless LAN ---> // 无线网卡
[*] Intersil devices
<*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)
[*] Support downloading firmware images with Host AP driver
[*] Support for non-volatile firmware download
2.3 配置支持 wifi 网络 IEEE 802.11
Location:
[*] Networking support --->
-*- Wireless ---> // 无线网络支持.
<*> cfg80211 - wireless configuration API // 使用WiFi的前提,Linux无线局域网(802.11)配置接口(cfg80211)
[ ] nl80211 testmode command // 仅供调试和特殊目的使用
[ ] enable developer warnings // 仅供调试开发使用
[ ] cfg80211 certification onus
[*] enable powersave by default // 若开启此项则表示默认开启省电模式
[*] support CRDA
[*] cfg80211 wireless extensions compatibility // 为那些老旧的用户空间程序提供兼容性,建议关闭.
<*> Generic IEEE 802.11 Networking Stack (mac80211) // 独立于硬件的通用IEEE 802.11协议栈模块(mac80211).不确定的选"Y".
[*] Minstrel // minstrel发送速率(TX rate)控制算法.用于CONFIG_MAC80211模块.这是首选的算法,不确定的选"Y".
[*] Minstrel 802.11n support // minstrel_ht发送速率(TX rate)控制算法.适用于802.11n规范.不确定的选"Y".
[ ] Minstrel 802.11ac support
Default rate control algorithm (Minstrel) ---> // 默认发送速率(TX rate)控制算法.建议选择"Minstrel"算法.
[*] Enable mac80211 mesh networking (pre-802.11s) support // 802.11s草案是无线网状网络(Mesh Networking)的延伸与增补标准(amendment).
[ ] Trace all mac80211 debug messages // 跟踪所有mac80211模块的调试信息,仅用于调试目的.
[ ] Select mac80211 debugging features ---- // 仅供调试
2.4 编译内核
由于 kernel 镜像文件大小的限制,无需将 wifi 驱动编译进 kernel 镜像,所以按照上诉配置完之后重新 make linux 编译 kernel 即可。
3 wifi 驱动移植
3.1 解压 rlt8188fu 源码
将 rtl8188FU_linux_v5.11.5.4-0-g65b8f0aad.20220413.tar.gz 源码解压至内核路径 na51089_linux_sdk/code/driver/source/net 中,并重命名为 rtl8188fu。
3.2 客制 wifi 的 Makefile
修改 wifi 驱动源码内的 Makefile 文件,进行 wifi 驱动的客制化调整,使得编译出的 wifi 驱动足够的小且满足项目需求。
3.3 修改 BSP 的 Makefile
在路径 na51089_linux_sdk/code/driver/source 中的 Makefile 中增加关于新增的 rlt8188fu 的编译命令:
obj-m += \
net/rtl8188FU_linux_v5.7.4.2_36687.20200421/ \
3.4 编译 rlt8188fu 驱动
进入路径 na51089_linux_sdk/code/driver/source 下,执行 make 即可编译出 rlt8188fu.ko
4 简单测试
1、用新编译的 uInage 和 rlt8188fu.ko 重新打包并启动开发板
2、执行命令 lsmod,若显示如下即正常加载 wifi rlt8188fu 的驱动
root@NVTEVM:~$ lsmod
8188fu 1544192 0 - Live 0x00000000 (O)
3、执行命令 ifconfig -a ,测试结果如下即正常识别 wifi rtl8188fu 网卡
root@NVTEVM:~$ ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:18:AE:00:9A:19
inet addr:192.168.226.201 Bcast:192.168.226.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe37:3729/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:162599 errors:0 dropped:104 overruns:0 frame:0
TX packets:235 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:191478632 (182.6 MiB) TX bytes:52807 (51.5 KiB)
Interrupt:12
eth0:1 Link encap:Ethernet HWaddr 00:18:AE:00:9A:19
inet addr:169.254.45.9 Bcast:169.254.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:12
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:61 errors:0 dropped:0 overruns:0 frame:0
TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:16712 (16.3 KiB) TX bytes:16712 (16.3 KiB)
sit0 Link encap:IPv6-in-IPv4
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
wlan0 Link encap:Ethernet HWaddr A0:9F:10:C6:D1:9F
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
wlan1 Link encap:Ethernet HWaddr A2:9F:10:C6:D1:9F
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
4、执行命令 ./wpa_supplicant -Dwext -iwlan0 -c ./wpa_supplicant.conf -d -B 启动 wpa_supplicant 程序
root@NVTEVM:/tmp_run$ ./wpa_supplicant -Dwext -iwlan0 -c ./wpa_supplicant.conf -d -B
wpa_supplicant v0.8.x_rtw_r24647.20171025
random: Trying to read entropy from /dev/random
Initializing interface 'wlan0' conf './wpa_supplicant.conf' driver 'wext' ctrl_interface 'N/A' bridge 'N/A'
Configuration file './wpa_supplicant.conf' -> '/tmp_run/./wpa_supplicant.conf'
Reading configuration file '/tmp_run/./wpa_supplicant.conf'
Failed to read or parse configuration '/tmp_run/./wpa_supplicant.conf'.
Failed to add interface wlan0
: Cancelling scan request
: Cancelling authentication timeout
root@NVTEVM:/tmp_run$
5、执行命令 ./wpa_cli -i wlan0 status 查询 wifi 状态
root@NVTEVM:/tmp_run$ ./wpa_cli -i wlan0 status
wpa_state=INACTIVE
address=a0:9f:10:c6:d1:a3
signal_level=0
6、执行命令 ./wpa_cli -i wlan0 scan 和 ./wpa_cli -i wlan0 scan_r 扫描 wifi 和 wifi 列表
root@NVTEVM:/tmp_run$ ./wpa_cli -i wlan0 scan
OK
root@NVTEVM:/tmp_run$ ./wpa_cli -i wlan0 scan_r
bssid / frequency / signal level / flags / ssid
d0:76:e7:75:d5:9f 2462 36 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] TVT-WIFI
54:25:ea:10:cd:40 2437 31 [WPA2-PSK-CCMP][WPS][ESS] Kevin-Office
e4:d3:32:27:00:08 2437 28 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] office_01
a4:bd:c4:c6:bb:c2 2447 26 [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][ESS] menjin
...