日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡析esp32的wifi驅動如何被集成進Zephyr的驅動

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

掃碼添加小助手

加入工程師交流群

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

框架

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

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

1. esp_private:

esp提供的wifi驅動,不開源,屬于zephyr的外部module,其API頭文件在moduleshalespressifcomponentsesp_wifiincludeesp_private內

2. adapter

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

3. esp_wifi_drv:

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

這部分是后文的主要分析內容,代碼在zephyrdriverswifiesp32src

4. L2 ethernet

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

esp_wifi_drv

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

初始化

主要是完成L2的初始化,注冊入device初始化函數(shù)eth_esp32_dev_init和iface的初始化函數(shù)eth_esp32_init已經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)啟動時kernel的POST_KERNEL階段調用eth_esp32_dev_init,在net初始化階段調用eth_esp32_init.

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

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

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

//安裝配置進行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;

}

網絡初始化, 完成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地址,設置給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);

//進行ethernet初始化

ethernet_init(iface);

//注冊接收數(shù)據(jù)的callback,當hal esp32 wifi驅動收到網絡封包后會調用eth_esp32_rx

esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, eth_esp32_rx);

}

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

前面的代碼可以看到注冊的callback是eth_esp32_rx,hal esp32 wifi驅動收到網絡封包后會調用eth_esp32_rx,eth_esp32_rx會將網絡封包直接轉發(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;

}

//為封包分配內存

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ù)從驅動搬運到pkt內

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驅動封包數(shù)據(jù)已經使用完

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在初始化時將eth_esp32_send注冊進ethernet_api的send, IP層在呼叫L2的send時會找到ethernet_send進行發(fā)送,ethernet_send調用就是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進行發(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;

}

待確認

Wifi的幀結構是802.11, 其幀結構和ethernet不一樣,現(xiàn)在直接將hal esp32 wifi和zephyr ethernet對接,應該是esp做了相應的轉換,具體如何,待確認。

編輯:jq

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

    關注

    12

    文章

    1994

    瀏覽量

    88733
  • API
    API
    +關注

    關注

    2

    文章

    2481

    瀏覽量

    67063
  • WIFI
    +關注

    關注

    82

    文章

    5533

    瀏覽量

    214520
  • ESP
    ESP
    +關注

    關注

    0

    文章

    198

    瀏覽量

    36745
  • 開源
    +關注

    關注

    3

    文章

    4368

    瀏覽量

    46467

原文標題:Zephyr ESP32 wifi驅動簡析

