Wlan使用参考


1. 概述

无线局域网技术(Wi-Fi)是一种定义了物理层和数据链路层标准的无线网络技术。SigmaStar 的 PCUPID 系列芯片内部未集成 Wi-Fi 的 MAC 和 PHY 功能,因此需要外挂 Wi-Fi 芯片以实现 MAC 和 PHY 的控制。常见的使用方式是外挂一颗同时集成了 MAC 和 PHY 的 Wi-Fi 模块/模组(集成 WiFi 芯片、射频等硬件及协议栈,能通过标准接口为其他设备提供 WiFi 连接功能的模块化硬件电路)

外挂 WiFi 模组和 SOC 之间的通信标准接口主要包括以下几种:

  • SDIO 接口

  • USB 接口

2. 关键字说明

  • WIFI芯片 :实现 WiFi 功能的集成电路(IC),集成 MAC 控制器和 PHY 控制器,需外部搭配射频电路、电源管理、晶振等元件才能工作,无法直接独立使用。常见的WiFi芯片包含芯片厂商自己的MCU,用来运行协议栈、寄存器配置等核心软件。

  • WIFI模组 :集成 WiFi 芯片、射频、晶振等硬件及协议栈,能通过标准接口为其他设备提供 WiFi 连接功能的模块化组件,是硬件电路和软件的集合,有时候也单指硬件电路。

  • WiFi6 :802.11ax 无线标准的商业命名

3. 功能描述

PCUPID 系列芯片公板的WiFi技术使用方案如图,包含用于连接WiFi模组的sdio接口和usb接口,内存里的数据通过sdio接口或usb接口发送到WiFi模组,然后WiFi模组通过自身的射频发送到空间电磁环境中,接收过程刚好相反。

WiFi模组-soc接口

Wi-Fi芯片/模组有以下特点:

  • 未采用 Linux 系统自带的无线 MAC 层协议栈实现(即未使用mac80211子系统),但是会使用cfg80211子系统完成 Wi-Fi 模组的参数配置。
  • 无线 MAC 层协议栈大多集成于 Wi-Fi 芯片内部(部分 Wi-Fi 芯片具备 MCU 功能,可运行厂商自研的 MAC 层协议栈代码)
  • 与 Linux 网络协议栈的适配逻辑,主要在模组的驱动 ko 文件中实现

4. 硬件连接介绍

4.1 soc硬件接口确认

PCUPID 系列芯片公板的WiFi模组使用sdio接口和usb接口,这里以Comake_Pi_D1板子为例,它用usb1接口连接WiFi模组,usb接口的引脚是"DP_USB2_P0/1","DM_USB2_P0/1"。

注意:usb接口的引脚是专用的,没有复用其他功能,所以在hw checklist表的引脚复用子表ARMTmux里是找不到usb接口引脚说明的

4.2 wifi模组接口确认

Comake_Pi_D1板子用的是ssw108ge,下图是该模组的线序图,需要关注模组的引脚分布

ssw108ge模组接线图

4.3 原理图连接

Comake_Pi_D1 开发板通过 USB1 接口连接 Wi-Fi 模组,如下图所示。其中,USB1 接口的两根信号线为DP_USB2_P1和DM_USB2_P1。

Wi-Fi 模组的供电由3V3_WIFI提供,其供电控制通过GPIOA_13引脚配合开关管实现:当GPIOA_13输出低电平时,开关管导通,3V3_WIFI为模组供电。

使用 Wi-Fi 模组时需确保供电开启,若需默认供电,需在内核设备树(dts)中配置GPIOA_13引脚,具体配置方法详见后续章节。

usb1_wifi接线图

5. Kernel用法介绍

5.1 配置sdio接口dts

如果是sdio接口的WiFi模组,请参考《SDMMC使用参考》章节,完成设备树(dts)和 padmux的配置

5.2 配置usb接口dts

如果是usb接口的WiFi模组,参考《USB使用参考》章节,完成usb host模式的设备树(dts)配置

5.3 kernel config配置

在kernel目录下执行"make menuconfig",然后打开或关闭,修改某些配置项,如果需要保存修改后的配置,需要再次执行"make savedefconfig",然后执行"cp defconfig 目标defconfig"

