[WIFI] WiFi模块驱动移植+调试
转自 : https://mp.weixin.qq.com/s/DYqQgUqFicAPqBairS1Dyg?token=351837586&lang=zh_CN
一、WiFi驱动配置
当我们有一个新的Wifi模块,需要在项目上配置驱动时,Wifi原厂会给你相对应的资料,比如移植手册、驱动代码等,可以根据这些资料进行移植。此处只讲SDIO类型的WiFi模块。
WiFi模块的驱动移植有两种编译方法:
1.单独编译驱动2.将新的WiFi驱动放到内核中编译
最后都是生成.ko文件,拷贝到设备上insmod一下就可以成功使用了
(1) 单独编译驱动
首先保存好原厂的驱动代码,放到自己的文件路径下

1.配置编译环境
修改驱动文件中的Makefile,配置对应的内核路径、交叉编译工具链、平台架构等

参数说明:
-
KDIR:内核路径
-
CC:交叉编译器
-
architecture: 平台架构
-
system:使用的系统
-
platform_soc: 平台宏
2.配置驱动选项
在驱动根目录中敲make menuconfig

根据自己需要进行详细配置,看英文介绍就可以配置,这里不做过多演示。不同厂商、不同模块所需配置都不相同,可以根据原厂给的这块WiFi模块手册进行配置,或问原厂技术支持进行配置

3.驱动编译
不同厂家、不同芯片的编译方式也可能有所不同,这里介绍三种常见的编译方式a.直接编译make;make stripb.带参数编译

参数说明:
- KDIR:内核路径
- CC:交叉编译器
- architecture: 平台架构
- system:使用的系统
- platform_soc: 平台宏
c.使用脚本编译build_driver.sh 放在驱动根目录,需要按照格式添加对应的平台即可

执行:
- ./build_driver.sh 是 help 说明;
- ./build_driver.sh XXXXX 会完整的编译 WIFI 驱动
-
./build_driver.sh XXXX conf 会进入驱动配置界面
(2) 内核中编译
1.配置编译环境
进入内核目录下的drivers/net/wireless//

将 XXXXXXX 的驱动源码目录复制到内核目录下的drivers/net/wirelesee//

该目录中修改Makefile 和Kconfig 文件
Makefile:添加对应WiFi模块的编译选项项

Kconfig :在当前的Kconfig文件中引入一个外部的Kconfig文件路径

2.配置驱动选项
修改完Makefile和Kconfig文件后回到内核顶层目录进行配置编译
make menuconfig配置路径如下:
-> Device Drivers
-> [*]Network device support***
-> [*] Wireless LAN
3.驱动编译
配置好后make ARCH=arm进行编译
- 在Linux驱动中,使用"M"形式的模块指示符表示该模块将作为可加载模块编译。这意味着模块将编译为独立的二进制文件,而不是静态链接到内核。
- 这些模块文件通常位于/lib/modules/{kernel_version}/目录下,其中{kernel_version}是正在运行的Linux内核版本号。
- 当加载或卸载该模块时,可以使用insmod或modprobe命令将其加载到内核中,或使用rmmod命令卸载。
(3) 驱动加载测试
将生成的.ko文件有两种方式拷贝到设备上
1.第一种是直接拷贝,利用cp命令将.ko文件直接拷贝到设备上
2.第二种是直接将生成的kernel内核拷贝到设备上重新启动,.ko文件会在lib/modules/x.x.xx(Linux内核版本)/的目录下
以第一种为例,insmod XXXXXX.ko就可以将驱动加载到内核中,此时会根据驱动的代码打印一些内核log。也可以使用dmesg查看。

输入“ifconfig -a”命令,查看wlanX(X=0….n)网卡是否存在,一般都是 wlan0,除非板子上有多个 WIFI 模块在工作

