chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

簡析esp32的wifi驅(qū)動如何被集成進(jìn)Zephyr的驅(qū)動

ZephyrProject ? 來源:ZephyrProject ? 作者:ZephyrProject ? 2021-06-01 10:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

分析Zephyr ESP32 WIFI驅(qū)動的實(shí)現(xiàn)可以更為清晰的掌握esp32 wifi在zephyr上的使用,本文主要分析esp32的wifi驅(qū)動如何被集成進(jìn)Zephyr的驅(qū)動,并不涉及esp32 wifi驅(qū)動本身API的說明。

框架

目前ESP32 wifi在zephyr上的實(shí)現(xiàn)框架如下圖

93deaa3e-c240-11eb-9e57-12bb97331649.png

1. esp_private:

esp提供的wifi驅(qū)動,不開源,屬于zephyr的外部module,其API頭文件在moduleshalespressifcomponentsesp_wifiincludeesp_private內(nèi)

2. adapter

esp提供的zephyr wifi適配層,對esp_private進(jìn)行封裝專門為zephyr用,屬于zephyr的外部module,其代碼放在moduleshalespressifzephyradaptersrcwifi

3. esp_wifi_drv:

Zephyr中的esp32 wifi驅(qū)動,調(diào)用adapter,和L2 ethernet進(jìn)行對接。明明是wifi,不封裝為L2 wifi, 而封裝為L2 ethernet,這可能是目前zephyr對L2 wifi的抽象還不完備,目前只支持offload wifi。

這部分是后文的主要分析內(nèi)容,代碼在zephyrdriverswifiesp32src

4. L2 ethernet

Zephyr L2 ethernet,提供ethernet初始化/配置/收發(fā)功能, 代碼在zephyrsubsys etl2ethernet,本文不做分析

esp_wifi_drv

zephyr的esp32 wifi驅(qū)動可以分為初始化,收,發(fā)三部分來分析:

初始化

主要是完成L2的初始化,注冊入device初始化函數(shù)eth_esp32_dev_init和iface的初始化函數(shù)eth_esp32_init已經(jīng)L2的發(fā)送函數(shù)eth_esp32_send

1

2

static const struct ethernet_api eth_esp32_apis = {

.iface_api.init= eth_esp32_init,

.send = eth_esp32_send,

};

NET_DEVICE_DT_INST_DEFINE(0,

eth_esp32_dev_init, NULL,

e_data, NULL, CONFIG_ETH_INIT_PRIORITY,

e_esp32_apis, ETHERNET_L2,

NET_L2_GET_CTX_TYPE(ETHERNET_L2), NET_ETH_MTU);

使用NET_DEVICE_DT_INST_DEFINE注冊后,在系統(tǒng)啟動時(shí)kernel的POST_KERNEL階段調(diào)用eth_esp32_dev_init,在net初始化階段調(diào)用eth_esp32_init.

eth_esp32_dev_init代碼如下,主要是調(diào)用hal中提供的一系列初始化和啟動函數(shù),讓wifi啟動,值得注意的是當(dāng)CONFIG_ESP32_WIFI_STA_AUTO=y時(shí),zephyr驅(qū)動會自動去幫你用配置好的CONFIG_ESP32_WIFI_SSID和CONFIG_ESP32_WIFI_PASSWORD去連接Wifi。

如果沒有配置,就需要在應(yīng)用代碼中直接調(diào)用esp hal的API進(jìn)行連接,另外就是zephyr目前并沒有將esp32 wifi的scan/connect/disconnect做到L2 WIFI內(nèi)進(jìn)行管理,可以參考Zephyr網(wǎng)絡(luò)管理模塊分析-注冊請求機(jī)制, 這邊部分也需要在應(yīng)用中直接調(diào)用esp hal的API進(jìn)行管理。

static int eth_esp32_dev_init(const struct device *dev)

{

esp_timer_init();

esp_event_init();

wifi_init_config_t config = WIFI_INIT_CONFIG_DEFAULT();

esp_err_t ret = esp_wifi_init(&config);

ret |= esp_supplicant_init();

ret |= esp_wifi_start();

//安裝配置進(jìn)行WIFI連接

if (IS_ENABLED(CONFIG_ESP32_WIFI_STA_AUTO)) {

wifi_config_t wifi_config = {

.sta = {

.ssid = CONFIG_ESP32_WIFI_SSID,

.password = CONFIG_ESP32_WIFI_PASSWORD,

},

};

ret = esp_wifi_set_mode(WIFI_MODE_STA);

ret |= esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);

ret |= esp_wifi_connect();

}

