MXC-A36_2024.04.18/fr3092_mcu/examples/application/bootloader/customer_ota/ota.c

357 lines
9.7 KiB
C
Raw Normal View History

2024-04-17 19:45:26 +08:00
/******************************************************************************
* Copyright (c) 20203, Freqchip
*
* All rights reserved.
*
*
*/
#include <stdio.h>
#include <string.h>
//#include <core_cm33.h>
#include "fr30xx.h"
#include "co_util.h"
#include "gap_api.h"
#include "gatt_api.h"
#include "FreeRTOS.h"
#include "timers.h"
#include "ota.h"
#include "ota_service.h"
/******************************************************************************
* MACROS ()
*/
/*****************************************************************************
* CONSTANTS ()
*/
#define PMU_REG_FLASH_VDD_CTRL 0xFB
/*****************************************************************************
* TYPEDEFS ()
*/
__PACKED_STRUCT ota_ongoing_t{
uint8_t type;
uint8_t start_flag;
uint8_t erase_flag;
uint8_t mac_addr[6];
};
__PACKED_STRUCT ota_file_version_t{
uint32_t otaboot_version;
uint32_t app_version;
uint32_t controller_version;
uint32_t dsp_version;
};
__PACKED_STRUCT file_info_t{
uint32_t file_version;
uint32_t file_storage_base;
uint32_t file_length;
uint32_t file_crc;
};
__PACKED_STRUCT ota_info_t{
uint8_t first_check_flag[4];
uint8_t file_type; //烧录文件中,所包含的文件类型
struct file_info_t boot_file_info;
struct file_info_t app_file_info;
struct file_info_t controller_file_info;
struct file_info_t dsp_file_info;
uint8_t controller_flag;
struct ota_ongoing_t ota_ongoing;
uint32_t rsv[10];
};
__PACKED_STRUCT firmware_version
{
uint32_t firmware_version;
} __attribute__((packed));
__PACKED_STRUCT storage_baseaddr
{
uint32_t baseaddr;
} __attribute__((packed));
__PACKED_STRUCT page_erase_rsp
{
uint32_t base_address;
} __attribute__((packed));
__PACKED_STRUCT write_mem_rsp
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT read_mem_rsp
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT write_data_rsp
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT read_data_rsp
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT ota_start_rsp
{
uint32_t ota_start;
} __attribute__((packed));
__PACKED_STRUCT ota_finish_rsp
{
uint32_t ota_finsih_state;
} __attribute__((packed));
__PACKED_STRUCT app_ota_rsp_hdr_t
{
uint8_t result;
uint8_t org_opcode;
uint16_t length;
__PACKED union
{
uint8_t nvds_type;
struct firmware_version version;
struct storage_baseaddr baseaddr;
struct page_erase_rsp page_erase;
struct write_mem_rsp write_mem;
struct read_mem_rsp read_mem;
struct write_data_rsp write_data;
struct read_data_rsp read_data;
struct ota_finish_rsp finsih_rsp;
struct ota_start_rsp ota_start;
} __attribute__((packed)) rsp;
} __attribute__((packed));
__PACKED_STRUCT page_erase_cmd
{
uint32_t base_address;
} __attribute__((packed));
__PACKED_STRUCT write_mem_cmd
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT read_mem_cmd
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT write_data_cmd
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT read_data_cmd
{
uint32_t base_address;
uint16_t length;
} __attribute__((packed));
__PACKED_STRUCT firmware_check
{
uint32_t firmware_length;
uint32_t CRC32_data;
} __attribute__((packed));
__PACKED_STRUCT app_ota_cmd_hdr_t
{
uint8_t opcode;
uint16_t length;
__PACKED union
{
struct page_erase_cmd page_erase;
struct write_mem_cmd write_mem;
struct read_mem_cmd read_mem;
struct write_data_cmd write_data;
struct read_data_cmd read_data;
struct firmware_check fir_crc_data;
} __attribute__((packed)) cmd;
} __attribute__((packed));
__PACKED_STRUCT otas_send_rsp
{
uint8_t conidx;
uint16_t length;
uint8_t *buffer;
};
/******************************************************************************
* LOCAL VARIABLES ()
*/
static struct ota_info_t * ota_info;
/******************************************************************************
* GLOBAL VARIABLES ()
*/
extern uint8_t ble_static_addr[6];
/******************************************************************************
* LOCAL FUNCTIONS ()
*/
/******************************************************************************
* EXTERN FUNCTIONS ()
*/
extern void wdt_rst_start(void);
void show_reg(uint8_t *buffer,uint16_t length)
{
for(int i = 0; i < length; i++)
{
printf("%02x ",buffer[i]);
}
printf("\r\n");
}
void ota_check_file_init(void)
{
ota_info = pvPortMalloc(sizeof(struct ota_info_t));
flash_read(QSPI0,OTA_BOOT_INFO_ADDRESS,sizeof(struct ota_info_t),(uint8_t *)ota_info);
}
void ota_deinit(void)
{
}
/*********************************************************************
* @fn app_otas_recv_data
*
* @brief Otas Data handler
*
*/
void app_otas_recv_data(uint8_t conidx,uint8_t *p_data,uint16_t len)
{
struct app_ota_cmd_hdr_t *cmd_hdr = (struct app_ota_cmd_hdr_t *)p_data;
struct app_ota_rsp_hdr_t *rsp_hdr;
uint16_t rsp_data_len = (OTA_HDR_OPCODE_LEN+OTA_HDR_LENGTH_LEN+OTA_HDR_RESULT_LEN);
switch(cmd_hdr->opcode)
{
case OTA_CMD_NVDS_TYPE:
rsp_data_len += 1;
break;
case OTA_CMD_GET_STR_BASE:
rsp_data_len += sizeof(struct storage_baseaddr);
break;
case OTA_CMD_READ_FW_VER:
rsp_data_len += sizeof(struct firmware_version);
break;
case OTA_CMD_PAGE_ERASE:
rsp_data_len += sizeof(struct page_erase_rsp);
break;
case OTA_CMD_WRITE_DATA:
rsp_data_len += sizeof(struct write_data_rsp);
break;
case OTA_CMD_READ_DATA:
rsp_data_len += sizeof(struct read_data_rsp);
break;
case OTA_CMD_WRITE_MEM:
rsp_data_len += sizeof(struct write_mem_rsp);
break;
case OTA_CMD_READ_MEM:
rsp_data_len += sizeof(struct read_mem_rsp);
break;
case OTA_CMD_START:
rsp_data_len += sizeof(struct ota_start_rsp);
break;
case OTA_CMD_NULL:
return;
}
struct otas_send_rsp *req = pvPortMalloc(sizeof(struct otas_send_rsp));
uint16_t base_length;
req->conidx = conidx;
req->length = rsp_data_len;
req->buffer = pvPortMalloc(rsp_data_len);
rsp_hdr = (struct app_ota_rsp_hdr_t *)&req->buffer[0];
rsp_hdr->result = OTA_RSP_SUCCESS;
rsp_hdr->org_opcode = cmd_hdr->opcode;
rsp_hdr->length = rsp_data_len - (OTA_HDR_OPCODE_LEN+OTA_HDR_LENGTH_LEN+OTA_HDR_RESULT_LEN);
switch(cmd_hdr->opcode)
{
case OTA_CMD_NVDS_TYPE:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_GET_STR_BASE:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_READ_FW_VER:
{
uint8_t type;
type = *(p_data + (OTA_HDR_OPCODE_LEN+OTA_HDR_LENGTH_LEN));
switch(type)
{
case FILE_BOOT_LOADER:
rsp_hdr->rsp.version.firmware_version = ota_info->boot_file_info.file_version;
break;
case FILE_APP:
rsp_hdr->rsp.version.firmware_version = ota_info->app_file_info.file_version;
break;
case FILE_CONTROLLER:
rsp_hdr->rsp.version.firmware_version = ota_info->controller_file_info.file_version;
break;
case FILE_DSP:
rsp_hdr->rsp.version.firmware_version = ota_info->dsp_file_info.file_version;
break;
}
printf("version:%x",rsp_hdr->rsp.version.firmware_version);
}
break;
case OTA_CMD_PAGE_ERASE:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_CHIP_ERASE:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_WRITE_DATA:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_READ_DATA:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_WRITE_MEM:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_READ_MEM:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_REBOOT:
rsp_hdr->result = OTA_RSP_ERROR;
break;
case OTA_CMD_START:
{
uint8_t ota_type;
ota_type = *(p_data + (OTA_HDR_OPCODE_LEN+OTA_HDR_LENGTH_LEN));
printf("ota type:%d\r\n",ota_type);
ota_info->ota_ongoing.type = ota_type;
ota_info->ota_ongoing.start_flag = 0x01;
ota_info->ota_ongoing.erase_flag = 0;
memcpy(ota_info->ota_ongoing.mac_addr,ble_static_addr,6);
flash_erase(QSPI0,OTA_BOOT_INFO_ADDRESS,0x1000);
flash_write(QSPI0,OTA_BOOT_INFO_ADDRESS,sizeof(struct ota_info_t),(uint8_t *)ota_info);
wdt_rst_start();
rsp_hdr->rsp.ota_start.ota_start = 0;
}
break;
default:
rsp_hdr->result = OTA_RSP_ERROR;
break;
}
ota_gatt_report_notify(conidx,req->buffer,req->length);
vPortFree(req->buffer);
vPortFree(req);
}