0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

BL808 RT-Thread Wi-Fi 驱动适配

RTThread物联网操作系统 来源:RT-Thread论坛「燕十三」 作者:RT-Thread论坛「燕十 2023-12-02 11:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

BL808 WiFi 属于 SOC 单芯片型无线 MCU,片上集成 WiFi 功能,移植 RT-Thread 过程中,需要使用 RT-Thread wlan 框架。RT-Thread wlan 框架是用于管理 Wi-Fi 驱动设备的框架,对下连接具体的 Wi-Fi 驱动,控制 Wi-Fi 的连接断开、扫描等操作,对上为应用提供统一的 Wi-Fi 控制接口wlan 框架主要有 3 部分组成:
  • dev 驱动接口层:为 wlan 框架提供统一的接口调用。
  • manage 管理层:为用户提供 Wi-Fi 扫描,链接,断线重连等功能。
  • protocol 协议:负责处理 Wi-Fi 产生的数据流,如 lwip。
使用了 wlan 驱动框架之后,Wi-Fi 驱动只需要关注 Wi-Fi 的连接、断开、扫描等动作,并通过 event 将相关动作告知 wlan 框架,由 wlan 框架根据收到的 event 管理 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-Thread论坛用户「燕十三」的原创文章,再次感谢


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1991

    浏览量

    88705
  • WIFI
    +关注

    关注

    82

    文章

    5532

    浏览量

    214441
  • RT-Thread
    +关注

    关注

    32

    文章

    1640

    浏览量

    45210

原文标题:BL808 RT-Thread Wi-Fi 驱动适配

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread 中设备树的适配方法 | 技术集结

    本文基于RT-Thread现有的DM(设备模型)框架,以Rock2F开发板为例,系统梳理了RK3528SoC的快速移植流程,涵盖了CLK、Pinctrl、ADC、NVMEM、Thermal、RNG等
    的头像 发表于 04-04 18:05 3147次阅读
    <b class='flag-5'>RT-Thread</b> 中设备树的<b class='flag-5'>适配</b>方法 | 技术集结

    RT-Thread新开发工具支持:e2studio手把手适配教程 | 技术集结

    Titan-RA8P1的芯片是Renensas的RA8P1系列芯片,瑞萨官方使用的IDE是e2studio。本文介绍如何在e2studio中创建工程并结合RT-Thread的源码,在e2studio
    的头像 发表于 04-02 18:06 3548次阅读
    <b class='flag-5'>RT-Thread</b>新开发工具支持:e2studio手把手<b class='flag-5'>适配</b>教程 | 技术集结

    技术资讯 I Wi-Fi 模块设计

    本文要点Wi-Fi模块设计旨在打造一套紧凑且高效的硬件和软件解决方案,使设备能够通过Wi-Fi网络实现通信。Wi-Fi模块设计是一个复杂的过程,要求研发人员兼具硬件与软件工程方面的专业知识
    的头像 发表于 02-27 17:12 883次阅读
    技术资讯 I <b class='flag-5'>Wi-Fi</b> 模块设计

    恩智浦亮相RT-Thread 20周年开发者大会

    日前,“开源向实·生产力进化启示录”全球峰会暨RT-Thread 20周年开发者大会在上海成功举办,恩智浦作为RT-Thread的紧密合作伙伴,在活动中重磅亮相,展示双方在共建RT-Thread OS开发生态方面的新成果、新方案
    的头像 发表于 01-26 09:07 752次阅读

    Wi-Fi:无线连接的全球通用语

    一、什么是Wi-FiWi-FiWi-Fi联盟制造商的商标认证,是基于IEEE 802.11标准的无线局域网技术。它允许电子设备在特定范围内无线接入网络,实现高速数据交换与互联网访问,已成为
    发表于 01-07 09:49

    基于RT-Thread的简单物联网温控箱 | 技术集结

    目录项目概述RT-Thread使用情况概述硬件框架软件框架说明演示效果改进方向代码地址1项目概述本项目是一个简易的、较高精度的、易于扩展的桌面级温控系统。实现对箱内温度的精确控制,并通过Wi-Fi
    的头像 发表于 12-26 18:18 7441次阅读
    基于<b class='flag-5'>RT-Thread</b>的简单物联网温控箱 | 技术集结

    【WiFi+蓝牙模组】高性能 Wi-Fi +蓝牙模组的国产替代方案

    模组,基于 BL618 和 BL616 芯片,支持 Wi-Fi 6 (802.11ax) + BLE 5.3 + Thread 协议,高带宽、低延迟、低功耗。 Ai-M61系列   基
    的头像 发表于 11-26 17:44 694次阅读
    【WiFi+蓝牙模组】高性能 <b class='flag-5'>Wi-Fi</b> +蓝牙模组的国产替代方案

    使用RT-Thread studio 开发RT-Thread Nano项目的时候 串口的驱动是要自己写吗?

    刚入坑。使用RT-Thread studio 开发RT-Thread 标准板项目的时候直接使用里边的串口uart_dev=rt_device_find(“uart5”);然后操作设备,在开发R
    发表于 09-26 08:14

    浅谈Wi-Fi 6E与Wi-Fi 7的关键器件——BAW滤波器新技术

    作者: Qorvo 亚太区无线连接事业部高级行销经理林健富   2020年1月,Wi-Fi联盟正式宣布开放6GHz频段(5925MHz-7125MHz),并将其命名为Wi-Fi 6E。2020年4月
    发表于 09-19 18:29 2475次阅读
    浅谈<b class='flag-5'>Wi-Fi</b> 6E与<b class='flag-5'>Wi-Fi</b> 7的关键器件——BAW滤波器新技术

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 1280次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread Nano硬核移植指南:手把手实现VGLite图形驱动适配 | 技术集结

    VGLite是NXP提供的轻量级2D图形API,本文将手把手带你实现VGLite图形驱动适配RT-Thread。文章分为上、下两篇,将手把手教您移植。上篇对RT-ThreadNano内
    的头像 发表于 07-17 14:40 3629次阅读
    <b class='flag-5'>RT-Thread</b> Nano硬核移植指南:手把手实现VGLite图形<b class='flag-5'>驱动</b><b class='flag-5'>适配</b> | 技术集结

    用SPI玩转WiFi,RT-Thread ESP-Hosted驱动深度适配指南 | 技术集结

    还在为MCU的WiFi连接方案发愁?RT-Thread社区开源ESP-Hosted驱动,通过标准SPI接口即可实现,并且该仓库已整理成RT-Thread软件包。RT
    的头像 发表于 07-09 19:03 1899次阅读
    用SPI玩转WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted<b class='flag-5'>驱动</b>深度<b class='flag-5'>适配</b>指南 | 技术集结

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2826次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    玄铁加入RT-Thread 高级会员合作伙伴 | 战略新篇

    。深化合作,共建RISC-V生态RT-Thread作为国内领先的嵌入式操作系统,与玄铁团队在技术适配、生态共建方面已建立长期紧密的合作关系。目前,RT-Thread
    的头像 发表于 06-23 20:22 1346次阅读
    玄铁加入<b class='flag-5'>RT-Thread</b> 高级会员合作伙伴 | 战略新篇

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1434次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进