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

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

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

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

冬至子 ? 來源:燕十三 ? 作者:燕十三 ? 2023-12-04 11:38 ? 次閱讀

BL808 WiFi 屬于 SOC 單芯片型無線 MCU,片上集成 WiFi 功能,移植 RT-Thread 過程中,需要使用 RT-Thread wlan 框架。

RT-Thread wlan 框架是用于管理 Wi-Fi 驅(qū)動設(shè)備的框架,對下連接具體的 Wi-Fi 驅(qū)動,控制 Wi-Fi 的連接斷開、掃描等操作,對上為應(yīng)用提供統(tǒng)一的 Wi-Fi 控制接口。

wlan 框架主要有 3 部分組成:

dev 驅(qū)動接口層:為 wlan 框架提供統(tǒng)一的接口調(diào)用。

manage 管理層:為用戶提供 Wi-Fi 掃描,鏈接,斷線重連等功能。

protocol 協(xié)議:負(fù)責(zé)處理 Wi-Fi 產(chǎn)生的數(shù)據(jù)流,如 lwip。

使用了 wlan 驅(qū)動框架之后,Wi-Fi 驅(qū)動只需要關(guān)注 Wi-Fi 的連接、斷開、掃描等動作,并通過 event 將相關(guān)動作告知 wlan 框架,由 wlan 框架根據(jù)收到的 event 管理 lwip。

1、使能 wlan 驅(qū)動

Linux 下 執(zhí)行如下命令,并開啟 wlan 驅(qū)動。

$ scons --menuconfig
RT-Thread Components --->
Device Drivers --->
[*] Using Wi-Fi framework --->

開啟 wlan 驅(qū)動后,默認(rèn)會選中 lwip。

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

Network --->

  • - LwIP: light weight TCP/IP stack --->
    [
    ] Not use Rx thread
    [*] Not use Tx thread

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

初始化

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

static const struct rt_wlan_dev_ops ops =
{
.wlan_init = drv_wlan_init,
.wlan_mode = drv_wlan_mode,
.wlan_scan = drv_wlan_scan,
.wlan_join = drv_wlan_join,
.wlan_softap = drv_wlan_softap,
.wlan_disconnect = drv_wlan_disconnect,
.wlan_ap_stop = drv_wlan_ap_stop,
.wlan_ap_deauth = drv_wlan_ap_deauth,
.wlan_scan_stop = drv_wlan_scan_stop,
.wlan_get_rssi = drv_wlan_get_rssi,
.wlan_set_powersave = drv_wlan_set_powersave,
.wlan_get_powersave = drv_wlan_get_powersave,
.wlan_cfg_promisc = drv_wlan_cfg_promisc,
.wlan_cfg_filter = drv_wlan_cfg_filter,
.wlan_cfg_mgnt_filter = drv_wlan_cfg_mgnt_filter,
.wlan_set_channel = drv_wlan_set_channel,
.wlan_get_channel = drv_wlan_get_channel,
.wlan_set_country = drv_wlan_set_country,
.wlan_get_country = drv_wlan_get_country,
.wlan_set_mac = drv_wlan_set_mac,
.wlan_get_mac = drv_wlan_get_mac,
.wlan_recv = drv_wlan_recv,
.wlan_send = drv_wlan_send,
};
int rt_hw_wifi_init(void)
{
rt_err_t ret = RT_EOK;
static struct rt_wlan_device wlan0;
static struct rt_wlan_device wlan1;
memset(&wifi_sta, 0, sizeof(wifi_sta));
ret = rt_wlan_dev_register(&wlan0, RT_WLAN_DEVICE_STA_NAME, &ops, 0, &wifi_sta);
wifi_sta.wlan = &wlan0;
memset(&wifi_ap, 0, sizeof(wifi_ap));
ret |= rt_wlan_dev_register(&wlan1, RT_WLAN_DEVICE_AP_NAME, &ops, 0, &wifi_ap);
wifi_ap.wlan = &wlan1;
return ret;
}
INIT_DEVICE_EXPORT(rt_hw_wifi_init);

啟動設(shè)備

在 main.c 中 加入 rt_wlan_set_mode 分別設(shè)置 STATION 和 AP 模式。

int main(void)
{
rt_kprintf("Hello, RISC-V!n");
/* set wifi work mode */
rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);
return 0;
}

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

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

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

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

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

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

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

在 AP 模式下,開啟軟 AP 成功后,通過 rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, RT_WLAN_DEV_EVT_AP_START, RT_NULL) 函數(shù)通知 wlan 框架 AP 模式開啟成功。關(guān)閉軟 AP 成功后,通過 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 時間后會開啟 DHCP_SERVER 服務(wù)。

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

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

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

wlan 框架通過 drv_wlan_send() 函數(shù)將需要發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包發(fā)輸出去。針對WiFi 而言,需要通過判斷設(shè)備是 station 還是 ap 后,將對應(yīng)的數(shù)據(jù)包發(fā)送給 WiFi 。

static int drv_wlan_send(struct rt_wlan_device *wlan, void *buff, int len)
{
if (wlan->user_data == &wifi_sta)
bl_wifi_tx(0, (struct pbuf *)buff);
else
bl_wifi_tx(1, (struct pbuf *)buff);
return RT_EOK;
}

