From 961c1174bbf1aaae5fa2f672806ed4eaf2f917be Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期三, 05 二月 2025 15:45:10 +0800 Subject: [PATCH] 串口传输协议加上一位指令类型 --- 01_SDK/nimble/mcu_boot/src/prf_ota.c | 564 +++++++++++++++++++++++++++----------------------------- 1 files changed, 270 insertions(+), 294 deletions(-) diff --git a/01_SDK/nimble/mcu_boot/src/prf_ota.c b/01_SDK/nimble/mcu_boot/src/prf_ota.c index 8970389..c7a7253 100644 --- a/01_SDK/nimble/mcu_boot/src/prf_ota.c +++ b/01_SDK/nimble/mcu_boot/src/prf_ota.c @@ -1,48 +1,49 @@ +#include "soc_api.h" +#include "utility.h" +#include "app_log.h" #include "prf_ota.h" #include "PANSeries.h" #include "comm_prf.h" #include "flash_manager.h" #include "info.h" -#define printf(...) +#define PKT_MASK_TBL_LEN (128 * 4) +#define PRF_OTA_PKT_LEN 250 +#define PRF_BIT_MASK_WIDTH 32 -#define PKT_MASK_TBL_LEN (128 * 4) -#define PRF_OTA_PKT_LEN 250 -#define PRF_BIT_MASK_WIDTH 32 - -pan_prf_config_t prf_config = +pan_prf_config_t prf_config = { - .work_mode = PRF_MODE_ENHANCE, //PRF_MODE_NORMAL,PRF_MODE_ENHANCE - .chip_mode = PRF_CHIP_MODE_SEL_NRF, //PRF_CHIP_MODE_SEL_NRF,//PRF_CHIP_MODE_SEL_XN297, - .trx_mode = PRF_RX_MODE, - .phy = PRF_PHY_2M, //PRF_PHY_250K,//PRF_PHY_1M, - .crc = PRF_CRC_SEL_CRC16, - .src = PRF_SRC_SEL_NOSRC, - .mode_conf = PRF_BLE_CONF, - .rx_timeout = 50000, //50ms - .rf_channel = 2510, - .tx_no_ack = DISABLE, - .trf_type = PRF_TRF_NRF52, - .rx_length = 5, - .sync_length = 4, - .crc_include_sync = DISABLE, - .src_include_sync = DISABLE, - .sync = { 0x71, 0x76, 0x41, 0x29 }, - .pid_manual_flag = DISABLE, - .tx_power = 0, - .pipe = PRF_PIPE0, + .work_mode = PRF_MODE_ENHANCE, //PRF_MODE_NORMAL,PRF_MODE_ENHANCE + .chip_mode = PRF_CHIP_MODE_SEL_NRF, //PRF_CHIP_MODE_SEL_NRF,//PRF_CHIP_MODE_SEL_XN297, + .trx_mode = PRF_RX_MODE, + .phy = PRF_PHY_2M, //PRF_PHY_250K,//PRF_PHY_1M, + .crc = PRF_CRC_SEL_CRC16, + .src = PRF_SRC_SEL_NOSRC, + .mode_conf = PRF_BLE_CONF, + .rx_timeout = 50000, //50ms + .rf_channel = 2510, + .tx_no_ack = DISABLE, + .trf_type = PRF_TRF_NRF52, + .rx_length = 5, + .sync_length = 4, + .crc_include_sync = DISABLE, + .src_include_sync = DISABLE, + .sync = { 0x71, 0x76, 0x41, 0x29 }, + .pid_manual_flag = DISABLE, + .tx_power = 0, + .pipe = PRF_PIPE0, }; enum prf_ota_status_t { - prf_ota_verify = 0x01, - prf_ota_start, - prf_ota_ing, - prf_ota_check, - prf_ota_check_ack, - prf_ota_retrans, - prf_ota_get_checksum, - prf_ota_end, + prf_ota_verify = 0x01, + prf_ota_start, + prf_ota_ing, + prf_ota_check, + prf_ota_check_ack, + prf_ota_retrans, + prf_ota_get_checksum, + prf_ota_end, }; bool rx_data_exist = false; @@ -66,326 +67,301 @@ void data_printf(uint8_t const *data, uint32_t len) { - uint32_t i = 0; + uint32_t i = 0; - if (len == 0) - { - return; - } + if (len == 0) + { + return; + } - for (; i < len; i++) - { - printf("0x%02X ", data[i]); - } - printf("\n"); + for (; i < len; i++) + { + APP_LOG("0x%02X ", data[i]); + } + APP_LOG("\n"); } void event_tx_fun(void) { - panchip_prf_trx_start(); + panchip_prf_trx_start(); } __ramfunc void event_rx_fun(void) { - rx_payload.data_length = panchip_prf_data_rec(&rx_payload); + rx_payload.data_length = panchip_prf_data_rec(&rx_payload); - panchip_prf_payload_t ack_payload; - static uint8_t ack_count = 0; - - if((rx_payload.data[0] == prf_ota_verify) || (rx_payload.data[0] == prf_ota_check)) - { - if(ack_count != (prf_id%10)) - { - panchip_prf_reset(); - panchip_prf_trx_start(); - } - ack_count++; - if(ack_count >= 10) - { - ack_count = 0; - } - } - else - { - ack_count = 0; - } - - if(rx_payload.data[0] == prf_ota_verify) - { - memcpy(&ack_payload.data, &rx_payload.data, rx_payload.data_length); - ack_payload.data[4] = prf_id; - ack_payload.data_length = rx_payload.data_length + 1; - } - else if(rx_payload.data[0] == prf_ota_check) - { - ack_payload.data[0] = prf_ota_check_ack; - memcpy(&ack_payload.data[1],chunk_pk_tbl, pkt_tbl_num); - ack_payload.data_length = (pkt_tbl_num + 1); - } - else if(rx_payload.data[0] == prf_ota_get_checksum) - { - ack_payload.data[0] = prf_ota_get_checksum; - ack_payload.data[1] = prf_id; - ack_payload.data[2] = calculate_sum; - ack_payload.data_length = 3; - } - else - { - ack_payload.data_length = 0; - } + panchip_prf_payload_t ack_payload; + static uint8_t ack_count = 0; - panchip_prf_set_ack_data(&ack_payload); - - rx_data_exist = true; + if((rx_payload.data[0] == prf_ota_verify) || (rx_payload.data[0] == prf_ota_check)) + { + if(ack_count != (prf_id%10)) + { + panchip_prf_reset(); + panchip_prf_trx_start(); + } + ack_count++; + if(ack_count >= 10) + { + ack_count = 0; + } + } + else + { + ack_count = 0; + } + + if(rx_payload.data[0] == prf_ota_verify) + { + memcpy(&ack_payload.data, &rx_payload.data, rx_payload.data_length); + ack_payload.data[4] = prf_id; + ack_payload.data_length = rx_payload.data_length + 1; + } + else if(rx_payload.data[0] == prf_ota_check) + { + ack_payload.data[0] = prf_ota_check_ack; + memcpy(&ack_payload.data[1],chunk_pk_tbl, pkt_tbl_num); + ack_payload.data_length = (pkt_tbl_num + 1); + } + else if(rx_payload.data[0] == prf_ota_get_checksum) + { + ack_payload.data[0] = prf_ota_get_checksum; + ack_payload.data[1] = prf_id; + ack_payload.data[2] = calculate_sum; + ack_payload.data_length = 3; + } + else + { + ack_payload.data_length = 0; + } + + panchip_prf_set_ack_data(&ack_payload); + + rx_data_exist = true; } void event_rx_timeout_fun(void) { - prf_verify_timeout = false; + prf_verify_timeout = false; } void event_crc_err_fun(void) { - panchip_prf_trx_start(); + panchip_prf_trx_start(); } void panchip_prf_isr_init(void) { - isr_cb.tx_cb = event_tx_fun; - isr_cb.rx_cb = event_rx_fun; - isr_cb.rx_timeout_cb = event_rx_timeout_fun; - isr_cb.rx_crc_err_cb = event_crc_err_fun; + isr_cb.tx_cb = event_tx_fun; + isr_cb.rx_cb = event_rx_fun; + isr_cb.rx_timeout_cb = event_rx_timeout_fun; + isr_cb.rx_crc_err_cb = event_crc_err_fun; } void panchip_prf_irq_enable(void) { - NVIC_SetPriority (LL_IRQn, 0); - /* Enable RF interrupt */ - NVIC_EnableIRQ(LL_IRQn); -} - -void uart_printf_init(void) -{ - CLK_AHBPeriphClockCmd(CLK_AHBPeriph_APB1, ENABLE); - CLK_APB1PeriphClockCmd(CLK_APB1Periph_UART0, ENABLE); - - SYS_SET_MFP(P1, 6, UART0_TX); - SYS_SET_MFP(P1, 7, UART0_RX); - GPIO_EnableDigitalPath(P1, BIT7); - - UART_InitTypeDef Init_Struct; - - Init_Struct.UART_BaudRate = 921600; - Init_Struct.UART_LineCtrl = Uart_Line_8n1; - - /* Init UART0 for printf */ - UART_Init(UART0, &Init_Struct); - UART_EnableFifo(UART0); + NVIC_SetPriority(LL_IRQn, 0); + /* Enable RF interrupt */ + NVIC_EnableIRQ(LL_IRQn); } uint8_t prf_ota_check_sum(uint8_t *data, uint32_t len) { - uint8_t check_sum = 0; + uint8_t check_sum = 0; - for(int i = 0;i < len;i++) - { - check_sum += data[i]; - } - - return check_sum; + for(int i = 0;i < len;i++) + { + check_sum += data[i]; + } + + return check_sum; } uint8_t prf_pkt_len_get(void) { - if(prf_pkt_len == 0) { - return 250; - } else { - return prf_pkt_len; - } + if(prf_pkt_len == 0) { + return 250; + } else { + return prf_pkt_len; + } } uint8_t prf_mask_width_get(void) { - if(prf_mask_width == 0) { - return 32; - } else { - return prf_mask_width; - } + if(prf_mask_width == 0) { + return 32; + } else { + return prf_mask_width; + } } void panchip_prf_ota_init(void) { - OTP_STRUCT_T otp; - - SystemHwParamLoader(&otp); - - if(check_info_tlv_data()) { - phy_value_init_from_info(); + if(check_info_tlv_data_prf()) { + phy_value_init_from_info_prf(); } else { - phy_value_init_from_code(); - } - - memset(firmware_data, 0xff, PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH); - - memset(chunk_pk_tbl, 0, sizeof(chunk_pk_tbl)); - - panchip_prf_init(&prf_config); - - if(otp.m.ft_version >= 2) - { - srand(otp.m_v2.mac_addr[5]); - prf_id = rand(); - } - - panchip_prf_set_chn(prf_config.rf_channel); + phy_value_init_from_code_prf(); + } - /*adr match bit */ - PRI_RF_SetAddrMatchBit(PRI_RF, 0); - - panchip_prf_trx_start(); + memset(firmware_data, 0xff, PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH); + + memset(chunk_pk_tbl, 0, sizeof(chunk_pk_tbl)); + + panchip_prf_init(&prf_config); + + // Generate a PRF ID from chip mac address + extern uint8_t m_chip_mac[6]; + srand(BytesToUint32(&m_chip_mac[2])); + prf_id = (uint8_t)rand(); + + panchip_prf_set_chn(prf_config.rf_channel); + + /*adr match bit */ + PRI_RF_SetAddrMatchBit(PRI_RF, 0); + + panchip_prf_trx_start(); } void panchip_prf_recv_data_prase(uint8_t *data, uint8_t len) { - switch(data[0]) - { - case prf_ota_verify: - if(!memcmp(&data[1], prf_verify_data, 3)) - { - firmware_len = 0; - calculate_sum = 0; - fm_status_refresh(); /* clear flash manager for a new ota process */ - prf_ota_stat = prf_ota_start; - panchip_prf_rx_timeout(0); - panchip_prf_trx_start(); - } - break; - case prf_ota_start: - if(prf_ota_stat == prf_ota_start) - { - prf_ota_stat = prf_ota_ing; - pkt_sector_num = data[1]; - prf_pkt_len = data[2]; - prf_mask_width = data[3]; - FMC_EraseCodeArea(FLCTL, FLASH_AREA_IMAGE_START, pkt_sector_num * SECTOR_SIZE); - - pkt_total_num = (pkt_sector_num * SECTOR_SIZE) / PRF_OTA_PKT_LEN; - if((pkt_sector_num * SECTOR_SIZE) % PRF_OTA_PKT_LEN) { - pkt_total_num = pkt_total_num + 1; - } + switch(data[0]) + { + case prf_ota_verify: + if(!memcmp(&data[1], prf_verify_data, 3)) + { + firmware_len = 0; + calculate_sum = 0; + fm_status_refresh(); /* clear flash manager for a new ota process */ + prf_ota_stat = prf_ota_start; + panchip_prf_rx_timeout(0); + panchip_prf_trx_start(); + } + break; + case prf_ota_start: + if(prf_ota_stat == prf_ota_start) + { + prf_ota_stat = prf_ota_ing; + pkt_sector_num = data[1]; + prf_pkt_len = data[2]; + prf_mask_width = data[3]; + FMC_EraseCodeArea(FLCTL, FLASH_AREA_IMAGE_START, pkt_sector_num * SECTOR_SIZE); - pkt_tbl_num = (pkt_sector_num * SECTOR_SIZE) / (PRF_OTA_PKT_LEN * 8); - if((pkt_sector_num * SECTOR_SIZE) % (PRF_OTA_PKT_LEN * 8)) { - pkt_tbl_num = pkt_tbl_num + 1; - } - - printf("pkt_tbl_num %d,%d,%d\n",pkt_sector_num, pkt_tbl_num, pkt_total_num); - } - break; - case prf_ota_ing: - if(prf_ota_stat == prf_ota_ing) - { - chunk_pk_index = (data[1] << 8) | data[2]; - chunk_pk_tbl[(chunk_pk_index/8)] |= 1 << (chunk_pk_index - 8 * (chunk_pk_index/8)); + pkt_total_num = (pkt_sector_num * SECTOR_SIZE) / PRF_OTA_PKT_LEN; + if((pkt_sector_num * SECTOR_SIZE) % PRF_OTA_PKT_LEN) { + pkt_total_num = pkt_total_num + 1; + } - memcpy(&firmware_data[(len - 3) * (chunk_pk_index%PRF_BIT_MASK_WIDTH)], &data[3], (len - 3)); - calculate_chunk_len += (len - 3); - printf("chunk_pk_index %d,%x,%d\n",chunk_pk_index,chunk_pk_tbl[(chunk_pk_index/8)],calculate_chunk_len); - if((!((chunk_pk_index + 1) % PRF_BIT_MASK_WIDTH)) || - (((chunk_pk_index + 1) % PRF_BIT_MASK_WIDTH) && ((chunk_pk_index + 1) == pkt_total_num))) - { - FMC_WriteStream(FLCTL, FLASH_AREA_IMAGE_START + firmware_len, firmware_data, PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH); - memset(firmware_data, 0xff, PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH); - firmware_len += PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH; - printf("len %d,%d\n",firmware_len, calculate_chunk_len); - calculate_chunk_len = 0; - } - } - break; - case prf_ota_check: - for(int i = 0;i < pkt_tbl_num;i++) - { - if(((chunk_pk_tbl[i] & 0xff) != 0xff)) - { - prf_check_status = false; - break; - } - else - { - prf_check_status = true; - } - } - - if(prf_check_status == false) - { - prf_ota_stat = prf_ota_retrans; - } - break; - case prf_ota_retrans: - if(prf_ota_stat == prf_ota_retrans) - { - chunk_pk_index = (data[1] << 8) | data[2]; - chunk_pk_tbl[(chunk_pk_index/8)] |= 1 << (chunk_pk_index - 8 * (chunk_pk_index/8)); - printf("trans %d,%d\n",chunk_pk_index,(len - 3)); - FMC_WriteStream(FLCTL, FLASH_AREA_IMAGE_START + chunk_pk_index * PRF_OTA_PKT_LEN, &data[3], (len - 3)); - } - break; - case prf_ota_get_checksum: - if(calculate_sum == 0) - { - uint16_t read_index = 0; - uint8_t m_checksum = 0; - while(read_index < pkt_sector_num) - { - FMC_ReadStream(FLCTL,(FLASH_AREA_IMAGE_START + (read_index * SECTOR_SIZE)), CMD_FAST_READ, firmware_data, SECTOR_SIZE); - m_checksum += prf_ota_check_sum(firmware_data, SECTOR_SIZE); - read_index++; - } - calculate_sum = m_checksum; - printf("calculate_sum %x\n",calculate_sum); - } - break; - case prf_ota_end: - NVIC_SystemReset(); - break; - default: - break; - } + pkt_tbl_num = (pkt_sector_num * SECTOR_SIZE) / (PRF_OTA_PKT_LEN * 8); + if((pkt_sector_num * SECTOR_SIZE) % (PRF_OTA_PKT_LEN * 8)) { + pkt_tbl_num = pkt_tbl_num + 1; + } + + APP_LOG_INFO("pkt_tbl_num %d,%d,%d\n",pkt_sector_num, pkt_tbl_num, pkt_total_num); + } + break; + case prf_ota_ing: + if(prf_ota_stat == prf_ota_ing) + { + chunk_pk_index = (data[1] << 8) | data[2]; + chunk_pk_tbl[(chunk_pk_index/8)] |= 1 << (chunk_pk_index - 8 * (chunk_pk_index/8)); + + memcpy(&firmware_data[(len - 3) * (chunk_pk_index%PRF_BIT_MASK_WIDTH)], &data[3], (len - 3)); + calculate_chunk_len += (len - 3); + APP_LOG_INFO("chunk_pk_index %d,%x,%d\n",chunk_pk_index,chunk_pk_tbl[(chunk_pk_index/8)],calculate_chunk_len); + if((!((chunk_pk_index + 1) % PRF_BIT_MASK_WIDTH)) || + (((chunk_pk_index + 1) % PRF_BIT_MASK_WIDTH) && ((chunk_pk_index + 1) == pkt_total_num))) + { + FMC_WriteStream(FLCTL, FLASH_AREA_IMAGE_START + firmware_len, firmware_data, PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH); + memset(firmware_data, 0xff, PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH); + firmware_len += PRF_OTA_PKT_LEN * PRF_BIT_MASK_WIDTH; + APP_LOG_INFO("len %d,%d\n",firmware_len, calculate_chunk_len); + calculate_chunk_len = 0; + } + } + break; + case prf_ota_check: + for(int i = 0;i < pkt_tbl_num;i++) + { + if(((chunk_pk_tbl[i] & 0xff) != 0xff)) + { + prf_check_status = false; + break; + } + else + { + prf_check_status = true; + } + } + + if(prf_check_status == false) + { + prf_ota_stat = prf_ota_retrans; + } + break; + case prf_ota_retrans: + if(prf_ota_stat == prf_ota_retrans) + { + chunk_pk_index = (data[1] << 8) | data[2]; + chunk_pk_tbl[(chunk_pk_index/8)] |= 1 << (chunk_pk_index - 8 * (chunk_pk_index/8)); + APP_LOG_INFO("trans %d,%d\n",chunk_pk_index,(len - 3)); + FMC_WriteStream(FLCTL, FLASH_AREA_IMAGE_START + chunk_pk_index * PRF_OTA_PKT_LEN, &data[3], (len - 3)); + } + break; + case prf_ota_get_checksum: + if(calculate_sum == 0) + { + uint16_t read_index = 0; + uint8_t m_checksum = 0; + while(read_index < pkt_sector_num) + { + FMC_ReadStream(FLCTL,(FLASH_AREA_IMAGE_START + (read_index * SECTOR_SIZE)), CMD_DREAD, firmware_data, SECTOR_SIZE); + m_checksum += prf_ota_check_sum(firmware_data, SECTOR_SIZE); + read_index++; + } + calculate_sum = m_checksum; + APP_LOG_INFO("calculate_sum %x\n",calculate_sum); + } + break; + case prf_ota_end: + SYS_UnlockReg(); + CLK_ResetChip(); + break; + default: + break; + } } bool panchip_prf_ota_start(void) { - panchip_prf_ota_init(); - - while(prf_ota_stat == prf_ota_verify) - { - if(rx_data_exist == true) - { - rx_data_exist = false; - panchip_prf_recv_data_prase(rx_payload.data, rx_payload.data_length); - } - - if(prf_verify_timeout == false) - { - return false; - } - } + panchip_prf_ota_init(); - return true; + while(prf_ota_stat == prf_ota_verify) + { + if(rx_data_exist == true) + { + rx_data_exist = false; + panchip_prf_recv_data_prase(rx_payload.data, rx_payload.data_length); + } + + if(prf_verify_timeout == false) + { + return false; + } + } + + return true; } void on_prf_ota_enter(void) -{ - uart_printf_init(); - - printf("prf ota server init\n"); - - while(prf_ota_stat != prf_ota_end) - { - if(rx_data_exist == true) - { - rx_data_exist = false; - panchip_prf_recv_data_prase(rx_payload.data, rx_payload.data_length); - } - } +{ + APP_LOG_INFO("Entering Private 2.4G (PRF) OTA flow, OTA Server Init..\n"); + + while(prf_ota_stat != prf_ota_end) + { + if(rx_data_exist == true) + { + rx_data_exist = false; + panchip_prf_recv_data_prase(rx_payload.data, rx_payload.data_length); + } + } } -- Gitblit v1.9.3