mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-26 14:31:04 +08:00
commit
0740ccd9f7
@ -16,7 +16,7 @@ target_include_directories(firmware PUBLIC
|
|||||||
.
|
.
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(firmware hardware_pio hardware_dma pico_stdlib pico_rand cyw43_driver_picow)
|
target_link_libraries(firmware pico_stdlib pico_rand pico_cyw43_driver pico_cyw43_arch_none)
|
||||||
pico_add_extra_outputs(firmware) # create map/bin/hex file etc.
|
pico_add_extra_outputs(firmware) # create map/bin/hex file etc.
|
||||||
|
|
||||||
pico_enable_stdio_usb(firmware 1) # Route stdio
|
pico_enable_stdio_usb(firmware 1) # Route stdio
|
@ -12,10 +12,10 @@ build: pico-sdk build/firmware.uf2
|
|||||||
|
|
||||||
build/firmware.uf2:
|
build/firmware.uf2:
|
||||||
$(MKBUILD)
|
$(MKBUILD)
|
||||||
cd build && cmake -G "Unix Makefiles" .. && make
|
cd build && cmake -DPICO_BOARD="pico_w" -G "Unix Makefiles" .. && make
|
||||||
|
|
||||||
pico-sdk:
|
pico-sdk:
|
||||||
git clone --depth 1 -b 1.5.1 https://github.com/raspberrypi/pico-sdk $@
|
git clone --depth 1 -b 2.0.0 https://github.com/raspberrypi/pico-sdk $@
|
||||||
cd $@ && git submodule update --init
|
cd $@ && git submodule update --init
|
||||||
|
|
||||||
clean:
|
clean:
|
@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
#include "pico/unique_id.h"
|
#include "pico/unique_id.h"
|
||||||
|
#include "pico/cyw43_arch.h"
|
||||||
#include "cyw43.h"
|
#include "cyw43.h"
|
||||||
#include "cyw43_country.h"
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
#include "mongoose.h"
|
||||||
#include "driver_pico-w.h"
|
#include "driver_pico-w.h"
|
||||||
@ -19,10 +19,11 @@ 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;
|
||||||
// initialize WiFi chip and connect to network
|
if (cyw43_arch_init() != 0) return false; // initialize async_context and WiFi chip
|
||||||
cyw43_init(&cyw43_state);
|
cyw43_arch_enable_sta_mode();
|
||||||
cyw43_wifi_set_up(&cyw43_state, CYW43_ITF_STA, true, CYW43_COUNTRY_WORLDWIDE);
|
// start connecting to network
|
||||||
cyw43_wifi_join(&cyw43_state, strlen(d->ssid), d->ssid, strlen(d->pass), d->pass, CYW43_AUTH_WPA2_AES_PSK, NULL, CYW43_ITF_STA);
|
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);
|
cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -34,11 +35,7 @@ static size_t mg_tcpip_driver_pico_w_tx(const void *buf, size_t 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 ? 1 : 0;
|
return (cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA) == CYW43_LINK_JOIN);
|
||||||
}
|
|
||||||
|
|
||||||
void driver_pico_w_poll(void) {
|
|
||||||
cyw43_poll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mg_tcpip_driver mg_tcpip_driver_pico_w = {
|
struct mg_tcpip_driver mg_tcpip_driver_pico_w = {
|
||||||
@ -48,32 +45,17 @@ struct mg_tcpip_driver mg_tcpip_driver_pico_w = {
|
|||||||
mg_tcpip_driver_pico_w_up,
|
mg_tcpip_driver_pico_w_up,
|
||||||
};
|
};
|
||||||
|
|
||||||
void cyw43_cb_tcpip_init(cyw43_t *self, int itf) {}
|
// Called once per outstanding frame by async_context
|
||||||
void cyw43_cb_tcpip_deinit(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) {}
|
|
||||||
|
|
||||||
// Called once per outstanding frame during a call to cyw43_poll
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return mac address
|
// Called by async_context
|
||||||
void cyw43_hal_get_mac(__unused int idx, uint8_t buf[6]) {
|
void cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf) {}
|
||||||
memcpy(buf, cyw43_state.mac, 6);
|
void cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf) {}
|
||||||
}
|
|
||||||
|
|
||||||
// Generate a mac address if one is not set in otp
|
|
||||||
void cyw43_hal_generate_laa_mac(__unused int idx, uint8_t buf[6]) {
|
|
||||||
pico_unique_board_id_t board_id;
|
|
||||||
MG_DEBUG(("No MAC in cyw43 OTP, generated from board id"));
|
|
||||||
pico_get_unique_board_id(&board_id);
|
|
||||||
memcpy(buf, &board_id.id[2], 6);
|
|
||||||
buf[0] &= (uint8_t)~0x1; // unicast
|
|
||||||
buf[0] |= 0x2; // locally administered
|
|
||||||
}
|
|
||||||
|
|
||||||
// there's life beyond lwIP
|
// there's life beyond lwIP
|
||||||
void pbuf_copy_partial(void){(void)0;}
|
void pbuf_copy_partial(void){(void)0;}
|
@ -6,5 +6,3 @@ struct mg_tcpip_driver_pico_w_data {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern struct mg_tcpip_driver mg_tcpip_driver_pico_w;
|
extern struct mg_tcpip_driver mg_tcpip_driver_pico_w;
|
||||||
|
|
||||||
void driver_pico_w_poll(void);
|
|
@ -43,7 +43,6 @@ int main(void) {
|
|||||||
|
|
||||||
MG_INFO(("Starting event loop"));
|
MG_INFO(("Starting event loop"));
|
||||||
for (;;) {
|
for (;;) {
|
||||||
driver_pico_w_poll();
|
|
||||||
mg_mgr_poll(&mgr, 0);
|
mg_mgr_poll(&mgr, 0);
|
||||||
}
|
}
|
||||||
|
|
@ -18,9 +18,20 @@ if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_P
|
|||||||
message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')")
|
message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_TAG} AND (NOT PICO_SDK_FETCH_FROM_GIT_TAG))
|
||||||
|
set(PICO_SDK_FETCH_FROM_GIT_TAG $ENV{PICO_SDK_FETCH_FROM_GIT_TAG})
|
||||||
|
message("Using PICO_SDK_FETCH_FROM_GIT_TAG from environment ('${PICO_SDK_FETCH_FROM_GIT_TAG}')")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (PICO_SDK_FETCH_FROM_GIT AND NOT PICO_SDK_FETCH_FROM_GIT_TAG)
|
||||||
|
set(PICO_SDK_FETCH_FROM_GIT_TAG "master")
|
||||||
|
message("Using master as default value for PICO_SDK_FETCH_FROM_GIT_TAG")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK")
|
set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK")
|
||||||
set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable")
|
set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable")
|
||||||
set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK")
|
set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK")
|
||||||
|
set(PICO_SDK_FETCH_FROM_GIT_TAG "${PICO_SDK_FETCH_FROM_GIT_TAG}" CACHE FILEPATH "release tag for SDK")
|
||||||
|
|
||||||
if (NOT PICO_SDK_PATH)
|
if (NOT PICO_SDK_PATH)
|
||||||
if (PICO_SDK_FETCH_FROM_GIT)
|
if (PICO_SDK_FETCH_FROM_GIT)
|
||||||
@ -34,14 +45,14 @@ if (NOT PICO_SDK_PATH)
|
|||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
pico_sdk
|
pico_sdk
|
||||||
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
|
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
|
||||||
GIT_TAG master
|
GIT_TAG ${PICO_SDK_FETCH_FROM_GIT_TAG}
|
||||||
GIT_SUBMODULES_RECURSE FALSE
|
GIT_SUBMODULES_RECURSE FALSE
|
||||||
)
|
)
|
||||||
else ()
|
else ()
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
pico_sdk
|
pico_sdk
|
||||||
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
|
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
|
||||||
GIT_TAG master
|
GIT_TAG ${PICO_SDK_FETCH_FROM_GIT_TAG}
|
||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
@ -1,164 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2022 Raspberry Pi (Trading) Ltd.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This header is included by cyw43_driver to setup its environment
|
|
||||||
|
|
||||||
// THIS FILE HAS BEEN EDITED, ORIGINAL FILE IN PICO-SDK
|
|
||||||
|
|
||||||
#ifndef _CYW43_CONFIGPORT_H
|
|
||||||
#define _CYW43_CONFIGPORT_H
|
|
||||||
|
|
||||||
#include "boards/pico_w.h"
|
|
||||||
#include "hardware/gpio.h"
|
|
||||||
#include "pico/error.h"
|
|
||||||
#include "pico/time.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Use our own TCP/IP stack
|
|
||||||
#define CYW43_LWIP 0
|
|
||||||
|
|
||||||
#ifndef CYW43_HOST_NAME
|
|
||||||
#define CYW43_HOST_NAME "Mongoose"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_GPIO
|
|
||||||
#define CYW43_GPIO 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_LOGIC_DEBUG
|
|
||||||
#define CYW43_LOGIC_DEBUG 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_USE_OTP_MAC
|
|
||||||
#define CYW43_USE_OTP_MAC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_NO_NETUTILS
|
|
||||||
#define CYW43_NO_NETUTILS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_IOCTL_TIMEOUT_US
|
|
||||||
#define CYW43_IOCTL_TIMEOUT_US 1000000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_USE_STATS
|
|
||||||
#define CYW43_USE_STATS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// todo should this be user settable?
|
|
||||||
#ifndef CYW43_HAL_MAC_WLAN0
|
|
||||||
#define CYW43_HAL_MAC_WLAN0 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef STATIC
|
|
||||||
#define STATIC static
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_USE_SPI
|
|
||||||
#define CYW43_USE_SPI 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_SPI_PIO
|
|
||||||
#define CYW43_SPI_PIO 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE
|
|
||||||
#if CYW43_ENABLE_BLUETOOTH
|
|
||||||
#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "wb43439A0_7_95_49_00_combined.h"
|
|
||||||
#else
|
|
||||||
#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "w43439A0_7_95_49_00_combined.h"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CYW43_WIFI_NVRAM_INCLUDE_FILE
|
|
||||||
#define CYW43_WIFI_NVRAM_INCLUDE_FILE "wifi_nvram_43439.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Note, these are negated, because cyw43_driver negates them before returning!
|
|
||||||
#define CYW43_EPERM (-PICO_ERROR_NOT_PERMITTED) // Operation not permitted
|
|
||||||
#define CYW43_EIO (-PICO_ERROR_IO) // I/O error
|
|
||||||
#define CYW43_EINVAL (-PICO_ERROR_INVALID_ARG) // Invalid argument
|
|
||||||
#define CYW43_ETIMEDOUT (-PICO_ERROR_TIMEOUT) // Connection timed out
|
|
||||||
|
|
||||||
#define CYW43_NUM_GPIOS CYW43_WL_GPIO_COUNT
|
|
||||||
|
|
||||||
#define cyw43_hal_pin_obj_t uint
|
|
||||||
|
|
||||||
// get the number of elements in a fixed-size array
|
|
||||||
#define CYW43_ARRAY_SIZE(a) count_of(a)
|
|
||||||
|
|
||||||
static inline uint32_t cyw43_hal_ticks_us(void) {
|
|
||||||
return time_us_32();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t cyw43_hal_ticks_ms(void) {
|
|
||||||
return to_ms_since_boot(get_absolute_time());
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int cyw43_hal_pin_read(cyw43_hal_pin_obj_t pin) {
|
|
||||||
return gpio_get(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cyw43_hal_pin_low(cyw43_hal_pin_obj_t pin) {
|
|
||||||
gpio_clr_mask(1 << pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cyw43_hal_pin_high(cyw43_hal_pin_obj_t pin) {
|
|
||||||
gpio_set_mask(1 << pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CYW43_HAL_PIN_MODE_INPUT (GPIO_IN)
|
|
||||||
#define CYW43_HAL_PIN_MODE_OUTPUT (GPIO_OUT)
|
|
||||||
|
|
||||||
#define CYW43_HAL_PIN_PULL_NONE (0)
|
|
||||||
#define CYW43_HAL_PIN_PULL_UP (1)
|
|
||||||
#define CYW43_HAL_PIN_PULL_DOWN (2)
|
|
||||||
|
|
||||||
static inline void cyw43_hal_pin_config(cyw43_hal_pin_obj_t pin, uint32_t mode, uint32_t pull, __unused uint32_t alt) {
|
|
||||||
assert((mode == CYW43_HAL_PIN_MODE_INPUT || mode == CYW43_HAL_PIN_MODE_OUTPUT) && alt == 0);
|
|
||||||
gpio_set_dir(pin, mode);
|
|
||||||
gpio_set_pulls(pin, pull == CYW43_HAL_PIN_PULL_UP, pull == CYW43_HAL_PIN_PULL_DOWN);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cyw43_hal_get_mac(int idx, uint8_t buf[6]);
|
|
||||||
|
|
||||||
void cyw43_hal_generate_laa_mac(int idx, uint8_t buf[6]);
|
|
||||||
|
|
||||||
|
|
||||||
// documentation is king
|
|
||||||
#define CYW43_THREAD_ENTER
|
|
||||||
#define CYW43_THREAD_EXIT
|
|
||||||
#define CYW43_THREAD_LOCK_CHECK
|
|
||||||
|
|
||||||
// ??? and the ';' at the end is needed
|
|
||||||
#define CYW43_SDPCM_SEND_COMMON_WAIT (void) 0;
|
|
||||||
#define CYW43_DO_IOCTL_WAIT (void) 0;
|
|
||||||
|
|
||||||
#define cyw43_delay_ms sleep_ms
|
|
||||||
#define cyw43_delay_us sleep_us
|
|
||||||
static inline void cyw43_schedule_internal_poll_dispatch(void (*func)(void)){
|
|
||||||
(void)func; // do nothing, we'll call it anyway
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CYW43_POST_POLL_HOOK
|
|
||||||
|
|
||||||
// Allow malloc and free to be changed
|
|
||||||
#ifndef cyw43_malloc
|
|
||||||
#define cyw43_malloc malloc
|
|
||||||
#endif
|
|
||||||
#ifndef cyw43_free
|
|
||||||
#define cyw43_free free
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
x
Reference in New Issue
Block a user