feat: add delayed uart and runtime mac configuration

This commit is contained in:
2026-04-29 04:35:48 +08:00
parent c9ece65182
commit ac0c464910
7 changed files with 93 additions and 15 deletions
+70 -2
View File
@@ -13,6 +13,7 @@
#include "route_msg.h" #include "route_msg.h"
#include "app_runtime.h" #include "app_runtime.h"
#include "debug_log.h" #include "debug_log.h"
#include "ethernetif.h"
#include "uart_trans.h" #include "uart_trans.h"
#define CONFIG_RX_BUFFER_SIZE 160u #define CONFIG_RX_BUFFER_SIZE 160u
@@ -115,6 +116,19 @@ static int parse_link_uart(const char *value, uint8_t *uart)
return -1; return -1;
} }
static int parse_uart_name(const char *value, uint8_t *uart_index)
{
if (equals_ignore_case(value, "U0") || equals_ignore_case(value, "UART2")) {
*uart_index = LINK_UART_U0;
return 0;
}
if (equals_ignore_case(value, "U1") || equals_ignore_case(value, "UART3")) {
*uart_index = LINK_UART_U1;
return 0;
}
return -1;
}
static const char *link_uart_to_str(uint8_t uart) static const char *link_uart_to_str(uint8_t uart)
{ {
return (uart == LINK_UART_U1) ? "U1" : "U0"; return (uart == LINK_UART_U1) ? "U1" : "U0";
@@ -136,6 +150,15 @@ static const char *link_index_to_name(uint32_t index)
} }
} }
static void config_get_display_mac(uint8_t *mac)
{
if (ethernetif_get_effective_mac(mac) != 0u) {
return;
}
memcpy(mac, g_config.net.mac, sizeof(g_config.net.mac));
}
static int parse_link_name(const char *value, uint32_t *index) static int parse_link_name(const char *value, uint32_t *index)
{ {
if (equals_ignore_case(value, "S1")) { if (equals_ignore_case(value, "S1")) {
@@ -231,13 +254,15 @@ static at_result_t handle_summary_query(char *response, uint16_t max_len)
char mask_str[16]; char mask_str[16];
char gw_str[16]; char gw_str[16];
char mac_str[18]; char mac_str[18];
uint8_t display_mac[6];
char rip_str[CONFIG_LINK_COUNT][16]; char rip_str[CONFIG_LINK_COUNT][16];
uint32_t i; uint32_t i;
config_ip_to_str(g_config.net.ip, ip_str); config_ip_to_str(g_config.net.ip, ip_str);
config_ip_to_str(g_config.net.mask, mask_str); config_ip_to_str(g_config.net.mask, mask_str);
config_ip_to_str(g_config.net.gw, gw_str); config_ip_to_str(g_config.net.gw, gw_str);
config_mac_to_str(g_config.net.mac, mac_str); config_get_display_mac(display_mac);
config_mac_to_str(display_mac, mac_str);
for (i = 0; i < CONFIG_LINK_COUNT; ++i) { for (i = 0; i < CONFIG_LINK_COUNT; ++i) {
config_ip_to_str(g_config.links[i].remote_ip, rip_str[i]); config_ip_to_str(g_config.links[i].remote_ip, rip_str[i]);
} }
@@ -317,6 +342,14 @@ const device_config_t *config_get(void)
return &g_config; return &g_config;
} }
uint32_t config_get_uart_baudrate(uint8_t uart_index)
{
if (uart_index >= CONFIG_UART_COUNT) {
return DEFAULT_UART_BAUDRATE;
}
return g_config.uart_baudrate[uart_index];
}
device_config_t *config_get_mutable(void) device_config_t *config_get_mutable(void)
{ {
return &g_config; return &g_config;
@@ -372,6 +405,39 @@ at_result_t config_process_at_cmd(const char *cmd, char *response, uint16_t max_
snprintf(response, max_len, "+MUX:%u\r\nOK\r\n", g_config.mux_mode); snprintf(response, max_len, "+MUX:%u\r\nOK\r\n", g_config.mux_mode);
return AT_OK; return AT_OK;
} }
if (equals_ignore_case(p, "BAUD?")) {
snprintf(response, max_len,
"+BAUD:U0=%lu,U1=%lu\r\nOK\r\n",
(unsigned long)g_config.uart_baudrate[0],
(unsigned long)g_config.uart_baudrate[1]);
return AT_OK;
}
if (parse_command_with_value(p, "BAUD", &value)) {
char value_copy[48];
char *cursor;
char *token;
uint8_t uart_index;
uint32_t baudrate;
strncpy(value_copy, value, sizeof(value_copy) - 1u);
value_copy[sizeof(value_copy) - 1u] = '\0';
cursor = value_copy;
token = config_next_token(&cursor);
if (token == NULL || parse_uart_name(token, &uart_index) != 0) {
snprintf(response, max_len, "ERROR: Invalid UART\r\n");
return AT_INVALID_PARAM;
}
token = config_next_token(&cursor);
if (token == NULL || parse_u32_value(token, 1200u, 921600u, &baudrate) != 0) {
snprintf(response, max_len, "ERROR: Invalid baudrate\r\n");
return AT_INVALID_PARAM;
}
g_config.uart_baudrate[uart_index] = baudrate;
snprintf(response, max_len, "OK\r\n");
return AT_NEED_REBOOT;
}
if (parse_command_with_value(p, "MUX", &value)) { if (parse_command_with_value(p, "MUX", &value)) {
uint32_t mux_value; uint32_t mux_value;
if (parse_u32_value(value, 0u, 1u, &mux_value) != 0) { if (parse_u32_value(value, 0u, 1u, &mux_value) != 0) {
@@ -387,11 +453,13 @@ at_result_t config_process_at_cmd(const char *cmd, char *response, uint16_t max_
char mask_str[16]; char mask_str[16];
char gw_str[16]; char gw_str[16];
char mac_str[18]; char mac_str[18];
uint8_t display_mac[6];
config_ip_to_str(g_config.net.ip, ip_str); config_ip_to_str(g_config.net.ip, ip_str);
config_ip_to_str(g_config.net.mask, mask_str); config_ip_to_str(g_config.net.mask, mask_str);
config_ip_to_str(g_config.net.gw, gw_str); config_ip_to_str(g_config.net.gw, gw_str);
config_mac_to_str(g_config.net.mac, mac_str); config_get_display_mac(display_mac);
config_mac_to_str(display_mac, mac_str);
snprintf(response, max_len, "+NET:IP=%s,MASK=%s,GW=%s,MAC=%s\r\nOK\r\n", ip_str, mask_str, gw_str, mac_str); snprintf(response, max_len, "+NET:IP=%s,MASK=%s,GW=%s,MAC=%s\r\nOK\r\n", ip_str, mask_str, gw_str, mac_str);
return AT_OK; return AT_OK;
} }
+2 -1
View File
@@ -66,7 +66,7 @@ typedef struct {
#define DEFAULT_NET_IP {192, 168, 31, 100} #define DEFAULT_NET_IP {192, 168, 31, 100}
#define DEFAULT_NET_MASK {255, 255, 255, 0} #define DEFAULT_NET_MASK {255, 255, 255, 0}
#define DEFAULT_NET_GW {192, 168, 31, 1} #define DEFAULT_NET_GW {192, 168, 31, 1}
#define DEFAULT_NET_MAC {0x02, 0x00, 0x00, 0x00, 0x00, 0x01} #define DEFAULT_NET_MAC {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
#define DEFAULT_UART_BAUDRATE 115200u #define DEFAULT_UART_BAUDRATE 115200u
#define DIAG_CH390_RAW_POLL 0 #define DIAG_CH390_RAW_POLL 0
@@ -86,6 +86,7 @@ int config_save(void);
void config_set_defaults(void); void config_set_defaults(void);
const device_config_t *config_get(void); const device_config_t *config_get(void);
device_config_t *config_get_mutable(void); device_config_t *config_get_mutable(void);
uint32_t config_get_uart_baudrate(uint8_t uart_index);
at_result_t config_process_at_cmd(const char *cmd, char *response, uint16_t max_len); at_result_t config_process_at_cmd(const char *cmd, char *response, uint16_t max_len);
void ConfigTask(void *argument); void ConfigTask(void *argument);
void config_uart_idle_handler(void); void config_uart_idle_handler(void);
-7
View File
@@ -405,13 +405,6 @@ int uart_trans_init(void)
return 0; return 0;
} }
int uart_trans_config(uint8_t uart_index, uint32_t baudrate)
{
UART_HandleTypeDef *huart = (uart_index == LINK_UART_U1) ? &huart3 : &huart2;
huart->Init.BaudRate = baudrate;
return (HAL_UART_Init(huart) == HAL_OK) ? 0 : -1;
}
int uart_trans_start_all(void) int uart_trans_start_all(void)
{ {
uint32_t i; uint32_t i;
-1
View File
@@ -36,7 +36,6 @@ typedef struct {
#define UART_TX_RING_BUFFER_SIZE 256u #define UART_TX_RING_BUFFER_SIZE 256u
int uart_trans_init(void); int uart_trans_init(void);
int uart_trans_config(uint8_t uart_index, uint32_t baudrate);
int uart_trans_start_all(void); int uart_trans_start_all(void);
const char *uart_trans_send_result_to_str(uart_trans_send_result_t result); const char *uart_trans_send_result_to_str(uart_trans_send_result_t result);
uart_trans_send_result_t uart_trans_send_buffer(uart_channel_t channel, const uint8_t *data, uint16_t len); uart_trans_send_result_t uart_trans_send_buffer(uart_channel_t channel, const uint8_t *data, uint16_t len);
+1
View File
@@ -47,6 +47,7 @@ void MX_USART2_UART_Init(void);
void MX_USART3_UART_Init(void); void MX_USART3_UART_Init(void);
/* USER CODE BEGIN Prototypes */ /* USER CODE BEGIN Prototypes */
void USART_SetConfiguredBaudrates(uint32_t usart2_baudrate, uint32_t usart3_baudrate);
/* USER CODE END Prototypes */ /* USER CODE END Prototypes */
+9 -2
View File
@@ -68,6 +68,7 @@ void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */ /* USER CODE BEGIN PFP */
static void CH390_HardwareReset(void); static void CH390_HardwareReset(void);
static void LED_Init(void); static void LED_Init(void);
static void ApplyConfiguredUartBaudrates(void);
void Debug_TrapWithRttHint(const char *tag); void Debug_TrapWithRttHint(const char *tag);
/* USER CODE END PFP */ /* USER CODE END PFP */
@@ -109,6 +110,12 @@ void LED_Toggle(void)
HAL_GPIO_TogglePin(LED_PORT, LED_PIN); HAL_GPIO_TogglePin(LED_PORT, LED_PIN);
} }
static void ApplyConfiguredUartBaudrates(void)
{
USART_SetConfiguredBaudrates(config_get_uart_baudrate(LINK_UART_U0),
config_get_uart_baudrate(LINK_UART_U1));
}
/* USER CODE END 0 */ /* USER CODE END 0 */
/** /**
@@ -143,6 +150,8 @@ int main(void)
MX_GPIO_Init(); MX_GPIO_Init();
MX_DMA_Init(); MX_DMA_Init();
MX_USART1_UART_Init(); MX_USART1_UART_Init();
config_init();
ApplyConfiguredUartBaudrates();
MX_USART2_UART_Init(); MX_USART2_UART_Init();
MX_USART3_UART_Init(); MX_USART3_UART_Init();
MX_SPI1_Init(); MX_SPI1_Init();
@@ -155,8 +164,6 @@ int main(void)
/* CH390 硬件复位 */ /* CH390 硬件复位 */
CH390_HardwareReset(); CH390_HardwareReset();
/* Initialize configuration from Flash (fallback to defaults on invalid data) */
config_init();
debug_log_boot("config-ready"); debug_log_boot("config-ready");
/* USER CODE END 2 */ /* USER CODE END 2 */
+11 -2
View File
@@ -22,6 +22,9 @@
/* USER CODE BEGIN 0 */ /* USER CODE BEGIN 0 */
static uint32_t g_usart2_baudrate = 115200u;
static uint32_t g_usart3_baudrate = 115200u;
/* USER CODE END 0 */ /* USER CODE END 0 */
UART_HandleTypeDef huart1; UART_HandleTypeDef huart1;
@@ -76,7 +79,7 @@ void MX_USART2_UART_Init(void)
/* USER CODE END USART2_Init 1 */ /* USER CODE END USART2_Init 1 */
huart2.Instance = USART2; huart2.Instance = USART2;
huart2.Init.BaudRate = 115200; huart2.Init.BaudRate = g_usart2_baudrate;
huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Parity = UART_PARITY_NONE;
@@ -105,7 +108,7 @@ void MX_USART3_UART_Init(void)
/* USER CODE END USART3_Init 1 */ /* USER CODE END USART3_Init 1 */
huart3.Instance = USART3; huart3.Instance = USART3;
huart3.Init.BaudRate = 115200; huart3.Init.BaudRate = g_usart3_baudrate;
huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Parity = UART_PARITY_NONE;
@@ -396,4 +399,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
void USART_SetConfiguredBaudrates(uint32_t usart2_baudrate, uint32_t usart3_baudrate)
{
g_usart2_baudrate = usart2_baudrate;
g_usart3_baudrate = usart3_baudrate;
}
/* USER CODE END 1 */ /* USER CODE END 1 */