色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

ZephyrProject ? 來源:ZephyrProject ? 作者:ZephyrProject ? 2021-06-01 10:41 ? 次閱讀

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

框架

目前ESP32 wifi在zephyr上的實現框架如下圖

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初始化/配置/收發功能, 代碼在zephyrsubsys etl2ethernet,本文不做分析

esp_wifi_drv

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

初始化

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

eth_esp32_dev_init代碼如下,主要是調用hal中提供的一系列初始化和啟動函數,讓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注冊,并注冊數據接收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);

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

esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, eth_esp32_rx);

}

數據接收

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

}

//將封包數據從驅動搬運到pkt內

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

LOG_ERR(“Failed to write pkt”);

goto pkt_unref;

}

//將封包抓發給IP層

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

LOG_ERR(“Failed to push received data”);

goto pkt_unref;

}

//通知esp驅動封包數據已經使用完

esp_wifi_internal_free_rx_buffer(eb);

return ESP_OK;

pkt_unref:

net_pkt_unref(pkt);

return ESP_FAIL;

}

數據發送

數據發送的API在初始化時將eth_esp32_send注冊進ethernet_api的send, IP層在呼叫L2的send時會找到ethernet_send進行發送,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進行發送

/* 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不一樣,現在直接將hal esp32 wifi和zephyr ethernet對接,應該是esp做了相應的轉換,具體如何,待確認。

編輯:jq

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

    關注

    12

    文章

    1838

    瀏覽量

    85263
  • API
    API
    +關注

    關注

    2

    文章

    1499

    瀏覽量

    61965
  • WIFI
    +關注

    關注

    81

    文章

    5296

    瀏覽量

    203578
  • ESP
    ESP
    +關注

    關注

    0

    文章

    183

    瀏覽量

    33926
  • 開源
    +關注

    關注

    3

    文章

    3309

    瀏覽量

    42473

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

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

收藏 人收藏

    評論

    相關推薦

    esp32用什么軟件編程

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

    ESP32-WROOM-32E、ESP32-WROOM-32D、ESP32-WROOM-32U 有什么區別?ESP32-WROOM-32 后綴字母代表的意思是?

    相信很多人心里都有這樣的疑問,今天就教大家怎么區分它們。 32D和32U是同一個芯片ESP32-D0WD的模組,主要區別的天線模式,分別是板載和IPEX外接天線。 32E是用的升級版的芯片
    的頭像 發表于 07-17 10:09 ?9399次閱讀
    <b class='flag-5'>ESP32</b>-WROOM-32E、<b class='flag-5'>ESP32</b>-WROOM-32D、<b class='flag-5'>ESP32</b>-WROOM-32U  有什么區別?<b class='flag-5'>ESP32</b>-WROOM-32 后綴字母代表的意思是?

    請問ESP32的網口與WIFI能否共存?

    請問ESP32 的網口與WIFI能否共存, 1臺電腦用網口TCP-client與ESP32的TCP-server連接; 另一臺電腦用WIFI的TCP-client與
    發表于 06-25 06:49

    如何使用espidf將esp32做成WiFi中繼?

    如何使用espidf將esp32做成WiFi中繼,讓esp32通過WiFi連接互聯網,同時作為AP,能讓連接到esp32AP的設備能夠直接訪
    發表于 06-25 06:43

    樂鑫esp32系列在睡眠模式下保持藍牙連接的功耗測試

    本教程適用于ESP32-S3、ESP32-C3、ESP32-C6睡眠模式介紹ESP32系列常見的休眠方式有三種,分別為Modem-sleep、Light-sleep和Deep-slee
    的頭像 發表于 06-21 08:04 ?2664次閱讀
    樂鑫<b class='flag-5'>esp32</b>系列在睡眠模式下保持藍牙連接的功耗測試

    ESP32集成HiLink編譯失敗的原因?

    /libwpa_supplicant.a esp-idf/driver/libdriver.a /esp32/sources/esp-idf/components/esp_wifi/l
    發表于 06-18 08:19

    請問ESP32有emmc的驅動嗎?

    ESP32 有emmc的驅動
    發表于 06-14 06:23

    ESP32驅動3264點陣屏有噪點的原因?

    ESP32 驅動3264點陣屏顯示時間,采用ARDUINO編寫。 不打開WIFI,顯示會一切正常,打開WIFI,顯示屏會有噪點閃動,無規律,就是發光的二極管會不時地更亮一下。 用
    發表于 06-13 06:56

    如何在zephyr上使能esp32-c3內置的USB串口?

    如題,請問如何在zephyr上使能esp32-c3內置的 USB 串口。
    發表于 06-12 08:11

    請問ESP32-S3如何驅動QSPI接口的LCD?

    目前項目用ESP32-S3來驅動QSPI接口的LCD,驅動IC為GC9B71(規格書參考附件)。試著在ESP-IDF的范例spi_lcd_touch_example_main基礎修改了
    發表于 06-07 06:51

    linux端始終識別不到ESP32-WROOM-32UE的設備id不到probe函數的原因?

    _VENDOR_ID, ESP_DEVICE_ID_2) }, {} }; 但linux端始終識別不到ESP32-WROOM-32UE的設備id不到probe函數內,/sys/bus/sdio/devices下看不到設備節點,
    發表于 06-06 06:44

    ESP32S3用LVGL驅動480*480RGB屏幕,只要連接上WIFI,屏幕顯示就會錯位怎么解決?

    ESP32S3用LVGL驅動480*480RGB屏幕,只要連接上WIFI,屏幕顯示就會錯位,請問有解決方案嗎? IDF5.1.2
    發表于 06-05 08:15

    基于ESP32開發的工業級2.4GHz WiFi藍牙模塊方案

    ? ? ? ?ESP32集成了2.4 GHz WiFi和藍牙雙模的單芯片方案,它采用臺積電(TSMC)超低功耗的40納米工藝,具有超高的射頻性能、穩定性、通用性和可靠性,以及超低的功耗,滿足
    的頭像 發表于 05-31 17:06 ?873次閱讀

    ESP32系列ESP32-D0WD雙模 超低功耗集成BLE4.2+2.4G WIFI SoC芯片

    ESP32系列ESP32-D0WD雙模 超低功耗集成BLE4.2+2.4G WIFI SoC芯片
    的頭像 發表于 05-29 11:52 ?1460次閱讀
    <b class='flag-5'>ESP32</b>系列<b class='flag-5'>ESP32</b>-D0WD雙模 超低功耗<b class='flag-5'>集成</b>BLE4.2+2.4G <b class='flag-5'>WIFI</b> SoC芯片

    請問foc驅動板上可以用esp32嗎?

    foc驅動板上可以用esp32
    發表于 03-19 06:03
    主站蜘蛛池模板: 亚洲色欲国产AV精品综合| 久久精品国产亚洲AV麻豆欧美玲| 中文中幕无码亚洲视频| 天天色天天综合网| 鸥美一级黄色片| 蜜芽资源高清在线观看| 久久AV喷吹AV高潮欧美| 国产精品亚洲精品日韩电影| 成人在线免费视频播放| 99亚洲精品色情无码久久| 最新中文字幕在线视频| 夜色帮首页| 亚洲日本欧美国产在线视| 性欧美videofree中文字幕| 越南女子杂交内射BBWXZ| 亚洲AV久久无码高潮喷水| 视频一区视频二区ae86| 四虎永久免费| 午夜深情在线观看免费| 亚洲.欧美.中文字幕在线观看| 吸奶舔下面| 影音先锋男人av橹橹色| 2018年免费三级av观看| caoporm国产精品视频免费| 99午夜高清在线视频在观看| a亚洲在线观看不卡高清| 扒开双腿疯进出爽爽爽动态图| 北条麻妃久久99精品| 国产精品久久久久久人妻精品流 | 黑吊大战白xxxxxx| 久久精品国产96精品亚洲| 久久亚洲精品成人| 秋霞伦理电影在线看| 天天看高清影视在线18| 一个人在线观看的视频| 99精品国产电影| 国产精品A8198V久久A片| 久久99精品久久久久久园产越南| 麻豆精选2021| 天天看学生视频| 中文字幕精品在线观看|