5.3.1 配置wext

Wext是Wireless Extension,是内核中WIFI驱动和用户态进程的标准接口,iwpriv命令依赖这个配置。WEXT是2000年代初的技术,已无法满足现代WiFi需求,按需打开该配置项。

内核配置如下:

-*- Networking support  --->
    -*-   Wireless  --->
        <M>   cfg80211 - wireless configuration API
        ...
        [*]     cfg80211 wireless extensions compatibility

image.png

5.3.2 配置cfg80211

CFG80211是内核中WIFI驱动和用户态进程的标准接口,在CFG80211出现之前是WEXT,现在越来越多的使用CFG80211。

内核配置如下:

-*- Networking support  --->
    -*-   Wireless  --->
        <M>   cfg80211 - wireless configuration API

image.png

5.3.3 配置bridge

使用wlan及p2p实现板端WIFI桥接,内核配置如下:

-*- Networking support  --->
    -*-   Wireless  --->
        <M>   cfg80211 - wireless configuration API

image.png

Device Drivers  --->
    Generic Driver Options  --->
        [*] Support for uevent helper

image.png

-*- Networking support  --->
    Networking options  --->
        <M> 802.1d Ethernet Bridging

image.png

5.4 加载相关ko

5.4.1 加载sdio相关ko

sdio相关的ko都已经默认编译进内核,上电就会自动加载运行

  • mmc_core.ko
  • mmc_block.ko
  • kdrv_sdmmc.ko

5.4.2 加载usb相关ko

usb的host模式需要按顺序加载以下ko

  • usb-common.ko
  • usbcore.ko
  • sstar-usb2-phy.ko
  • ehci-hcd.ko

5.4.3 加载内核相关ko

需要加载以下ko

  • cfg80211.ko

5.4.4 加载wifi模组相关ko

Wi-Fi 模组厂商会为客户提供相应的驱动 ko 文件。PCUPID 系列芯片公板提供了适用于 SDIO 接口和 USB 接口的驱动文件,分别为ssw102b_wifi_sdio.ko和SSW108GE_wifi_usb.ko。

Comake_Pi_D1 开发板使用的是SSW108GE_wifi_usb.ko,该驱动主要提供以下三种功能:

  • MAC 层适配:对接 Linux 内核网络协议栈(如通过net_device结构体注册网络接口,实现数据包收发的协议转换)
  • 硬件控制:初始化 WiFi 芯片(如射频、基带、固件加载)、管理无线信道 / 功率 / 加密等硬件参数
  • 接口控制:实现 SDIO/USB 总线与 WiFi 芯片的通信(如数据帧的打包 / 解包、中断处理、总线时序控制)

Comake_Pi_D1 开发板在启动脚本里默认加载SSW108GE_wifi_usb.ko

5.5 应用层调用

加载了SSW108GE_wifi_usb.ko驱动之后,就能在应用层正常使用wifi功能了,常用工具有iwconfig,iwlist,wap_supplicant,wap_cli,hostapd,hostapd_cli等


6. 常用工具

6.1 wap_supplicant使用

wpa_supplicant是一个独立运行的守护进程,用来启动无线网络后台服务,在消息循环中处理WPA状态机、控制命令、驱动事件、配置信息等。

常用命令参数如下:

-I <ifname>         // 网络接口名称
-c <conf>           // 配置文件名称
-C <ctrl_intf>      // 控制接口名称
-D<driver>          // 驱动类型名称
-p <driver_param>   // 驱动参数
-b <br_ifname>      // 桥接口名称
-d                  // 增加调试信息

使用样例:

ifconfig wlan0 up
mkdir -p /tmp/wifi/run
/customer/wifi/wpa_supplicant -Dnl80211 -i wlan0 -c /customer/wifi/wpa_supplicant.conf -d &

启动无线网络服务,驱动类型为nl80211,使用网络端口名称为wlan0,配置文件路径为/customer/wpa_supplicant.conf。若配置文件中有保存热点信息,则发起连接。

配置文件参考如下:

ctrl_interface=/tmp/wifi/run/wpa_supplicant
update_config=1
network={
ssid="sstest"
psk="12345678"
}

成功连接上热点后:

image.png

image.png

6.2 wpa_cli使用

