- 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 框架。
-
驅動
+關注
關注
12文章
1852瀏覽量
85685 -
WIFI
+關注
關注
81文章
5310瀏覽量
204935 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40419
原文標題:BL808 RT-Thread Wi-Fi 驅動適配
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
從Wi-Fi 4到Wi-Fi 7:網速飆升40倍的無線革命
![從<b class='flag-5'>Wi-Fi</b> 4到<b class='flag-5'>Wi-Fi</b> 7:網速飆升40倍的無線革命](https://file1.elecfans.com/web3/M00/01/8E/wKgZO2dWUgCAQStIAAAs-eJkIc8590.png)
RT-Thread上CAN實踐
![<b class='flag-5'>RT-Thread</b>上CAN實踐](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
2024 RT-Thread全球巡回 線下培訓火熱來襲!
![2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
【好書推薦】RT-Thread設備驅動開發指南
![【好書推薦】<b class='flag-5'>RT-Thread</b>設備<b class='flag-5'>驅動</b>開發指南](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread Wi-Fi Host Driver (WHD)
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>Wi-Fi</b> Host Driver (WHD)](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!
![6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式
![4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C6/D0/wKgaomYDlJyAKUBmAAAgR-TqYwc187.png)
4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
恩智浦半導體正式加入RT-Thread全球合作伙伴計劃!
![恩智浦半導體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!](https://file1.elecfans.com/web2/M00/C5/31/wKgaomXyY_eAHGhqAAAkpBZI8PE901.png)
RT-Thread驅動開發指南進階篇-動手驅動先楫未適配的外設LCD
![<b class='flag-5'>RT-Thread</b><b class='flag-5'>驅動</b>開發指南進階篇-動手<b class='flag-5'>驅動</b>先楫未<b class='flag-5'>適配</b>的外設LCD](https://file1.elecfans.com/web2/M00/C1/D4/wKgaomXarr-AKhdfAAAcu6ZeWvU306.png)
《RT-Thread設備驅動開發指南》基礎篇--以先楫bsp的hwtimer設備為例
![《<b class='flag-5'>RT-Thread</b>設備<b class='flag-5'>驅動</b>開發指南》基礎篇--以先楫bsp的hwtimer設備為例](https://file.elecfans.com/web2/M00/37/D7/pYYBAGI9l9uAOwALAAAmFmqVYdg094.png)
RT-Thread設備驅動開發指南基礎篇—以先楫bsp的hwtimer設備為例
![<b class='flag-5'>RT-Thread</b>設備<b class='flag-5'>驅動</b>開發指南基礎篇—以先楫bsp的hwtimer設備為例](https://file1.elecfans.com/web2/M00/C1/40/wKgaomXUXOGAMhesAAAk3OUcwHA076.png)
評論