0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

BL808 RT-Thread Wi-Fi 驅(qū)動(dòng)適配

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:RT-Thread論壇「燕十三」 ? 作者:RT-Thread論壇「燕十 ? 2023-12-02 11:06 ? 次閱讀
BL808 WiFi 屬于 SOC 單芯片型無(wú)線 MCU,片上集成 WiFi 功能,移植 RT-Thread 過(guò)程中,需要使用 RT-Thread wlan 框架。RT-Thread wlan 框架是用于管理 Wi-Fi 驅(qū)動(dòng)設(shè)備的框架,對(duì)下連接具體的 Wi-Fi 驅(qū)動(dòng),控制 Wi-Fi 的連接斷開(kāi)、掃描等操作,對(duì)上為應(yīng)用提供統(tǒng)一的 Wi-Fi 控制接口wlan 框架主要有 3 部分組成:
  • dev 驅(qū)動(dòng)接口層:為 wlan 框架提供統(tǒng)一的接口調(diào)用。
  • manage 管理層:為用戶提供 Wi-Fi 掃描,鏈接,斷線重連等功能。
  • protocol 協(xié)議:負(fù)責(zé)處理 Wi-Fi 產(chǎn)生的數(shù)據(jù)流,如 lwip。
使用了 wlan 驅(qū)動(dòng)框架之后,Wi-Fi 驅(qū)動(dòng)只需要關(guān)注 Wi-Fi 的連接、斷開(kāi)、掃描等動(dòng)作,并通過(guò) event 將相關(guān)動(dòng)作告知 wlan 框架,由 wlan 框架根據(jù)收到的 event 管理 lwip。

1、使能 wlan 驅(qū)動(dòng)

Linux 下 執(zhí)行如下命令,并開(kāi)啟 wlan 驅(qū)動(dòng)。

1$scons--menuconfig
2RT-ThreadComponents--->
3DeviceDrivers--->
4[*]UsingWi-Fiframework--->

開(kāi)啟 wlan 驅(qū)動(dòng)后,默認(rèn)會(huì)選中 lwip。

如 WiFi SOC 類芯片,原廠 SDK 中已經(jīng)有線程管理 WiFi 數(shù)據(jù)收發(fā),可關(guān)閉 lwip 中的 Rx thread 和 Tx thread,以節(jié)省系統(tǒng)資源。

1Network--->
2-*-LwIP:lightweightTCP/IPstack--->
3[*]NotuseRxthread
4[*]NotuseTxthread

2、wlan 驅(qū)動(dòng)框架適配

初始化

通過(guò) rt_wlan_dev_register() 注冊(cè) STATION 和 AP 設(shè)備,并將 wlan 設(shè)備接口函數(shù)注冊(cè)進(jìn)對(duì)應(yīng)設(shè)備。

 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);

啟動(dòng)設(shè)備

在 main.c 中 加入 rt_wlan_set_mode 分別設(shè)置 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}

接口實(shí)現(xiàn)

在 STATION 模式下,至少需要實(shí)現(xiàn)連接路由器 drv_wlan_join() 和斷開(kāi)路由器 drv_wlan_disconnect() 這 2 個(gè)函數(shù)。

在 AP 模式下,至少要實(shí)現(xiàn) AP 開(kāi)啟 drv_wlan_softap 和 AP 關(guān)閉 drv_wlan_ap_stop() 這 2個(gè)函數(shù)。

這 4 個(gè)函數(shù)可以按照芯片 SDK 上的接口對(duì)應(yīng)實(shí)現(xiàn)即可。

event 管理

在實(shí)現(xiàn)以上接口用,需要在 Wi-Fi 觸發(fā)對(duì)應(yīng)事件后,通過(guò) event 通知 wlan 驅(qū)動(dòng)框架。

在 STATION 模式下,當(dāng)連接路由器成功后,通過(guò) rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_CONNECT, RT_NULL) 函數(shù)通知 wlan 框架 station 已經(jīng)連接路由成功。當(dāng)斷開(kāi)路由器后,通過(guò) rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_DISCONNECT, RT_NULL) 函數(shù)通過(guò) wlan 框架 station 已經(jīng)斷開(kāi)路由器。

wlan 框架在收到 RT_WLAN_DEV_EVT_CONNECT 時(shí)間后會(huì)通過(guò) dhcp 服務(wù)獲取 IP。

在 AP 模式下,開(kāi)啟軟 AP 成功后,通過(guò) rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_START, RT_NULL) 函數(shù)通知 wlan 框架 AP 模式開(kāi)啟成功。關(guān)閉軟 AP 成功后,通過(guò) rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_STOP, RT_NULL) 函數(shù)通知 wlan 框架軟 AP 關(guān)閉。