if (ret != ESP_OK) {

LOG_ERR(“Connect failed”);

}

return ret;

}

網(wǎng)絡(luò)初始化, 完成ethernet iface注冊,并注冊數(shù)據(jù)接收callback,

static void eth_esp32_init(struct net_if *iface)

{

const struct device *dev = net_if_get_device(iface);

struct esp32_wifi_runtime *dev_data = DEV_DATA(dev);

dev_data-》iface = iface;

esp32_wifi_iface = iface;

//從ESP32讀出MAC地址,設(shè)置給zephyr的iface

/* Start interface when we are actually connected with WiFi network */

net_if_flag_set(iface, NET_IF_NO_AUTO_START);

esp_read_mac(dev_data-》mac_addr, ESP_MAC_WIFI_STA);

/* Assign link local address. */

net_if_set_link_addr(iface,

dev_data-》mac_addr, 6, NET_LINK_ETHERNET);

//進(jìn)行ethernet初始化

ethernet_init(iface);

//注冊接收數(shù)據(jù)的callback,當(dāng)hal esp32 wifi驅(qū)動收到網(wǎng)絡(luò)封包后會調(diào)用eth_esp32_rx

esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, eth_esp32_rx);

}

數(shù)據(jù)接收

前面的代碼可以看到注冊的callback是eth_esp32_rx,hal esp32 wifi驅(qū)動收到網(wǎng)絡(luò)封包后會調(diào)用eth_esp32_rx,eth_esp32_rx會將網(wǎng)絡(luò)封包直接轉(zhuǎn)發(fā)給IP層

static esp_err_t eth_esp32_rx(void *buffer, uint16_t len, void *eb)

{

struct net_pkt *pkt;

if (esp32_wifi_iface == NULL) {

LOG_ERR(“network interface unavailable”);

return ESP_FAIL;

}

//為封包分配內(nèi)存

pkt = net_pkt_rx_alloc_with_buffer(esp32_wifi_iface, len,

AF_UNSPEC, 0, K_NO_WAIT);

if (!pkt) {

LOG_ERR(“Failed to get net buffer”);

return ESP_FAIL;

}

//將封包數(shù)據(jù)從驅(qū)動搬運(yùn)到pkt內(nèi)

if (net_pkt_write(pkt, buffer, len) 《 0) {

LOG_ERR(“Failed to write pkt”);

goto pkt_unref;

}

//將封包抓發(fā)給IP層

if (net_recv_data(esp32_wifi_iface, pkt) 《 0) {

LOG_ERR(“Failed to push received data”);

goto pkt_unref;

}

//通知esp驅(qū)動封包數(shù)據(jù)已經(jīng)使用完

esp_wifi_internal_free_rx_buffer(eb);

return ESP_OK;

pkt_unref:

net_pkt_unref(pkt);

return ESP_FAIL;

}

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

數(shù)據(jù)發(fā)送的API在初始化時(shí)將eth_esp32_send注冊進(jìn)ethernet_api的send, IP層在呼叫L2的send時(shí)會找到ethernet_send進(jìn)行發(fā)送,ethernet_send調(diào)用就是eth_esp32_send

static int ethernet_send(struct net_if *iface, struct net_pkt *pkt)

{

。。。

//這里api-》send就是注冊的eth_esp32_send

ret = net_l2_send(api-》send, net_if_get_device(iface), iface, pkt);

。。。

}

static inline int net_l2_send(net_l2_send_t send_fn,

const struct device *dev,

struct net_if *iface,

struct net_pkt *pkt)

{

net_capture_pkt(iface, pkt);

return send_fn(dev, pkt);

}

static int eth_esp32_send(const struct device *dev, struct net_pkt *pkt)

