mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-17 10:49:47 +00:00
move embedded tutorials out of protocol tree
This commit is contained in:
1 parent
338756d0b0
commit
8fc5651044
287 files changed
+720
-267
No files matched your search
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= ./example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c net.c packed_fs.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c net.c packed_fs.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
# CFLAGS_MONGOOSE +=
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
# The following lines of boilerplate have to be in your project's
|
||||
# CMakeLists in this exact order for cmake to work correctly
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
project(mongoose-esp32-example)
|
||||
@@ -1,38 +0,0 @@
|
||||
THISDIR = $(realpath $(CURDIR))
|
||||
ROOTDIR = $(realpath $(CURDIR)/../../../..)
|
||||
DOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) espressif/idf
|
||||
CMD ?= idf.py build
|
||||
PORT ?= /dev/ttyUSB0
|
||||
|
||||
all: example
|
||||
|
||||
example:
|
||||
true
|
||||
|
||||
build: Makefile $(wildcard main/*)
|
||||
$(DOCKER) $(CMD)
|
||||
|
||||
flash:
|
||||
flash: CMD = idf.py flash
|
||||
flash: DA = --device $(PORT)
|
||||
flash: build
|
||||
|
||||
.PHONY: build
|
||||
|
||||
dashboard.hex: build
|
||||
esputil mkhex \
|
||||
0x8000 build/partition_table/partition-table.bin \
|
||||
0x1000 build/bootloader/bootloader.bin \
|
||||
0x100000 build/mongoose-esp32-example.bin > $@
|
||||
|
||||
flash2: dashboard.hex
|
||||
esputil -p $(PORT) -b 921600 -fp 0x220 flash dashboard.hex
|
||||
esputil -p $(PORT) monitor
|
||||
|
||||
ESPTOOL ?= esptool.py
|
||||
|
||||
flash3:
|
||||
cd build && $(ESPTOOL) --chip esp32 -p $(PORT) -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB 0x8000 partition_table/partition-table.bin 0x1000 bootloader/bootloader.bin 0x100000 mongoose-esp32-example.bin
|
||||
|
||||
clean:
|
||||
test -d build && $(DOCKER) rm -rf build sdkconfig || true
|
||||
@@ -1 +0,0 @@
|
||||
See detailed tutorial at https://mongoose.ws/tutorials/esp32/device-dashboard
|
||||
@@ -1,7 +0,0 @@
|
||||
idf_component_register(SRCS "main.c"
|
||||
"wifi.c"
|
||||
"net.c"
|
||||
"packed_fs.c"
|
||||
"mongoose.c")
|
||||
component_compile_options(-DHTTP_URL="http://0.0.0.0:80")
|
||||
component_compile_options(-DHTTPS_URL="https://0.0.0.0:443")
|
||||
@@ -1,272 +0,0 @@
|
||||
// Copyright (c) 2020 Cesanta Software Limited
|
||||
// All rights reserved
|
||||
|
||||
#include "mongoose.h"
|
||||
#include "net.h"
|
||||
|
||||
#define WIFI_SSID "YOUR_WIFI_NETWORK_NAME" // SET THIS!
|
||||
#define WIFI_PASS "YOUR_WIFI_PASSWORD" // SET THIS!
|
||||
|
||||
void app_main(void) {
|
||||
// Setup wifi. This function is implemented in wifi.c
|
||||
// It blocks until connected to the configured WiFi network
|
||||
void wifi_init(const char *ssid, const char *pass);
|
||||
wifi_init(WIFI_SSID, WIFI_PASS);
|
||||
|
||||
// Connected to WiFi, now start HTTP server
|
||||
struct mg_mgr mgr;
|
||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
||||
mg_mgr_init(&mgr);
|
||||
MG_INFO(("Mongoose version : v%s", MG_VERSION));
|
||||
MG_INFO(("Listening on : %s", HTTP_URL));
|
||||
#if MG_ENABLE_MBEDTLS
|
||||
MG_INFO(("Listening on : %s", HTTPS_URL));
|
||||
#endif
|
||||
|
||||
web_init(&mgr);
|
||||
for (;;) mg_mgr_poll(&mgr, 1000); // Infinite event loop
|
||||
}
|
||||
|
||||
#if MG_OTA == MG_OTA_CUSTOM
|
||||
enum {
|
||||
MG_OTA_UNAVAILABLE = 0, // No OTA information is present
|
||||
MG_OTA_FIRST_BOOT = 1, // Device booting the first time after the OTA
|
||||
MG_OTA_UNCOMMITTED = 2, // Ditto, but marking us for the rollback
|
||||
MG_OTA_COMMITTED = 3 // The firmware is good
|
||||
};
|
||||
enum { MG_FIRMWARE_CURRENT = 0, MG_FIRMWARE_PREVIOUS = 1 };
|
||||
|
||||
void *mg_flash_start(void) {
|
||||
return NULL;
|
||||
}
|
||||
size_t mg_flash_size(void) {
|
||||
return 0;
|
||||
}
|
||||
size_t mg_flash_sector_size(void) {
|
||||
return 0;
|
||||
}
|
||||
size_t mg_flash_write_align(void) {
|
||||
return 0;
|
||||
}
|
||||
int mg_flash_bank(void) {
|
||||
return 0;
|
||||
}
|
||||
bool mg_flash_erase(void *location) {
|
||||
(void) location;
|
||||
return false;
|
||||
}
|
||||
bool mg_flash_swap_bank(void) {
|
||||
return true;
|
||||
}
|
||||
bool mg_flash_write(void *addr, const void *buf, size_t len) {
|
||||
(void) addr, (void) buf, (void) len;
|
||||
return false;
|
||||
}
|
||||
void mg_device_reset(void) {
|
||||
esp_restart();
|
||||
}
|
||||
|
||||
#include "esp_app_format.h"
|
||||
#include "esp_ota_ops.h"
|
||||
|
||||
static size_t s_size = 0; // Firmware size to flash. In-progress indicator
|
||||
static bool rx_checked = false; // Whether firmware being received has been checked as valid
|
||||
const esp_partition_t * update_partition = NULL; // The partition the update is being applied to
|
||||
esp_ota_handle_t update_handle = 0; // Handle of the current update process
|
||||
|
||||
const esp_partition_t * get_partition_from_fw(int fw) {
|
||||
if (MG_FIRMWARE_CURRENT == fw) {
|
||||
return esp_ota_get_running_partition();
|
||||
}
|
||||
const esp_partition_t * p = esp_ota_get_last_invalid_partition();
|
||||
if (NULL == p) {
|
||||
p = esp_ota_get_next_update_partition(NULL);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
// Returns true if the data buffer contains the header of a valid firmware
|
||||
const size_t fw_size_required = sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t);
|
||||
bool check_fw_header(const void* buf, size_t len) {
|
||||
// Ensure we have received enough data to do the check
|
||||
if (len < fw_size_required) {
|
||||
MG_ERROR(("Insufficient data to check firmware header - %d bytes, require %d bytes", len, fw_size_required));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check the magic word of the received firmare
|
||||
esp_app_desc_t* rx_app_info = (esp_app_desc_t*)(((char*)buf) + sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t));
|
||||
if (ESP_APP_DESC_MAGIC_WORD != rx_app_info->magic_word) {
|
||||
MG_ERROR(("Invalid app - invalid magic word"));
|
||||
return false;
|
||||
}
|
||||
MG_INFO(("Received firmware: %s %s", rx_app_info->project_name, rx_app_info->version));
|
||||
|
||||
// Get the name/version of the running firmware
|
||||
const esp_partition_t *current = esp_ota_get_running_partition();
|
||||
esp_app_desc_t curr_app_info;
|
||||
esp_err_t res = esp_ota_get_partition_description(current, &curr_app_info);
|
||||
if (ESP_OK != res) {
|
||||
MG_ERROR(("Unable to get name/version of running firmware"));
|
||||
return false;
|
||||
}
|
||||
MG_INFO(("Running firmware: %s %s", curr_app_info.project_name, curr_app_info.version));
|
||||
|
||||
// Check the name of the new firmware is the same as the old firmware
|
||||
if (memcmp(curr_app_info.project_name, rx_app_info->project_name, sizeof(curr_app_info.project_name)) != 0) {
|
||||
MG_ERROR(("Firmware name is different. Wrong firmware uploaded! Current %s Uploaded %s", curr_app_info.project_name, rx_app_info->project_name));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check the version of the new firmware is different from the old firmware
|
||||
if (memcmp(curr_app_info.version, rx_app_info->version, sizeof(curr_app_info.version)) == 0) {
|
||||
MG_ERROR(("Firmware version is the same. Wrong firmware uploaded! Current %s, Uploaded %s", curr_app_info.version, rx_app_info->version));
|
||||
//return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t mg_ota_size(int fw) {
|
||||
const esp_partition_t *p = get_partition_from_fw(fw);
|
||||
if (NULL == p) {
|
||||
return 0;
|
||||
}
|
||||
return p->size;
|
||||
}
|
||||
|
||||
bool mg_ota_begin(size_t new_firmware_size) {
|
||||
rx_checked = false;
|
||||
if (s_size) {
|
||||
MG_ERROR(("OTA already in progress. Call mg_ota_end()"));
|
||||
return false;
|
||||
}
|
||||
int partition_size = mg_ota_size(MG_FIRMWARE_PREVIOUS);
|
||||
if (new_firmware_size > partition_size) {
|
||||
MG_ERROR(("Firmware %lu bytes, max %lu", new_firmware_size, partition_size));
|
||||
return false;
|
||||
}
|
||||
update_partition = esp_ota_get_next_update_partition(NULL);
|
||||
if (NULL == update_partition) {
|
||||
MG_ERROR(("esp_ota_get_next_update_partition returned NULL"));
|
||||
return false;
|
||||
}
|
||||
esp_err_t res = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle);
|
||||
if (res != ESP_OK) {
|
||||
esp_ota_abort(update_handle);
|
||||
MG_ERROR(("esp_ota_begin failed (%s)", esp_err_to_name(res)));
|
||||
return false;
|
||||
}
|
||||
s_size = new_firmware_size;
|
||||
MG_INFO(("Starting OTA, firmware size %lu", s_size));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool mg_ota_write(const void *buf, size_t len) {
|
||||
if (s_size == 0) {
|
||||
MG_ERROR(("OTA is not started, call mg_ota_begin()"));
|
||||
return false;
|
||||
}
|
||||
if (!rx_checked) {
|
||||
if (!check_fw_header(buf, len)) {
|
||||
return false;
|
||||
}
|
||||
rx_checked = true;
|
||||
}
|
||||
esp_err_t res = esp_ota_write(update_handle, buf, len);
|
||||
if (res != ESP_OK) {
|
||||
esp_ota_abort(update_handle);
|
||||
MG_ERROR(("esp_ota_write FAILED (%s)", esp_err_to_name(res)));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool mg_ota_end(void) {
|
||||
if (0 == s_size) {
|
||||
MG_INFO(("Finishing OTA: fail"));
|
||||
return false;
|
||||
}
|
||||
s_size = 0;
|
||||
esp_err_t err = esp_ota_end(update_handle);
|
||||
if (err != ESP_OK) {
|
||||
MG_ERROR(("esp_ota_end failed (%s)!", esp_err_to_name(err)));
|
||||
return false;
|
||||
}
|
||||
err = esp_ota_set_boot_partition(update_partition);
|
||||
if (err != ESP_OK) {
|
||||
MG_ERROR(("esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err)));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool mg_ota_commit(void) {
|
||||
esp_ota_mark_app_valid_cancel_rollback();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool mg_ota_rollback(void) {
|
||||
if(esp_ota_check_rollback_is_possible()) {
|
||||
esp_ota_mark_app_invalid_rollback_and_reboot();
|
||||
return true;
|
||||
}
|
||||
MG_ERROR(("Rollback NOT possible"));
|
||||
return false;
|
||||
}
|
||||
|
||||
int mg_ota_status(int fw) {
|
||||
const esp_partition_t *p = get_partition_from_fw(fw);
|
||||
if (NULL == p) {
|
||||
return 0;
|
||||
}
|
||||
int status = MG_OTA_UNAVAILABLE;
|
||||
|
||||
esp_ota_img_states_t img_state = ESP_OTA_IMG_UNDEFINED;
|
||||
esp_err_t res = esp_ota_get_state_partition(p, &img_state);
|
||||
if (ESP_OK == res) {
|
||||
if (ESP_OTA_IMG_VALID == img_state) {
|
||||
status = MG_OTA_COMMITTED;
|
||||
} else if (ESP_OTA_IMG_UNDEFINED == img_state) {
|
||||
status = MG_OTA_UNCOMMITTED;
|
||||
} else if (ESP_OTA_IMG_INVALID == img_state) {
|
||||
status = MG_OTA_UNAVAILABLE;
|
||||
} else if (ESP_OTA_IMG_ABORTED == img_state) {
|
||||
status = MG_OTA_UNAVAILABLE;
|
||||
} else if (ESP_OTA_IMG_NEW == img_state) {
|
||||
status = MG_OTA_FIRST_BOOT;
|
||||
} else if (ESP_OTA_IMG_PENDING_VERIFY == img_state) {
|
||||
status = MG_OTA_UNCOMMITTED;
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
uint32_t mg_ota_crc32(int fw) {
|
||||
(void) fw;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t mg_ota_timestamp(int fw) {
|
||||
const esp_partition_t *p = get_partition_from_fw(fw);
|
||||
|
||||
esp_app_desc_t app;
|
||||
esp_err_t res = esp_ota_get_partition_description(p, &app);
|
||||
if (ESP_OK != res)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct tm datetime = {};
|
||||
if (NULL == strptime(app.date, "%b %d %Y", &datetime))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (NULL == strptime(app.time, "%H:%M:%S", &datetime))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return mktime(&datetime);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.h
|
||||
@@ -1,4 +0,0 @@
|
||||
#define MG_ARCH MG_ARCH_ESP32
|
||||
|
||||
#define MG_TLS MG_TLS_NONE // change to 'MG_TLS_MBED' to enable TLS
|
||||
#define MG_OTA MG_OTA_CUSTOM
|
||||
@@ -1 +0,0 @@
|
||||
../../net.c
|
||||
@@ -1 +0,0 @@
|
||||
../../net.h
|
||||
@@ -1 +0,0 @@
|
||||
../../packed_fs.c
|
||||
@@ -1,104 +0,0 @@
|
||||
// Code taken from the ESP32 IDF WiFi station Example
|
||||
|
||||
#include <string.h>
|
||||
#include "esp_event.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_system.h"
|
||||
#include "esp_wifi.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/event_groups.h"
|
||||
#include "freertos/task.h"
|
||||
#include "nvs_flash.h"
|
||||
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/sys.h"
|
||||
|
||||
#include "mongoose.h"
|
||||
|
||||
static EventGroupHandle_t s_wifi_event_group;
|
||||
|
||||
/* The event group allows multiple bits for each event, but we only care about
|
||||
* two events:
|
||||
* - we are connected to the AP with an IP
|
||||
* - we failed to connect after the maximum amount of retries */
|
||||
#define WIFI_CONNECTED_BIT BIT0
|
||||
#define WIFI_FAIL_BIT BIT1
|
||||
|
||||
static int s_retry_num = 0;
|
||||
|
||||
static void event_handler(void *arg, esp_event_base_t event_base,
|
||||
int32_t event_id, void *event_data) {
|
||||
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
|
||||
esp_wifi_connect();
|
||||
} else if (event_base == WIFI_EVENT &&
|
||||
event_id == WIFI_EVENT_STA_DISCONNECTED) {
|
||||
if (s_retry_num < 10) {
|
||||
esp_wifi_connect();
|
||||
s_retry_num++;
|
||||
MG_INFO(("retry to connect to the AP"));
|
||||
} else {
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
||||
}
|
||||
MG_ERROR(("connect to the AP fail"));
|
||||
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
|
||||
ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
|
||||
MG_INFO(("IP ADDRESS:" IPSTR, IP2STR(&event->ip_info.ip)));
|
||||
s_retry_num = 0;
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_init(const char *ssid, const char *pass) {
|
||||
esp_err_t ret = nvs_flash_init();
|
||||
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
|
||||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||
ret = nvs_flash_init();
|
||||
}
|
||||
ESP_ERROR_CHECK(ret);
|
||||
|
||||
s_wifi_event_group = xEventGroupCreate();
|
||||
|
||||
ESP_ERROR_CHECK(esp_netif_init());
|
||||
|
||||
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
||||
esp_netif_create_default_wifi_sta();
|
||||
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||
|
||||
esp_event_handler_instance_t instance_any_id;
|
||||
esp_event_handler_instance_t instance_got_ip;
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
||||
WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, &instance_any_id));
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
||||
IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, &instance_got_ip));
|
||||
|
||||
wifi_config_t c = {.sta = {.threshold = {.authmode = WIFI_AUTH_WPA2_PSK},
|
||||
.pmf_cfg = {.capable = true, .required = false}}};
|
||||
snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), "%s", ssid);
|
||||
snprintf((char *) c.sta.password, sizeof(c.sta.password), "%s", pass);
|
||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
||||
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &c));
|
||||
ESP_ERROR_CHECK(esp_wifi_start());
|
||||
MG_DEBUG(("wifi_init_sta finished."));
|
||||
|
||||
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
||||
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
|
||||
pdFALSE, pdFALSE, portMAX_DELAY);
|
||||
|
||||
if (bits & WIFI_CONNECTED_BIT) {
|
||||
MG_INFO(("connected to ap SSID:%s password:%s", ssid, pass));
|
||||
} else if (bits & WIFI_FAIL_BIT) {
|
||||
MG_ERROR(("Failed to connect to SSID:%s, password:%s", ssid, pass));
|
||||
} else {
|
||||
MG_ERROR(("UNEXPECTED EVENT"));
|
||||
}
|
||||
|
||||
/* The event will not be processed after unregister */
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
||||
IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
||||
WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
|
||||
vEventGroupDelete(s_wifi_event_group);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, , 0x6000
|
||||
otadata, data, ota, , 0x2000,
|
||||
phy_init, data, phy, , 0x1000,
|
||||
ota_0, app, ota_0, , 948K,
|
||||
ota_1, app, ota_1, , 948K,
|
||||
|
@@ -1,5 +0,0 @@
|
||||
CONFIG_PARTITION_TABLE_CUSTOM=y
|
||||
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
|
||||
CONFIG_PARTITION_TABLE_FILENAME="partitions.csv"
|
||||
CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
|
||||
#CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
|
||||
@@ -1 +0,0 @@
|
||||
../../infineon/
|
||||
@@ -1,53 +0,0 @@
|
||||
CFLAGS = -W -Wall -Wextra -Wundef -Wshadow -Wdouble-promotion
|
||||
CFLAGS += -Wformat-truncation -fno-common -Wconversion
|
||||
CFLAGS += -g3 -Os -ffunction-sections -fdata-sections
|
||||
CFLAGS += -I. -Icmsis_core/CMSIS/Core/Include
|
||||
CFLAGS += -D__SAME54P20A__ -Icmsis_sam/include
|
||||
CFLAGS += -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp
|
||||
LDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map
|
||||
|
||||
SOURCES = main.c syscalls.c startup.c
|
||||
|
||||
# Mongoose-specific source code files and build options. See https://mongoose.ws/documentation/#build-options
|
||||
SOURCES += mongoose.c net.c packed_fs.c
|
||||
CFLAGS += -DMG_ENABLE_TCPIP=1 -DMG_ARCH=MG_ARCH_ARMGCC -DMG_ENABLE_CUSTOM_MILLIS=1 -DMG_ENABLE_LINES=1
|
||||
CFLAGS += -DMG_ENABLE_DRIVER_SAME54=1 -DMG_ENABLE_CUSTOM_RANDOM=1 $(CFLAGS_EXTRA)
|
||||
|
||||
# Example specific build options. See README.md
|
||||
CFLAGS += -DHTTP_URL=\"http://0.0.0.0/\"
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
RM = cmd /C del /Q /F
|
||||
else
|
||||
RM = rm -rf
|
||||
endif
|
||||
|
||||
build: firmware.bin
|
||||
|
||||
firmware.bin: firmware.elf
|
||||
arm-none-eabi-objcopy -O binary $< $@
|
||||
|
||||
firmware.elf: cmsis_core cmsis_sam hal.h link.ld Makefile $(SOURCES)
|
||||
arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(CFLAGS_EXTRA) $(LDFLAGS) -o $@
|
||||
|
||||
flash: firmware.bin
|
||||
bossac -p /dev/cu.usb* -w -v -b $<
|
||||
|
||||
cmsis_core:
|
||||
git clone --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@
|
||||
cmsis_sam:
|
||||
curl -sL https://packs.download.microchip.com/Microchip.SAME54_DFP.3.9.244.atpack -o $@.zip
|
||||
mkdir $@ && cd $@ && unzip ../$@.zip
|
||||
|
||||
# Automated test via https://vcon.io/automated-firmware-tests/. Set VCON_API_KEY and update DEVICE_URL
|
||||
DEVICE_URL ?= https://dash.vcon.io/api/v3/devices/9
|
||||
update: firmware.bin
|
||||
curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<
|
||||
|
||||
test update: CFLAGS += -DUART_DEBUG=USART1
|
||||
test: update
|
||||
curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt
|
||||
grep 'READY, IP:' /tmp/output.txt # Check for network init
|
||||
|
||||
clean:
|
||||
$(RM) firmware.* cmsis_core cmsis_sam *.zip
|
||||
@@ -1,219 +0,0 @@
|
||||
// Copyright (c) 2022 Cesanta Software Limited
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
// https://ww1.microchip.com/downloads/aemDocuments/documents/MCU32/ProductDocuments/DataSheets/SAM-D5x-E5x-Family-Data-Sheet-DS60001507.pdf
|
||||
// https://ww1.microchip.com/downloads/en/DeviceDoc/70005321A.pdf
|
||||
|
||||
#ifndef LED_PIN
|
||||
#define LED_PIN PIN('C', 18)
|
||||
#endif
|
||||
|
||||
#ifndef BUTTON_PIN
|
||||
#define BUTTON_PIN PIN('B', 31)
|
||||
#endif
|
||||
|
||||
#ifndef UART_DEBUG
|
||||
#define UART_DEBUG USART1
|
||||
#endif
|
||||
|
||||
#pragma once
|
||||
#include <sam.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define BIT(x) (1UL << (x))
|
||||
#define SETBITS(R, CLEARMASK, SETMASK) (R) = ((R) & ~(CLEARMASK)) | (SETMASK)
|
||||
#define PIN(bank, num) ((((bank) - 'A') << 8) | (num))
|
||||
#define PINNO(pin) (pin & 255)
|
||||
#define PINBANK(pin) (pin >> 8)
|
||||
|
||||
static inline void spin(volatile uint32_t count) {
|
||||
while (count--) (void) 0;
|
||||
}
|
||||
|
||||
static inline uint32_t clock_sys_freq(void) {
|
||||
return 48000000U;
|
||||
}
|
||||
|
||||
enum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_AF, GPIO_MODE_ANALOG };
|
||||
enum { GPIO_OTYPE_PUSH_PULL, GPIO_OTYPE_OPEN_DRAIN };
|
||||
enum { GPIO_SPEED_LOW, GPIO_SPEED_MEDIUM, GPIO_SPEED_HIGH, GPIO_SPEED_INSANE };
|
||||
enum { GPIO_PULL_NONE, GPIO_PULL_UP, GPIO_PULL_DOWN };
|
||||
#define GPIO(N) ((port_group_registers_t *) (PORT_BASE_ADDRESS + 0x80 * (N)))
|
||||
typedef port_group_registers_t GPIO_TypeDef;
|
||||
static inline GPIO_TypeDef *gpio_bank(uint16_t pin) {
|
||||
return GPIO(PINBANK(pin));
|
||||
}
|
||||
static inline void gpio_toggle(uint16_t pin) {
|
||||
gpio_bank(pin)->PORT_OUTTGL = BIT(PINNO(pin));
|
||||
}
|
||||
static inline bool gpio_read(uint16_t pin) {
|
||||
return gpio_bank(pin)->PORT_IN & BIT(PINNO(pin));
|
||||
}
|
||||
static inline void gpio_write(uint16_t pin, bool val) {
|
||||
GPIO_TypeDef *gpio = gpio_bank(pin);
|
||||
if (val) {
|
||||
gpio->PORT_OUTSET = BIT(PINNO(pin));
|
||||
} else {
|
||||
gpio->PORT_OUTCLR = BIT(PINNO(pin));
|
||||
}
|
||||
}
|
||||
static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type,
|
||||
uint8_t speed, uint8_t pull, uint8_t af) {
|
||||
(void) type, (void) speed, (void) pull, (void) af;
|
||||
GPIO_TypeDef *gpio = gpio_bank(pin);
|
||||
uint32_t mask = BIT(PINNO(pin));
|
||||
MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_PORT_Msk;
|
||||
if (mode == GPIO_MODE_INPUT) {
|
||||
gpio->PORT_DIRCLR = mask;
|
||||
} else {
|
||||
gpio->PORT_DIRSET = mask;
|
||||
}
|
||||
}
|
||||
static inline void gpio_input(uint16_t pin) {
|
||||
gpio_init(pin, GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
||||
GPIO_PULL_NONE, 0);
|
||||
}
|
||||
static inline void gpio_output(uint16_t pin) {
|
||||
gpio_init(pin, GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
||||
GPIO_PULL_NONE, 0);
|
||||
}
|
||||
|
||||
typedef sercom_usart_int_registers_t USART_TypeDef;
|
||||
#define USART1 ((USART_TypeDef *) SERCOM0_BASE_ADDRESS)
|
||||
#define USART2 ((USART_TypeDef *) SERCOM1_BASE_ADDRESS)
|
||||
#define USART3 ((USART_TypeDef *) SERCOM2_BASE_ADDRESS)
|
||||
static inline bool uart_init(USART_TypeDef *uart, unsigned long baud) {
|
||||
uint16_t rx = 0, tx = 0; // Pins
|
||||
uint8_t rx_mux = 0, tx_mux = 0;
|
||||
if (uart == USART1) {
|
||||
MCLK_REGS->MCLK_APBAMASK |= MCLK_APBAMASK_SERCOM0_Msk;
|
||||
GCLK_REGS->GCLK_PCHCTRL[SERCOM0_GCLK_ID_CORE] =
|
||||
GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN_Msk;
|
||||
GCLK_REGS->GCLK_PCHCTRL[SERCOM0_GCLK_ID_SLOW] =
|
||||
GCLK_PCHCTRL_GEN_GCLK3 | GCLK_PCHCTRL_CHEN_Msk;
|
||||
tx = PIN('A', 4), rx = PIN('A', 5);
|
||||
rx_mux = MUX_PA05D_SERCOM0_PAD1, tx_mux = MUX_PA04D_SERCOM0_PAD0;
|
||||
} else if (uart == USART2) {
|
||||
MCLK_REGS->MCLK_APBAMASK |= MCLK_APBAMASK_SERCOM1_Msk;
|
||||
tx = PIN('C', 27), rx = PIN('C', 28);
|
||||
} else if (uart == USART3) {
|
||||
MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_SERCOM2_Msk;
|
||||
tx = PIN('A', 9), rx = PIN('A', 8);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
gpio_bank(rx)->PORT_WRCONFIG =
|
||||
PORT_WRCONFIG_PMUX(rx_mux) | PORT_WRCONFIG_WRPMUX(1) |
|
||||
PORT_WRCONFIG_PMUXEN(1) | PORT_WRCONFIG_WRPINCFG(1) | BIT(PINNO(rx));
|
||||
gpio_bank(tx)->PORT_WRCONFIG =
|
||||
PORT_WRCONFIG_PMUX(tx_mux) | PORT_WRCONFIG_WRPMUX(1) |
|
||||
PORT_WRCONFIG_PMUXEN(1) | PORT_WRCONFIG_WRPINCFG(1) | BIT(PINNO(tx));
|
||||
uart->SERCOM_CTRLA = SERCOM_USART_INT_CTRLA_DORD(1) |
|
||||
SERCOM_USART_INT_CTRLA_MODE(1 /* INT_CLK */) |
|
||||
SERCOM_USART_INT_CTRLA_RXPO(1 /* PAD1 */) |
|
||||
SERCOM_USART_INT_CTRLA_TXPO(0 /* PAD0 */) |
|
||||
SERCOM_USART_INT_CTRLA_SAMPR(1);
|
||||
uart->SERCOM_BAUD = (uint16_t) (clock_sys_freq() / (16 * baud));
|
||||
uart->SERCOM_CTRLB = SERCOM_USART_INT_CTRLB_RXEN(1) |
|
||||
SERCOM_USART_INT_CTRLB_TXEN(1) |
|
||||
SERCOM_USART_INT_CTRLB_CHSIZE(0);
|
||||
while (uart->SERCOM_SYNCBUSY & SERCOM_USART_INT_SYNCBUSY_CTRLB_Msk) spin(1);
|
||||
uart->SERCOM_CTRLA |= SERCOM_USART_INT_CTRLA_ENABLE(1);
|
||||
while (uart->SERCOM_SYNCBUSY & SERCOM_USART_INT_SYNCBUSY_ENABLE_Msk) spin(1);
|
||||
return true;
|
||||
}
|
||||
static inline void uart_write_byte(USART_TypeDef *uart, uint8_t byte) {
|
||||
while (!(uart->SERCOM_INTFLAG & SERCOM_USART_INT_INTFLAG_DRE_Msk)) spin(1);
|
||||
uart->SERCOM_DATA = byte;
|
||||
}
|
||||
static inline void uart_write_buf(USART_TypeDef *uart, char *buf, size_t len) {
|
||||
while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++);
|
||||
}
|
||||
static inline bool uart_read_ready(USART_TypeDef *uart) {
|
||||
return (uart->SERCOM_INTFLAG & SERCOM_USART_EXT_INTFLAG_RXC_Msk);
|
||||
}
|
||||
static inline uint8_t uart_read_byte(USART_TypeDef *uart) {
|
||||
return (uint8_t) (uart->SERCOM_DATA & 255U);
|
||||
}
|
||||
|
||||
static inline void rng_init(void) {
|
||||
MCLK_REGS->MCLK_APBCMASK |= MCLK_APBCMASK_TRNG_Msk;
|
||||
TRNG_REGS->TRNG_CTRLA = TRNG_CTRLA_ENABLE_Msk;
|
||||
}
|
||||
static inline uint32_t rng_read(void) {
|
||||
while ((TRNG_REGS->TRNG_INTFLAG & TRNG_INTFLAG_DATARDY_Msk) == 0) spin(1);
|
||||
return TRNG_REGS->TRNG_DATA;
|
||||
}
|
||||
|
||||
#define UID_BASE_W0 0x008061FC // Word 0 location of the 128-bit chip ID
|
||||
#define UID_BASE_W1_3 0x00806010 // Words 1-3 location of the 128-bit chip ID
|
||||
|
||||
#define UUID(n) ((n >= 0 && n <= 3) ? \
|
||||
(((uint8_t *) UID_BASE_W0)[n]) : \
|
||||
(((uint8_t *) UID_BASE_W1_3)[n - 4]))
|
||||
|
||||
#define GENERATE_LOCALLY_ADMINISTERED_MAC() \
|
||||
{ \
|
||||
2, UUID(0) ^ UUID(1) ^ UUID(2), UUID(3) ^ UUID(4) ^ UUID(5), \
|
||||
UUID(6) ^ UUID(7) ^ UUID(8), UUID(9) ^ UUID(10) ^ UUID(11), \
|
||||
UUID(12) ^ UUID(13) ^ UUID(14) ^ UUID(15) \
|
||||
}
|
||||
|
||||
static inline bool timer_expired(volatile uint64_t *t, uint64_t prd,
|
||||
uint64_t now) {
|
||||
if (now + prd < *t) *t = 0; // Time wrapped? Reset timer
|
||||
if (*t == 0) *t = now + prd; // Firt poll? Set expiration
|
||||
if (*t > now) return false; // Not expired yet, return
|
||||
*t = (now - *t) > prd ? now + prd : *t + prd; // Next expiration time
|
||||
return true; // Expired, return true
|
||||
}
|
||||
|
||||
static inline void clock_init(void) {
|
||||
SCB->CPACR |= (15U << 20); // Enable FPU
|
||||
SysTick_Config(clock_sys_freq() / 1000); // Sys tick every 1ms
|
||||
}
|
||||
|
||||
static inline void gpio_set_irq_handler(uint16_t pin, void (*fn)(void *),
|
||||
void *arg) {
|
||||
(void) pin, (void) fn, (void) arg;
|
||||
}
|
||||
|
||||
static inline void ethernet_init(void) {
|
||||
uint16_t pins[] = {PIN('A', 12), PIN('A', 13), PIN('A', 14), PIN('A', 15),
|
||||
PIN('A', 17), PIN('A', 18), PIN('A', 19), PIN('C', 11),
|
||||
PIN('C', 12), PIN('C', 20)};
|
||||
uint32_t af[] = {MUX_PA12L_GMAC_GRX1, MUX_PA13L_GMAC_GRX0,
|
||||
MUX_PA14L_GMAC_GTXCK, MUX_PA15L_GMAC_GRXER,
|
||||
MUX_PA17L_GMAC_GTXEN, MUX_PA18L_GMAC_GTX0,
|
||||
MUX_PA19L_GMAC_GTX1, MUX_PC11L_GMAC_GMDC,
|
||||
MUX_PC12L_GMAC_GMDIO, MUX_PC20L_GMAC_GRXDV};
|
||||
|
||||
MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_PORT_Msk;
|
||||
|
||||
for (size_t i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) {
|
||||
int bank = PINBANK(pins[i]), no = PINNO(pins[i]);
|
||||
PORT_REGS->GROUP[bank].PORT_PINCFG[no] |= PORT_PINCFG_PMUXEN_Msk;
|
||||
volatile uint8_t *m = &PORT_REGS->GROUP[bank].PORT_PMUX[no / 2], v = m[0];
|
||||
if (no & 1) {
|
||||
m[0] = (uint8_t) ((v & ~0xf0) | PORT_PMUX_PMUXO(af[i]));
|
||||
} else {
|
||||
m[0] = (uint8_t) ((v & ~0x0f) | PORT_PMUX_PMUXE(af[i]));
|
||||
}
|
||||
}
|
||||
|
||||
PORT_REGS->GROUP[0].PORT_PINCFG[17] |= PORT_PINCFG_DRVSTR_Msk;
|
||||
PORT_REGS->GROUP[0].PORT_PINCFG[18] |= PORT_PINCFG_DRVSTR_Msk;
|
||||
PORT_REGS->GROUP[0].PORT_PINCFG[19] |= PORT_PINCFG_DRVSTR_Msk;
|
||||
|
||||
// Reset PHY
|
||||
uint16_t phy_pin = PIN('C', 21);
|
||||
gpio_output(phy_pin);
|
||||
gpio_write(phy_pin, false);
|
||||
spin(999);
|
||||
gpio_write(phy_pin, true);
|
||||
spin(999);
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
ENTRY(Reset_Handler);
|
||||
MEMORY {
|
||||
flash(rx) : ORIGIN = 0x00000000, LENGTH = 1024k
|
||||
sram(rwx) : ORIGIN = 0x20000000, LENGTH = 256k
|
||||
}
|
||||
_estack = ORIGIN(sram) + LENGTH(sram);
|
||||
|
||||
SECTIONS {
|
||||
.vectors : { FILL(256) KEEP(*(.vectors)) } > flash
|
||||
.text : { *(.text*) } > flash
|
||||
.rodata : { *(.rodata*) } > flash
|
||||
|
||||
.data : {
|
||||
_sdata = .;
|
||||
*(.first_data)
|
||||
*(.data SORT(.data.*))
|
||||
_edata = .;
|
||||
} > sram AT > flash
|
||||
_sidata = LOADADDR(.data);
|
||||
|
||||
.bss : { _sbss = .; *(.bss SORT(.bss.*) COMMON) _ebss = .; } > sram
|
||||
|
||||
. = ALIGN(8);
|
||||
_end = .;
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022-2023 Cesanta Software Limited
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "hal.h"
|
||||
#include "mongoose.h"
|
||||
#include "net.h"
|
||||
|
||||
#define BLINK_PERIOD_MS 500 // LED blinking period in millis
|
||||
#define LOG_PERIOD_MS 1000 // Info log period in millis
|
||||
|
||||
void SystemInit(void) { // Called automatically by startup code
|
||||
clock_init();
|
||||
rng_init();
|
||||
}
|
||||
|
||||
static volatile uint64_t s_ticks; // Milliseconds since boot
|
||||
void SysTick_Handler(void) { // SyStick IRQ handler, triggered every 1ms
|
||||
s_ticks++;
|
||||
}
|
||||
|
||||
uint64_t mg_millis(void) { // Let Mongoose use our uptime function
|
||||
return s_ticks; // Return number of milliseconds since boot
|
||||
}
|
||||
|
||||
bool mg_random(void *buf, size_t len) { // Use on-board RNG
|
||||
for (size_t n = 0; n < len; n += sizeof(uint32_t)) {
|
||||
uint32_t r = rng_read();
|
||||
memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static void timer_fn(void *arg) {
|
||||
struct mg_tcpip_if *ifp = arg; // show network stats
|
||||
const char *names[] = {"down", "up", "req", "ready"};
|
||||
MG_INFO(("Ethernet: %s, IP: %M, rx:%u, tx:%u, dr:%u, er:%u",
|
||||
names[ifp->state], mg_print_ip4, &ifp->ip, ifp->nrecv, ifp->nsent,
|
||||
ifp->ndrop, ifp->nerr));
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
gpio_input(BUTTON_PIN);
|
||||
gpio_output(LED_PIN);
|
||||
uart_init(UART_DEBUG, 115200);
|
||||
ethernet_init();
|
||||
|
||||
MG_INFO(("Starting, CPU freq %g MHz", (double) clock_sys_freq() / 1000000));
|
||||
|
||||
struct mg_mgr mgr; // Initialise
|
||||
mg_mgr_init(&mgr); // Mongoose event manager
|
||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
||||
|
||||
// Initialise Mongoose network stack
|
||||
struct mg_tcpip_driver_same54_data driver_data = {.mdc_cr = 5};
|
||||
struct mg_tcpip_if mif = {.mac = GENERATE_LOCALLY_ADMINISTERED_MAC()/*{2, 3, 4, 5, 6, 7}*/,
|
||||
// Uncomment below for static configuration:
|
||||
// .ip = mg_htonl(MG_U32(192, 168, 0, 223)),
|
||||
// .mask = mg_htonl(MG_U32(255, 255, 255, 0)),
|
||||
// .gw = mg_htonl(MG_U32(192, 168, 0, 1)),
|
||||
.driver = &mg_tcpip_driver_same54,
|
||||
.driver_data = &driver_data};
|
||||
mg_tcpip_init(&mgr, &mif);
|
||||
mg_timer_add(&mgr, LOG_PERIOD_MS, MG_TIMER_REPEAT, timer_fn, &mif);
|
||||
|
||||
MG_INFO(("MAC: %M. Waiting for IP...", mg_print_mac, mif.mac));
|
||||
while (mif.state != MG_TCPIP_STATE_READY) {
|
||||
mg_mgr_poll(&mgr, 0);
|
||||
}
|
||||
|
||||
MG_INFO(("Initialising application..."));
|
||||
web_init(&mgr);
|
||||
|
||||
MG_INFO(("Starting event loop"));
|
||||
for (;;) {
|
||||
mg_mgr_poll(&mgr, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.h
|
||||
@@ -1 +0,0 @@
|
||||
../../net.c
|
||||
@@ -1 +0,0 @@
|
||||
../../net.h
|
||||
@@ -1 +0,0 @@
|
||||
../../packed_fs.c
|
||||
@@ -1,332 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022-2023 Cesanta Software Limited
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
void Reset_Handler(void); // Defined below
|
||||
void Dummy_Handler(void); // Defined below
|
||||
void SysTick_Handler(void); // Defined in main.c
|
||||
void SystemInit(void); // Defined in main.c, called by reset handler
|
||||
void _estack(void); // Defined in link.ld
|
||||
|
||||
#define WEAK_ALIAS __attribute__((weak, alias("Default_Handler")))
|
||||
|
||||
WEAK_ALIAS void NMI_Handler(void);
|
||||
WEAK_ALIAS void HardFault_Handler(void);
|
||||
WEAK_ALIAS void MemoryManagement_Handler(void);
|
||||
WEAK_ALIAS void BusFault_Handler(void);
|
||||
WEAK_ALIAS void UsageFault_Handler(void);
|
||||
WEAK_ALIAS void SVCall_Handler(void);
|
||||
WEAK_ALIAS void DebugMonitor_Handler(void);
|
||||
WEAK_ALIAS void PendSV_Handler(void);
|
||||
WEAK_ALIAS void SysTick_Handler(void);
|
||||
|
||||
WEAK_ALIAS void PM_Handler(void);
|
||||
WEAK_ALIAS void MCLK_Handler(void);
|
||||
WEAK_ALIAS void OSCCTRL_XOSC0_Handler(void);
|
||||
WEAK_ALIAS void OSCCTRL_XOSC1_Handler(void);
|
||||
WEAK_ALIAS void OSCCTRL_DFLL_Handler(void);
|
||||
WEAK_ALIAS void OSCCTRL_DPLL0_Handler(void);
|
||||
WEAK_ALIAS void OSCCTRL_DPLL1_Handler(void);
|
||||
WEAK_ALIAS void OSC32KCTRL_Handler(void);
|
||||
WEAK_ALIAS void SUPC_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SUPC_BODDET_Handler(void);
|
||||
WEAK_ALIAS void WDT_Handler(void);
|
||||
WEAK_ALIAS void RTC_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_0_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_1_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_2_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_3_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_4_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_5_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_6_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_7_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_8_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_9_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_10_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_11_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_12_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_13_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_14_Handler(void);
|
||||
WEAK_ALIAS void EIC_EXTINT_15_Handler(void);
|
||||
WEAK_ALIAS void FREQM_Handler(void);
|
||||
WEAK_ALIAS void NVMCTRL_0_Handler(void);
|
||||
WEAK_ALIAS void NVMCTRL_1_Handler(void);
|
||||
WEAK_ALIAS void DMAC_0_Handler(void);
|
||||
WEAK_ALIAS void DMAC_1_Handler(void);
|
||||
WEAK_ALIAS void DMAC_2_Handler(void);
|
||||
WEAK_ALIAS void DMAC_3_Handler(void);
|
||||
WEAK_ALIAS void DMAC_OTHER_Handler(void);
|
||||
WEAK_ALIAS void EVSYS_0_Handler(void);
|
||||
WEAK_ALIAS void EVSYS_1_Handler(void);
|
||||
WEAK_ALIAS void EVSYS_2_Handler(void);
|
||||
WEAK_ALIAS void EVSYS_3_Handler(void);
|
||||
WEAK_ALIAS void EVSYS_OTHER_Handler(void);
|
||||
WEAK_ALIAS void PAC_Handler(void);
|
||||
WEAK_ALIAS void RAMECC_Handler(void);
|
||||
WEAK_ALIAS void SERCOM0_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM0_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM0_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM0_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SERCOM1_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM1_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM1_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM1_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SERCOM2_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM2_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM2_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM2_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SERCOM3_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM3_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM3_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM3_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SERCOM4_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM4_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM4_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM4_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SERCOM5_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM5_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM5_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM5_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SERCOM6_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM6_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM6_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM6_OTHER_Handler(void);
|
||||
WEAK_ALIAS void SERCOM7_0_Handler(void);
|
||||
WEAK_ALIAS void SERCOM7_1_Handler(void);
|
||||
WEAK_ALIAS void SERCOM7_2_Handler(void);
|
||||
WEAK_ALIAS void SERCOM7_OTHER_Handler(void);
|
||||
WEAK_ALIAS void CAN0_Handler(void);
|
||||
WEAK_ALIAS void CAN1_Handler(void);
|
||||
WEAK_ALIAS void USB_OTHER_Handler(void);
|
||||
WEAK_ALIAS void USB_SOF_HSOF_Handler(void);
|
||||
WEAK_ALIAS void USB_TRCPT0_Handler(void);
|
||||
WEAK_ALIAS void USB_TRCPT1_Handler(void);
|
||||
WEAK_ALIAS void GMAC_Handler(void);
|
||||
WEAK_ALIAS void TCC0_OTHER_Handler(void);
|
||||
WEAK_ALIAS void TCC0_MC0_Handler(void);
|
||||
WEAK_ALIAS void TCC0_MC1_Handler(void);
|
||||
WEAK_ALIAS void TCC0_MC2_Handler(void);
|
||||
WEAK_ALIAS void TCC0_MC3_Handler(void);
|
||||
WEAK_ALIAS void TCC0_MC4_Handler(void);
|
||||
WEAK_ALIAS void TCC0_MC5_Handler(void);
|
||||
WEAK_ALIAS void TCC1_OTHER_Handler(void);
|
||||
WEAK_ALIAS void TCC1_MC0_Handler(void);
|
||||
WEAK_ALIAS void TCC1_MC1_Handler(void);
|
||||
WEAK_ALIAS void TCC1_MC2_Handler(void);
|
||||
WEAK_ALIAS void TCC1_MC3_Handler(void);
|
||||
WEAK_ALIAS void TCC2_OTHER_Handler(void);
|
||||
WEAK_ALIAS void TCC2_MC0_Handler(void);
|
||||
WEAK_ALIAS void TCC2_MC1_Handler(void);
|
||||
WEAK_ALIAS void TCC2_MC2_Handler(void);
|
||||
WEAK_ALIAS void TCC3_OTHER_Handler(void);
|
||||
WEAK_ALIAS void TCC3_MC0_Handler(void);
|
||||
WEAK_ALIAS void TCC3_MC1_Handler(void);
|
||||
WEAK_ALIAS void TCC4_OTHER_Handler(void);
|
||||
WEAK_ALIAS void TCC4_MC0_Handler(void);
|
||||
WEAK_ALIAS void TCC4_MC1_Handler(void);
|
||||
WEAK_ALIAS void TC0_Handler(void);
|
||||
WEAK_ALIAS void TC1_Handler(void);
|
||||
WEAK_ALIAS void TC2_Handler(void);
|
||||
WEAK_ALIAS void TC3_Handler(void);
|
||||
WEAK_ALIAS void TC4_Handler(void);
|
||||
WEAK_ALIAS void TC5_Handler(void);
|
||||
WEAK_ALIAS void TC6_Handler(void);
|
||||
WEAK_ALIAS void TC7_Handler(void);
|
||||
WEAK_ALIAS void PDEC_OTHER_Handler(void);
|
||||
WEAK_ALIAS void PDEC_MC0_Handler(void);
|
||||
WEAK_ALIAS void PDEC_MC1_Handler(void);
|
||||
WEAK_ALIAS void ADC0_OTHER_Handler(void);
|
||||
WEAK_ALIAS void ADC0_RESRDY_Handler(void);
|
||||
WEAK_ALIAS void ADC1_OTHER_Handler(void);
|
||||
WEAK_ALIAS void ADC1_RESRDY_Handler(void);
|
||||
WEAK_ALIAS void AC_Handler(void);
|
||||
WEAK_ALIAS void DAC_OTHER_Handler(void);
|
||||
WEAK_ALIAS void DAC_EMPTY_0_Handler(void);
|
||||
WEAK_ALIAS void DAC_EMPTY_1_Handler(void);
|
||||
WEAK_ALIAS void DAC_RESRDY_0_Handler(void);
|
||||
WEAK_ALIAS void DAC_RESRDY_1_Handler(void);
|
||||
WEAK_ALIAS void I2S_Handler(void);
|
||||
WEAK_ALIAS void PCC_Handler(void);
|
||||
WEAK_ALIAS void AES_Handler(void);
|
||||
WEAK_ALIAS void TRNG_Handler(void);
|
||||
WEAK_ALIAS void ICM_Handler(void);
|
||||
WEAK_ALIAS void PUKCC_Handler(void);
|
||||
WEAK_ALIAS void QSPI_Handler(void);
|
||||
WEAK_ALIAS void SDHC0_Handler(void);
|
||||
WEAK_ALIAS void SDHC1_Handler(void);
|
||||
|
||||
__attribute__((section(".vectors"))) void (*const tab[16 + 138])(void) = {
|
||||
_estack,
|
||||
Reset_Handler,
|
||||
NMI_Handler,
|
||||
HardFault_Handler,
|
||||
MemoryManagement_Handler,
|
||||
BusFault_Handler,
|
||||
UsageFault_Handler,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
SVCall_Handler,
|
||||
DebugMonitor_Handler,
|
||||
NULL,
|
||||
PendSV_Handler,
|
||||
SysTick_Handler,
|
||||
PM_Handler, // 0 Power
|
||||
MCLK_Handler, // 1 Main
|
||||
OSCCTRL_XOSC0_Handler, // 2 Oscillators
|
||||
OSCCTRL_XOSC1_Handler, // 3 Oscillators
|
||||
OSCCTRL_DFLL_Handler, // 4 Oscillators
|
||||
OSCCTRL_DPLL0_Handler, // 5 Oscillators
|
||||
OSCCTRL_DPLL1_Handler, // 6 Oscillators
|
||||
OSC32KCTRL_Handler, // 7 32kHz
|
||||
SUPC_OTHER_Handler, // 8 Supply
|
||||
SUPC_BODDET_Handler, // 9 Supply
|
||||
WDT_Handler, // 10 Watchdog
|
||||
RTC_Handler, // 11 Real-Time
|
||||
EIC_EXTINT_0_Handler, // 12 External
|
||||
EIC_EXTINT_1_Handler, // 13 External
|
||||
EIC_EXTINT_2_Handler, // 14 External
|
||||
EIC_EXTINT_3_Handler, // 15 External
|
||||
EIC_EXTINT_4_Handler, // 16 External
|
||||
EIC_EXTINT_5_Handler, // 17 External
|
||||
EIC_EXTINT_6_Handler, // 18 External
|
||||
EIC_EXTINT_7_Handler, // 19 External
|
||||
EIC_EXTINT_8_Handler, // 20 External
|
||||
EIC_EXTINT_9_Handler, // 21 External
|
||||
EIC_EXTINT_10_Handler, // 22 External
|
||||
EIC_EXTINT_11_Handler, // 23 External
|
||||
EIC_EXTINT_12_Handler, // 24 External
|
||||
EIC_EXTINT_13_Handler, // 25 External
|
||||
EIC_EXTINT_14_Handler, // 26 External
|
||||
EIC_EXTINT_15_Handler, // 27 External
|
||||
FREQM_Handler, // 28 Frequency
|
||||
NVMCTRL_0_Handler, // 29 Non-Volatile
|
||||
NVMCTRL_1_Handler, // 30 Non-Volatile
|
||||
DMAC_0_Handler, // 31 Direct
|
||||
DMAC_1_Handler, // 32 Direct
|
||||
DMAC_2_Handler, // 33 Direct
|
||||
DMAC_3_Handler, // 34 Direct
|
||||
DMAC_OTHER_Handler, // 35 Direct
|
||||
EVSYS_0_Handler, // 36 Event
|
||||
EVSYS_1_Handler, // 37 Event
|
||||
EVSYS_2_Handler, // 38 Event
|
||||
EVSYS_3_Handler, // 39 Event
|
||||
EVSYS_OTHER_Handler, // 40 Event
|
||||
PAC_Handler, // 41 Peripheral
|
||||
0, // 42 Reserved
|
||||
0, // 43 Reserved
|
||||
0, // 44 Reserved
|
||||
RAMECC_Handler, // 45 RAM
|
||||
SERCOM0_0_Handler, // 46 Serial
|
||||
SERCOM0_1_Handler, // 47 Serial
|
||||
SERCOM0_2_Handler, // 48 Serial
|
||||
SERCOM0_OTHER_Handler, // 49 Serial
|
||||
SERCOM1_0_Handler, // 50 Serial
|
||||
SERCOM1_1_Handler, // 51 Serial
|
||||
SERCOM1_2_Handler, // 52 Serial
|
||||
SERCOM1_OTHER_Handler, // 53 Serial
|
||||
SERCOM2_0_Handler, // 54 Serial
|
||||
SERCOM2_1_Handler, // 55 Serial
|
||||
SERCOM2_2_Handler, // 56 Serial
|
||||
SERCOM2_OTHER_Handler, // 57 Serial
|
||||
SERCOM3_0_Handler, // 58 Serial
|
||||
SERCOM3_1_Handler, // 59 Serial
|
||||
SERCOM3_2_Handler, // 60 Serial
|
||||
SERCOM3_OTHER_Handler, // 61 Serial
|
||||
SERCOM4_0_Handler, // 62 Serial
|
||||
SERCOM4_1_Handler, // 63 Serial
|
||||
SERCOM4_2_Handler, // 64 Serial
|
||||
SERCOM4_OTHER_Handler, // 65 Serial
|
||||
SERCOM5_0_Handler, // 66 Serial
|
||||
SERCOM5_1_Handler, // 67 Serial
|
||||
SERCOM5_2_Handler, // 68 Serial
|
||||
SERCOM5_OTHER_Handler, // 69 Serial
|
||||
SERCOM6_0_Handler, // 70 Serial
|
||||
SERCOM6_1_Handler, // 71 Serial
|
||||
SERCOM6_2_Handler, // 72 Serial
|
||||
SERCOM6_OTHER_Handler, // 73 Serial
|
||||
SERCOM7_0_Handler, // 74 Serial
|
||||
SERCOM7_1_Handler, // 75 Serial
|
||||
SERCOM7_2_Handler, // 76 Serial
|
||||
SERCOM7_OTHER_Handler, // 77 Serial
|
||||
CAN0_Handler, // 78 Control
|
||||
CAN1_Handler, // 79 Control
|
||||
USB_OTHER_Handler, // 80 Universal
|
||||
USB_SOF_HSOF_Handler, // 81 Universal
|
||||
USB_TRCPT0_Handler, // 82 Universal
|
||||
USB_TRCPT1_Handler, // 83 Universal
|
||||
GMAC_Handler, // 84 Ethernet
|
||||
TCC0_OTHER_Handler, // 85 Timer
|
||||
TCC0_MC0_Handler, // 86 Timer
|
||||
TCC0_MC1_Handler, // 87 Timer
|
||||
TCC0_MC2_Handler, // 88 Timer
|
||||
TCC0_MC3_Handler, // 89 Timer
|
||||
TCC0_MC4_Handler, // 90 Timer
|
||||
TCC0_MC5_Handler, // 91 Timer
|
||||
TCC1_OTHER_Handler, // 92 Timer
|
||||
TCC1_MC0_Handler, // 93 Timer
|
||||
TCC1_MC1_Handler, // 94 Timer
|
||||
TCC1_MC2_Handler, // 95 Timer
|
||||
TCC1_MC3_Handler, // 96 Timer
|
||||
TCC2_OTHER_Handler, // 97 Timer
|
||||
TCC2_MC0_Handler, // 98 Timer
|
||||
TCC2_MC1_Handler, // 99 Timer
|
||||
TCC2_MC2_Handler, // 100 Timer
|
||||
TCC3_OTHER_Handler, // 101 Timer
|
||||
TCC3_MC0_Handler, // 102 Timer
|
||||
TCC3_MC1_Handler, // 103 Timer
|
||||
TCC4_OTHER_Handler, // 104 Timer
|
||||
TCC4_MC0_Handler, // 105 Timer
|
||||
TCC4_MC1_Handler, // 106 Timer
|
||||
TC0_Handler, // 107 Basic
|
||||
TC1_Handler, // 108 Basic
|
||||
TC2_Handler, // 109 Basic
|
||||
TC3_Handler, // 110 Basic
|
||||
TC4_Handler, // 111 Basic
|
||||
TC5_Handler, // 112 Basic
|
||||
TC6_Handler, // 113 Basic
|
||||
TC7_Handler, // 114 Basic
|
||||
PDEC_OTHER_Handler, // 115 Quadrature
|
||||
PDEC_MC0_Handler, // 116 Quadrature
|
||||
PDEC_MC1_Handler, // 117 Quadrature
|
||||
ADC0_OTHER_Handler, // 118 Analog
|
||||
ADC0_RESRDY_Handler, // 119 Analog
|
||||
ADC1_OTHER_Handler, // 120 Analog
|
||||
ADC1_RESRDY_Handler, // 121 Analog
|
||||
AC_Handler, // 122 Analog
|
||||
DAC_OTHER_Handler, // 123 Digital-to-Analog
|
||||
DAC_EMPTY_0_Handler, // 124 Digital-to-Analog
|
||||
DAC_EMPTY_1_Handler, // 125 Digital-to-Analog
|
||||
DAC_RESRDY_0_Handler, // 126 Digital-to-Analog
|
||||
DAC_RESRDY_1_Handler, // 127 Digital-to-Analog
|
||||
I2S_Handler, // 128 Inter-IC
|
||||
PCC_Handler, // 129 Parallel
|
||||
AES_Handler, // 130 Advanced
|
||||
TRNG_Handler, // 131 True
|
||||
ICM_Handler, // 132 Integrity
|
||||
PUKCC_Handler, // 133 PUblic-Key
|
||||
QSPI_Handler, // 134 Quad
|
||||
SDHC0_Handler, // 135 SD/MMC
|
||||
SDHC1_Handler // 136 SD/MMC
|
||||
};
|
||||
|
||||
__attribute__((naked, noreturn)) void Reset_Handler(void) {
|
||||
// Clear BSS section, and copy data section from flash to RAM
|
||||
extern long _sbss, _ebss, _sdata, _edata, _sidata;
|
||||
for (long *src = &_sbss; src < &_ebss; src++) *src = 0;
|
||||
for (long *src = &_sdata, *dst = &_sidata; src < &_edata;) *src++ = *dst++;
|
||||
|
||||
SCB->VTOR = (uint32_t) &tab;
|
||||
SystemInit();
|
||||
|
||||
// Call main()
|
||||
extern void main(void);
|
||||
main();
|
||||
for (;;) (void) 0; // Infinite loop
|
||||
}
|
||||
|
||||
void Default_Handler(void) {
|
||||
for (;;) (void) 0;
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
// Copyright (c) 2022 Cesanta Software Limited
|
||||
// All rights reserved
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
int _fstat(int fd, struct stat *st) {
|
||||
if (fd < 0) return -1;
|
||||
st->st_mode = S_IFCHR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *_sbrk(int incr) {
|
||||
extern char _end;
|
||||
static unsigned char *heap = NULL;
|
||||
unsigned char *prev_heap;
|
||||
if (heap == NULL) heap = (unsigned char *) &_end;
|
||||
prev_heap = heap;
|
||||
heap += incr;
|
||||
return prev_heap;
|
||||
}
|
||||
|
||||
int _open(const char *path) {
|
||||
(void) path;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _close(int fd) {
|
||||
(void) fd;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _isatty(int fd) {
|
||||
(void) fd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int _lseek(int fd, int ptr, int dir) {
|
||||
(void) fd, (void) ptr, (void) dir;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void _exit(int status) {
|
||||
(void) status;
|
||||
for (;;) asm volatile("BKPT #0");
|
||||
}
|
||||
|
||||
void _kill(int pid, int sig) {
|
||||
(void) pid, (void) sig;
|
||||
}
|
||||
|
||||
int _getpid(void) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _write(int fd, char *ptr, int len) {
|
||||
(void) fd, (void) ptr, (void) len;
|
||||
if (fd == 1) uart_write_buf(UART_DEBUG, ptr, (size_t) len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _read(int fd, char *ptr, int len) {
|
||||
(void) fd, (void) ptr, (void) len;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _link(const char *a, const char *b) {
|
||||
(void) a, (void) b;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _unlink(const char *a) {
|
||||
(void) a;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int _stat(const char *path, struct stat *st) {
|
||||
(void) path, (void) st;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int mkdir(const char *path, mode_t mode) {
|
||||
(void) path, (void) mode;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void _init(void) {
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1 +0,0 @@
|
||||
../../nxp
|
||||
@@ -1 +0,0 @@
|
||||
../../pico-sdk/
|
||||
@@ -1 +0,0 @@
|
||||
../../renesas
|
||||
@@ -1 +0,0 @@
|
||||
../../stm32
|
||||
@@ -1 +0,0 @@
|
||||
../../ti
|
||||
@@ -1 +0,0 @@
|
||||
../../wch
|
||||
@@ -1 +0,0 @@
|
||||
../../zephyr/device-dashboard
|
||||
@@ -1,11 +1,13 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
SPROG ?= server # Program we are building
|
||||
CPROG ?= client # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
SOUT ?= -o $(SPROG) # Compiler argument for output file
|
||||
COUT ?= -o $(CPROG) # Compiler argument for output file
|
||||
SSOURCES = server.c mongoose.c # Source code files
|
||||
CSOURCES = client.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SSOURCES = server.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CSOURCES = client.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
#CFLAGS_MONGOOSE += -DMG_ENABLE_LINES
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
#CFLAGS_MONGOOSE += -DMG_ENABLE_LINES
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
#CFLAGS_MONGOOSE += -DMG_ENABLE_LINES
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
#CFLAGS_MONGOOSE +=
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,9 +1,11 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
PACK ?= ./pack # Packing executable
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
CFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
THISDIR = $(realpath $(CURDIR))
|
||||
ROOTDIR = $(realpath $(CURDIR)/../../../../..)
|
||||
DOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) docker.io/mdashnet/8266
|
||||
CMD ?= make -C src defconfig app
|
||||
PORT ?= /dev/ttyUSB0
|
||||
|
||||
all: example
|
||||
|
||||
example:
|
||||
true
|
||||
|
||||
build: Makefile $(wildcard src/main/*)
|
||||
$(DOCKER) $(CMD)
|
||||
|
||||
flash:
|
||||
flash: CMD = python /esp/components/esptool_py/esptool/esptool.py \
|
||||
--chip esp8266 --port $(PORT) --baud 115200 --before default_reset \
|
||||
--after hard_reset write_flash -z --flash_mode dio --flash_freq 40m \
|
||||
--flash_size 2MB 0x10000 $(THISDIR)/src/build/mongoose-example.bin
|
||||
flash: DA = --device $(PORT)
|
||||
flash: build
|
||||
|
||||
buildall:
|
||||
buildall: CMD = make -C src all
|
||||
buildall: build
|
||||
|
||||
flashall:
|
||||
flashall: CMD = python /esp/components/esptool_py/esptool/esptool.py \
|
||||
--chip esp8266 --port $(PORT) --baud 115200 --before default_reset \
|
||||
--after hard_reset write_flash -z --flash_mode dio --flash_freq 40m \
|
||||
--flash_size 2MB 0x0 $(THISDIR)/src/build/bootloader/bootloader.bin \
|
||||
0x10000 $(THISDIR)/src/build/mongoose-example.bin \
|
||||
0x8000 $(THISDIR)/src/build/partitions_singleapp.bin
|
||||
flashall: DA = --device $(PORT)
|
||||
flashall: build
|
||||
|
||||
monitor:
|
||||
monitor: CMD = /esp/tools/idf_monitor.py --port $(PORT) $(THISDIR)/src/build/mongoose-example.elf
|
||||
monitor: build
|
||||
|
||||
.PHONY: build
|
||||
|
||||
clean:
|
||||
test -d src/build && $(DOCKER) rm -rf src/build || true
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
See detailed tutorial at https://mongoose.ws/tutorials/esp8266/http-client-server/
|
||||
@@ -1,9 +0,0 @@
|
||||
#
|
||||
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
|
||||
# project subdirectory.
|
||||
#
|
||||
|
||||
PROJECT_NAME := mongoose-example
|
||||
|
||||
include $(IDF_PATH)/make/project.mk
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
#
|
||||
# Main component makefile.
|
||||
#
|
||||
# This Makefile can be left empty. By default, it will take the sources in the
|
||||
# src/ directory, compile them and link them into lib(subdirectory_name).a
|
||||
# in the build directory. This behaviour is entirely configurable,
|
||||
# please read the ESP-IDF documents if you need to do this.
|
||||
#
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
// Copyright (c) 2020 Cesanta Software Limited
|
||||
// All rights reserved
|
||||
|
||||
#include "mongoose.h"
|
||||
|
||||
#define WIFI_SSID "WIFI_NETWORK" // SET THIS!
|
||||
#define WIFI_PASS "WIFI_PASSWORD" // SET THIS!
|
||||
|
||||
#define SERVER_URL "http://0.0.0.0:80"
|
||||
#define CLIENT_URL "http://info.cern.ch"
|
||||
|
||||
// Event handler for a server (accepted) connection
|
||||
static void cb(struct mg_connection *c, int ev, void *ev_data) {
|
||||
if (ev == MG_EV_HTTP_MSG) {
|
||||
mg_http_reply(c, 200, "", "Hello from ESP!\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Event handler for a client connection - fetch the first web page in history
|
||||
// To enable TLS for HTTP,
|
||||
// 1. Copy "ca.pem" file to the ESP8266 flash FS
|
||||
// 2. Add TLS init snippet for the connection, see examples/http-client
|
||||
static void cb2(struct mg_connection *c, int ev, void *ev_data) {
|
||||
if (ev == MG_EV_CONNECT) {
|
||||
struct mg_str s = mg_url_host(CLIENT_URL);
|
||||
mg_printf(c, "GET / HTTP/1.0\r\nHost: %.*s\r\n\r\n", (int) s.len, s.buf);
|
||||
} else if (ev == MG_EV_HTTP_MSG) {
|
||||
struct mg_http_message *hm = ev_data; // Print HTTP response
|
||||
MG_INFO(("Fetched:\n%.*s", (int) hm->message.len, hm->message.buf));
|
||||
c->is_draining = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Called after we're connected to WiFi network
|
||||
static void run_mongoose(void) {
|
||||
struct mg_mgr mgr;
|
||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
||||
mg_mgr_init(&mgr);
|
||||
mg_http_listen(&mgr, SERVER_URL, cb, &mgr); // Listening server
|
||||
mg_http_connect(&mgr, CLIENT_URL, cb2, &mgr); // Example client
|
||||
MG_INFO(("Starting Mongoose web server v%s", MG_VERSION));
|
||||
for (;;) mg_mgr_poll(&mgr, 1000);
|
||||
mg_mgr_free(&mgr);
|
||||
}
|
||||
|
||||
void app_main(void) {
|
||||
// Setup wifi. This function is implemented in wifi.c
|
||||
// It blocks until connected to the configured WiFi network
|
||||
void wifi_init(const char *ssid, const char *pass);
|
||||
wifi_init(WIFI_SSID, WIFI_PASS);
|
||||
|
||||
// Done connecting to WiFi, now start HTTP server
|
||||
run_mongoose();
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../../../mongoose.h
|
||||
@@ -1,2 +0,0 @@
|
||||
#define MG_ARCH MG_ARCH_ESP8266
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
#include <string.h>
|
||||
#include "esp_event.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_system.h"
|
||||
#include "esp_wifi.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/event_groups.h"
|
||||
#include "freertos/task.h"
|
||||
#include "nvs_flash.h"
|
||||
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/sys.h"
|
||||
|
||||
#include "mongoose.h"
|
||||
|
||||
static EventGroupHandle_t s_wifi_event_group;
|
||||
|
||||
/* The event group allows multiple bits for each event, but we only care about
|
||||
* two events:
|
||||
* - we are connected to the AP with an IP
|
||||
* - we failed to connect after the maximum amount of retries */
|
||||
#define WIFI_CONNECTED_BIT BIT0
|
||||
#define WIFI_FAIL_BIT BIT1
|
||||
|
||||
static int s_retry_num = 0;
|
||||
|
||||
static void event_handler(void *arg, esp_event_base_t event_base,
|
||||
int32_t event_id, void *event_data) {
|
||||
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
|
||||
esp_wifi_connect();
|
||||
} else if (event_base == WIFI_EVENT &&
|
||||
event_id == WIFI_EVENT_STA_DISCONNECTED) {
|
||||
if (s_retry_num < 3) {
|
||||
esp_wifi_connect();
|
||||
s_retry_num++;
|
||||
MG_DEBUG(("retry to connect to the AP"));
|
||||
} else {
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
||||
}
|
||||
MG_ERROR(("connect to the AP fail"));
|
||||
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
|
||||
ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
|
||||
MG_INFO(("got ip:%s", ip4addr_ntoa(&event->ip_info.ip)));
|
||||
s_retry_num = 0;
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_init(const char *ssid, const char *pass) {
|
||||
s_wifi_event_group = xEventGroupCreate();
|
||||
tcpip_adapter_init();
|
||||
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
|
||||
&event_handler, NULL));
|
||||
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
|
||||
&event_handler, NULL));
|
||||
|
||||
wifi_config_t c = {};
|
||||
snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), "%s", ssid);
|
||||
snprintf((char *) c.sta.password, sizeof(c.sta.password), "%s", pass);
|
||||
if (pass != NULL && pass[0] != '\0') {
|
||||
c.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK;
|
||||
}
|
||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
||||
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &c));
|
||||
ESP_ERROR_CHECK(esp_wifi_start());
|
||||
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
||||
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
|
||||
pdFALSE, pdFALSE, portMAX_DELAY);
|
||||
|
||||
if (bits & WIFI_CONNECTED_BIT) {
|
||||
MG_INFO(("connected to ap SSID:%s password:%s", ssid, pass));
|
||||
} else if (bits & WIFI_FAIL_BIT) {
|
||||
MG_ERROR(("Failed to connect to SSID:%s, password:%s", ssid, pass));
|
||||
} else {
|
||||
MG_ERROR(("UNEXPECTED EVENT"));
|
||||
}
|
||||
|
||||
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP,
|
||||
&event_handler));
|
||||
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID,
|
||||
&event_handler));
|
||||
vEventGroupDelete(s_wifi_event_group);
|
||||
}
|
||||
@@ -1,524 +0,0 @@
|
||||
#
|
||||
# Automatically generated file. DO NOT EDIT.
|
||||
# Espressif IoT Development Framework (ESP-IDF) Project Configuration
|
||||
#
|
||||
CONFIG_IDF_TARGET_ESP8266=y
|
||||
CONFIG_IDF_TARGET="esp8266"
|
||||
|
||||
#
|
||||
# SDK tool configuration
|
||||
#
|
||||
CONFIG_SDK_TOOLPREFIX="xtensa-lx106-elf-"
|
||||
CONFIG_SDK_PYTHON="python"
|
||||
# CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES is not set
|
||||
CONFIG_BOOTLOADER_INIT_SPI_FLASH=y
|
||||
# CONFIG_BOOTLOADER_DISABLE_JTAG_IO is not set
|
||||
# CONFIG_BOOTLOADER_FAST_BOOT is not set
|
||||
# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
|
||||
# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
|
||||
# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set
|
||||
CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
|
||||
# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set
|
||||
# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
|
||||
CONFIG_LOG_BOOTLOADER_LEVEL=3
|
||||
# CONFIG_BOOTLOADER_APP_TEST is not set
|
||||
CONFIG_BOOTLOADER_STORE_OFFSET=0x0
|
||||
CONFIG_ESPTOOLPY_PORT="/dev/ttyACM0"
|
||||
CONFIG_ESPTOOLPY_BAUD_115200B=y
|
||||
# CONFIG_ESPTOOLPY_BAUD_230400B is not set
|
||||
# CONFIG_ESPTOOLPY_BAUD_921600B is not set
|
||||
# CONFIG_ESPTOOLPY_BAUD_2MB is not set
|
||||
# CONFIG_ESPTOOLPY_BAUD_OTHER is not set
|
||||
CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200
|
||||
CONFIG_ESPTOOLPY_BAUD=115200
|
||||
CONFIG_ESPTOOLPY_COMPRESSED=y
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set
|
||||
CONFIG_ESPTOOLPY_FLASHMODE="dio"
|
||||
CONFIG_SPI_FLASH_MODE=0x0
|
||||
# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
|
||||
# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ="40m"
|
||||
CONFIG_SPI_FLASH_FREQ=0x0
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE="4MB"
|
||||
CONFIG_SPI_FLASH_SIZE=0x400000
|
||||
CONFIG_ESPTOOLPY_BEFORE_RESET=y
|
||||
# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
|
||||
CONFIG_ESPTOOLPY_BEFORE="default_reset"
|
||||
CONFIG_ESPTOOLPY_AFTER_HARD_RESET=y
|
||||
# CONFIG_ESPTOOLPY_AFTER_SOFT_RESET is not set
|
||||
# CONFIG_ESPTOOLPY_AFTER_NORESET is not set
|
||||
CONFIG_ESPTOOLPY_AFTER="hard_reset"
|
||||
# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set
|
||||
# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set
|
||||
# CONFIG_ESPTOOLPY_MONITOR_BAUD_74880B is not set
|
||||
CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y
|
||||
# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set
|
||||
# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set
|
||||
# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set
|
||||
# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set
|
||||
CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=74880
|
||||
CONFIG_ESPTOOLPY_MONITOR_BAUD=115200
|
||||
CONFIG_PARTITION_TABLE_SINGLE_APP=y
|
||||
# CONFIG_PARTITION_TABLE_TWO_OTA is not set
|
||||
# CONFIG_PARTITION_TABLE_CUSTOM is not set
|
||||
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
|
||||
CONFIG_PARTITION_TABLE_OFFSET=0x8000
|
||||
CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv"
|
||||
CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
|
||||
# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set
|
||||
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
|
||||
# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set
|
||||
# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set
|
||||
# CONFIG_COMPILER_CXX_EXCEPTIONS is not set
|
||||
CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
|
||||
# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set
|
||||
# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set
|
||||
# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set
|
||||
# CONFIG_COMPILER_STACK_CHECK is not set
|
||||
# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set
|
||||
CONFIG_APP_UPDATE_CHECK_APP_SUM=y
|
||||
# CONFIG_APP_UPDATE_CHECK_APP_HASH is not set
|
||||
CONFIG_APP_COMPILE_TIME_DATE=y
|
||||
# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set
|
||||
# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set
|
||||
# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set
|
||||
# CONFIG_ENABLE_COAP is not set
|
||||
CONFIG_ESP_TLS_USING_MBEDTLS=y
|
||||
# CONFIG_ESP_TLS_USING_WOLFSSL is not set
|
||||
# CONFIG_ESP_TLS_SERVER is not set
|
||||
# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
|
||||
# CONFIG_ESP_WOLFSSL_INTERNAL is not set
|
||||
# CONFIG_WOLFSSL_DEBUG is not set
|
||||
CONFIG_ESP8266_NMI_WDT=y
|
||||
# CONFIG_ESP8266_XTAL_FREQ_40 is not set
|
||||
CONFIG_ESP8266_XTAL_FREQ_26=y
|
||||
CONFIG_ESP8266_XTAL_FREQ=26
|
||||
# CONFIG_ESP8266_DEFAULT_CPU_FREQ_80 is not set
|
||||
CONFIG_ESP8266_DEFAULT_CPU_FREQ_160=y
|
||||
CONFIG_ESP8266_DEFAULT_CPU_FREQ_MHZ=160
|
||||
CONFIG_ESP_FILENAME_MACRO_NO_PATH=y
|
||||
# CONFIG_ESP_FILENAME_MACRO_RAW is not set
|
||||
# CONFIG_ESP_FILENAME_MACRO_NULL is not set
|
||||
CONFIG_USING_NEW_ETS_VPRINTF=y
|
||||
# CONFIG_LINK_ETS_PRINTF_TO_IRAM is not set
|
||||
CONFIG_ETS_PRINTF_EXIT_WHEN_FLASH_RW=y
|
||||
# CONFIG_SOC_FULL_ICACHE is not set
|
||||
CONFIG_SOC_IRAM_SIZE=0xC000
|
||||
# CONFIG_DISABLE_ROM_UART_PRINT is not set
|
||||
# CONFIG_ESP_PANIC_PRINT_HALT is not set
|
||||
CONFIG_ESP_PANIC_PRINT_REBOOT=y
|
||||
# CONFIG_ESP_PANIC_SILENT_REBOOT is not set
|
||||
# CONFIG_ESP_PANIC_GDBSTUB is not set
|
||||
CONFIG_RESET_REASON=y
|
||||
CONFIG_WIFI_PPT_TASKSTACK_SIZE=5120
|
||||
CONFIG_ESP8266_CORE_GLOBAL_DATA_LINK_IRAM=y
|
||||
# CONFIG_ESP8266_OTA_FROM_OLD is not set
|
||||
# CONFIG_ESP8266_BOOT_COPY_APP is not set
|
||||
CONFIG_ESP8266_TIME_SYSCALL_USE_FRC1=y
|
||||
# CONFIG_ESP8266_TIME_SYSCALL_USE_NONE is not set
|
||||
# CONFIG_PM_ENABLE is not set
|
||||
CONFIG_SCAN_AP_MAX=99
|
||||
CONFIG_WIFI_TX_RATE_SEQUENCE_FROM_HIGH=y
|
||||
# CONFIG_ESP8266_WIFI_QOS_ENABLED is not set
|
||||
# CONFIG_ESP8266_WIFI_AMPDU_RX_ENABLED is not set
|
||||
# CONFIG_ESP8266_WIFI_AMSDU_ENABLED is not set
|
||||
CONFIG_ESP8266_WIFI_RX_BUFFER_NUM=16
|
||||
CONFIG_ESP8266_WIFI_LEFT_CONTINUOUS_RX_BUFFER_NUM=16
|
||||
CONFIG_ESP8266_WIFI_RX_PKT_NUM=7
|
||||
CONFIG_ESP8266_WIFI_TX_PKT_NUM=6
|
||||
CONFIG_ESP8266_WIFI_NVS_ENABLED=y
|
||||
CONFIG_ESP8266_WIFI_CONNECT_OPEN_ROUTER_WHEN_PWD_IS_SET=y
|
||||
CONFIG_ESP8266_WIFI_ENABLE_WPA3_SAE=y
|
||||
# CONFIG_ESP8266_WIFI_DEBUG_LOG_ENABLE is not set
|
||||
CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y
|
||||
# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set
|
||||
CONFIG_ESP_PHY_INIT_DATA_VDD33_CONST=33
|
||||
CONFIG_ESP8266_PHY_MAX_WIFI_TX_POWER=20
|
||||
# CONFIG_ESP8266_HSPI_HIGH_THROUGHPUT is not set
|
||||
CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
|
||||
CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
|
||||
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2048
|
||||
CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584
|
||||
CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584
|
||||
CONFIG_ESP_CONSOLE_UART_DEFAULT=y
|
||||
# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set
|
||||
# CONFIG_ESP_CONSOLE_UART_NONE is not set
|
||||
CONFIG_ESP_CONSOLE_UART_NUM=0
|
||||
CONFIG_ESP_CONSOLE_UART_BAUDRATE=74880
|
||||
# CONFIG_ESP_UART0_SWAP_IO is not set
|
||||
CONFIG_ESP_TASK_WDT=y
|
||||
CONFIG_ESP_TASK_WDT_PANIC=y
|
||||
# CONFIG_ESP_TASK_WDT_TIMEOUT_13N is not set
|
||||
# CONFIG_ESP_TASK_WDT_TIMEOUT_14N is not set
|
||||
CONFIG_ESP_TASK_WDT_TIMEOUT_15N=y
|
||||
CONFIG_ESP_TASK_WDT_TIMEOUT_S=15
|
||||
# CONFIG_ESP_EVENT_LOOP_PROFILING is not set
|
||||
CONFIG_ESP_EVENT_POST_FROM_ISR=y
|
||||
CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y
|
||||
# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set
|
||||
CONFIG_HTTP_BUF_SIZE=512
|
||||
CONFIG_HTTPD_MAX_REQ_HDR_LEN=512
|
||||
CONFIG_HTTPD_MAX_URI_LEN=512
|
||||
CONFIG_OTA_BUF_SIZE=256
|
||||
# CONFIG_OTA_ALLOW_HTTP is not set
|
||||
# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set
|
||||
CONFIG_FATFS_CODEPAGE_437=y
|
||||
# CONFIG_FATFS_CODEPAGE_720 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_737 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_771 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_775 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_850 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_852 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_855 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_857 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_860 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_861 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_862 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_863 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_864 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_865 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_866 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_869 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_932 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_936 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_949 is not set
|
||||
# CONFIG_FATFS_CODEPAGE_950 is not set
|
||||
CONFIG_FATFS_CODEPAGE=437
|
||||
CONFIG_FATFS_LFN_NONE=y
|
||||
# CONFIG_FATFS_LFN_HEAP is not set
|
||||
# CONFIG_FATFS_LFN_STACK is not set
|
||||
CONFIG_FATFS_FS_LOCK=0
|
||||
CONFIG_FATFS_TIMEOUT_MS=10000
|
||||
CONFIG_FATFS_PER_FILE_CACHE=y
|
||||
CONFIG_FMB_COMM_MODE_TCP_EN=y
|
||||
CONFIG_FMB_TCP_PORT_DEFAULT=502
|
||||
CONFIG_FMB_TCP_PORT_MAX_CONN=5
|
||||
CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20
|
||||
CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150
|
||||
CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200
|
||||
CONFIG_FMB_QUEUE_LENGTH=20
|
||||
CONFIG_FMB_PORT_TASK_STACK_SIZE=4096
|
||||
CONFIG_FMB_SERIAL_BUF_SIZE=256
|
||||
CONFIG_FMB_PORT_TASK_PRIO=10
|
||||
CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y
|
||||
CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233
|
||||
CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20
|
||||
CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
|
||||
CONFIG_FMB_CONTROLLER_STACK_SIZE=4096
|
||||
CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20
|
||||
CONFIG_FMB_TIMER_GROUP=0
|
||||
CONFIG_FMB_TIMER_INDEX=0
|
||||
# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set
|
||||
# CONFIG_DISABLE_FREERTOS is not set
|
||||
CONFIG_FREERTOS_UNICORE=y
|
||||
# CONFIG_FREERTOS_ENABLE_REENT is not set
|
||||
CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
|
||||
CONFIG_FREERTOS_HZ=100
|
||||
CONFIG_FREERTOS_MAX_HOOK=2
|
||||
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024
|
||||
CONFIG_FREERTOS_ISR_STACKSIZE=512
|
||||
# CONFIG_FREERTOS_EXTENED_HOOKS is not set
|
||||
CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y
|
||||
# CONFIG_FREERTOS_CODE_LINK_TO_IRAM is not set
|
||||
CONFIG_FREERTOS_TIMER_STACKSIZE=2048
|
||||
CONFIG_TASK_SWITCH_FASTER=y
|
||||
# CONFIG_USE_QUEUE_SETS is not set
|
||||
# CONFIG_ENABLE_FREERTOS_SLEEP is not set
|
||||
# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set
|
||||
# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set
|
||||
CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y
|
||||
# CONFIG_HEAP_DISABLE_IRAM is not set
|
||||
# CONFIG_HEAP_TRACING is not set
|
||||
CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y
|
||||
# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set
|
||||
# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set
|
||||
# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
|
||||
CONFIG_LOG_DEFAULT_LEVEL_INFO=y
|
||||
# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set
|
||||
# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set
|
||||
CONFIG_LOG_DEFAULT_LEVEL=3
|
||||
CONFIG_LOG_COLORS=y
|
||||
# CONFIG_LOG_SET_LEVEL is not set
|
||||
CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
|
||||
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
|
||||
# CONFIG_LWIP_L2_TO_L3_COPY is not set
|
||||
# CONFIG_LWIP_IRAM_OPTIMIZATION is not set
|
||||
CONFIG_LWIP_TIMERS_ONDEMAND=y
|
||||
CONFIG_LWIP_MAX_SOCKETS=10
|
||||
# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set
|
||||
# CONFIG_LWIP_SO_LINGER is not set
|
||||
CONFIG_LWIP_SO_REUSE=y
|
||||
CONFIG_LWIP_SO_REUSE_RXTOALL=y
|
||||
# CONFIG_LWIP_SO_RCVBUF is not set
|
||||
# CONFIG_LWIP_NETBUF_RECVINFO is not set
|
||||
CONFIG_LWIP_IP4_FRAG=y
|
||||
CONFIG_LWIP_IP6_FRAG=y
|
||||
# CONFIG_LWIP_IP4_REASSEMBLY is not set
|
||||
# CONFIG_LWIP_IP6_REASSEMBLY is not set
|
||||
# CONFIG_LWIP_IP_FORWARD is not set
|
||||
# CONFIG_LWIP_STATS is not set
|
||||
# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set
|
||||
CONFIG_LWIP_ESP_GRATUITOUS_ARP=y
|
||||
CONFIG_LWIP_GARP_TMR_INTERVAL=60
|
||||
CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
|
||||
CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
|
||||
# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set
|
||||
CONFIG_LWIP_DHCPS_LEASE_UNIT=60
|
||||
CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
|
||||
# CONFIG_LWIP_AUTOIP is not set
|
||||
# CONFIG_LWIP_IPV6_AUTOCONFIG is not set
|
||||
CONFIG_LWIP_NETIF_LOOPBACK=y
|
||||
CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8
|
||||
CONFIG_LWIP_MAX_ACTIVE_TCP=16
|
||||
CONFIG_LWIP_MAX_LISTENING_TCP=16
|
||||
CONFIG_LWIP_TCP_MAXRTX=12
|
||||
CONFIG_LWIP_TCP_SYNMAXRTX=6
|
||||
CONFIG_LWIP_TCP_MSS=1440
|
||||
CONFIG_LWIP_TCP_TMR_INTERVAL=250
|
||||
CONFIG_LWIP_TCP_MSL=60000
|
||||
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=2880
|
||||
CONFIG_LWIP_TCP_WND_DEFAULT=5760
|
||||
CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
|
||||
CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
|
||||
# CONFIG_LWIP_TCP_SACK_OUT is not set
|
||||
# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
|
||||
CONFIG_LWIP_TCP_OVERSIZE_MSS=y
|
||||
# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
|
||||
# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
|
||||
CONFIG_LWIP_TCP_RTO_TIME=3000
|
||||
CONFIG_LWIP_MAX_UDP_PCBS=16
|
||||
CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
|
||||
CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=2048
|
||||
CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
|
||||
# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set
|
||||
CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF
|
||||
# CONFIG_LWIP_PPP_SUPPORT is not set
|
||||
CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3
|
||||
CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
|
||||
# CONFIG_LWIP_MULTICAST_PING is not set
|
||||
# CONFIG_LWIP_BROADCAST_PING is not set
|
||||
CONFIG_LWIP_MAX_RAW_PCBS=16
|
||||
# CONFIG_LWIP_IPV6 is not set
|
||||
CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1
|
||||
CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000
|
||||
CONFIG_LWIP_ESP_LWIP_ASSERT=y
|
||||
# CONFIG_LWIP_DEBUG is not set
|
||||
CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
|
||||
# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
|
||||
# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
|
||||
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
|
||||
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
|
||||
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
|
||||
# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set
|
||||
# CONFIG_MBEDTLS_DEBUG is not set
|
||||
CONFIG_MBEDTLS_HAVE_TIME=y
|
||||
# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set
|
||||
CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
|
||||
# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set
|
||||
# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set
|
||||
# CONFIG_MBEDTLS_TLS_DISABLED is not set
|
||||
CONFIG_MBEDTLS_TLS_SERVER=y
|
||||
CONFIG_MBEDTLS_TLS_CLIENT=y
|
||||
CONFIG_MBEDTLS_TLS_ENABLED=y
|
||||
# CONFIG_MBEDTLS_PSK_MODES is not set
|
||||
CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
|
||||
CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y
|
||||
CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
|
||||
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
|
||||
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
|
||||
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
|
||||
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
|
||||
CONFIG_MBEDTLS_SSL_RENEGOTIATION=y
|
||||
# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set
|
||||
CONFIG_MBEDTLS_SSL_PROTO_TLS1=y
|
||||
CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y
|
||||
CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
|
||||
# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set
|
||||
CONFIG_MBEDTLS_SSL_ALPN=y
|
||||
CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y
|
||||
CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y
|
||||
CONFIG_MBEDTLS_AES_C=y
|
||||
# CONFIG_MBEDTLS_CAMELLIA_C is not set
|
||||
# CONFIG_MBEDTLS_DES_C is not set
|
||||
CONFIG_MBEDTLS_RC4_DISABLED=y
|
||||
# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set
|
||||
# CONFIG_MBEDTLS_RC4_ENABLED is not set
|
||||
# CONFIG_MBEDTLS_BLOWFISH_C is not set
|
||||
# CONFIG_MBEDTLS_XTEA_C is not set
|
||||
CONFIG_MBEDTLS_CCM_C=y
|
||||
CONFIG_MBEDTLS_GCM_C=y
|
||||
# CONFIG_MBEDTLS_RIPEMD160_C is not set
|
||||
CONFIG_MBEDTLS_PEM_PARSE_C=y
|
||||
CONFIG_MBEDTLS_PEM_WRITE_C=y
|
||||
CONFIG_MBEDTLS_X509_CRL_PARSE_C=y
|
||||
CONFIG_MBEDTLS_X509_CSR_PARSE_C=y
|
||||
CONFIG_MBEDTLS_ECP_C=y
|
||||
CONFIG_MBEDTLS_ECDH_C=y
|
||||
CONFIG_MBEDTLS_ECDSA_C=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
|
||||
CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
|
||||
# CONFIG_util_assert is not set
|
||||
# CONFIG_ESP_SHA is not set
|
||||
CONFIG_ESP_AES=y
|
||||
CONFIG_ESP_MD5=y
|
||||
CONFIG_ESP_ARC4=y
|
||||
# CONFIG_ENABLE_MDNS is not set
|
||||
CONFIG_MQTT_PROTOCOL_311=y
|
||||
CONFIG_MQTT_TRANSPORT_SSL=y
|
||||
CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
|
||||
CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
|
||||
# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set
|
||||
# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set
|
||||
# CONFIG_MQTT_CUSTOM_OUTBOX is not set
|
||||
CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
|
||||
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set
|
||||
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set
|
||||
CONFIG_NEWLIB_NANO_FORMAT=y
|
||||
# CONFIG_OPENSSL_DEBUG is not set
|
||||
CONFIG_OPENSSL_ASSERT_DO_NOTHING=y
|
||||
# CONFIG_OPENSSL_ASSERT_EXIT is not set
|
||||
CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5
|
||||
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
|
||||
CONFIG_PTHREAD_STACK_MIN=768
|
||||
CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread"
|
||||
CONFIG_SPIFFS_MAX_PARTITIONS=3
|
||||
CONFIG_SPIFFS_CACHE=y
|
||||
CONFIG_SPIFFS_CACHE_WR=y
|
||||
# CONFIG_SPIFFS_CACHE_STATS is not set
|
||||
CONFIG_SPIFFS_PAGE_CHECK=y
|
||||
CONFIG_SPIFFS_GC_MAX_RUNS=10
|
||||
# CONFIG_SPIFFS_GC_STATS is not set
|
||||
CONFIG_SPIFFS_PAGE_SIZE=256
|
||||
CONFIG_SPIFFS_OBJ_NAME_LEN=32
|
||||
CONFIG_SPIFFS_USE_MAGIC=y
|
||||
CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
|
||||
CONFIG_SPIFFS_META_LENGTH=4
|
||||
CONFIG_SPIFFS_USE_MTIME=y
|
||||
# CONFIG_SPIFFS_DBG is not set
|
||||
# CONFIG_SPIFFS_API_DBG is not set
|
||||
# CONFIG_SPIFFS_GC_DBG is not set
|
||||
# CONFIG_SPIFFS_CACHE_DBG is not set
|
||||
# CONFIG_SPIFFS_CHECK_DBG is not set
|
||||
# CONFIG_SPIFFS_TEST_VISUALISATION is not set
|
||||
CONFIG_IP_LOST_TIMER_INTERVAL=120
|
||||
CONFIG_TCPIP_ADAPTER_GLOBAL_DATA_LINK_IRAM=y
|
||||
CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
|
||||
CONFIG_VFS_SUPPORT_TERMIOS=y
|
||||
CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
|
||||
CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
|
||||
# CONFIG_WL_SECTOR_SIZE_512 is not set
|
||||
CONFIG_WL_SECTOR_SIZE_4096=y
|
||||
CONFIG_WL_SECTOR_SIZE=4096
|
||||
# CONFIG_ENABLE_UNIFIED_PROVISIONING is not set
|
||||
CONFIG_LTM_FAST=y
|
||||
CONFIG_WPA_MBEDTLS_CRYPTO=y
|
||||
# CONFIG_WPA_DEBUG_PRINT is not set
|
||||
# CONFIG_WPA_TESTING_OPTIONS is not set
|
||||
# CONFIG_WPA_WPS_WARS is not set
|
||||
# CONFIG_WPA_11KV_SUPPORT is not set
|
||||
|
||||
# Deprecated options for backward compatibility
|
||||
CONFIG_TARGET_PLATFORM="esp8266"
|
||||
CONFIG_TOOLPREFIX="xtensa-lx106-elf-"
|
||||
# CONFIG_MAKE_WARN_UNDEFINED_VARIABLES is not set
|
||||
CONFIG_FLASHMODE_QIO=y
|
||||
# CONFIG_FLASHMODE_QOUT is not set
|
||||
# CONFIG_FLASHMODE_DIO is not set
|
||||
# CONFIG_FLASHMODE_DOUT is not set
|
||||
# CONFIG_MONITOR_BAUD_9600B is not set
|
||||
# CONFIG_MONITOR_BAUD_57600B is not set
|
||||
# CONFIG_MONITOR_BAUD_74880B is not set
|
||||
CONFIG_MONITOR_BAUD_115200B=y
|
||||
# CONFIG_MONITOR_BAUD_230400B is not set
|
||||
# CONFIG_MONITOR_BAUD_921600B is not set
|
||||
# CONFIG_MONITOR_BAUD_2MB is not set
|
||||
# CONFIG_MONITOR_BAUD_OTHER is not set
|
||||
CONFIG_MONITOR_BAUD_OTHER_VAL=74880
|
||||
CONFIG_MONITOR_BAUD=115200
|
||||
CONFIG_OPTIMIZATION_LEVEL_DEBUG=y
|
||||
# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set
|
||||
CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y
|
||||
# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set
|
||||
# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set
|
||||
# CONFIG_CXX_EXCEPTIONS is not set
|
||||
CONFIG_STACK_CHECK_NONE=y
|
||||
# CONFIG_STACK_CHECK_NORM is not set
|
||||
# CONFIG_STACK_CHECK_STRONG is not set
|
||||
# CONFIG_STACK_CHECK_ALL is not set
|
||||
# CONFIG_STACK_CHECK is not set
|
||||
# CONFIG_WARN_WRITE_STRINGS is not set
|
||||
CONFIG_MAIN_TASK_STACK_SIZE=3584
|
||||
CONFIG_CONSOLE_UART_DEFAULT=y
|
||||
# CONFIG_CONSOLE_UART_CUSTOM is not set
|
||||
# CONFIG_CONSOLE_UART_NONE is not set
|
||||
CONFIG_CONSOLE_UART_NUM=0
|
||||
CONFIG_CONSOLE_UART_BAUDRATE=74880
|
||||
# CONFIG_UART0_SWAP_IO is not set
|
||||
CONFIG_TASK_WDT=y
|
||||
CONFIG_TASK_WDT_PANIC=y
|
||||
CONFIG_TASK_WDT_TIMEOUT_S=15
|
||||
CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150
|
||||
CONFIG_MB_MASTER_DELAY_MS_CONVERT=200
|
||||
CONFIG_MB_QUEUE_LENGTH=20
|
||||
CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096
|
||||
CONFIG_MB_SERIAL_BUF_SIZE=256
|
||||
CONFIG_MB_SERIAL_TASK_PRIO=10
|
||||
CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y
|
||||
CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233
|
||||
CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20
|
||||
CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
|
||||
CONFIG_MB_CONTROLLER_STACK_SIZE=4096
|
||||
CONFIG_MB_EVENT_QUEUE_TIMEOUT=20
|
||||
CONFIG_MB_TIMER_GROUP=0
|
||||
CONFIG_MB_TIMER_INDEX=0
|
||||
# CONFIG_L2_TO_L3_COPY is not set
|
||||
# CONFIG_USE_ONLY_LWIP_SELECT is not set
|
||||
CONFIG_ESP_GRATUITOUS_ARP=y
|
||||
CONFIG_GARP_TMR_INTERVAL=60
|
||||
CONFIG_TCPIP_RECVMBOX_SIZE=32
|
||||
CONFIG_TCP_MAXRTX=12
|
||||
CONFIG_TCP_SYNMAXRTX=6
|
||||
CONFIG_TCP_MSS=1440
|
||||
CONFIG_TCP_MSL=60000
|
||||
CONFIG_TCP_SND_BUF_DEFAULT=2880
|
||||
CONFIG_TCP_WND_DEFAULT=5760
|
||||
CONFIG_TCP_RECVMBOX_SIZE=6
|
||||
CONFIG_TCP_QUEUE_OOSEQ=y
|
||||
# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
|
||||
CONFIG_TCP_OVERSIZE_MSS=y
|
||||
# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set
|
||||
# CONFIG_TCP_OVERSIZE_DISABLE is not set
|
||||
CONFIG_UDP_RECVMBOX_SIZE=6
|
||||
CONFIG_TCPIP_TASK_STACK_SIZE=2048
|
||||
CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
|
||||
# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set
|
||||
CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
|
||||
# CONFIG_PPP_SUPPORT is not set
|
||||
CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
|
||||
CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
|
||||
CONFIG_ESP32_PTHREAD_STACK_MIN=768
|
||||
CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread"
|
||||
CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
|
||||
CONFIG_SUPPORT_TERMIOS=y
|
||||
# End of deprecated options
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1 +0,0 @@
|
||||
../../zephyr/http-client
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c packed_fs.c # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c packed_fs.c # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
CFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
CFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c packed_fs.c # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c packed_fs.c # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
CFLAGS_MONGOOSE += -DMG_IO_SIZE=128 -DMG_ENABLE_LINES=1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
#CFLAGS += -fsanitize=address,undefined,alignment
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
@@ -30,4 +32,4 @@ clean: # Cleanup. Delete built program and all build artifact
|
||||
|
||||
vc98: CC = cl
|
||||
vc98:
|
||||
$(CC) $(SOURCES) $(CFLAGS_MONGOOSE) -DMG_ENABLE_IPV6=0 $(CFLAGS_EXTRA) /MD /Feserver.exe
|
||||
$(CC) $(SOURCES) -I$(REPO_ROOT) $(CFLAGS_MONGOOSE) -DMG_ENABLE_IPV6=0 $(CFLAGS_EXTRA) /MD /Feserver.exe
|
||||
@@ -1,63 +0,0 @@
|
||||
#include "mongoose.h"
|
||||
#include "WiFi.h"
|
||||
|
||||
#define LED_PIN LED_BUILTIN
|
||||
#define WIFI_SSID "wifi_network_name" // Change this
|
||||
#define WIFI_PASS "wifi_password" // And this
|
||||
|
||||
struct mg_mgr mgr;
|
||||
|
||||
// Crude function to get available RAM, for quick profiling
|
||||
size_t getFreeRAM(void) {
|
||||
size_t size = 0, increment = 1024;
|
||||
void *p;
|
||||
while ((p = malloc(size)) != NULL) free(p), size += increment;
|
||||
return size;
|
||||
}
|
||||
|
||||
void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {
|
||||
if (ev == MG_EV_HTTP_MSG) {
|
||||
struct mg_http_message *hm = (struct mg_http_message *)ev_data;
|
||||
if (mg_match(hm->uri, mg_str("/api/led/on"), NULL)) {
|
||||
digitalWrite(LED_PIN, HIGH);
|
||||
mg_http_reply(c, 200, "", "{%m: %d}\n", MG_ESC("led"), digitalRead(LED_PIN));
|
||||
} else if (mg_match(hm->uri, mg_str("/api/led/off"), NULL)) {
|
||||
digitalWrite(LED_PIN, LOW);
|
||||
mg_http_reply(c, 200, "", "{%m: %d}\n", MG_ESC("led"), digitalRead(LED_PIN));
|
||||
} else {
|
||||
mg_http_reply(c, 200, "", "ok, free RAM: %u\n", xPortGetFreeHeapSize());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
Serial.begin(115200);
|
||||
while (!Serial) delay(50);
|
||||
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(WIFI_SSID, WIFI_PASS);
|
||||
while(WiFi.status() != WL_CONNECTED) Serial.print("."), delay(100);
|
||||
|
||||
Serial.println("\nConnected to the WiFi network");
|
||||
Serial.print("IP Address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
mg_mgr_init(&mgr);
|
||||
mg_log_set(MG_LL_DEBUG);
|
||||
mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);
|
||||
mg_http_listen(&mgr, "http://0.0.0.0", http_ev_handler, NULL);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
mg_mgr_poll(&mgr, 0);
|
||||
}
|
||||
|
||||
extern "C" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp) __attribute__((weak));
|
||||
extern "C" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp) {
|
||||
if (ip6_addr_isany_val(inp->ip6_addr[0].u_addr.ip6)) {
|
||||
pbuf_free(p);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.h
|
||||
@@ -1,5 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#define MG_ARCH MG_ARCH_ESP32
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.h
|
||||
@@ -1,10 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#define MG_ARCH MG_ARCH_ARMGCC // Use ARM toolchain
|
||||
#define MG_ENABLE_TCPIP 1 // Enable built-in network stack
|
||||
#define MG_ENABLE_DRIVER_IMXRT10 1 // Enable RTxx driver
|
||||
#define MG_ENABLE_CUSTOM_MILLIS 1 // Let user implement mg_millis()
|
||||
#define MG_ENABLE_POSIX_FS 0 // Disable POSIX filesystem
|
||||
|
||||
#define HTTP_URL "http://0.0.0.0"
|
||||
#define HTTPS_URL "https://0.0.0.0"
|
||||
@@ -1 +0,0 @@
|
||||
../../../device-dashboard/net.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../device-dashboard/net.h
|
||||
@@ -1 +0,0 @@
|
||||
../../../device-dashboard/packed_fs.c
|
||||
@@ -1,149 +0,0 @@
|
||||
#include "mongoose.h"
|
||||
#include "net.h"
|
||||
|
||||
void ethernet_init(void);
|
||||
struct mg_mgr mgr;
|
||||
struct mg_tcpip_driver_imxrt_data data = {.mdc_cr = 24, .phy_addr = 0};
|
||||
struct mg_tcpip_if mif = {
|
||||
// Construct MAC address from the unique chip ID
|
||||
.mac = {2, (uint8_t) (HW_OCOTP_CFG0 & 255),
|
||||
(uint8_t) ((HW_OCOTP_CFG0 >> 10) & 255),
|
||||
(uint8_t) (((HW_OCOTP_CFG0 >> 19) ^ (HW_OCOTP_CFG1 >> 19)) & 255),
|
||||
(uint8_t) ((HW_OCOTP_CFG1 >> 10) & 255),
|
||||
(uint8_t) (HW_OCOTP_CFG1 & 255)},
|
||||
// The default is DHCP. Uncomment 3 lines below for static IP config:
|
||||
// .ip = mg_htonl(MG_U32(192, 168, 0, 223)),
|
||||
// .mask = mg_htonl(MG_U32(255, 255, 255, 0)),
|
||||
// .gw = mg_htonl(MG_U32(192, 168, 0, 1)),
|
||||
.driver = &mg_tcpip_driver_imxrt,
|
||||
.driver_data = &data};
|
||||
|
||||
uint64_t mg_millis(void) { // Let Mongoose use our uptime function
|
||||
return millis();
|
||||
}
|
||||
|
||||
// Simple HTTP server that runs on port 8000
|
||||
// Mongoose event handler function, gets called by the mg_mgr_poll()
|
||||
// See https://mongoose.ws/documentation/#2-minute-integration-guide
|
||||
static void simple_http_listener(struct mg_connection *c, int ev, void *ev_data) {
|
||||
if (ev == MG_EV_HTTP_MSG) {
|
||||
// The MG_EV_HTTP_MSG event means HTTP request. `hm` holds parsed request,
|
||||
// see https://mongoose.ws/documentation/#struct-mg_http_message
|
||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||
|
||||
// If the requested URI is "/api/hi", send a simple JSON response back
|
||||
if (mg_match(hm->uri, mg_str("/api/hi"), NULL)) {
|
||||
// Use mg_http_reply() API function to generate JSON response. It adds a
|
||||
// Content-Length header automatically. In the response, we show
|
||||
// the requested URI and HTTP body:
|
||||
mg_http_reply(c, 200, "", "{%m:%m,%m:%m}\n", // See mg_snprintf doc
|
||||
MG_ESC("uri"), mg_print_esc, hm->uri.len, hm->uri.buf,
|
||||
MG_ESC("body"), mg_print_esc, hm->body.len, hm->body.buf);
|
||||
} else {
|
||||
// For all other URIs, serve some static content
|
||||
mg_http_reply(c, 200, "", "<html>millis: %lu</html>", millis());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
Serial.begin(115200);
|
||||
while (!Serial) delay(50);
|
||||
|
||||
mg_mgr_init(&mgr); // Initialise Mongoose event manager
|
||||
mg_log_set(MG_LL_DEBUG); // Set log level and log function
|
||||
mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);
|
||||
|
||||
MG_INFO(("CPU %g MHz. Starting TCP/IP stack", (double) F_CPU / 1000000));
|
||||
ethernet_init();
|
||||
mg_tcpip_init(&mgr, &mif); // Initialise built-in TCP/IP stack
|
||||
|
||||
MG_INFO(("Waiting for IP..."));
|
||||
while (mif.state != MG_TCPIP_STATE_READY) mg_mgr_poll(&mgr, 1);
|
||||
|
||||
// We start two HTTP listeners: one is a simple one on port 8000,
|
||||
// with event handler function defined above - simple_http_listener
|
||||
// See https://mongoose.ws/documentation/#2-minute-integration-guide
|
||||
// Another listener is for a more sophisticated Web device dashboard
|
||||
MG_INFO(("Starting web dashboard"));
|
||||
mg_http_listen(&mgr, "http://0.0.0.0:8000", simple_http_listener, NULL);
|
||||
web_init(&mgr); // Sophisticated Web UI, see net.c :: fn()
|
||||
}
|
||||
|
||||
void loop() {
|
||||
static uint64_t timer;
|
||||
if (mg_timer_expired(&timer, 500, mg_millis())) { // Every 500ms
|
||||
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // blink an LED
|
||||
}
|
||||
|
||||
mg_mgr_poll(&mgr, 1); // Process network events
|
||||
}
|
||||
|
||||
extern "C" void ENET_IRQHandler(void);
|
||||
|
||||
#define CLRSET(reg, clear, set) ((reg) = ((reg) & ~(clear)) | (set))
|
||||
#define RMII_PAD_INPUT_PULLDOWN 0x30E9
|
||||
#define RMII_PAD_INPUT_PULLUP 0xB0E9
|
||||
#define RMII_PAD_CLOCK 0x0031
|
||||
|
||||
// initialize the ethernet hardware
|
||||
void ethernet_init(void) {
|
||||
CCM_CCGR1 |= CCM_CCGR1_ENET(CCM_CCGR_ON);
|
||||
// configure PLL6 for 50 MHz, pg 1173
|
||||
CCM_ANALOG_PLL_ENET_CLR =
|
||||
CCM_ANALOG_PLL_ENET_POWERDOWN | CCM_ANALOG_PLL_ENET_BYPASS | 0x0F;
|
||||
CCM_ANALOG_PLL_ENET_SET = CCM_ANALOG_PLL_ENET_ENABLE |
|
||||
CCM_ANALOG_PLL_ENET_BYPASS
|
||||
/*| CCM_ANALOG_PLL_ENET_ENET2_REF_EN*/
|
||||
| CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN
|
||||
/*| CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT(1)*/
|
||||
| CCM_ANALOG_PLL_ENET_DIV_SELECT(1);
|
||||
while (!(CCM_ANALOG_PLL_ENET & CCM_ANALOG_PLL_ENET_LOCK))
|
||||
; // wait for PLL lock
|
||||
CCM_ANALOG_PLL_ENET_CLR = CCM_ANALOG_PLL_ENET_BYPASS;
|
||||
// configure REFCLK to be driven as output by PLL6, pg 326
|
||||
|
||||
CLRSET(IOMUXC_GPR_GPR1,
|
||||
IOMUXC_GPR_GPR1_ENET1_CLK_SEL | IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN,
|
||||
IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR);
|
||||
|
||||
// Configure pins
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_14 = 5; // Reset B0_14 Alt5 GPIO7.15
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_15 = 5; // Power B0_15 Alt5 GPIO7.14
|
||||
GPIO7_GDIR |= (1 << 14) | (1 << 15);
|
||||
GPIO7_DR_SET = (1 << 15); // Power on
|
||||
GPIO7_DR_CLEAR = (1 << 14); // Reset PHY chip
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_04 = RMII_PAD_INPUT_PULLDOWN; // PhyAdd[0] = 0
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_06 = RMII_PAD_INPUT_PULLDOWN; // PhyAdd[1] = 1
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_05 = RMII_PAD_INPUT_PULLUP; // Slave mode
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_11 = RMII_PAD_INPUT_PULLDOWN; // Auto MDIX
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_07 = RMII_PAD_INPUT_PULLUP;
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_08 = RMII_PAD_INPUT_PULLUP;
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_09 = RMII_PAD_INPUT_PULLUP;
|
||||
IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_10 = RMII_PAD_CLOCK;
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_05 = 3; // RXD1 B1_05 Alt3, pg 525
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_04 = 3; // RXD0 B1_04 Alt3, pg 524
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_10 = 6 | 0x10; // REFCLK B1_10 Alt6, pg 530
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_11 = 3; // RXER B1_11 Alt3, pg 531
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_06 = 3; // RXEN B1_06 Alt3, pg 526
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_09 = 3; // TXEN B1_09 Alt3, pg 529
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_07 = 3; // TXD0 B1_07 Alt3, pg 527
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_08 = 3; // TXD1 B1_08 Alt3, pg 528
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_15 = 0; // MDIO B1_15 Alt0, pg 535
|
||||
IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_14 = 0; // MDC B1_14 Alt0, pg 534
|
||||
IOMUXC_ENET_MDIO_SELECT_INPUT = 2; // GPIO_B1_15_ALT0, pg 792
|
||||
IOMUXC_ENET0_RXDATA_SELECT_INPUT = 1; // GPIO_B1_04_ALT3, pg 792
|
||||
IOMUXC_ENET1_RXDATA_SELECT_INPUT = 1; // GPIO_B1_05_ALT3, pg 793
|
||||
IOMUXC_ENET_RXEN_SELECT_INPUT = 1; // GPIO_B1_06_ALT3, pg 794
|
||||
IOMUXC_ENET_RXERR_SELECT_INPUT = 1; // GPIO_B1_11_ALT3, pg 795
|
||||
IOMUXC_ENET_IPG_CLK_RMII_SELECT_INPUT = 1; // GPIO_B1_10_ALT6, pg 791
|
||||
delay(1);
|
||||
GPIO7_DR_SET = (1 << 14); // Start PHY chip
|
||||
// ENET_MSCR = ENET_MSCR_MII_SPEED(9);
|
||||
delay(1);
|
||||
|
||||
// Setup IRQ handler
|
||||
attachInterruptVector(IRQ_ENET, ENET_IRQHandler);
|
||||
NVIC_ENABLE_IRQ(IRQ_ENET);
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../mongoose.h
|
||||
@@ -1,18 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#define MG_ARCH MG_ARCH_CUSTOM
|
||||
#define MG_ENABLE_TCPIP 1
|
||||
#define MG_ENABLE_DRIVER_W5500 1
|
||||
#define MG_ENABLE_TCPIP_DRIVER_INIT 0
|
||||
#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0
|
||||
#define MG_ENABLE_CUSTOM_MILLIS 1
|
||||
#define MG_ENABLE_CUSTOM_RANDOM 1
|
||||
#define MG_TLS MG_TLS_BUILTIN
|
||||
#define MG_IO_SIZE 256
|
||||
@@ -1,116 +0,0 @@
|
||||
#include <SPI.h>
|
||||
#include "mongoose.h"
|
||||
|
||||
#define LED_PIN LED_BUILTIN // LED pin
|
||||
#define SS_PIN 17 // Slave select pin for the W5500 module
|
||||
|
||||
struct mg_tcpip_spi spi = {
|
||||
NULL, // SPI metadata
|
||||
[](void *) { digitalWrite(SS_PIN, LOW); SPI.beginTransaction(SPISettings()); },
|
||||
[](void *) { digitalWrite(SS_PIN, HIGH); SPI.endTransaction(); },
|
||||
[](void *, uint8_t *w, uint8_t *r, size_t n) { // Execute transaction
|
||||
while (n--) {
|
||||
uint8_t c = (w != NULL) ? *w++ : 0xFF;
|
||||
uint8_t d = SPI.transfer(c);
|
||||
if (r != NULL) *r++ = d;
|
||||
}
|
||||
},
|
||||
};
|
||||
struct mg_mgr mgr; // Mongoose event manager
|
||||
struct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}}; // Network interface
|
||||
|
||||
// Used by Mongoose for time tracking
|
||||
uint64_t mg_millis(void) {
|
||||
return millis();
|
||||
}
|
||||
|
||||
// Used by Mongoose to generate random data
|
||||
bool mg_random(void *buf, size_t len) { // For TLS
|
||||
uint8_t *p = (uint8_t *) buf;
|
||||
while (len--) *p++ = (unsigned char) (rand() & 255);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Crude function to get available RAM, for quick profiling
|
||||
extern "C" char *sbrk(int);
|
||||
extern char *__brkval;
|
||||
int getFreeRAM() {
|
||||
char top;
|
||||
#ifdef __arm__
|
||||
return &top - (char *) sbrk(0);
|
||||
#elif defined(CORE_TEENSY) || (ARDUINO > 103 && ARDUINO != 151)
|
||||
return &top - __brkval;
|
||||
#else
|
||||
return __brkval ? &top - __brkval : &top - __malloc_heap_start;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {
|
||||
if (ev == MG_EV_HTTP_MSG) {
|
||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||
if (mg_match(hm->uri, mg_str("/api/led/on"), NULL)) {
|
||||
digitalWrite(LED_PIN, HIGH);
|
||||
mg_http_reply(c, 200, "", "{%m: %d}\n", MG_ESC("led"), digitalRead(LED_PIN));
|
||||
} else if (mg_match(hm->uri, mg_str("/api/led/off"), NULL)) {
|
||||
digitalWrite(LED_PIN, LOW);
|
||||
mg_http_reply(c, 200, "", "{%m: %d}\n", MG_ESC("led"), digitalRead(LED_PIN));
|
||||
} else {
|
||||
mg_http_reply(c, 200, "", "ok, free RAM: %u\n", getFreeRAM());
|
||||
}
|
||||
}
|
||||
// Initialise TLS if we're a TLS listener
|
||||
if (c->is_tls && ev == MG_EV_ACCEPT) {
|
||||
struct mg_tls_opts opts;
|
||||
memset(&opts, 0, sizeof(opts));
|
||||
|
||||
// Generated by https://mongoose.ws/tls/
|
||||
#define TLS_CERT \
|
||||
"-----BEGIN CERTIFICATE-----\n" \
|
||||
"MIIBkzCCATqgAwIBAgIEZ3E9lzAKBggqhkjOPQQDAjATMREwDwYDVQQDEwhNb25n\n" \
|
||||
"b29zZTAeFw0yNDEyMjkxMjE2MjNaFw0zNDEyMjcxMjE2MjNaMBQxEjAQBgNVBAMT\n" \
|
||||
"CWxvY2FsaG9zdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHxxuByu5K2k7DYq\n" \
|
||||
"b3eQsHb3VY5NWglWun7axh69OWF7V9OUUyON1y8ISirL0Gj5ZPOogIgrB9iOcz6K\n" \
|
||||
"q9n8NQOjezB5MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAM\n" \
|
||||
"BgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFGn8GpPWaM0JC7U4zlg+bCljSjLoMCMG\n" \
|
||||
"A1UdEQQcMBqCCWxvY2FsaG9zdIINMTkyLjE2OC4wLjEwMDAKBggqhkjOPQQDAgNH\n" \
|
||||
"ADBEAiAr1fO3QLLm+vjYarctNI+gfnxxB4edRTRmcFWHmBS8oQIgY5lkq2JCwATG\n" \
|
||||
"YsVQUmS+2Tbc7ij7lkduXO42pvr/0fw=\n" \
|
||||
"-----END CERTIFICATE-----"
|
||||
|
||||
#define TLS_KEY \
|
||||
"-----BEGIN EC PRIVATE KEY-----\n" \
|
||||
"MHcCAQEEIHKu84eEw9dX8nez82g3F94OsZJ14LVbAN+OBW+++V2poAoGCCqGSM49\n" \
|
||||
"AwEHoUQDQgAEfHG4HK7kraTsNipvd5CwdvdVjk1aCVa6ftrGHr05YXtX05RTI43X\n" \
|
||||
"LwhKKsvQaPlk86iAiCsH2I5zPoqr2fw1Aw==\n" \
|
||||
"-----END EC PRIVATE KEY-----"
|
||||
|
||||
opts.cert = mg_str(TLS_CERT);
|
||||
opts.key = mg_str(TLS_KEY);
|
||||
|
||||
mg_tls_init(c, &opts);
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200); // Initialise serial
|
||||
while (!Serial) delay(50); // for debug output
|
||||
|
||||
SPI.begin(); // Iniitialise SPI
|
||||
pinMode(SS_PIN, OUTPUT); // to communicate with W5500 Ethernet module
|
||||
pinMode(LED_PIN, OUTPUT); // Initialise LED
|
||||
|
||||
mg_mgr_init(&mgr); // Initialise Mongoose event manager
|
||||
mg_log_set(MG_LL_DEBUG); // Set debug log level
|
||||
mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL); // Log serial
|
||||
mif.driver = &mg_tcpip_driver_w5500; // Use W5500 built-in driver
|
||||
mif.driver_data = &spi; // Pass SPI interface to W5500 driver
|
||||
mg_tcpip_init(&mgr, &mif); // Initialise built-in TCP/IP stack
|
||||
|
||||
// Setup HTTP & HTTPS listeners. Respond "ok" on any HTTP request
|
||||
mg_http_listen(&mgr, "http://0.0.0.0:80", http_ev_handler, NULL);
|
||||
mg_http_listen(&mgr, "https://0.0.0.0:443", http_ev_handler, NULL);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
mg_mgr_poll(&mgr, 1);
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../http-client/esp8266/http-client-server
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1 +0,0 @@
|
||||
../../zephyr/http-server
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c packed_fs.c # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c packed_fs.c # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
CFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
CFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
@@ -1,8 +1,10 @@
|
||||
REPO_ROOT ?= ../../..
|
||||
|
||||
PROG ?= example # Program we are building
|
||||
DELETE = rm -rf # Command to remove files
|
||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
||||
SOURCES = main.c mongoose.c # Source code files
|
||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
||||
SOURCES = main.c $(REPO_ROOT)/mongoose.c # Source code files
|
||||
CFLAGS = -I$(REPO_ROOT) -W -Wall -Wextra -g -I. # Build options
|
||||
|
||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
||||
CFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.c
|
||||
@@ -1 +0,0 @@
|
||||
../../../mongoose.h
|
||||
Loaded 100 of 287 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user