从图中可以看出,当前开发板有一个叫做“wlan0”的网卡,这个就是我们驱动对应的网卡。
二、配置WiFi联网
不管是什么WIFI,当驱动测试都正常工作时,我们需要进行配置联网,WIFI要想联网,需要移植一些其他第三方组件,否则无法连接路由器或配置成路由器的功能,接下来我们就配置这些第三方组件。
(1) 基础第三方库、软件介绍:
-
OpenSSL:OpenSSL是一个开放源代码的软件库,提供了常用的安全协议(如SSL/TLS)的实现,用于加密通信和保护网络数据。它广泛应用于许多网络应用程序和操作系统中。
-
libnl-3.5.0:libnl是一个用于操作Linux内核网络部分的库,提供了对网络接口、路由表等的管理和配置功能。libnl-3.5.0则是libnl的特定版本。
-
Hostapd:Hostapd是一个用于实现无线网络接入点(AP)功能的软件,它可以将计算机或设备的无线网卡变成一个独立的无线接入点,允许其他设备通过它连接到网络。
-
DHCP:DHCP(Dynamic Host Configuration Protocol)是一种网络协议,可以自动分配IP地址、子网掩码、网关、DNS服务器等网络参数给计算机,简化了网络配置过程。通常用于局域网中的设备自动获取IP地址。
当我们需要配置WiFi正常上网时,可以用openssl+libnl-3.5.0+hostapd+dhcp实现
(2) 编译Hostapd
hostapd开源的仓库:git clone git://w1.fi/hostap.git
如何配置hostapd可以看以下链接,详细操作过程就不说了
https://blog.csdn.net/weixin_40209493/article/details/128716621?fromshare=blogdetail&sharetype=blogdetail&sharerId=128716621&sharerefer=PC&sharesource=qq_56921854&sharefrom=from_link
https://blog.csdn.net/weixin_43209963/article/details/128310918?fromshare=blogdetail&sharetype=blogdetail&sharerId=128310918&sharerefer=PC&sharesource=qq_56921854&sharefrom=from_link
最后会生成hostapd、hostapd_cli两个文件,这两个文件用于配置无线热点
(3) 编译dnsmasq
hostapd开源的仓库:git clone git://w1.fi/hostap.git
如何配置dnsmasq可以看以下链接,详细操作过程就不说了
https://www.xjx100.cn/news/291221.html?action=onClick
https://www.cnblogs.com/weidongliu/p/17361053.html
最后会生成dnsmasq一个文件,这个文件也是用于配置无线热点
(4) hostapd.conf
将上一步生成的程序拷贝到TF卡上就可以控制WiFi联网了,但运行Hostapd前提,还需要一个hostapd.conf的配置文件,这个文件就在源码目录下的Hostapd目录中(上一步生成的程序也在这个目录)

hostapd.conf是一个用于配置无线接入点(Access Point)的主要配置文件。它是HostAP(Host Access Point)驱动程序的配置文件,它定义了无线网络的参数和设置,包括SSID(无线网络名称)、加密方式、身份验证方法、频段、无线通道等。通过编辑hostapd.conf文件,可以自定义配置无线网络的各种参数,以满足特定的需求和安全要求。
详细配置可以根据源码目录下的这个文件里的说明进行配置:

这里我就自己写了一个hostapd的配置文件:
1 interface=wlan0
2 driver=nl80211
3 ctrl_interface_group=0
4 ssid=CDR_00000
5 country_code=CN
6 ieee80211d=1
7 hw_mode=g
8 channel=11
9 chanlist=1 6 11
10 beacon_int=100
11 max_num_sta=10
12 auth_algs=1
13 wmm_enabled=1
14 wpa=2
15 wpa_passphrase=12345678
16 wpa_key_mgmt=WPA-PSK WPA-EAP
17 wpa_pairwise=TKIP CCMP
18 rsn_pairwise=CCMP
19 wpa_group_rekey=86400
(5) 运行 hostapd
WIFI 功能能用 wlan的这个网卡,所以先提前查看是否有这个网卡

如果存在,将上述三个文件复制到设备中来
可以输入命令启动/system/bin/hostapd -- -d -s /data/wifi/hostapd_xj.conf
因为要作为 AP,所以需要配置 dhcp 服务器
1 ifconfig p2p0 192.168.42.129
2 mkdir -p /var/lib/misc/
3 start-stop-daemon -S -q -m -b -p /var/run/dnsmasq.pid \
4 -x /system/bin/dnsmasq -- --interface=p2p0 \
5 --dhcp-range=192.168.42.10,192.168.42.100,1h \
6 --except-interface=lo --bind-interfaces \
7 --keep-in-foreground --no-poll --user=root
这样就创建了Wifi(AP)并且可以让其它设备连上来了
(6)WIFI 联网测试
手机连接测试,可以连接该Wifi!!!
浙公网安备 33010602011771号