K230 SDK IoT WiFi AiW4211LV10使用指南
1. 功能介绍
AiW4211LV10是一款低功耗IoT WiFi芯片,我司采用该芯片平台设计了一款AiW4211LV10开发板,该开发板可通过TF卡插槽接入K230 EVB板。K230 EVB加载AiW4211LV10驱动之后,可以生成wlan0无线网卡,实现网络数据通信。

图1-1 AiW4211LV10开发板
WiFi主要功能如图1-1所示:

图1-1 WiFi功能框图
WiFi主要功能简介:
- 消息通信:WiFi接收并解析Host端发送的消息指令及指令参数,触发相应事件执行
- 网络通信:网络数据透传
- 参数配置:建立SoftAP,接收配置参数,并触发配置事件
- 配置存取:管理配置数据形成的配置文件,存储在flash上
- AP接入:接入指定AP,监控接入状态并进行相应处理
- 保活链路:建立维护与远程服务器之间的保活链路
- 休眠:设置软硬件环境,给Host下电(依据平台特性,K230自下电),WiFi进入休眠模式
- IO唤醒:处理button或PIR唤醒信号,恢复软硬件环境,给Host上电
- 网络唤醒:处理来自保活链路的唤醒数据包,恢复软硬件环境,给Host上电
2. 模块依赖
硬件上依赖AiW4211LV10开发板,依赖K230 EVB开发板。软件上依赖于K230 SDK。
2.1 软件环境
K230 SDK V0.5.1及后续版本。 AiW4211LV10 SDK。
2.2 硬件环境
K230 EVB开发板设置emmc启动,空出TF卡插槽用于AiW4211LV10开发板接入。 开发板硬件版本及跳线见表2-1:
表2-1开发板版本
| 开发板 | 硬件版本 | 设置 |
|---|---|---|
| K230 EVB | V1.1 | POWER BY BUTTON启动模式,跳线关系: 1.JUMPER J1 1—-2 2.JUMPER J1 13–14 |
| AiW4211LV10 | V1.1 |
K230 EVB开发板飞线到AiW4211LV10开发板排针,连接关系见表2-2:
表2-2 飞线关系
| Link1 | Link2 | Link3 | Link4 | Link5 | Link6 | Link7 | |
|---|---|---|---|---|---|---|---|
| K230 排针 | TP21 (5V) | J8.PIN9 (GPIO34) | J1.PIN9 (RTC_INT4) | J1.PIN14 (PW_EN) | |||
| WiFi 排针 | J6.PIN1 (5V) | J2.PIN3 (SDIO_INT_OUT) | J6.PIN3 (WH) | J2.PIN2 (GPIO2) | J2.PIN4 (TX) | J2.PIN5 (RX) | J2.PIN6 (GND) |
| TTL-USB | RX | TX | GND | ||||
| 说明 | 5V供电线 | WiFi数据中断线 | WiFi唤醒K230中断线 | WiFi监控K230电平 | com口收发 | com口收发 | com口GND |
连接说明:
- TP21是5V电压测试点,需要焊接一个插针,如果K230 EVB版本为V1.0则需要连接到J5 PIN16
- 如果使用不涉及WiFi唤醒K230 EVB则无需建立Link3
- 如果WiFi配置成通过监控K230 core的电源状态进入休眠则建立Link4,否则不需要。
- TTL-USB与WiFi的连线主要是为了观察WiFi的固件输出,无需要可以不连接
- AiW4211LV10开发板排针说明见表2-3
表2-3 WiFi开发板排针说明
| WIFI子板 接口 | 信号定义 | 描述 | 电平 | 必要性 | K230 USIP LP3 EVB 接口 | |
|---|---|---|---|---|---|---|
| J4 | 金手指 | SDIO_CLK/CMD/DATA | SDIO信号及GND | 3.3V | 必连 | TF卡槽 |
| J6 | PIN1 | VDD_5V_WIFI | 供电输入_5V | POWER | 必连 | TP21(V1.1) 或J5.PIN16(V1.0) |
| PIN2 | GND | GND | GND | 预留 | ||
| PIN3 | WIFI_WAKE_HOST | WIFI唤醒K230 | 1.8V | 功能信号 | J1.PIN9 | |
| PIN4 | WIFI_UART0_TX | 串口TX,可连接K230 | 1.8V | 预留 | J8.PIN15,目前无连接需求 | |
| PIN5 | WIFI_UART0_RX | 串口RX,可连接K230 | 1.8V | 预留 | J8.PIN13,目前无连接需求 | |
| PIN6 | HOST_WAKE_WIFI | K230唤醒WIFI | 1.8V | 功能信号 | J8.PIN11, 目前无连接需求 | |
| J2 | PIN1 | WIFI_POWER_EN | WIFI使能,预留 | 3.3V | 预留 | |
| PIN2 | GPIO2 | 监控K230电平 | 3.3V | 功能信号 | J1.PIN14 | |
| PIN3 | SDIO_INT_OUT | SDIO中断 | 1.8V | 功能信号 | J8.PIN9 | |
| PIN4 | UART0_TXD | 调试串口TXD | 3.3V | 调试串口 | 连PC | |
| PIN5 | UART0_RXD | 调试串口RXD | 3.3V | 调试串口 | 连PC | |
| PIN6 | GND | GND | GND | 调试串口 | 连PC | |
| J3 | PIN1 | PIR_WAKE_HOST | PIR唤醒K230 | 1.8V | 可选 | J1.PIN待定 |
| PIN2 | GND | PIR供电,接PIR黑色线 | GND | \ | \ | |
| PIN3 | PIR_WAKE_WiFi | PIR信号,接PIR棕色线 | 3.3V | \ | \ | |
| PIN4 | VDD_3V3 | PIR供电,接PIR红色线 | POWER | \ | \ |
3. 模块配置
3.1 SDK目录结构
WiFi SDK的目录结构如下:
├── README.txt //简要编译及使用说明文档
├── support //存放固件烧写工具BurnTool.exe,编译环境搭建说明文档及支持包
├── toolchain //固件交叉编译工具链
├── Makefile //编译入口Makefile,可实现一键编译
├── SocChannel //WiFi驱动及配置工具源码
├── AiW4211LV10 //WiFi固件源码
编译驱动的工具链因与平台相关,故未放入SDK之中,如有需要请联系我们。
3.2 定制化修改
在WiFi SDK之中,为了便于固件的定制化,与硬件设计关联比较紧密的代码,需要公布且可由用户定制的SoftAP相关参数,以及自定义的被多个文件使用的全局变量等,被放置在canaan_private.h及canaan_private.c文件之中。重点项目说明见表3-1:
表3-1 定制化重点项说明
| 项目 | 说明 |
|---|---|
| CONFIG_WIFI_MONITOR_HOSTLEVEL | 使能该宏之后WiFi通过监控K230的电源状态引脚触发休眠,将忽略休眠指令 |
| HOST_LLEVEL_TIME | 配合CONFIG_WIFI_MONITOR_HOSTLEVEL使用,电源状态引脚拉低持续HOST_LLEVEL_TIME时间将触发休眠,设置该时间是为了防抖及过滤冷启动的不稳定状态 |
| LONG_PRESS_TIME | 长按WiFi开发板上的K4按键持续LONG_PRESS_TIME时间WiFi将建立SoftAP模式,用于配置AP接入。参考5.3.1。 |
| TCP_SERVER_PORT | SoftAP建立之后,WiFi启动一个tcp socket server用于接收网络配置信息,TCP_SERVER_PORT是指定监听端口 |
| g_softap_ipaddr | SoftAP的网关、掩码及ip |
| g_softapcfg | SoftAP的热点名称及密码等 |
| gpios_config[] g_gpios_config | WiFi GPIO配置表,与硬件设计相关,描述各功能GPIO的编号、功能名、方向、中断类型及触发方式和中断回调函数 |
| kd_gpios_hoststanby | WiFi给Host下电接口,可根据平台特性实现,因K230自下电,此接口未操作任何IO |
| kd_gpios_wakehost | WiFi给Host上电接口,可根据平台特性实现,针对K230平台,WiFi给K230 PMU发送了一个IO信号 |
4. 固件编译
4.1 编译环境
固件编译环境搭建请参考文档《AiW4211V10/AiW4211LV10 SDK开发环境搭建 用户指南.pdf》,该文档存储于WiFi SDK的support目录。 使用者也可以联系 成都爱旗科技有限公司(http://www.aichtech.com/) 索取相关资料。
4.2 编译方法
进入WiFi SDK源码目录执行指令make all和make install,编译得到WiFi固件、驱动、配置工具及通信接口共享库文件存储在顶层的out目录下:
out/
├── bin
│ ├── aiw4211l_demo_allinone.bin
│ ├── aiw4211lv10.ko
│ ├── wifi.conf
│ ├── iotwifi_link
│ ├── iotwifi_cli
│ └── k230_pwrdown
├── inc
│ ├── soc_msg.h
│ └── hal_iotwifi_cli.h
└── lib
└── libhal_iotwifi.so
也可以各部分独立编译: make firmware:编译WiFi固件aiw4211l_demo_allinone.bin make driver:编译WiFi驱动aiw4211lv10.ko make tools:编译配置工具和通信接口共享库,iotwifi_link、iotwifi_cli、libhal_iotwifi.so、k230_pwrdown
备注:K230 SDK已经集成了WiFi驱动、配置工具和通信接口库,因此这些可以不编译
5. 模块启动
5.1 固件烧写
使用WiFi SDK support目录 下的烧写工具BurnTool.exe,通过串口将固件aiw4211l_demo_allinone.bin烧写到AiW4211LV10开发板。
烧写方法请参考文档《AiW4211V10/AiW4211LV10 BurnTool工具 使用指南.pdf》,该文档存储于WiFi SDK的support目录。
使用者也可以联系 成都爱旗科技有限公司(http://www.aichtech.com/) 索取相关资料。
图5-1展示的是单板快速烧写的示意图:

图5-1 单板快速烧写
step 1: 选择烧写COM口 step 2: 通过“Setting”菜单项配置COM口参数 step 3: 选择WiFi固件 step 4: 点击“Connect”控件向WiFi开发板发起连接,WiFi开发板上电,工具log窗口可以看到ready to load …,表示连接已经建立,可以开始烧写了 step 5: 点击“Send file”控件开始烧写
5.2 驱动加载
参考2.2节内容配置硬件环境,长按K230 EVB板上K1按键上电启动,加载驱动:
modprobe aiw4211lv10 或者 modprobe aiw4211lv10 mmc=1 gpio=34
启动配置工具server端并置于后台运行:iotwifi_link &
当前驱动支持传入mmc主控编号及用于中断检测的gpio编号,可以实现较为灵活的硬件配置,如果不传参则分别使用代码中规定的默认值1和34。iotwifi_link的功能角色类似于wpa_supplicant,它首先会将wlan0 up起来,然后从WiFi设备侧同步mac地址及ip地址到Host端。

图 5-2 驱动加载及iotwifi_link启动
5.3 参数配置
AiW4211LV10的接入AP、休眠等级、休眠周期、唤醒IO、tcp keepalive的目标server、保活参数等直接影响WiFi运行,且需要根据实际场景进行动态调整的参数,可以通过5.3.1和5.3.2节提供的方式方法进行传参配置。
除非用户想要改变配置,否则每次启动之后无需重配。
5.3.1 通过网络配置AP接入
AiW4211LV10开发板支持通过网络配置目标AP的名称、密码和加密方式这三个参数。配置AP接入的步骤如下:
step 1: 准备一个路由器,并记录其热点名称、密码和加密方式信息 step 2: AiW4211LV10开发板在固件烧写之后初次启动运行时,或者在已经完成配置的情况下长按板上K4按键3s,WiFi将启动SoftAP模式生成一个热点并建立一个基于TCP协议的socket server step 3: 将PC连入该热点,然后启动NetAssist step 4: 配置NetAssist作为 tcp socket client连接到WiFi step 5: server解析配置数据后连接到指定AP,退出SoftAP模式
使用者如有能力可以开发一个手机APP进行网络配置,这里为简单起见只是使用了PC+NetAssist方案。SoftAP参数及配置数据格式见表5-1,NetAssist配置运行见图5-1:
表 5-1 SoftAP参数及配置数据格式
| 项目 | 参数 |
|---|---|
| AP name | k230 |
| AP password | 12345678 |
| server ip | 192.168.43.1 |
| server port | 35556 |
| config data | cfg=<targer ap name>,<targer ap auth>,<targer ap password> 例如:cfg=xuyuxuan,2,Xuyuxuan123 |

图 5-3 NetAssist配置运行
5.3.2 通过消息配置AP接入
AiW4211LV10开发板支持通过消息通道配置目标AP参数(与5.3.1功能相同),除此之外还可以通过消息通道配置WiFi休眠参数和tcp keepalive参数。消息通道是K230与AiW4211LV10之间通过SDIO总线建立起来的软件通道。
5.3.2.1 通过配置工具配置
配置步骤如下:
step 1: 准备一个路由器并启动热点 step 2: 将PC接入该热点,然后启动NetAssist,这里为简单起见使用PC+NetAssist作为远端保活服务器 step 3: 配置NetAssist作为 tcp socket server等待WiFi保活链路的接入 step 4: K230端根据热点信息和NetAssist启动的server信息编辑配置文件/etc/wifi.conf step 5: 运行配置工具client端,解析配置文件,发送配置消息:iotwifi_cli –config /etc/wifi.conf step 6: AiW4211LV10接收到配置参数之后,首先存储休眠参数,然后接入指定AP,最后建立tcp socket client连入NetAssist建立的 tcp socket server
/etc/wifi.conf是WiFi工作参数配置文件,以json格式编写,基本上是对wifi_config_t结构体的映射,具体可参考6.1.2章节。文件内容如下:
{
"sleep": {
"level": 2,
"period": 3000,
"wake_gpios": [5]
},
"conn": {
"ssid": "xuyuxuan",
"auth": 2,
"key": "Xuyuxuan123",
"bssid": "",
"pairwise": 0
},
"keepalive": {
"svrip": "192.168.50.197",
"svrport": 5001,
"time": 10,
"intvl": 2,
"probes": 5,
"hrintvl": 60,
"hrprobes": 5
}
}
备注: “wake_gpios”: [5] 是一个数组项,当前数组只有一个元素5,表示WiFi可以被自身的gpio5唤醒,该IO对应按键K4,如果新添加唤醒源可以以逗号分隔追加。这取决于具体的硬件设计。

图 5-4 (A)WiFi接入路 由器并被分配IP (B)tcp keepalive server
5.3.2.2 通过调用API配置
在实际的业务程序中,可以通过调用通信接口共享库libhal_iotwifi.so提供的API接口kd_wifi_config进行参数配置,API说明请参考6.1.1章节,配置步骤与5.3.2.1相同。
5.3.2.1节当中介绍的工具iotwifi_cli也是通过调用该接口实现WiFi参数配置的。
5.4 系统休眠
5.4.1 通过工具配置休眠
运行配置工具client端发送休眠指令触发WiFi休眠:iotwifi_cli –dirsleep

图 5-5 WiFi进入休眠log
5.4.2 通过调用API休眠
在实际的业务程序中,可以通过调用通信接口共享库libhal_iotwifi.so提供的API接口kd_wifi_sleep触发WiFi休眠,具体请参考6.2章节。
工具iotwifi_cli也是通过调用该接口触发WiFi休眠的。
5.4.3 通过监控电平休眠
K230 EVB可以实现自下电,下电之后K230 EVB开发板J1 PIN14(PW_EN)引脚的电平将会被拉低,WiFi也可以通过监控该引脚的电平触发休眠。该功能使用的前提是K230功耗管理功能正常,并在编译WiFi固件时使能宏 CONFIG_WIFI_MONITOR_HOSTLEVEL(默认不使能),使能该宏之后WiFi将忽略K230发送的sleep指令,仅依据引脚电平状态进行休眠。
工具k230_pwrdown可以实现较为简单的K230 EVB双核自下电,它未做任何文件存储、状态检测等业务逻辑上的安全处理,因此只可以用于电平触发WiFi休眠的场景验证。该工具未集成到K230 SDK当中,因此需要拷贝到K230 EVB上执行:
./k230_pwrdown
5.5 系统唤醒
5.5.1 按键唤醒
如果WiFi已进入休眠状态,短按AiW4211LV10开发板上的K4按键可唤醒WiFi,WiFi将给K230 EVB的PMU发送唤醒信号,如果此时K230 EVB处于5.4.3节配置的下电状态(非冷启动),其将被上电。

图5-6 按键唤醒log
5.5.2 网络唤醒
如果WiFi已进入休眠状态,NetAssist发送wakeup可唤醒WiFi,WiFi将给K230 EVB的PMU发送唤醒信号,如果此时K230 EVB处于5.4.3节配置的下电状态(非冷启动),其将被上电。

图5-7 网络唤醒log
6. API参考
AiW4211LV10驱动加载后生成的无线网卡与一般WiFi网卡无异,因此网络通信功能无特殊API需要说明。 除基本的网络通信外,K230与WiFi还存在两个消息通信接口,需要重点说明。
6.1 config接口
6.1.1 API
int kd_wifi_config(wifi_config_t *config) 配置WiFi工作参数:
- 配置目标AP的名称、密码、认证及加密方式
- 配置WiFi休眠等级,苏醒周期以及可唤醒的gpio
- 配置tcp keepalive时间参数等
6.1.2 数据结构
6.1.2.1 wifi_config_t
typedef struct {
unsigned int config_mask;
#define CFG_MASK_SLEEP (1 << 0)
#define CFG_MASK_CONNECT (1 << 1)
#define CFG_MASK_KEEPALIVE (1 << 2)
wifi_sleep_t sleep;
wifi_connect_t conn;
wifi_keepalive_t keepalive;
} wifi_config_t;
表6-1 wifi_config_t结构体成员
| config_mask | 配置目标项掩码,使能或屏蔽目标项,例如全部配置则:config_mask = CFG_MASK_SLEEP|CFG_MASK_CONNECT|CFG_MASK_KEEPALIVE CFG_MASK_SLEEP:配置休眠参数 CFG_MASK_CONNECT:配置AP连接参数 CFG_MASK_KEEPALIVE:配置tcp keepalive参数 |
|---|---|
| sleep | 休眠参数 |
| conn | AP连接参数 |
| keepalive | tcp keepalive参数 |
6.1.2.2 wifi_sleep_t
typedef struct
{
unsigned int level;
#define WIFI_SLEEP_LIGHT 1
#define WIFI_SLEEP_DEEP 2
#define WIFI_SLEEP_ULTRA 3
unsigned int period;
union
{
/*
* gpioX_wake: 0---disable, 1---enable
*/
struct {
unsigned int gpio0_wake:1;
unsigned int gpio1_wake:1;
unsigned int gpio2_wake:1;
unsigned int gpio3_wake:1;
unsigned int gpio4_wake:1;
unsigned int gpio5_wake:1;
unsigned int gpio6_wake:1;
unsigned int gpio7_wake:1;
unsigned int gpio8_wake:1;
unsigned int gpio9_wake:1;
unsigned int gpio10_wake:1;
unsigned int gpio11_wake:1;
unsigned int gpio12_wake:1;
unsigned int gpio13_wake:1;
unsigned int gpio14_wake:1;
};
unsigned int wake_gpios;
};
} wifi_sleep_t;
表6-2 wifi_sleep_t结构体成员
| level | 休眠等级 WIFI_SLEEP_LIGHT:浅睡 WIFI_SLEEP_DEEP:深睡,主要休眠模式 WIFI_SLEEP_ULTRA:超深睡,只有3/5/7/14号gpio可唤醒,目前不使用 |
|---|---|
| period | 苏醒周期,有效数值33~~4000ms。WiFi周期性从休眠态醒来,检测AP是否有发给自己的数据缓存 |
| wake_gpios | enable或disable可唤醒WiFi的gpio(WiFi侧gpio) |
6.1.2.3 wifi_connect_t
typedef struct
{
char ssid[EXT_WIFI_MAX_SSID_LEN + 1];
ext_wifi_auth_mode auth;
char key[EXT_WIFI_MAX_KEY_LEN + 1];
unsigned char bssid[EXT_WIFI_MAC_LEN];
ext_wifi_pairwise pairwise;
} wifi_connect_t;
表6-3 wifi_connect_t结构体成员
| ssid | AP名称 |
|---|---|
| auth | 认证类型 EXT_WIFI_SECURITY_OPEN EXT_WIFI_SECURITY_WEP EXT_WIFI_SECURITY_WPA2PSK EXT_WIFI_SECURITY_WPAPSK_WPA2PSK_MIX EXT_WIFI_SECURITY_WPAPSK EXT_WIFI_SECURITY_WPA EXT_WIFI_SECURITY_WPA2 EXT_WIFI_SECURITY_SAE EXT_WIFI_SECURITY_WPA3_WPA2_PSK_MIX EXT_WIFI_SECURITY_UNKNOWN |
| Key | AP密码 |
| bssid | AP bssid,一般为AP mac地址 |
| pairwise | 加密类型 EXT_WIFI_PARIWISE_UNKNOWN EXT_WIFI_PAIRWISE_AES EXT_WIFI_PAIRWISE_TKIP EXT_WIFI_PAIRWISE_TKIP_AES_MIX |
6.1.2.4 wifi_keepalive_t
typedef struct
{
unsigned char svrip[16];
unsigned short svrport;
unsigned short tcp_keepalive_time;
unsigned short tcp_keepalive_intvl;
unsigned short tcp_keepalive_probes;
unsigned short heartbeat_intvl;
unsigned short heartbeat_probes;
} wifi_keepalive_t;
表6-4 wifi_keepalive_t结构体成员
| svrip | server端ip地址 |
|---|---|
| svrport | server端端口号 |
| tcp_keepalive_time | TCP层keepalive心跳包常规发送周期,秒 |
| tcp_keepalive_intvl | TCP层keepalive心跳包无回应之后新的发送周期,秒 |
| tcp_keepalive_probes | TCP层keepalive心跳包无回应计数超过该阈值之后,判断TCP连接异常,断开重连 |
| heartbeat_intvl | 应用层心跳包发送周期,秒 |
| heartbeat_probes | 应用层心跳包无回应计数超过该阈值之后,判断socket连接异常,断开重连 |
6.2 sleep接口
int kd_wifi_sleep(void) 控制WiFi进入休眠,休眠相关参数在config API当中设置。
7.wifi功能限制
AiW4211LV10芯片为单频wifi芯片,不支持ap和sta同时共存,当ap启动时固定在某一信道,再起sta的话sta会在不同的信道上扫描,此时ap就会断连。 当通过sdio传入conf为错误配置时,AiW4211LV10会显示sta连接ap失败 串口打印 please reset conf,此时可通过iotwifi_cli传入新的正确的conf。 当通过client传入sta错误配置时,wifi从ap会切换到sta模式,AiW4211LV10会显示sta连接ap失败 串口同样打印please reset conf,由于sta与ap不能同时共存,这时wifi芯片会从sta切换到ap模式重新起tcp server ,sta需要重新连接ap,作为client重新接入。