25#include "boards/pico.h"
26#include "hardware/flash.h"
27#include "hardware/regs/addressmap.h"
28#include "hardware/sync.h"
36#define FLASH_TARGET_OFFSET (PICO_FLASH_SIZE_BYTES - FLASH_SECTOR_SIZE)
38#define CONFIG_MAGIC 0xCAFEBABE
39#define BYTES_PER_KIBIBYTE 1024U
40#define RAM_TOTAL_KIBIBYTES 264U
41#define RAM_BASE_ADDRESS 0x20000000U
42#define W55RP20_FLASH_TOTAL_BYTES (2U * BYTES_PER_KIBIBYTE * BYTES_PER_KIBIBYTE)
46 extern char stack_limit_sym
asm(
"__StackLimit");
47 extern char bss_end_sym
asm(
"__bss_end__");
48 extern char heap_start_sym
asm(
"__heap_start");
49 extern char heap_end_sym
asm(
"__heap_end");
50 (void)stack_limit_sym;
62 struct mallinfo current_mallinfo = mallinfo();
63 uint32_t heap_used = current_mallinfo.uordblks;
66 LOG_PLAIN(
"Static RAM (data+bss): %" PRIu32 " bytes (%.1f KB)\n", (uint32_t)static_used,
68 LOG_PLAIN(
"Heap allocated: %" PRIu32 " bytes (%.1f KB)\n", (uint32_t)heap_used,
70 LOG_PLAIN(
"Total RAM: %" PRIu32 " bytes (%.1f KB)\n", (uint32_t)total_ram,
73 uint32_t free_ram = (uint32_t)(total_ram - static_used - heap_used);
80 extern char flash_binary_start_sym
asm(
"__flash_binary_start");
81 extern char flash_binary_end_sym
asm(
"__flash_binary_end");
83 uintptr_t flash_start = (uintptr_t)&flash_binary_start_sym;
84 uintptr_t flash_end = (uintptr_t)&flash_binary_end_sym;
86 uint32_t flash_used = (uint32_t)(flash_end - flash_start);
88 uint32_t flash_free = total_flash - flash_used;
110 memcpy(cfg, tmp_cnfg,
sizeof(
config_t));
116 uint8_t buf[FLASH_PAGE_SIZE] = {0};
117 uint32_t ints = save_and_disable_interrupts();
120 restore_interrupts(ints);
146 LOG_INFO(
" net: mac=%02X:%02X:%02X:%02X:%02X:%02X ip=%u.%u.%u.%u sn=%u.%u.%u.%u "
147 "gw=%u.%u.%u.%u dns=%u.%u.%u.%u dhcp=%u\r\n",
163 LOG_INFO(
" v24: baud=%u txd_inv=%u txc_inv=%u cts_inv=%u rts_inv=%u dtr_inv=%u rxd_inv=%u "
164 "rxc_inv=%u dcd_inv=%u\r\n",
179 assert(FLASH_PAGE_SIZE >
sizeof(
config_t));
180 uint8_t buf[FLASH_PAGE_SIZE] = {0};
183 memcpy(buf, cfg_mut,
sizeof(
config_t));
185 uint32_t ints = save_and_disable_interrupts();
188 restore_interrupts(ints);
void print_flash_usage(void)
Print flash usage statistics.
void dump_config(void)
Print current configuration to console/log output.
#define RAM_TOTAL_KIBIBYTES
#define FLASH_TARGET_OFFSET
#define W55RP20_FLASH_TOTAL_BYTES
bool config_read(config_t *cfg)
Read configuration from flash.
#define BYTES_PER_KIBIBYTE
void config_write(const config_t *cfg)
Write configuration to flash.
void print_memory_usage(void)
Print RAM usage statistics.
void config_wipe(void)
Erase persistent configuration sector.
bool config_is_valid(void)
Check if flash configuration magic marker is valid.
static const config_t * nonsafe_config_read(void)
uint8_t broadcast_address[4]
V24_POLARITIES_T polarities
V24_RX_POLARITIES_T rx_polarities
V24_TX_POLARITIES_T tx_polarities
Persistent configuration blob stored in flash.
UDP_CONFIG_T local_config
NETWORK_CONFIG_T net_config
UDP_CONFIG_T remote_config