WiFi 設(shè)備接收到數(shù)據(jù)后,通過 rt_wlan_dev_report_data() 函數(shù),將數(shù)據(jù)傳遞給 wlan 框架,wlan 框架會進(jìn)一步通過 lwip 做進(jìn)一步處理。

int bl_wifi_rx(uint8_t idx, struct pbuf *p)
{
rt_err_t ret = RT_EOK;
if (idx == 0)
ret = rt_wlan_dev_report_data(wifi_sta.wlan, p, p->tot_len);
else
ret = rt_wlan_dev_report_data(wifi_ap.wlan, p, p->tot_len);
return ret;
}

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

mac相關(guān)

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

static rt_err_t drv_wlan_set_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
{
wifi_mgmr_sta_mac_set(mac);
return RT_EOK;
}
static rt_err_t drv_wlan_get_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
{
wifi_mgmr_sta_mac_get(mac);
return RT_EOK;
}
Wi-Fi scan

static rt_err_t drv_wlan_scan(struct rt_wlan_device *wlan, struct rt_scan_info *scan_info)
{
int channel_input_num = 0;
uint8_t channel_input[MAX_FIXED_CHANNELS_LIMIT] = {0};
const char *ssid = NULL;
uint8_t bssid[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
uint8_t scan_mode = SCAN_ACTIVE;
uint32_t duration_scan_us = 0;
if (scan_info != NULL && scan_info->ssid.len > 0)
{
ssid = scan_info->ssid.val;
}
if (wifi_mgmr_scan_adv(wlan, wifi_scan_complete_callback, channel_input, channel_input_num, bssid, ssid, scan_mode, duration_scan_us) != 0)
return -RT_ERROR;
return RT_EOK;

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

    關(guān)注

    2

    文章

    657

    瀏覽量

    73098
  • 驅(qū)動器
    +關(guān)注

    關(guān)注

    52

    文章

    8236

    瀏覽量

    146355
  • SoC芯片
    +關(guān)注

    關(guān)注

    1

    文章

    612

    瀏覽量

    34921
  • LwIP協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

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

    關(guān)注

    31

    文章

    1289

    瀏覽量

    40122
收藏 人收藏

    評論

    相關(guān)推薦

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

    BL808 WiFi 屬于 SOC 單芯片型無線 MCU,片上集成 WiFi 功能,移植 RT-Thread 過程中,需要使用 RT-Thread wlan 框架。 RT-Thread
    的頭像 發(fā)表于 12-02 11:06 ?1470次閱讀
    <b class='flag-5'>BL808</b> <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Wi-Fi</b> <b class='flag-5'>驅(qū)動</b><b class='flag-5'>適配</b>

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驅(qū)動,但是它是 LVGL 和 rt-thread 的接口。LVGL 在 rt-thread 上運(yùn)行的基石。
    發(fā)表于 07-08 09:37 ?1489次閱讀

    RT-Thread ssd1306驅(qū)動

    RT-Thread 驅(qū)動ssd1306
    的頭像 發(fā)表于 04-21 10:08 ?26.5w次閱讀
    <b class='flag-5'>RT-Thread</b> ssd1306<b class='flag-5'>驅(qū)動</b>

    DT-BL10 Wi-Fi和BLE共存模塊是什么

    DT-BL10 Wi-Fi和BLE共存模塊是高度集成的單芯片低功耗802.11n無線局域網(wǎng)(WLAN)網(wǎng)絡(luò)控制器。它在單個芯片中集成了RISC CPU,WLAN MAC,支持lT1R的WLAN基帶
    發(fā)表于 02-10 07:57

    記錄BL808 BSP添加GPIO驅(qū)動時踩到的一些坑及解決方案

    該文主要記錄為 BL808 BSP 添加 GPIO 驅(qū)動時踩到的一些坑及解決方案。這是我第一次對接 RT-Thread BSP 的驅(qū)動,整理出本文避免之后踩到同樣的坑,也希望能幫助到和
    發(fā)表于 02-03 14:36

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實(shí)時操作系統(tǒng),本文是RT-Thread實(shí)時操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread Studio驅(qū)動SD卡

    RT-Thread Studio驅(qū)動SD卡前言一、創(chuàng)建基本工程1、創(chuàng)建Bootloader2、創(chuàng)建項(xiàng)目工程二、配置RT-Thread Settings三、代碼分析1.引入庫2.讀入數(shù)據(jù)四、效果驗(yàn)證
    發(fā)表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>驅(qū)動</b>SD卡

    RT-Thread開源作品秀】基于RT-Thread的星務(wù)平臺研究

    本作品為了驗(yàn)證星務(wù)軟件在RT-Thread系統(tǒng)運(yùn)行的可行性,底層是否能夠驅(qū)動星務(wù)軟件,同時擴(kuò)展RT-Thread應(yīng)用范圍。ART-Pi作為衛(wèi)星下位機(jī),...
    發(fā)表于 01-25 18:26 ?6次下載
    【<b class='flag-5'>RT-Thread</b>開源作品秀】基于<b class='flag-5'>RT-Thread</b>的星務(wù)平臺研究

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡介 作為一名 RTOS 的初學(xué)者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?4556次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發(fā)表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?3963次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

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

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

    RT-Thread Wi-Fi Host Driver (WHD)

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