wpa_cli是客户端程序,与wpa_supplicant通信,搜索、设置和连接网络。

常用命令参数如下(如当前网络接口为wlan0):

wpa_cli –i wlan0 scan               // 扫描附近的热点
wpa_cli –i wlan0 scan_result        // 显示扫描结果
wpa_cli –I wlan0 status             // 查看当前连接信息
wpa_cli –I wlan0 add_network        // 新建一个链接,返回network id
wpa_cli –I wlan0 set_network <network id> <variable> <value> // 设置网络参数,如ssid,psk,keymgmt
wpa_cli –I wlan0 select_network  <network id>       // 选择指定的网络(会断开其它的连接)
wpa_cli –I wlan0 enable_network <network id>        // 使能指定网络
wpa_cli –I wlan0 disable_network <network id>       // 禁用指定网络
wpa_cli –I wlan0 save_config        // 保持连接信息至wpa_supplicant.conf

根据wpa_supplicant.conf设置的ctrl_interface,添加-p选项指定路径,示例:

/customer/wifi/wpa_cli -p /tmp/wifi/run/wpa_supplicant/ -i wlan0 scan
/customer/wifi/wpa_cli -p /tmp/wifi/run/wpa_supplicant/ -i wlan0 scan_result
/customer/wifi/wpa_cli -p /tmp/wifi/run/wpa_supplicant/ -i wlan0 status

image.png

image.png

image.png

6.3 iwlist使用

iwlist用于对/proc/net/wireless文件进行分析,得出无线网卡相关信息。

常用命令参数如下(如当前网络接口为wlan0):

iwlist wlan0 scanning               // 扫描当前无线网络
iwlist wlan0 frequen                // 显示频道信息
iwlist wlan0 rate                   // 显示连接速度
iwlist wlan0 power                  // 显示电源模式

示例:

/customer/wifi/iwlist scanning
/customer/wifi/iwlist frequen

image.png

image.png

6.4 udhcpc使用

udhcpc作为dhcp客户端,动态获取ip。

常用命令参数如下:

-i <ifname> // 网络接口名称
-s <script> // udhcpc script
-a          // 使用arping验证提供的地址
-t <count>  // 发送数据包次数
-T <time>   // 数据包间时间间隔(默认是3s)
-f          // 前台执行
-b          // 后台执行
-n          // 租约获取失败时退出
-q          // 获取到租约后退出

使用样例:

udhcpc -q -i wlan0 -s /etc/init.d/udhcpc.script &

注意,udhcpc.script中的RESOLV_CONF路径要填上可读写的路径,例如:

-RESOLV_CONF="/appconfigs/resolv.conf"
+RESOLV_CONF="/tmp/resolv.conf"

image.png

image.png

注意,域名解析依赖编译链相关库,测试时需要指定LD_LIBRARY_PATH,例如export LD_LIBRARY_PATH=/customer/libdns:$LD_LIBRARY_PATH,需要确保板端/etc路径是可读写的。

image.png

6.5 hostapd使用

hostapd用来将当前设备作为热点,允许其它网络设备接入。

使用样例:

hostapd -B /customer/wifi/hostapd.conf        // -B:在后台执行守护进程

image.png

image.png

6.6 dnsmasq使用

dnsmasq是一个轻量级的,易于配置的DNS转发器和DHCP服务器。它的目的是给一个小网络提供DNS和可选的DHCP。

常用命令参数如下:

-i <ifname> // 网络接口名称
-C <path>     // 指定配置文件路径(默认为/etc/dnsmasq.conf)
--no-daemon // 非后台执行

使用样例:

dnsmasq -i p2p0 --no-daemon -C /customer/wifi/dnsmasq.conf &

6.7 hostapd_cli使用

hostapd_cli作为hostapd的客户端,使用时,首先需要先启动hostapd主程序。hostapd启动后,运行cli客户端时,会自动去连接当前正在工作的hostapd进程,连接成功后,cli客户端就可以对hostapd应用程序进行参数的获取和控制。

常用命令参数如下:

-i <ifname>     // 网络接口名称
-p <path>       // 控制套接字路径(默认为/var/run/hostapd)
-B              // 后台执行守护进程

使用样例:

