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