diff --git a/libzaf/zaf_flash.c b/libzaf/zaf_flash.c index 208e805..fe54e32 100644 --- a/libzaf/zaf_flash.c +++ b/libzaf/zaf_flash.c @@ -86,14 +86,14 @@ uint32_t zaf_compute_checksum(uint32_t* data, uint32_t size) { } bool zaf_flash_factory_reset(void) { memcpy(_rawstartadd, _defaultdata, _rawsize * 4); - zaf_flash_flush(); + zaf_flash_flush(); return true; } bool zaf_flash_flush(void) { #if PC_NVS_ENABLE _rawstartadd[0] = FLASH_MASK_VAL; - _rawstartadd[_rawsize - 1] =zaf_compute_checksum(_rawstartadd, _rawsize - 1); + _rawstartadd[_rawsize - 1] = zaf_compute_checksum(_rawstartadd, _rawsize - 1); _flash_erase(); HAL_FLASH_Unlock(); // 解锁 diff --git a/libzaf/zaf_flash.h b/libzaf/zaf_flash.h index 8375697..bc163c7 100644 --- a/libzaf/zaf_flash.h +++ b/libzaf/zaf_flash.h @@ -27,6 +27,7 @@ #define FLASH_MASK_VAL 0xABCD #define FLASH_START_ADD 0x08060000 // #define FLASH_EARSE_SECTOR FLASH_SECTOR_7 +#define FLASH_SOTRAGE_SIZE (128 * 1023) /** * @brief 初始化flash diff --git a/libzaf/zaf_log.h b/libzaf/zaf_log.h index 5667f8b..6d4e983 100644 --- a/libzaf/zaf_log.h +++ b/libzaf/zaf_log.h @@ -35,5 +35,7 @@ extern bool g_xs_enable_log; #define ZASSERT(cond) ASSERT(cond) +#define ZARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) + void zaf_log(const char* fmt, ...); void zaf_log_enable(bool enable); \ No newline at end of file diff --git a/usrc/base_service/config_service.c b/usrc/base_service/config_service.c index 1d12793..0b1ffce 100644 --- a/usrc/base_service/config_service.c +++ b/usrc/base_service/config_service.c @@ -43,6 +43,8 @@ void config_init(void) { /** * @brief flash初始化 */ + _Static_assert(sizeof(config_t) < FLASH_SOTRAGE_SIZE); + zaf_flash_init((uint32_t *)&_config, sizeof(config_t) / 4); bool cfg_is_error = !zaf_flash_check(); @@ -69,3 +71,17 @@ void config_generate_random_mac(void) { memset(&_config.mac[0], 0, sizeof(_config.mac)); memcpy(&_config.mac[0], mac.mac, 6); } + +void config_update_reg(uint32_t add, uint32_t val) { + for (uint32_t i = 0; i < ZARRAY_SIZE(_config.reg_config_storage); i++) { + if (_config.reg_config_storage[i].add == add) { + _config.reg_config_storage[i].val = val; + break; + } else if (_config.reg_config_storage[i].add == 0) { + _config.reg_config_storage[i].add = add; + _config.reg_config_storage[i].val = val; + break; + } + } + return; +} \ No newline at end of file diff --git a/usrc/base_service/config_service.h b/usrc/base_service/config_service.h index fc67b2e..1a15288 100644 --- a/usrc/base_service/config_service.h +++ b/usrc/base_service/config_service.h @@ -8,6 +8,11 @@ extern "C" { #endif typedef struct { + uint32_t add; + uint32_t val; +} reg_config_storage_t; + +typedef struct { uint32_t config_mark; uint32_t obtaining_ip_mode; @@ -17,6 +22,8 @@ typedef struct { uint32_t config0; // uint8_t mac[8]; // mac[5:0] is mac, mac[7:6] is pad for 32bit align + reg_config_storage_t reg_config_storage[1024]; + uint32_t checksum; // 不需要编辑 } config_t; @@ -26,6 +33,8 @@ void config_flush(void); void config_factory_reset(void); void config_generate_random_mac(void); +void config_update_reg(uint32_t add, uint32_t val); + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/usrc/base_service/fpga_if.c b/usrc/base_service/fpga_if.c index 897a105..898056e 100644 --- a/usrc/base_service/fpga_if.c +++ b/usrc/base_service/fpga_if.c @@ -22,7 +22,7 @@ void fpga_if_init() { // //! ioa0 临时用于当作复位引脚 zaf_gpio_init_as_output(&fpga_if.fpga_reserve_ioa0, FPGA_RESERVE_IOA0, kxs_gpio_od, false, false); - + zaf_gpio_init_as_output(&fpga_if.fpga_reserve_ioa1, FPGA_RESERVE_IOA1, kxs_gpio_od, false, false); zaf_gpio_init_as_output(&fpga_if.fpga_reserve_ioa2, FPGA_RESERVE_IOA2, kxs_gpio_od, false, false); zaf_gpio_init_as_output(&fpga_if.fpga_reserve_ioa3, FPGA_RESERVE_IOA3, kxs_gpio_od, false, false); @@ -69,7 +69,9 @@ static void _fpga_if_spi_write_data(SPI_HandleTypeDef *hspi, uint32_t add, uint3 } // HAL_SPI_Transmit(hspi, txbuf, 2 + 4, 1000); - *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24); + if (rxdata) { + *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24); + } } /** * @brief SPI寄存器读指令 @@ -90,7 +92,9 @@ static void _fpga_if_spi_read_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32 HAL_SPI_TransmitReceive_DMA(hspi, txbuf, rxbuf, 2 + 5); while (HAL_SPI_GetState(hspi) != HAL_SPI_STATE_READY) { } - *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24); + if (rxdata) { + *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24); + } } void fpga_if_spi_write_data(uint32_t add, uint32_t txdata, uint32_t *rxdata) { diff --git a/usrc/main.cpp b/usrc/main.cpp index 5659bcb..8b3f445 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -127,8 +127,17 @@ void umain() { * 解析并处理外部指令 */ osDelay(1000); - extern_if_service_init(); + config_t* config = config_get(); + for (uint32_t i = 0; i < ZARRAY_SIZE(config->reg_config_storage); i++) { + if (config->reg_config_storage[i].add == 0) { + break; + } + ZLOGI(TAG, "init reg [0x%x] [0x%x]", config->reg_config_storage[i].add, config->reg_config_storage[i].val); + fpga_if_spi_write_data(config->reg_config_storage[i].add, config->reg_config_storage[i].val, NULL); + } + + extern_if_service_init(); ZLOGI(TAG, "system init done"); int32_t count = 0; @@ -138,6 +147,5 @@ void umain() { if (FACTORY_RESET_KEY != PinNull) { factory_reset_key_detect(); } - } } diff --git a/usrc/service/extern_if_service.c b/usrc/service/extern_if_service.c index c0bb991..8ef3dc1 100644 --- a/usrc/service/extern_if_service.c +++ b/usrc/service/extern_if_service.c @@ -2,6 +2,7 @@ #include "project_dep.h" // #include "base_service/config_service.h" +#include "cmsis_os.h" #include "reg_manager.h" #define TAG "extern_if_service" @@ -67,7 +68,7 @@ static bool process_rx_packet(extern_if_service_context_t *cx, uint8_t *data, ui zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)data; cx->rxpacket = rxpacket; - if (rxpacket->packet_type != kzaf_packet_type_cmd) return; + if (rxpacket->packet_type != kzaf_packet_type_cmd) return false; /******************************************************************************* * 寄存器读 * @@ -109,6 +110,7 @@ static bool process_rx_packet(extern_if_service_context_t *cx, uint8_t *data, ui config_flush(); create_receipt(cx, 0, NULL, 0); } + return true; } /******************************************************************************* @@ -154,7 +156,7 @@ bool uart_is_rxing(UART_HandleTypeDef *huart) { // void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { g_uart_rx_buf_index = Size; } -static void uart_receiver_thread(void *) { +static void uart_receiver_thread(const void *) { while (1) { if (!uart_is_rxing(&COMMAND_UART)) { if (g_uart_rx_buf_index != 0) { @@ -171,6 +173,8 @@ static void uart_receiver_thread(void *) { void extern_if_service_init() { // ZASSERT(zaf_udp_init(&m_udp_cmd_server, "extern_if_udp", ZAF_SERVICE_DEVICE_PORT, udp_on_packet, 1024, NULL)); - m_cmd_uart_receiver_thread = osThreadCreate(&m_cmd_uart_receiver_thread, uart_receiver_thread); + + osThreadDef(cmdUartReceiverThread, uart_receiver_thread, osPriorityNormal, 0, 512); + m_cmd_uart_receiver_thread = osThreadCreate(osThread(cmdUartReceiverThread), NULL); ZASSERT(m_cmd_uart_receiver_thread != NULL); } diff --git a/usrc/service/reg_manager.c b/usrc/service/reg_manager.c index 6a961c7..33e9cee 100644 --- a/usrc/service/reg_manager.c +++ b/usrc/service/reg_manager.c @@ -8,7 +8,7 @@ uint32_t m_action_val0; uint32_t m_action_receipt; -void reg_manager_init() {} +void reg_manager_init() {} uint32_t reg_manager_read_reg(uint32_t addr) { uint32_t readbak = 0; static sn_t sncode; @@ -106,6 +106,7 @@ uint32_t reg_manager_write_reg(uint32_t addr, uint32_t value) { *******************************************************************************/ else if (addr >= REGADD__FPGA_START) { fpga_if_spi_write_data(addr, value, &readbak); + config_update_reg(addr, value); } return readbak; }