{

const int pkt_len = net_pkt_get_len(pkt);

//找到frame

/* Read the packet payload */

if (net_pkt_read(pkt, DEV_DATA(dev)-》frame_buf, pkt_len) 《 0) {

return -EIO;

}

//使用hal esp32 wifi進(jìn)行發(fā)送

/* Enqueue packet for transmission */

esp_wifi_internal_tx(ESP_IF_WIFI_STA, (void *)DEV_DATA(dev)-》frame_buf, pkt_len);

LOG_DBG(“pkt sent %p len %d”, pkt, pkt_len);

return 0;

}

待確認(rèn)

Wifi的幀結(jié)構(gòu)是802.11, 其幀結(jié)構(gòu)和ethernet不一樣,現(xiàn)在直接將hal esp32 wifi和zephyr ethernet對接,應(yīng)該是esp做了相應(yīng)的轉(zhuǎn)換,具體如何,待確認(rèn)。

編輯:jq

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

    關(guān)注

    12

    文章

    1918

    瀏覽量

    86939
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1620

    瀏覽量

    64048
  • WIFI
    +關(guān)注

    關(guān)注

    81

    文章

    5406

    瀏覽量

    208344
  • ESP
    ESP
    +關(guān)注

    關(guān)注

    0

    文章

    192

    瀏覽量

    35040
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3689

    瀏覽量

    43832

原文標(biāo)題:Zephyr ESP32 wifi驅(qū)動簡析

