Skip to content

Commit

Permalink
Merge pull request cesanta#2981 from cesanta/picowsdk
Browse files Browse the repository at this point in the history
Add Pico-W driver in src/drivers
  • Loading branch information
scaprile authored Dec 5, 2024
2 parents fd52fcc + bf013fc commit 0a4f322
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ project(firmware)
pico_sdk_init()

add_executable(firmware
driver_pico-w.c
main.c
mongoose.c
net.c
Expand Down

This file was deleted.

3 changes: 0 additions & 3 deletions examples/pico-sdk/pico-w-picosdk-baremetal-builtin/main.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
// Copyright (c) 2024 Cesanta Software Limited
// All rights reserved

#include "pico/stdlib.h"

#include "mongoose.h"
#include "net.h"

#include "driver_pico-w.h"

#define WIFI_SSID "yourWiFiSSID"
#define WIFI_PASS "yourWiFiPassword"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#define MG_ARCH MG_ARCH_PICOSDK

#define MG_ENABLE_TCPIP 1
#define MG_ENABLE_DRIVER_PICO_W 1
#define MG_ENABLE_TCPIP_DRIVER_INIT 0
#define MG_ENABLE_PACKED_FS 1
65 changes: 65 additions & 0 deletions mongoose.c
Original file line number Diff line number Diff line change
Expand Up @@ -17801,6 +17801,71 @@ bool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,
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
#line 1 "src/drivers/ppp.c"
#endif
Expand Down
14 changes: 14 additions & 0 deletions mongoose.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_xmc7;
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
struct mg_tcpip_spi {
Expand Down Expand Up @@ -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,
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 {
void *uart; // Opaque UART bus descriptor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,52 +1,51 @@
// Copyright (c) 2024 Cesanta Software Limited
// All rights reserved

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \
defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W

#include "net_builtin.h"
#include "drivers/pico-w.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 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;
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();
// 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;
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) {
return cyw43_send_ethernet(&cyw43_state, CYW43_ITF_STA, len, buf, false) ? 0 : 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) {
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 = {
mg_tcpip_driver_pico_w_init,
mg_tcpip_driver_pico_w_tx,
NULL,
mg_tcpip_driver_pico_w_up,
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) {
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;
Expand All @@ -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_down(cyw43_t *self, int itf) {}


// there's life beyond lwIP
void pbuf_copy_partial(void){(void)0;}
void pbuf_copy_partial(void) {(void) 0;}

#endif
15 changes: 15 additions & 0 deletions src/drivers/pico-w.h
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions src/net_builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_xmc7;
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
struct mg_tcpip_spi {
Expand Down

0 comments on commit 0a4f322

Please sign in to comment.