- dev 驱动接口层:为 wlan 框架提供统一的接口调用。
- manage 管理层:为用户提供 Wi-Fi 扫描,链接,断线重连等功能。
- protocol 协议:负责处理 Wi-Fi 产生的数据流,如 lwip。
1、使能 wlan 驱动
在 Linux 下 执行如下命令,并开启 wlan 驱动。
1$scons--menuconfig
2RT-ThreadComponents--->
3DeviceDrivers--->
4[*]UsingWi-Fiframework--->
开启 wlan 驱动后,默认会选中 lwip。
如 WiFi SOC 类芯片,原厂 SDK 中已经有线程管理 WiFi 数据收发,可关闭 lwip 中的 Rx thread 和 Tx thread,以节省系统资源。
1Network--->
2-*-LwIP:lightweightTCP/IPstack--->
3[*]NotuseRxthread
4[*]NotuseTxthread
2、wlan 驱动框架适配
初始化
通过 rt_wlan_dev_register() 注册 STATION 和 AP 设备,并将 wlan 设备接口函数注册进对应设备。
1staticconststructrt_wlan_dev_opsops=
2{
3.wlan_init=drv_wlan_init,
4.wlan_mode=drv_wlan_mode,
5.wlan_scan=drv_wlan_scan,
6.wlan_join=drv_wlan_join,
7.wlan_softap=drv_wlan_softap,
8.wlan_disconnect=drv_wlan_disconnect,
9.wlan_ap_stop=drv_wlan_ap_stop,
10.wlan_ap_deauth=drv_wlan_ap_deauth,
11.wlan_scan_stop=drv_wlan_scan_stop,
12.wlan_get_rssi=drv_wlan_get_rssi,
13.wlan_set_powersave=drv_wlan_set_powersave,
14.wlan_get_powersave=drv_wlan_get_powersave,
15.wlan_cfg_promisc=drv_wlan_cfg_promisc,
16.wlan_cfg_filter=drv_wlan_cfg_filter,
17.wlan_cfg_mgnt_filter=drv_wlan_cfg_mgnt_filter,
18.wlan_set_channel=drv_wlan_set_channel,
19.wlan_get_channel=drv_wlan_get_channel,
20.wlan_set_country=drv_wlan_set_country,
21.wlan_get_country=drv_wlan_get_country,
22.wlan_set_mac=drv_wlan_set_mac,
23.wlan_get_mac=drv_wlan_get_mac,
24.wlan_recv=drv_wlan_recv,
25.wlan_send=drv_wlan_send,
26};
27intrt_hw_wifi_init(void)
28{
29rt_err_tret=RT_EOK;
30staticstructrt_wlan_devicewlan0;
31staticstructrt_wlan_devicewlan1;
32memset(&wifi_sta,0,sizeof(wifi_sta));
33ret=rt_wlan_dev_register(&wlan0,RT_WLAN_DEVICE_STA_NAME,&ops,0,&wifi_sta);
34wifi_sta.wlan=&wlan0;
35memset(&wifi_ap,0,sizeof(wifi_ap));
36ret|=rt_wlan_dev_register(&wlan1,RT_WLAN_DEVICE_AP_NAME,&ops,0,&wifi_ap);
37wifi_ap.wlan=&wlan1;
38returnret;
39}
40INIT_DEVICE_EXPORT(rt_hw_wifi_init);
启动设备
在 main.c 中 加入 rt_wlan_set_mode 分别设置 STATION 和 AP 模式。
1intmain(void)
2{
3rt_kprintf("Hello,RISC-V!
");
4/*setwifiworkmode*/
5rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME,RT_WLAN_STATION);
6rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME,RT_WLAN_AP);
7return0;
8}
接口实现
在 STATION 模式下,至少需要实现连接路由器 drv_wlan_join() 和断开路由器 drv_wlan_disconnect() 这 2 个函数。
在 AP 模式下,至少要实现 AP 开启 drv_wlan_softap 和 AP 关闭 drv_wlan_ap_stop() 这 2个函数。
这 4 个函数可以按照芯片 SDK 上的接口对应实现即可。
event 管理
在实现以上接口用,需要在 Wi-Fi 触发对应事件后,通过 event 通知 wlan 驱动框架。
在 STATION 模式下,当连接路由器成功后,通过 rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_CONNECT, RT_NULL) 函数通知 wlan 框架 station 已经连接路由成功。当断开路由器后,通过 rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_DISCONNECT, RT_NULL) 函数通过 wlan 框架 station 已经断开路由器。
wlan 框架在收到 RT_WLAN_DEV_EVT_CONNECT 时间后会通过 dhcp 服务获取 IP。
在 AP 模式下,开启软 AP 成功后,通过 rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_START, RT_NULL) 函数通知 wlan 框架 AP 模式开启成功。关闭软 AP 成功后,通过 rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_STOP, RT_NULL) 函数通知 wlan 框架软 AP 关闭。
wlan 框架在收到 RT_WLAN_DEV_EVT_AP_START 时间后会开启 DHCP_SERVER 服务。
采用了 RT-Thread wlan 驱动框架后,芯片 SDK 只需要负责管理 WiFi 相关的连接服务,而不需要管理 lwip 协议栈,
数据收发
上面说到 wlan 框架在收到对应的 evnet 后,负责启动 lwip 中的对应服务。
-
wlan 框架通过 drv_wlan_send() 函数将需要发送的网络数据包发输出去。针对WiFi 而言,需要通过判断设备是 station 还是 ap 后,将对应的数据包发送给 WiFi 。
1staticintdrv_wlan_send(structrt_wlan_device*wlan,void*buff,intlen)
2{
3if(wlan->user_data==&wifi_sta)
4bl_wifi_tx(0,(structpbuf*)buff);
5else
6bl_wifi_tx(1,(structpbuf*)buff);
7returnRT_EOK;
8}
-
WiFi 设备接收到数据后,通过 rt_wlan_dev_report_data() 函数,将数据传递给 wlan 框架,wlan 框架会进一步通过 lwip 做进一步处理。
1intbl_wifi_rx(uint8_tidx,structpbuf*p)
2{
3rt_err_tret=RT_EOK;
4if(idx==0)
5ret=rt_wlan_dev_report_data(wifi_sta.wlan,p,p->tot_len);
6else
7ret=rt_wlan_dev_report_data(wifi_ap.wlan,p,p->tot_len);
8returnret;
9}
其他必须实现的接口
-
mac相关
主要实现 mac 地址读取和写入。
1staticrt_err_tdrv_wlan_set_mac(structrt_wlan_device*wlan,rt_uint8_tmac[])
2{
3wifi_mgmr_sta_mac_set(mac);
4returnRT_EOK;
1staticrt_err_tdrv_wlan_get_mac(structrt_wlan_device*wlan,rt_uint8_tmac[])
2{
3wifi_mgmr_sta_mac_get(mac);
4returnRT_EOK;
5}
-
Wi-Fi scan
1staticrt_err_tdrv_wlan_scan(structrt_wlan_device*wlan,structrt_scan_info*scan_info)
2{
3intchannel_input_num=0;
4uint8_tchannel_input[MAX_FIXED_CHANNELS_LIMIT]={0};
5constchar*ssid=NULL;
6uint8_tbssid[6]={0xff,0xff,0xff,0xff,0xff,0xff};
7uint8_tscan_mode=SCAN_ACTIVE;
8uint32_tduration_scan_us=0;
9if(scan_info!=NULL&&scan_info->ssid.len>0)
10{
11ssid=scan_info->ssid.val;
12}
13if(wifi_mgmr_scan_adv(wlan,wifi_scan_complete_callback,channel_input,channel_input_num,bssid,ssid,scan_mode,duration_scan_us)!=0)
14return-RT_ERROR;
15returnRT_EOK;
16}
BL808 WiFi 属于 SOC 单芯片型无线 MCU,片上集成 WiFi 功能,移植 RT-Thread 过程中,需要使用 RT-Thread wlan 框架。
本文为RT-Threadwilliam hill官网 用户「燕十三」的原创文章,再次感谢
-
驱动
+关注
关注
12文章
1840浏览量
85287 -
WIFI
+关注
关注
81文章
5297浏览量
203679 -
RT-Thread
+关注
关注
31文章
1288浏览量
40116
原文标题:BL808 RT-Thread Wi-Fi 驱动适配
文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论