Initial commit: my SECS2 project

This commit is contained in:
2026-06-12 14:19:01 +08:00
commit 2c3e2c4dc2
1138 changed files with 603966 additions and 0 deletions

455
usr/bsp/bsp_iap.c Normal file
View File

@@ -0,0 +1,455 @@
#include "bsp_iap.h"
#include <stdio.h>
#include <string.h>
#include "app.h"
#include "bsp_uart.h"
#include "usr_config.h"
#include "os_timer.h"
/* IAP ״̬<D7B4><CCAC><EFBFBD><EFBFBD> */
#define BSP_IAP_STATE_NOMORAL (0) /* <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ת */
#define BSP_IAP_STATE_UPDATEING (1) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define BSP_IAP_STATE_SUCCEED (2) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>ת */
/* IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡ͷ */
#define BSP_IAP_PROTO_RX_HEADER (0x5A)
/* IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define BSP_IAP_PROTO_RX_CMD_GET_SV (0x01) /* <20><>ȡ<EFBFBD><EFBFBD><E6B1BE> */
#define BSP_IAP_PROTO_RX_CMD_CODE_SIZE (0x02) /* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define BSP_IAP_PROTO_RX_CMD_WRITE_DATA (0x03) /* д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define BSP_IAP_PROTO_RX_CMD_UNKNOW_1 (0x04) /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>1 */
#define BSP_IAP_PROTO_RX_CMD_UNKNOW_2 (0x05) /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>2 */
#define BSP_IAP_PROTO_RX_CMD_UNKNOW_3 (0x06) /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>3 */
/* IAP Э<><EFBFBD><E9B7A2>֡ͷ */
#define BSP_IAP_PROTO_TX_HEADER (0xA5)
/* IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define BSP_IAP_PROTO_ERROR_CODE_SUCCEED (0) /* <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> */
#define BSP_IAP_PROTO_ERROR_CODE_CHECK (1) /* У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define BSP_IAP_PROTO_ERROR_CODE_CMD (2) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define BSP_IAP_PROTO_ERROR_CODE_LENGTH (3) /* <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD> */
/* <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С */
#define BSP_IAP_TX_LEN (32)
/* <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD> */
static u16 bsp_app_time_start; /* <20>ȴ<EFBFBD><C8B4><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʼʱ<CABC><EFBFBD><E4A3A8><EFBFBD>룩 */
static u8 bsp_iap_tx_buf[BSP_IAP_TX_LEN]; /* <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD> */
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
static void app_jump(void);
static void flash_page_erase(u16 page_num);
static void flash_write_u32(u32 write_addr, u32 *p_buffer, u16 num_write);
static void flash_write_u8(u32 write_addr, u8 *p_buffer, u16 num_write);
static void bsp_iap_send(u8 *p_data, u16 len);
static void bsp_iap_rx_task(u8 *p_data, u16 len, void *other_data);
static void bsp_iap_init(void);
static void bsp_iap_task(void);
static u8 sum_check(u8 *p_data, u16 len);
/******************************************
* <20><EFBFBD><E1B9B9>: bsp_iap
* <20><><EFBFBD><EFBFBD>: IAP <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> IAP <20>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>úͻص<CDBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
*******************************************/
bsp_iap_t iap =
{
.init = bsp_iap_init,
.task = bsp_iap_task,
};
/* ȫ<><C8AB>ָ<EFBFBD>룬ָ<EBA3AC><D6B8> IAP <20><EFBFBD><E1B9B9> */
bsp_iap_t *p_iap = &iap;
bsp_Uart_t *p_rx_uart;
/* Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ */
#define APP_START_ADDR 0x08002800
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ֽڣ<D6BD> */
#define SECTOR_SIZE FLASH_PAGE_SIZE
/******************************************
* <20><><EFBFBD><EFBFBD>: app_jump
* <20><><EFBFBD><EFBFBD>: <20><>ת<EFBFBD><D7AA>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD>ö<EFBFBD>ջָ<D5BB><EFBFBD><EBA3AC>ת<EFBFBD><D7AA><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
*******************************************/
static void app_jump(void)
{
u32 app_addr = APP_START_ADDR;
/* <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>ջָ<D5BB><D6B8><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7> */
if (((*(u32*)app_addr) & 0x2FFE0000) == 0x20000000)
{
typedef void (*iapfun)(void);
iapfun jump_to_app;
/* <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
__disable_irq();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӵ<EFBFBD>Ĭ<EFBFBD><C4AC>״̬<D7B4><CCAC>ʹ<EFBFBD><CAB9>HSIʱ<49><CAB1> */
HAL_RCC_DeInit();
// LL_USART_Disable(USART1);
// LL_USART_Disable(USART2);
//
// LL_USART_DisableIT_RXNE_RXFNE(USART1);
// LL_USART_DisableIT_RXNE_RXFNE(USART2);
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϹ<D0B6><CFB9><EFBFBD><EFBFBD><EFBFBD>־ */
for (u8 i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
/* <20><>ת<EFBFBD><D7AA>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD> */
jump_to_app = (iapfun)*(u32*)(app_addr + 4); /* <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ */
__set_MSP(*(u32*)app_addr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջָ<D5BB><D6B8> */
__enable_irq();
jump_to_app(); /* <20><>ת */
while(1);
}
}
static void bsp_Flash_FLASH_ErasePage(uint32_t Address)
{
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError = 0;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = Address;
EraseInitStruct.NbPages = 1;
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
}
/******************************************
* <20><><EFBFBD><EFBFBD>: flash_page_erase
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Flash <20><><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: page_num - Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><> APP_START_ADDR <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> page_num <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************/
static void flash_page_erase(u16 page_num)
{
u16 i;
HAL_FLASH_Unlock();//<2F><><EFBFBD><EFBFBD>
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR );
for (i = 0; i < page_num; i++)
{
bsp_Flash_FLASH_ErasePage(i * SECTOR_SIZE+APP_START_ADDR);
}
HAL_FLASH_Lock();//<2F><><EFBFBD><EFBFBD>
}
#include <string.h> // ʹ<><CAB9> memcpy
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4> Flash<73><68><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>̣<EFBFBD>
* @param write_addr Flash Ŀ<><C4BF><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 <20>ֽڶ<D6BD><DAB6>
* @param code_buffer Դ<><D4B4><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param size Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
*/
static void flash_code_write(uint32_t write_addr, uint8_t *code_buffer, uint16_t size)
{
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR);
// <20><><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>2<EFBFBD>ֽڣ<D6BD>д<EFBFBD><D0B4>
for (uint16_t i = 0; i < size; i += 2)
{
uint16_t data;
if (i + 1 < size)
data = ((uint16_t)code_buffer[i+1] << 8) | code_buffer[i];
else
data = (uint16_t)code_buffer[i]; // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><38><CEBB>0
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, write_addr + i, data);
}
HAL_FLASH_Lock();
}
/******************************************
* <20><><EFBFBD><EFBFBD>: bsp_iap_send
* <20><><EFBFBD><EFBFBD>: ͨ<><CDA8> UART1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: p_data - <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
* len - <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> UART1 <20>ķ<EFBFBD><C4B7>ͽӿ<CDBD>
*******************************************/
static void bsp_iap_send(u8 *p_data, u16 len)
{
if(p_rx_uart != NULL)
{
p_rx_uart->Send(p_rx_uart, p_data, len);
}
}
/******************************************
* <20><><EFBFBD><EFBFBD>: bsp_iap_init
* <20><><EFBFBD><EFBFBD>: IAP <20><>ʼ<EFBFBD><CABC>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ó<EFBFBD>ʼ״̬<D7B4><CCAC><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************/
static void bsp_iap_init(void)
{
p_iap->state = BSP_IAP_STATE_NOMORAL;
//COM_Uart1.Rx_DataAnalysis = bsp_iap_rx_task;
COM_Uart2.Rx_DataAnalysis = bsp_iap_rx_task;
}
/******************************************
* <20><><EFBFBD><EFBFBD>: bsp_iap_task
* <20><><EFBFBD><EFBFBD>: IAP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>е<EFBFBD><D0B5>ã<EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ݵ<EFBFBD>ǰ״ִ̬<CCAC><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
*******************************************/
static void bsp_iap_task(void)
{
switch (p_iap->state)
{
case BSP_IAP_STATE_NOMORAL: /* <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת APP */
{
if (TIME_TRUE == OsTimer_CheckTimeOut(bsp_app_time_start, osTime_MSecTick, 1000))
{
app_jump();
}
} break;
case BSP_IAP_STATE_UPDATEING: /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
/* Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
} break;
case BSP_IAP_STATE_SUCCEED: /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת */
{
app_jump();
} break;
default:
break;
}
}
/******************************************
* <20><><EFBFBD><EFBFBD>: sum_check
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ͣ<EFBFBD><CDA3>ۼӺ<DBBC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: p_data - <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
* len - <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
* <20><><EFBFBD><EFBFBD>: У<><D0A3><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ȼ<EFBFBD><C8BB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************/
static u8 sum_check(u8 *p_data, u16 len)
{
u16 i;
u8 sum = 0;
for (i = 0; i < len; i++)
{
sum += p_data[i];
}
return (-sum);
}
/******************************************
* <20><><EFBFBD><EFBFBD>: bsp_iap_rx_task
* <20><><EFBFBD><EFBFBD>: IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: p_data - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
* len - <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
* other_data - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>δʹ<CEB4>ã<EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> IAP Э<><D0AD>֡<EFBFBD><D6A1>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ظ<EFBFBD>
*******************************************/
static void bsp_iap_rx_task(u8 *p_data, u16 len, void *other_data)
{
u16 i, cmd, data_len, tx_len = 0;
u8 check_data, error_code = BSP_IAP_PROTO_ERROR_CODE_SUCCEED;
u8 *p_data_offset;
if(BSP_IAP_STATE_SUCCEED == p_iap->state)/*<2A><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>󣬲<EFBFBD><F3A3ACB2>ٽ<EFBFBD><D9BD>м<EFBFBD><D0BC><EFBFBD>*/
{
return;
}
/* ֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ȼ<EFBFBD><C8BC><EFBFBD> */
if (p_data[0] != BSP_IAP_PROTO_RX_HEADER || len < 4)
{
return;
}
data_len = p_data[1] << 8 | p_data[2];
if (len - 4 != data_len) /* <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD> */
{
error_code = BSP_IAP_PROTO_ERROR_CODE_LENGTH;
}
else
{
check_data = sum_check(p_data, len - 1);
if (check_data != p_data[len - 1]) /* У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
error_code = BSP_IAP_PROTO_ERROR_CODE_CHECK;
}
}
p_rx_uart = (bsp_Uart_t*)(other_data);
cmd = p_data[3];
p_data_offset = &p_data[4];
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6> */
switch (cmd)
{
case BSP_IAP_PROTO_RX_CMD_GET_SV: /* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE> */
{
u8 str_len, tx_data_len;
p_iap->state = BSP_IAP_STATE_UPDATEING; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
str_len = strlen(SwVersion) + 1;
memcpy(&bsp_iap_tx_buf[3], SwVersion, str_len);
tx_data_len = str_len;
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
bsp_iap_tx_buf[1] = tx_data_len + 1;
bsp_iap_tx_buf[2] = cmd;
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
tx_len = bsp_iap_tx_buf[1] + 3;
} break;
case BSP_IAP_PROTO_RX_CMD_CODE_SIZE: /* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
u8 tx_data_len;
u16 erase_size, erase_page, page_size;
erase_page = p_data_offset[0] << 8 | p_data_offset[1];
page_size = p_data_offset[2] << 8 | p_data_offset[3];
p_iap->page_size = page_size;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
erase_page /= ((float)SECTOR_SIZE / (float)page_size);
flash_page_erase(erase_page);
tx_data_len = 0;
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
bsp_iap_tx_buf[1] = tx_data_len + 1;
bsp_iap_tx_buf[2] = cmd;
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
tx_len = bsp_iap_tx_buf[1] + 3;
} break;
case BSP_IAP_PROTO_RX_CMD_WRITE_DATA: /* д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
u8 tx_data_len;
u16 index, code_size, addr_offset, i;
u32 addr;
u8 *p_code_data;
index = p_data_offset[0] << 8 | p_data_offset[1];
code_size = data_len - 3;
addr = index * p_iap->page_size;
p_code_data = &p_data_offset[2];
flash_code_write(APP_START_ADDR+addr, p_code_data, code_size);
/* <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> */
bsp_iap_tx_buf[3] = index >> 8;
bsp_iap_tx_buf[4] = index & 0x00ff;
tx_data_len = 2;
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
bsp_iap_tx_buf[1] = tx_data_len + 1;
bsp_iap_tx_buf[2] = cmd;
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
tx_len = bsp_iap_tx_buf[1] + 3;
} break;
case BSP_IAP_PROTO_RX_CMD_UNKNOW_1: /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD> */
{
u8 tx_data_len;
tx_data_len = 0;
p_iap->state = BSP_IAP_STATE_SUCCEED; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
bsp_iap_tx_buf[1] = tx_data_len + 1;
bsp_iap_tx_buf[2] = cmd;
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
tx_len = bsp_iap_tx_buf[1] + 3;
} break;
case BSP_IAP_PROTO_RX_CMD_UNKNOW_3: /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD> */
{
u8 tx_data_len;
tx_data_len = 2;
bsp_iap_tx_buf[3] = p_data_offset[0];
bsp_iap_tx_buf[4] = p_data_offset[1];
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
bsp_iap_tx_buf[1] = tx_data_len + 1;
bsp_iap_tx_buf[2] = cmd;
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
tx_len = bsp_iap_tx_buf[1] + 3;
} break;
case BSP_IAP_PROTO_RX_CMD_UNKNOW_2: /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> */
{
u8 tx_data_len;
tx_data_len = 0;
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
bsp_iap_tx_buf[1] = tx_data_len + 1;
bsp_iap_tx_buf[2] = cmd;
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
tx_len = bsp_iap_tx_buf[1] + 3;
} break;
default:
{
error_code = BSP_IAP_PROTO_ERROR_CODE_CMD;
} break;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
switch (error_code)
{
case BSP_IAP_PROTO_ERROR_CODE_SUCCEED:
{
bsp_iap_send(bsp_iap_tx_buf, tx_len);
} break;
case BSP_IAP_PROTO_ERROR_CODE_CHECK:
case BSP_IAP_PROTO_ERROR_CODE_CMD:
case BSP_IAP_PROTO_ERROR_CODE_LENGTH:
{
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
bsp_iap_tx_buf[1] = 0x01;
bsp_iap_tx_buf[2] = cmd;
bsp_iap_tx_buf[3] = error_code;
bsp_iap_tx_buf[4] = sum_check(bsp_iap_tx_buf, 4);
bsp_iap_send(bsp_iap_tx_buf, 5);
} break;
default:
break;
}
}