Browse Source

添加fpga寄存器存储功能

master
zhaohe 1 year ago
parent
commit
49b2f4b17d
  1. 4
      libzaf/zaf_flash.c
  2. 1
      libzaf/zaf_flash.h
  3. 2
      libzaf/zaf_log.h
  4. 16
      usrc/base_service/config_service.c
  5. 9
      usrc/base_service/config_service.h
  6. 10
      usrc/base_service/fpga_if.c
  7. 12
      usrc/main.cpp
  8. 10
      usrc/service/extern_if_service.c
  9. 3
      usrc/service/reg_manager.c

4
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(); // ½âËø

1
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

2
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);

16
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;
}

9
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

10
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) {

12
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();
}
}
}

10
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);
}

3
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;
}

Loading…
Cancel
Save