wlan 框架在收到 RT_WLAN_DEV_EVT_AP_START 時(shí)間后會(huì)開(kāi)啟 DHCP_SERVER 服務(wù)。

采用了 RT-Thread wlan 驅(qū)動(dòng)框架后,芯片 SDK 只需要負(fù)責(zé)管理 WiFi 相關(guān)的連接服務(wù),而不需要管理 lwip 協(xié)議棧,

數(shù)據(jù)收發(fā)

上面說(shuō)到 wlan 框架在收到對(duì)應(yīng)的 evnet 后,負(fù)責(zé)啟動(dòng) lwip 中的對(duì)應(yīng)服務(wù)。

  • wlan 框架通過(guò) drv_wlan_send() 函數(shù)將需要發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包發(fā)輸出去。針對(duì)WiFi 而言,需要通過(guò)判斷設(shè)備是 station 還是 ap 后,將對(duì)應(yīng)的數(shù)據(jù)包發(fā)送給 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 設(shè)備接收到數(shù)據(jù)后,通過(guò) rt_wlan_dev_report_data() 函數(shù),將數(shù)據(jù)傳遞給 wlan 框架,wlan 框架會(huì)進(jìn)一步通過(guò) lwip 做進(jìn)一步處理。

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}

其他必須實(shí)現(xiàn)的接口

  • mac相關(guān)

主要實(shí)現(xiàn) mac 地址讀取和寫(xiě)入。

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 單芯片型無(wú)線 MCU,片上集成 WiFi 功能,移植 RT-Thread 過(guò)程中,需要使用 RT-Thread wlan 框架。

本文為RT-Thread論壇用戶「燕十三」的原創(chuàng)文章,再次感謝


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1788

    瀏覽量

    84895
  • WIFI
    +關(guān)注

    關(guān)注

    81

    文章

    5256

    瀏覽量

    201688
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1239

    瀏覽量

    39425