/customer/wifi/hostapd_cli -I p2p0 –p /var/run/hostapd all_sta &

7. WiFi使用示例

7.1 加载WIFI驱动

先insmod加载WIFI驱动,以ssw102b为例,对应驱动是ssw102b_wifi_sdio.ko。执行如下命令:

insmod firmware_class.ko
insmod cfg80211.ko
insmod ssw102b_wifi_sdio.ko

使用ifconfig –a查看,可以看到新生成wlan0及p2p0节点:

image.png

7.2 STA模式测试

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/customer/wifi
mkdir -p /tmp/wifi/run
chmod 777 /tmp/wifi/run
ifconfig wlan0 up

创建wpa_supplicant.conf文件,编辑如下,使用测试热点为“sstest”,密码为“12345678”。

image.png

测试连接:

/customer/wifi/wpa_supplicant -Dnl80211 -i wlan0 -c /customer/wifi/wpa_supplicant.conf -d &

获取IP:

udhcpc -q -i wlan0 -s /etc/init.d/udhcpc.script &

查看wlan0信息:

image.png

扫描热点:

/customer/wifi/iwlist scanning

系统会自动连接wpa_supplicant.conf中设置好的wifi网络。

7.3 AP模式测试

mkdir -p /var/run/hostapd
mkdir -p /var/wifi/misc
mkdir -p /var/lib/misc
ifconfig p2p0 up
ifconfig p2p0 192.168.1.100 netmask 255.255.255.0

hostapd配置文件在/customer/wifi/hostapd.conf,其中ssid为当前设备的热点名称,wpa_passphrase为设备的连接密码。可修改此文件变更设备名称和密码。

开启热点:

./customer/wifi/hostapd -B /customer/wifi/hostapd.conf
./customer/wifi/dnsmasq -i p2p0 --no-daemon -C /customer/wifi/dnsmasq.conf &

网络设备可以搜索到热点“ssw101bap”:

image.png

使用手机连接热点

image.png

7.4 桥接模式测试

修改/customer/wifi/wpa_supplicant.conf,添加外部AP热点信息:

/ # vi /customer/wifi/wpa_supplicant.conf
ctrl_interface=/tmp/wifi/run/wpa_supplicant
update_config=1

network={
    ssid="sstest"
    psk="12345678"
}

加载驱动:

cd /customer/wifi

mkdir -p /tmp/wifi/run/wpa_supplicant
mkdir -p /var/run/hostapd
mkdir -p /var/wifi/misc
mkdir -p /var/lib/misc
insmod llc.ko
insmod stp.ko
insmod bridge.ko

hostapd.conf需要添加一项配置项:

interface=p2p0  //ssw101/2b 采用p2p0做ap interface。
bridge=br0      //固定
hw_mode=g       //固定
channel=1

注意: 桥接使用channel,前后端都是一致的。取决于wlan0连接到ap的channel,此处要填写相应channel。

添加环境变量,将wifi用到的so添加到系统中。一般放置在/customer/wifi下面export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/customer/wifi

初始化wifi模块,参考脚本/customer/wifi/sigma_wifi_init.sh

注:如果遇到 sh: write error: Invalid argument 可以忽略。

建立网卡桥接:

ifconfig wlan0 up
ifconfig p2p0 up
ifconfig wlan0 0.0.0.0
ifconfig p2p0 0.0.0.0
brctl addbr br0
brctl addif br0 wlan0
brctl addif br0 p2p0
ifconfig br0 up

sta连接wifi:

/customer/wifi/wpa_supplicant -Dnl80211 -i wlan0 -c /customer/wifi/wpa_supplicant.conf -b br0 &
udhcpc -S /etc/init.d/udhcpc.script -i br0

开启AP模式:

./hostapd -B /customer/wifi/hostapd.conf
./dnsmasq -i p2p0 --no-daemon -C /customer/wifi/dnsmasq.conf &
AP: SSID:ssw101bap pwd:12345678

如果sta可以连接外网,那么通过pc连接ssw101bap后,也可以正常连上网络。

注:如果sta连接wifi,出现 wlan0 is not sta mode的错误信息,可能是wifi驱动和kernel没有匹配。请找对应的wifi模组厂,提供新的ko。