Merge pull request #195 from logicog/fix_config_reading

Fix reading configuration over flash block boundaries
This commit is contained in:
René van Dorst
2026-04-17 11:46:03 +02:00
committed by GitHub
2 changed files with 42 additions and 15 deletions
+37 -15
View File
@@ -70,6 +70,8 @@ __xdata signed char cmd_words_b[N_WORDS];
__xdata uint8_t cmd_history[CMD_HISTORY_SIZE]; __xdata uint8_t cmd_history[CMD_HISTORY_SIZE];
__xdata uint16_t cmd_history_ptr; __xdata uint16_t cmd_history_ptr;
// Error set by commands
__xdata uint8_t err_status;
inline uint8_t isletter(uint8_t l) inline uint8_t isletter(uint8_t l)
{ {
@@ -1172,6 +1174,7 @@ uint8_t cmd_tokenize(void) __banked
print_string_x(&cmd_buffer[0]); print_string_x(&cmd_buffer[0]);
write_char('<'); write_char('\n'); write_char('<'); write_char('\n');
#endif #endif
err_status = ERR_OK;
line_ptr = 0; line_ptr = 0;
is_white = 1; is_white = 1;
uint8_t word = 0; uint8_t word = 0;
@@ -1189,11 +1192,14 @@ uint8_t cmd_tokenize(void) __banked
line_ptr++; line_ptr++;
if (word >= N_WORDS - 1) { if (word >= N_WORDS - 1) {
print_string("\ntoo many arguments, truncated"); print_string("\ntoo many arguments, truncated");
err_status = ERR_TOO_MANY_ARGUMENTS;
return 1; return 1;
} }
} }
if (line_ptr == CMD_BUF_SIZE - 1) if (line_ptr == CMD_BUF_SIZE - 1) {
err_status = ERR_CMD_TOO_LONG;
return 1; return 1;
}
cmd_words_b[word++] = line_ptr; cmd_words_b[word++] = line_ptr;
cmd_words_b[word++] = -1; cmd_words_b[word++] = -1;
@@ -1481,15 +1487,20 @@ void clear_command_history(void) __banked
#define FLASH_READ_BURST_SIZE 0x100 #define FLASH_READ_BURST_SIZE 0x100
#define PASSWORD "1234" #define PASSWORD "1234"
#if CONFIG_LEN % FLASH_READ_BURST_SIZE
#error "CONFIG_LEN not a multiple of FLASH_READ_BURST_SIZE"
#endif
void execute_config(void) __banked void execute_config(void) __banked
{ {
__xdata uint32_t pos = CONFIG_START; __xdata uint32_t pos = CONFIG_START;
__xdata uint16_t len_left = CONFIG_LEN; __xdata uint8_t pages_left = CONFIG_LEN / FLASH_READ_BURST_SIZE;
// Set default password, it can be overwritten in the configuration file // Set default password, it can be overwritten in the configuration file
strtox(passwd, PASSWORD); strtox(passwd, PASSWORD);
save_cmd = 0; save_cmd = 0;
uint8_t cmd_idx = 0;
do { do {
flash_region.addr = pos; flash_region.addr = pos;
flash_region.len = FLASH_READ_BURST_SIZE; flash_region.len = FLASH_READ_BURST_SIZE;
@@ -1498,24 +1509,35 @@ void execute_config(void) __banked
__xdata uint8_t cfg_idx = 0; __xdata uint8_t cfg_idx = 0;
uint8_t c = 0; uint8_t c = 0;
do { do {
for (uint8_t cmd_idx = 0; cmd_idx < (CMD_BUF_SIZE - 1); cmd_idx++) { if (cmd_idx >= (CMD_BUF_SIZE - 1)) {
c = flash_buf[cfg_idx++]; cmd_buffer[cmd_idx] = '\0';
if (c == 0 || c == '\n') { print_string("ERROR: Command too long: ");
cmd_buffer[cmd_idx] = '\0'; print_string_x(cmd_buffer);
if (cmd_idx && !cmd_tokenize()) write_char('\n');
cmd_parser(); err_status = ERR_CMD_TOO_LONG;
if (c == 0) goto config_done;
}
c = flash_buf[cfg_idx++];
if (c == 0 || c == '\n') {
cmd_buffer[cmd_idx] = '\0';
if (cmd_idx && !cmd_tokenize()) {
cmd_parser();
if (err_status)
goto config_done; goto config_done;
break;
} }
if (c == 0)
cmd_buffer[cmd_idx] = c; goto config_done;
cmd_idx = 0;
continue;
} }
} while(cfg_idx);
len_left -= FLASH_READ_BURST_SIZE; cmd_buffer[cmd_idx] = c;
cmd_idx++;
} while (cfg_idx);
pages_left--;
pos += FLASH_READ_BURST_SIZE; pos += FLASH_READ_BURST_SIZE;
} while(len_left); } while(pages_left);
config_done: config_done:
// Start saving commands to cmd_history // Start saving commands to cmd_history
+5
View File
@@ -45,6 +45,11 @@ extern __xdata uint8_t sbuf[SBUF_SIZE];
// Size of the flash buffer used for writing to flash, must be a multiple of the flash page size (0x100) // Size of the flash buffer used for writing to flash, must be a multiple of the flash page size (0x100)
#define FLASH_BUF_SIZE 512 #define FLASH_BUF_SIZE 512
// Errors for commands
#define ERR_OK 0
#define ERR_TOO_MANY_ARGUMENTS 1
#define ERR_CMD_TOO_LONG 2
// For RX data, a propriatary RTL FRAME is inserted. Instead of 0x0800 for IPv4, // For RX data, a propriatary RTL FRAME is inserted. Instead of 0x0800 for IPv4,
// the RTL_FRAME_TAG_ID is used as part of an 8-byte tag. When VLAN is activated, // the RTL_FRAME_TAG_ID is used as part of an 8-byte tag. When VLAN is activated,
// the VLAN tag is inserted after the RTL tag // the VLAN tag is inserted after the RTL tag