原文標(biāo)題:BL808 RT-Thread Wi-Fi 驅(qū)動(dòng)適配

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【好書(shū)推薦】RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南

    近年來(lái)國(guó)內(nèi)芯片產(chǎn)業(yè)和物聯(lián)網(wǎng)產(chǎn)業(yè)的快速崛起,行業(yè)發(fā)展迫切需要更多人才,尤其需要掌握嵌入式操作系統(tǒng)等底層技術(shù)的人才。隨著RT-Thread被更廣泛地應(yīng)用于行業(yè)中,開(kāi)發(fā)者對(duì)嵌入式驅(qū)動(dòng)開(kāi)發(fā)的需求越來(lái)越
    的頭像 發(fā)表于 08-01 08:35 ?290次閱讀
    【好書(shū)推薦】<b class='flag-5'>RT-Thread</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)指南

    RT-Thread Wi-Fi Host Driver (WHD)

    概述WHD是一個(gè)獨(dú)立的嵌入式Wi-Fi主機(jī)驅(qū)動(dòng)程序,它提供了一組與英飛凌WLAN芯片交互的api。WHD是一個(gè)獨(dú)立的固件產(chǎn)品,可以很容易地移植到任何嵌入式軟件環(huán)境,包括流行的物聯(lián)網(wǎng)框架。因此,WHD包含了RTOS和TCP/IP網(wǎng)絡(luò)抽象層的鉤
    的頭像 發(fā)表于 07-02 08:35 ?230次閱讀
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Wi-Fi</b> Host Driver (WHD)

    6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 05-28 08:35 ?311次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread驅(qū)動(dòng)開(kāi)發(fā)指南進(jìn)階篇-動(dòng)手驅(qū)動(dòng)先楫未適配的外設(shè)LCD

    經(jīng)過(guò)上一篇的《《RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer設(shè)備為例》闡述,可以大致了解到RT-thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的方法步驟,開(kāi)發(fā)指南中的進(jìn)階篇外設(shè)
    的頭像 發(fā)表于 02-25 11:04 ?1855次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)指南進(jìn)階篇-動(dòng)手<b class='flag-5'>驅(qū)動(dòng)</b>先楫未<b class='flag-5'>適配</b>的外設(shè)LCD

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer設(shè)備為例

    一、概述(一)RT-Thread設(shè)備驅(qū)動(dòng)RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是RT-thread官方出品撰寫(xiě),系統(tǒng)講解
    的頭像 發(fā)表于 02-24 08:16 ?945次閱讀
    《<b class='flag-5'>RT-Thread</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer設(shè)備為例

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南基礎(chǔ)篇—以先楫bsp的hwtimer設(shè)備為例

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是RT-thread官方出品撰寫(xiě),系統(tǒng)講解RT-thread IO設(shè)備驅(qū)動(dòng)開(kāi)發(fā)方法,從三方面進(jìn)行講解
    的頭像 發(fā)表于 02-20 16:01 ?1403次閱讀
    <b class='flag-5'>RT-Thread</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)指南基礎(chǔ)篇—以先楫bsp的hwtimer設(shè)備為例

    Wi-Fi HaLow和傳統(tǒng)Wi-Fi的區(qū)別

    Wi-Fi HaLow和傳統(tǒng)Wi-Fi的區(qū)別? Wi-Fi是一種無(wú)線網(wǎng)絡(luò)技術(shù),可以連接到互聯(lián)網(wǎng)或局域網(wǎng),為用戶提供無(wú)線上網(wǎng)的便利。隨著科技的發(fā)展和互聯(lián)網(wǎng)的普及,Wi-Fi也在不斷演進(jìn)和
    的頭像 發(fā)表于 02-02 15:28 ?802次閱讀

    Wi-Fi 6和Wi-Fi 5之間有哪些區(qū)別呢?

    Wi-Fi 6和Wi-Fi 5之間有哪些區(qū)別呢? Wi-Fi 6和Wi-Fi 5是無(wú)線局域網(wǎng)標(biāo)準(zhǔn)的兩個(gè)版本,它們之間存在很多區(qū)別。Wi-Fi
    的頭像 發(fā)表于 12-09 16:09 ?1801次閱讀

    BL808 RT-Thread Wi-Fi驅(qū)動(dòng)適配

    BL808 WiFi 屬于 SOC 單芯片型無(wú)線 MCU,片上集成 WiFi 功能,移植 RT-Thread 過(guò)程中,需要使用 RT-Thread wlan 框架。
    的頭像 發(fā)表于 12-04 11:38 ?664次閱讀

    Pico W基于C/C++ SDK適配RT-Thread Wi-Fi經(jīng)驗(yàn)總結(jié)

    Pico W 作為 Raspberry Pi Pico 的衍生版本,主要增加了無(wú)線通信的功能,通過(guò)搭載 CYW43439 無(wú)線芯片,支持 2.4 GHz Wi-Fi 4 及藍(lán)牙5.0 ,其余和 Raspberry Pi Pico 基本相同,外部引腳也相互兼容。
    的頭像 發(fā)表于 11-28 17:15 ?1549次閱讀
    Pico W基于C/C++ SDK<b class='flag-5'>適配</b><b class='flag-5'>RT-Thread</b> <b class='flag-5'>Wi-Fi</b>經(jīng)驗(yàn)總結(jié)

    基于rt-thread的socket通信設(shè)計(jì)

    最近再研究 rt-thread 的通信 ,想設(shè)計(jì)出 eps8266(多個(gè)) rt-thread(作為中控) 服務(wù)器的通信框架,使用的開(kāi)發(fā)板是 潘多拉
    的頭像 發(fā)表于 10-13 15:02 ?1059次閱讀
    基于<b class='flag-5'>rt-thread</b>的socket通信設(shè)計(jì)

    記錄為BL808添加GPIO驅(qū)動(dòng)

    該文主要記錄為 BL808 BSP 添加 GPIO 驅(qū)動(dòng)時(shí)踩到的一些坑及解決方案。這是我第一次對(duì)接 RT-Thread BSP 的驅(qū)動(dòng),整理出本文避免之后踩到同樣的坑,也希望能幫助到和
    的頭像 發(fā)表于 10-13 11:18 ?498次閱讀

    試用RT-Thread Studio(VSCode)

    想嘗試RT-Thread studio (VSCode),先下載安裝VSCode,再搜索RT-Thread
    的頭像 發(fā)表于 10-12 10:58 ?876次閱讀
    試用<b class='flag-5'>RT-Thread</b> Studio(VSCode)

    RT-Thread v5.0.2 發(fā)布

    RT-Thread 代碼倉(cāng)庫(kù)地址: ●? https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本發(fā)布日志詳情: ●? htt
    的頭像 發(fā)表于 10-10 18:45 ?1202次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布

    RT-Thread Studio上配置rtthread CANFD驅(qū)動(dòng)來(lái)控制M3508電機(jī)

    本文旨在RT-Thread Studio上配置rtthread CANFD驅(qū)動(dòng)來(lái)控制M3508電機(jī),不涉及任何原理 開(kāi)發(fā)環(huán)境:RT-Thread Studio v2.2.6
    發(fā)表于 10-08 11:44 ?1071次閱讀
    在<b class='flag-5'>RT-Thread</b> Studio上配置rtthread CANFD<b class='flag-5'>驅(qū)動(dòng)</b>來(lái)控制M3508電機(jī)