diff --git a/App/config.c b/App/config.c index cd42cd1..479372e 100644 --- a/App/config.c +++ b/App/config.c @@ -13,6 +13,7 @@ #include "route_msg.h" #include "app_runtime.h" #include "debug_log.h" +#include "ethernetif.h" #include "uart_trans.h" #define CONFIG_RX_BUFFER_SIZE 160u @@ -115,6 +116,19 @@ static int parse_link_uart(const char *value, uint8_t *uart) 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) { 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) { 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 gw_str[16]; char mac_str[18]; + uint8_t display_mac[6]; char rip_str[CONFIG_LINK_COUNT][16]; uint32_t i; 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.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) { 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; } +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) { 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); 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)) { uint32_t mux_value; 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 gw_str[16]; 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.mask, mask_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); return AT_OK; } diff --git a/App/config.h b/App/config.h index 6540c39..a0bb1d2 100644 --- a/App/config.h +++ b/App/config.h @@ -66,7 +66,7 @@ typedef struct { #define DEFAULT_NET_IP {192, 168, 31, 100} #define DEFAULT_NET_MASK {255, 255, 255, 0} #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 DIAG_CH390_RAW_POLL 0 @@ -86,6 +86,7 @@ int config_save(void); void config_set_defaults(void); const device_config_t *config_get(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); void ConfigTask(void *argument); void config_uart_idle_handler(void); diff --git a/App/uart_trans.c b/App/uart_trans.c index 1bbe755..8dae319 100644 --- a/App/uart_trans.c +++ b/App/uart_trans.c @@ -405,13 +405,6 @@ int uart_trans_init(void) 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) { uint32_t i; diff --git a/App/uart_trans.h b/App/uart_trans.h index b056373..8ae850a 100644 --- a/App/uart_trans.h +++ b/App/uart_trans.h @@ -36,7 +36,6 @@ typedef struct { #define UART_TX_RING_BUFFER_SIZE 256u int uart_trans_init(void); -int uart_trans_config(uint8_t uart_index, uint32_t baudrate); int uart_trans_start_all(void); 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); diff --git a/Core/Inc/usart.h b/Core/Inc/usart.h index 3741c11..57c97d7 100644 --- a/Core/Inc/usart.h +++ b/Core/Inc/usart.h @@ -47,6 +47,7 @@ void MX_USART2_UART_Init(void); void MX_USART3_UART_Init(void); /* USER CODE BEGIN Prototypes */ +void USART_SetConfiguredBaudrates(uint32_t usart2_baudrate, uint32_t usart3_baudrate); /* USER CODE END Prototypes */ diff --git a/Core/Src/main.c b/Core/Src/main.c index 30cb793..0431217 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -68,6 +68,7 @@ void MX_FREERTOS_Init(void); /* USER CODE BEGIN PFP */ static void CH390_HardwareReset(void); static void LED_Init(void); +static void ApplyConfiguredUartBaudrates(void); void Debug_TrapWithRttHint(const char *tag); /* USER CODE END PFP */ @@ -109,6 +110,12 @@ void LED_Toggle(void) 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 */ /** @@ -143,6 +150,8 @@ int main(void) MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); + config_init(); + ApplyConfiguredUartBaudrates(); MX_USART2_UART_Init(); MX_USART3_UART_Init(); MX_SPI1_Init(); @@ -155,8 +164,6 @@ int main(void) /* CH390 硬件复位 */ CH390_HardwareReset(); - /* Initialize configuration from Flash (fallback to defaults on invalid data) */ - config_init(); debug_log_boot("config-ready"); /* USER CODE END 2 */ diff --git a/Core/Src/usart.c b/Core/Src/usart.c index 0f4ad41..60f3744 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -22,6 +22,9 @@ /* USER CODE BEGIN 0 */ +static uint32_t g_usart2_baudrate = 115200u; +static uint32_t g_usart3_baudrate = 115200u; + /* USER CODE END 0 */ UART_HandleTypeDef huart1; @@ -76,7 +79,7 @@ void MX_USART2_UART_Init(void) /* USER CODE END USART2_Init 1 */ huart2.Instance = USART2; - huart2.Init.BaudRate = 115200; + huart2.Init.BaudRate = g_usart2_baudrate; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; @@ -105,7 +108,7 @@ void MX_USART3_UART_Init(void) /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; - huart3.Init.BaudRate = 115200; + huart3.Init.BaudRate = g_usart3_baudrate; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; @@ -396,4 +399,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) /* 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 */