mirror of
https://github.com/cesanta/mongoose.git
synced 2025-01-21 17:43:21 +08:00
Merge pull request #2981 from cesanta/picowsdk
Add Pico-W driver in src/drivers
This commit is contained in:
commit
0a4f322d49
@ -5,7 +5,6 @@ project(firmware)
|
|||||||
pico_sdk_init()
|
pico_sdk_init()
|
||||||
|
|
||||||
add_executable(firmware
|
add_executable(firmware
|
||||||
driver_pico-w.c
|
|
||||||
main.c
|
main.c
|
||||||
mongoose.c
|
mongoose.c
|
||||||
net.c
|
net.c
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
struct mg_tcpip_driver_pico_w_data {
|
|
||||||
char *ssid;
|
|
||||||
char *pass;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct mg_tcpip_driver mg_tcpip_driver_pico_w;
|
|
@ -1,12 +1,9 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
// Copyright (c) 2024 Cesanta Software Limited
|
||||||
// All rights reserved
|
// All rights reserved
|
||||||
|
|
||||||
#include "pico/stdlib.h"
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
#include "mongoose.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
|
||||||
#include "driver_pico-w.h"
|
|
||||||
|
|
||||||
#define WIFI_SSID "yourWiFiSSID"
|
#define WIFI_SSID "yourWiFiSSID"
|
||||||
#define WIFI_PASS "yourWiFiPassword"
|
#define WIFI_PASS "yourWiFiPassword"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#define MG_ARCH MG_ARCH_PICOSDK
|
#define MG_ARCH MG_ARCH_PICOSDK
|
||||||
|
|
||||||
#define MG_ENABLE_TCPIP 1
|
#define MG_ENABLE_TCPIP 1
|
||||||
|
#define MG_ENABLE_DRIVER_PICO_W 1
|
||||||
#define MG_ENABLE_TCPIP_DRIVER_INIT 0
|
#define MG_ENABLE_TCPIP_DRIVER_INIT 0
|
||||||
#define MG_ENABLE_PACKED_FS 1
|
#define MG_ENABLE_PACKED_FS 1
|
||||||
|
65
mongoose.c
65
mongoose.c
@ -17801,6 +17801,71 @@ bool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,
|
|||||||
return up;
|
return up;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MG_ENABLE_LINES
|
||||||
|
#line 1 "src/drivers/pico-w.c"
|
||||||
|
#endif
|
||||||
|
#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \
|
||||||
|
defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static struct mg_tcpip_if *s_ifp;
|
||||||
|
|
||||||
|
static bool mg_tcpip_driver_pico_w_init(struct mg_tcpip_if *ifp) {
|
||||||
|
struct mg_tcpip_driver_pico_w_data *d =
|
||||||
|
(struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;
|
||||||
|
s_ifp = ifp;
|
||||||
|
if (cyw43_arch_init() != 0)
|
||||||
|
return false; // initialize async_context and WiFi chip
|
||||||
|
cyw43_arch_enable_sta_mode();
|
||||||
|
// start connecting to network
|
||||||
|
if (cyw43_arch_wifi_connect_bssid_async(d->ssid, NULL, d->pass,
|
||||||
|
CYW43_AUTH_WPA2_AES_PSK) != 0)
|
||||||
|
return false;
|
||||||
|
cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t mg_tcpip_driver_pico_w_tx(const void *buf, size_t len,
|
||||||
|
struct mg_tcpip_if *ifp) {
|
||||||
|
(void) ifp;
|
||||||
|
return cyw43_send_ethernet(&cyw43_state, CYW43_ITF_STA, len, buf, false)
|
||||||
|
? 0
|
||||||
|
: len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool mg_tcpip_driver_pico_w_up(struct mg_tcpip_if *ifp) {
|
||||||
|
(void) ifp;
|
||||||
|
return (cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA) ==
|
||||||
|
CYW43_LINK_JOIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct mg_tcpip_driver mg_tcpip_driver_pico_w = {
|
||||||
|
mg_tcpip_driver_pico_w_init,
|
||||||
|
mg_tcpip_driver_pico_w_tx,
|
||||||
|
NULL,
|
||||||
|
mg_tcpip_driver_pico_w_up,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Called once per outstanding frame by async_context
|
||||||
|
void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len,
|
||||||
|
const uint8_t *buf) {
|
||||||
|
if (itf != CYW43_ITF_STA) return;
|
||||||
|
mg_tcpip_qwrite((void *) buf, len, s_ifp);
|
||||||
|
(void) cb_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called by async_context
|
||||||
|
void cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf) {}
|
||||||
|
void cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf) {}
|
||||||
|
|
||||||
|
// there's life beyond lwIP
|
||||||
|
void pbuf_copy_partial(void) {(void) 0;}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MG_ENABLE_LINES
|
#ifdef MG_ENABLE_LINES
|
||||||
#line 1 "src/drivers/ppp.c"
|
#line 1 "src/drivers/ppp.c"
|
||||||
#endif
|
#endif
|
||||||
|
14
mongoose.h
14
mongoose.h
@ -2785,6 +2785,7 @@ extern struct mg_tcpip_driver mg_tcpip_driver_ra;
|
|||||||
extern struct mg_tcpip_driver mg_tcpip_driver_xmc;
|
extern struct mg_tcpip_driver mg_tcpip_driver_xmc;
|
||||||
extern struct mg_tcpip_driver mg_tcpip_driver_xmc7;
|
extern struct mg_tcpip_driver mg_tcpip_driver_xmc7;
|
||||||
extern struct mg_tcpip_driver mg_tcpip_driver_ppp;
|
extern struct mg_tcpip_driver mg_tcpip_driver_ppp;
|
||||||
|
extern struct mg_tcpip_driver mg_tcpip_driver_pico_w;
|
||||||
|
|
||||||
// Drivers that require SPI, can use this SPI abstraction
|
// Drivers that require SPI, can use this SPI abstraction
|
||||||
struct mg_tcpip_spi {
|
struct mg_tcpip_spi {
|
||||||
@ -2946,6 +2947,19 @@ void mg_phy_init(struct mg_phy *, uint8_t addr, uint8_t config);
|
|||||||
bool mg_phy_up(struct mg_phy *, uint8_t addr, bool *full_duplex,
|
bool mg_phy_up(struct mg_phy *, uint8_t addr, bool *full_duplex,
|
||||||
uint8_t *speed);
|
uint8_t *speed);
|
||||||
|
|
||||||
|
#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \
|
||||||
|
defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W
|
||||||
|
|
||||||
|
#include "cyw43.h" // keep this include
|
||||||
|
#include "pico/cyw43_arch.h" // keep this include
|
||||||
|
#include "pico/unique_id.h" // keep this include
|
||||||
|
|
||||||
|
struct mg_tcpip_driver_pico_w_data {
|
||||||
|
char *ssid;
|
||||||
|
char *pass;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
struct mg_tcpip_driver_ppp_data {
|
struct mg_tcpip_driver_ppp_data {
|
||||||
void *uart; // Opaque UART bus descriptor
|
void *uart; // Opaque UART bus descriptor
|
||||||
|
@ -1,52 +1,51 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \
|
||||||
// All rights reserved
|
defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
|
#include "net_builtin.h"
|
||||||
|
#include "drivers/pico-w.h"
|
||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
#include "pico/unique_id.h"
|
|
||||||
#include "pico/cyw43_arch.h"
|
|
||||||
#include "cyw43.h"
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "driver_pico-w.h"
|
|
||||||
|
|
||||||
|
|
||||||
static struct mg_tcpip_if *s_ifp;
|
static struct mg_tcpip_if *s_ifp;
|
||||||
|
|
||||||
static bool mg_tcpip_driver_pico_w_init(struct mg_tcpip_if *ifp) {
|
static bool mg_tcpip_driver_pico_w_init(struct mg_tcpip_if *ifp) {
|
||||||
struct mg_tcpip_driver_pico_w_data *d = (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;
|
struct mg_tcpip_driver_pico_w_data *d =
|
||||||
|
(struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;
|
||||||
s_ifp = ifp;
|
s_ifp = ifp;
|
||||||
if (cyw43_arch_init() != 0) return false; // initialize async_context and WiFi chip
|
if (cyw43_arch_init() != 0)
|
||||||
|
return false; // initialize async_context and WiFi chip
|
||||||
cyw43_arch_enable_sta_mode();
|
cyw43_arch_enable_sta_mode();
|
||||||
// start connecting to network
|
// start connecting to network
|
||||||
if (cyw43_arch_wifi_connect_bssid_async(d->ssid, NULL, d->pass, CYW43_AUTH_WPA2_AES_PSK) != 0)
|
if (cyw43_arch_wifi_connect_bssid_async(d->ssid, NULL, d->pass,
|
||||||
|
CYW43_AUTH_WPA2_AES_PSK) != 0)
|
||||||
return false;
|
return false;
|
||||||
cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);
|
cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t mg_tcpip_driver_pico_w_tx(const void *buf, size_t len,
|
static size_t mg_tcpip_driver_pico_w_tx(const void *buf, size_t len,
|
||||||
struct mg_tcpip_if *ifp) {
|
struct mg_tcpip_if *ifp) {
|
||||||
return cyw43_send_ethernet(&cyw43_state, CYW43_ITF_STA, len, buf, false) ? 0 : len;
|
|
||||||
(void) ifp;
|
(void) ifp;
|
||||||
|
return cyw43_send_ethernet(&cyw43_state, CYW43_ITF_STA, len, buf, false)
|
||||||
|
? 0
|
||||||
|
: len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mg_tcpip_driver_pico_w_up(struct mg_tcpip_if *ifp) {
|
static bool mg_tcpip_driver_pico_w_up(struct mg_tcpip_if *ifp) {
|
||||||
return (cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA) == CYW43_LINK_JOIN);
|
(void) ifp;
|
||||||
|
return (cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA) ==
|
||||||
|
CYW43_LINK_JOIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mg_tcpip_driver mg_tcpip_driver_pico_w = {
|
struct mg_tcpip_driver mg_tcpip_driver_pico_w = {
|
||||||
mg_tcpip_driver_pico_w_init,
|
mg_tcpip_driver_pico_w_init,
|
||||||
mg_tcpip_driver_pico_w_tx,
|
mg_tcpip_driver_pico_w_tx,
|
||||||
NULL,
|
NULL,
|
||||||
mg_tcpip_driver_pico_w_up,
|
mg_tcpip_driver_pico_w_up,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Called once per outstanding frame by async_context
|
// Called once per outstanding frame by async_context
|
||||||
void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len, const uint8_t *buf) {
|
void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len,
|
||||||
|
const uint8_t *buf) {
|
||||||
if (itf != CYW43_ITF_STA) return;
|
if (itf != CYW43_ITF_STA) return;
|
||||||
mg_tcpip_qwrite((void *) buf, len, s_ifp);
|
mg_tcpip_qwrite((void *) buf, len, s_ifp);
|
||||||
(void) cb_data;
|
(void) cb_data;
|
||||||
@ -56,6 +55,7 @@ void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len, const uint8_t
|
|||||||
void cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf) {}
|
void cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf) {}
|
||||||
void cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf) {}
|
void cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf) {}
|
||||||
|
|
||||||
|
|
||||||
// there's life beyond lwIP
|
// there's life beyond lwIP
|
||||||
void pbuf_copy_partial(void){(void)0;}
|
void pbuf_copy_partial(void) {(void) 0;}
|
||||||
|
|
||||||
|
#endif
|
15
src/drivers/pico-w.h
Normal file
15
src/drivers/pico-w.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \
|
||||||
|
defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W
|
||||||
|
|
||||||
|
#include "cyw43.h" // keep this include
|
||||||
|
#include "pico/cyw43_arch.h" // keep this include
|
||||||
|
#include "pico/unique_id.h" // keep this include
|
||||||
|
|
||||||
|
struct mg_tcpip_driver_pico_w_data {
|
||||||
|
char *ssid;
|
||||||
|
char *pass;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -82,6 +82,7 @@ extern struct mg_tcpip_driver mg_tcpip_driver_ra;
|
|||||||
extern struct mg_tcpip_driver mg_tcpip_driver_xmc;
|
extern struct mg_tcpip_driver mg_tcpip_driver_xmc;
|
||||||
extern struct mg_tcpip_driver mg_tcpip_driver_xmc7;
|
extern struct mg_tcpip_driver mg_tcpip_driver_xmc7;
|
||||||
extern struct mg_tcpip_driver mg_tcpip_driver_ppp;
|
extern struct mg_tcpip_driver mg_tcpip_driver_ppp;
|
||||||
|
extern struct mg_tcpip_driver mg_tcpip_driver_pico_w;
|
||||||
|
|
||||||
// Drivers that require SPI, can use this SPI abstraction
|
// Drivers that require SPI, can use this SPI abstraction
|
||||||
struct mg_tcpip_spi {
|
struct mg_tcpip_spi {
|
||||||
|
Loading…
Reference in New Issue
Block a user