文章出處:【微信號:ZephyrProject,微信公眾號:ZephyrProject】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    樂鑫科技新品ESP32-H4亮點速遞!

    的技術潛力。產品主要規(guī)格產品特性與適用場景1超低功耗ESP32-H4內部集成的DC-DC模塊可高效管理電源,降低系統(tǒng)功耗,延長設備續(xù)航時間。同時,該設計使芯片能夠
    的頭像 發(fā)表于 04-16 18:05 ?468次閱讀
    樂鑫科技新品<b class='flag-5'>ESP32</b>-H4亮點速遞!

    新國標ESP32-C3充電寶驅屏方案,啟明云端樂鑫代理及方案商

    破局。該方案的亮點如下:功能集成:樂鑫科技ESP32-C3芯片方案,集成Wi-Fi和藍牙。直接驅動屏幕實時顯示電池健康度、使用次數(shù)等重要參數(shù),讓用戶對充電寶狀態(tài)一
    的頭像 發(fā)表于 03-17 18:19 ?470次閱讀
    新國標<b class='flag-5'>ESP32</b>-C3充電寶驅屏方案,啟明云端樂鑫代理及方案商

    ESP32/ESP8266開發(fā)板單向一對多ESP-NOW無線通信

    通過ESP-NOW無線通信協(xié)議實現(xiàn)ESP32開發(fā)板向多個ESP32/ESP 8266開發(fā)板發(fā)送數(shù)據(jù)。
    的頭像 發(fā)表于 03-13 09:23 ?321次閱讀
    <b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266開發(fā)板單向一對多<b class='flag-5'>ESP</b>-NOW無線通信

    ESP32驅動TFmini-S紅外激光測距ToF模塊進行測距

    本文介紹了TFmini-S紅外激光測距ToF模塊的基本特性,然后用ESP32開發(fā)板驅動TFmini-S模塊進行測距,并在串口助手上顯示出測距數(shù)據(jù)。
    的頭像 發(fā)表于 03-06 14:43 ?377次閱讀
    <b class='flag-5'>ESP32</b><b class='flag-5'>驅動</b>TFmini-S紅外激光測距ToF模塊進行測距

    ESP32 驅動瀚海微SD NAND 完整方案 + FAT/FAT32 驅動核心區(qū)別

    ESP32?驅動 SD NAND?的核心是基于SDIO?接口(SD NAND?主流通信方式,兼容 SPI?但速率更高),借助樂鑫官方esp-idf框架的SDMMC?驅動庫實現(xiàn),無需額外
    的頭像 發(fā)表于 02-02 11:38 ?896次閱讀
    <b class='flag-5'>ESP32</b> <b class='flag-5'>驅動</b>瀚海微SD NAND 完整方案 + FAT/FAT32 <b class='flag-5'>驅動</b>核心區(qū)別

    ESP32藍牙驅動MAX98357對音頻音樂播放

    本文介紹了MAX98357音頻模塊的基本特性,并利用ESP32的藍牙功能程序驅動此模塊,最后用手機藍牙連接ESP32播放手機音樂
    的頭像 發(fā)表于 12-19 19:55 ?3315次閱讀
    <b class='flag-5'>ESP32</b>藍牙<b class='flag-5'>驅動</b>MAX98357對音頻音樂播放

    ESP8266和ESP32開發(fā)板常見的2種下載方式

    ESP32ESP8266是性價比很高而且使用較為廣泛的的Wi-Fi模塊,在物聯(lián)網(IoT)領域的DIY項目中可以首先考慮這2款產品。 兩款芯片都屬于32位處理器。ESP32是低功耗雙核80MHz
    的頭像 發(fā)表于 11-10 20:30 ?1438次閱讀
    <b class='flag-5'>ESP</b>8266和<b class='flag-5'>ESP32</b>開發(fā)板常見的2種下載方式

    低成本開源!用樂鑫科技ESP32-S3開發(fā)板輕松驅動無刷電機,保姆級教程來了!

    想用ESP32-S3開發(fā)板驅動無刷電機卻不知從何下手?本教程將手把手教你完成從硬件連接到軟件編程的全流程,無論你是新手還是有一定經驗的開發(fā)者,都能輕松掌握!本教程代碼已全部開源!后臺私信關鍵詞
    的頭像 發(fā)表于 11-06 18:03 ?1168次閱讀
    低成本開源!用樂鑫科技<b class='flag-5'>ESP32</b>-S3開發(fā)板輕松<b class='flag-5'>驅動</b>無刷電機,保姆級教程來了!

    樂鑫ESP32-C6和ESP32-C61究竟該如何選擇?一文讀懂本質區(qū)別

    樂鑫科技推出的ESP32-C6和ESP32-C61均支持Wi-Fi6,但定位不同。ESP32-C6是多協(xié)議樞紐,集成Wi-Fi6、藍牙5、Zigbee和Thread,適合智能家居網關和
    的頭像 發(fā)表于 10-28 14:17 ?2766次閱讀
    樂鑫<b class='flag-5'>ESP32</b>-C6和<b class='flag-5'>ESP32</b>-C61究竟該如何選擇?一文讀懂本質區(qū)別

    ESP32驅動SPIFFS進行文件操作

    本篇文章介紹如何在ESP32開發(fā)板上使用SPIFFS(SPI Flash File System)進行文件操作??聪氯绾纬跏蓟疭PIFFS文件系統(tǒng)、讀取文件、列出文件、刪除文件,并查看存儲的剩余空間。
    的頭像 發(fā)表于 08-05 18:11 ?4523次閱讀
    <b class='flag-5'>ESP32</b><b class='flag-5'>驅動</b>SPIFFS進行文件操作

    zephyr設備驅動程序模型

    ? ? 1:Zephyr 內核支持多種設備驅動程序。驅動程序是否可用取決于board 和驅動程序。 Zephyr 設備模型為配置作為系統(tǒng)一部
    的頭像 發(fā)表于 07-29 10:34 ?865次閱讀
    <b class='flag-5'>zephyr</b>設備<b class='flag-5'>驅動</b>程序模型

    ESP32開發(fā)板元件資料

    ESP32開發(fā)板元件
    發(fā)表于 07-21 14:47 ?17次下載

    用SPI玩轉WiFi,RT-Thread ESP-Hosted驅動深度適配指南 | 技術集結

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

    基于ESP32C3的智能小車設計

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

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

    本文將介紹ESP32開發(fā)板驅動MFRC522 RFID模塊,讀取RFID卡原始數(shù)據(jù)、獲取RFID卡的UID,并將個人數(shù)據(jù)添加到RFID卡中。
    的頭像 發(fā)表于 05-28 15:52 ?1816次閱讀
    <b class='flag-5'>ESP32</b><b class='flag-5'>驅動</b>MFRC522 RFID模塊讀寫IC卡數(shù)據(jù)
    黄大仙区| 什邡市| 盘锦市| 墨竹工卡县| 长垣县| 清水河县| 靖州| 瑞昌市| 天柱县| 长治县| 晋江市| 昭平县| 康平县| 班玛县| 皮山县| 湖北省| 曲阜市| 绍兴县| 景谷| 武安市| 尼玛县| 江西省| 万年县| 兰溪市| 绿春县| 曲周县| 观塘区| 顺昌县| 中卫市| 武胜县| 九龙坡区| 林州市| 乳山市| 久治县| 桂平市| 宾阳县| 慈溪市| 靖州| 龙陵县| 即墨市| 安塞县|