文章出處:【微信號:ZephyrProject,微信公眾號:ZephyrProject】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    用SPI玩轉(zhuǎn)WiFi,RT-Thread ESP-Hosted驅(qū)動深度適配指南 | 技術(shù)集結(jié)

    還在為MCU的WiFi連接方案發(fā)愁?RT-Thread社區(qū)開源ESP-Hosted驅(qū)動,通過標(biāo)準(zhǔn)SPI接口即可實(shí)現(xiàn),并且該倉庫已整理成RT-Thread軟件包。RT-ThreadESP-Hosted
    的頭像 發(fā)表于 07-09 19:03 ?419次閱讀
    用SPI玩轉(zhuǎn)<b class='flag-5'>WiFi</b>,RT-Thread <b class='flag-5'>ESP</b>-Hosted<b class='flag-5'>驅(qū)動</b>深度適配指南 | 技術(shù)集結(jié)

    基于ESP32C3的智能小車設(shè)計(jì)

    你有沒有想過,從零開始親手制作一輛堅(jiān)固耐用的遙控越野車?今天,小編就帶你走進(jìn)一個(gè)融合機(jī)械、電子與物聯(lián)網(wǎng)的精彩DIY項(xiàng)目——一款由 Seeed Studio XIAO ESP32C3 強(qiáng)力驅(qū)動的 3D打印4x4 RC漫游車!
    的頭像 發(fā)表于 06-04 11:11 ?847次閱讀
    基于<b class='flag-5'>ESP32</b>C3的智能小車設(shè)計(jì)

    ESP32驅(qū)動MFRC522 RFID模塊讀寫IC卡數(shù)據(jù)

    本文將介紹ESP32開發(fā)板驅(qū)動MFRC522 RFID模塊,讀取RFID卡原始數(shù)據(jù)、獲取RFID卡的UID,并將個(gè)人數(shù)據(jù)添加到RFID卡中。
    的頭像 發(fā)表于 05-28 15:52 ?238次閱讀
    <b class='flag-5'>ESP32</b><b class='flag-5'>驅(qū)動</b>MFRC522 RFID模塊讀寫IC卡數(shù)據(jù)

    樂鑫ESP32-C5全面進(jìn)入量產(chǎn)!啟明云端樂鑫科技代理商

    樂鑫信息科技(688018.SH)宣布,ESP32-C5現(xiàn)已全面進(jìn)入量產(chǎn)。作為行業(yè)首款2.4&5GHz雙頻Wi-Fi6的RISC-VSoC,ESP32-C5同時(shí)集成Bluetooth5(LE
    的頭像 發(fā)表于 04-30 18:10 ?422次閱讀
    樂鑫<b class='flag-5'>ESP32</b>-C5全面進(jìn)入量產(chǎn)!啟明云端樂鑫科技代理商

    STM32和ESP32應(yīng)該學(xué)哪個(gè)

    等等,市場占有率也很高。 ESP32相對年輕了不少,滿打滿算也不到 10 歲,他的前身,還得從 ESP8266 說起,都屬于樂鑫科技的產(chǎn)品。 如果你用單片機(jī)做過一些物聯(lián)網(wǎng)產(chǎn)品,那多多少少應(yīng)該聽過 ESP8266,這是一個(gè)非常常見
    的頭像 發(fā)表于 02-18 09:52 ?695次閱讀

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本質(zhì)上是讓 ESP32 設(shè)備與豆包的 API 進(jìn)行通信,以獲取相關(guān)服務(wù)
    的頭像 發(fā)表于 02-05 13:40 ?1974次閱讀
    <b class='flag-5'>esp32</b>如何接入豆包

    ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術(shù)規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術(shù)規(guī)格書.pdf》資料免費(fèi)下載
    發(fā)表于 12-07 15:30 ?11次下載

    【AI技術(shù)支持】樂鑫ESP32芯片RMT控?zé)舢惓栴}處理

    問題描述在室外環(huán)境照明球泡燈上使用ESP32-D0WD-V3芯片,ESP-IDF版本為idf5.0時(shí),在使用RMT驅(qū)動三個(gè)RGB燈,這三個(gè)燈色每次都是統(tǒng)一的,但是有時(shí)會出現(xiàn)其中一個(gè)顏色異常的現(xiàn)象
    的頭像 發(fā)表于 11-23 01:00 ?843次閱讀
    【AI技術(shù)支持】樂鑫<b class='flag-5'>ESP32</b>芯片RMT控?zé)舢惓栴}處理

    【AI技術(shù)支持】ESP32-S3 JTAG調(diào)試問題處理

    啟明云端/01你是否曾遇到過?在使用ESP32-S3模塊,ESP-IDF版本為idf5.0時(shí),調(diào)試JTAG,嘗試很久也無法調(diào)通,這是為什么呢?啟明云端/02這是咋回事呢?這個(gè)過程需要安裝zadig
    的頭像 發(fā)表于 10-30 08:01 ?2245次閱讀
    【AI技術(shù)支持】<b class='flag-5'>ESP32</b>-S3 JTAG調(diào)試問題處理

    請問ESP32-WROOM-32D/32U是否支持WiFi Direct模式?

    1. ESP32-WROOM-32D/32U是否支持WiFi Direct模式? 2. 如果不支持,哪款芯片支持WiFi Direct模式,請?zhí)峁┬酒吞枴?3. 如果ESP32
    發(fā)表于 09-09 08:07

    esp32esp8266代碼共用嗎

    本文將介紹ESP32ESP8266兩款流行的微控制器在代碼共用性方面的可能性與差異性。 一、引言 隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的智能設(shè)備開始進(jìn)入我們的生活。其中,ESP32ESP
    的頭像 發(fā)表于 08-19 18:23 ?2344次閱讀

    esp8266和esp32區(qū)別是什么

    以下是關(guān)于ESP8266和ESP32的主要區(qū)別: 處理器和架構(gòu) : ESP8266 :使用一個(gè)Tensilica L106 80MHz的處理器,屬于Xtensa架構(gòu)。 ESP32 :使
    的頭像 發(fā)表于 08-19 18:16 ?7347次閱讀

    esp32用什么軟件編程

    ESP32是一款由樂鑫(Espressif)推出的低功耗、高性能的Wi-Fi和藍(lán)牙雙模微控制器,廣泛應(yīng)用于物聯(lián)網(wǎng)、智能家居、智能穿戴等領(lǐng)域。要對ESP32進(jìn)行編程,需要選擇合適的編程軟件和開發(fā)環(huán)境
    的頭像 發(fā)表于 08-19 17:24 ?6989次閱讀

    請問ESP32-S3-LCD-EV-Board的驅(qū)動在哪里安裝呢?

    請問ESP32-S3-LCD-EV-Board的驅(qū)動在哪里安裝呢?直接用USB連接到電腦上識別不到端口信息。
    發(fā)表于 07-22 07:05

    自己設(shè)計(jì)的ESP32S3電路,WiFi一直連不上,為什么?

    自己設(shè)計(jì)的ESP32S3電路,WiFi一直連不上。 附件中有ESP32S3電路圖,其中WiFi天線用的是CrossAir公司的CA-C03這款陶瓷天線,工作頻率范圍為2450MHz±
    發(fā)表于 07-19 07:51