第一次上传E3boot

This commit is contained in:
2025-08-22 09:18:17 +08:00
parent 17dcc44980
commit e248b10f07
16 changed files with 2715 additions and 0 deletions

640
IAP_Task.c Normal file
View File

@@ -0,0 +1,640 @@
#include "debug.h"
#include "crc16.h"
#include "flexcan_init.h"
#include <flexcan_cfg.h>
#include <udelay/udelay.h>
#include <remap/remap.h>
#include <armv7-r/cache.h>
#include "IAP_Task.h"
#include "wdt_refresh.h"
#include "pinmux_cfg.h"
#include <sdrv_gpio.h>
#include "sdrv_rstgen.h"
#include <reset_ip.h>
#include <rom_ctrl/rom_ctrl.h>
#include <sdrv_xspi.h>
#include "eth_cfg.h"
#include "sdrv_eth.h"
#include "interface_ethernet.h"
u32 fileDataLen = 0; //IAP file data length
u32 fileCheckSum = 0; //IAP file data checksum
u32 flashProgramLen = 0; //length of data written to backup area
//iapFileHeader iapPara; //IAP file parameters
CBL_CMD_LIST g_cmdList = {0};
volatile uint16_t g_updateModeCnt = 0;//
uint32_t g_recvLen = 0;
uint16_t g_canAddr = 0;
uint8_t des_ipaddr[4] = {192,168,17,3};//本机IP
//uint8_t CH395GWIPAddr[4] = {192,168,17,1};//网关
//uint8_t CH395IPMask[4] = {255,255,255,0};//掩码
//uint8_t OwnMasterIpArr[4] = {192,168,17,117};//ַ目标IP
uint8_t g_recvData[1028] = {0};
uint8_t g_recvDataCheck[1028] = {0};
uint8_t g_eflashRWBuffer[DATA_SIZE] = {0x00};
SystemDataRecord g_systemDataRecord = {0,0,0,0};
volatile uint8_t g_canRxMsgFlag = 0;//接收到CAN数据后的标志
volatile uint16_t Eth_Rx_Flag = 0;//接收到CAN数据后的标志
extern uint8_t SocketId;
ENET_RxBuf ENET_RxBuf_1 = {0};
uint8_t g_RedData[1024] = {0};
uint8_t debugdata[4] = {0,0,0,0};
Flash_RxBuf Flash_RxBuf_1 = {0};
Flash_RxBuf Flash_RxBuf_2 = {0};
uint8_t writeflashTime = 0;//最大循环写入3次
uint32_t AppBinSize = 0;//数据总长度,用来判断数据长度
uint32_t WriteflashSize = 0;//写的flash数据长度
uint32_t OTA_CANTxID = 0x02;//默认发送ID为0x02
uint32_t OTA_CANRxID = 0x01;//默认接收ID为0x01
uint32_t WDT_CANRxID = 0x03;//默认接收ID为0x03
uint8_t flash_eth_time = 0;//接收启动超时标志
uint8_t ethCmdSTT = 0;
bool WDTReFresh_flag = false;//busoff标志
/*********************************************************************
* @fn IAP_EEPROM_ERASE
*
* @brief erase Data-Flash block, minimal block is 256B
*
* @param Page_Address - the address of the page being erased.
* Length - Erased data length
*
* @return none
*/
void IAP_EEPROM_ERASE(uint32_t Page_Address, uint32_t Length)
{
u16 pageNum = Length / FLASH_PAGE_SIZE;
u16 lastDataNum = Length % FLASH_PAGE_SIZE;
u32 Len_PAGE = 0;
//-----------------------------------------------------
if(0 != (lastDataNum))//判断是否整除
{
pageNum = pageNum+1;
}
Len_PAGE = pageNum * FLASH_PAGE_SIZE;//计算擦写长度
sdrv_spi_nor_erase(&flash, Page_Address,Len_PAGE);
}
/*********************************************************************
* @fn IAP_EEPROM_WRITE
*
* @brief write Data-Flash data block
*
* @param StartAddr - the address of the page being written.
* Buffer - data buff
* Length - written data length
*
* @return FLASH_Status
*/
void IAP_EEPROM_WRITE( u32 StartAddr, u8 *Buffer, u32 Length )
{
u16 pageNum = Length / FLASH_PAGE_Write;
u16 lastDataNum = Length % FLASH_PAGE_Write;
u32 Len_PAGE = 0;
int write_sta = 0;
//-----------------------------------------------------
if(0 != (lastDataNum))//判断是否整除
{
pageNum = pageNum+1;
}
Len_PAGE = pageNum * FLASH_PAGE_Write;//计算擦写长度
write_sta = sdrv_spi_nor_write(&flash, StartAddr, Buffer, Len_PAGE);
if(write_sta != 0)
{
printf("flash fail!");
}
}
/*********************************************************************
* @fn IAP_EEPROM_READ
*
* @brief read Data-Flash data block
*
* @param StartAddr - the address of the page being read.
* Buffer - data buff
* Length - read data length
*
* @return none
*/
void IAP_EEPROM_READ( u32 StartAddr, u8 *Buffer, u32 Length )
{
u16 pageNum = Length / FLASH_PAGE_Write;
u16 lastDataNum = Length % FLASH_PAGE_Write;
u32 Len_PAGE = 0;
//-----------------------------------------------------
if(0 != (lastDataNum))//判断是否整除
{
pageNum = pageNum+1;
}
Len_PAGE = pageNum * FLASH_PAGE_Write;//计算擦写长度
sdrv_spi_nor_read(&flash, StartAddr, Buffer, Len_PAGE);
}
/**
* bootMsgTx
*
* @param[in] Mode: 模式 0:can下载1:以太网下载
* @param[in] Cmd: 发送的命令
* @param[in] *Buffer: 需要发送的数据
*
* @brief 发送下载时反馈给上位机的数据
*/
void bootMsgTx(uint8_t Mode,uint16_t Cmd,uint8_t *Buffer,uint8_t len)
{
uint16_t port = 0;
//------------------------------------------------------------------------------
switch(Mode)
{
case DOWNLOAD_CAN://can下载
CAN_Send_Msg(&g_flexcan_handle,Cmd, FLEXCAN_STANDARD_FRAME, FLEXCAN_FrameTypeData, Buffer,len, TX_MB_INDEX);
break;
case DOWNLOAD_ETH://以太网下载
if(0x02 == Cmd)
{
port = BOOT_TX_PORT;
}
UdpSendToData(UDPCB_1, Buffer,len, des_ipaddr, port);
break;
default:;
}
}
/**
* CAN_BootGetAddrData
*
* @param[in] none
* @return : 节点地址。
*
* @brief 获取节点地址信息
*/
uint16_t CAN_BootGetAddrData(void)
{
return 0x10;//返回的地址值需要根据实际情况进行修改
}
/**
* DataRecord_WriteUpgrade
*
* @param[in] upgradeFlag NORMAL_ON(0):normal start, CAN_BOOTLOADER_UPGRADE(1):bootloader upgrade
* @return 0, success.-1, fail, other:flash ctrl fail
*
* @brief Unlock the eflash control
*/
int DataRecord_WriteUpgrade(uint8_t upgradeFlag)
{
IAP_EEPROM_READ( DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4 );
IAP_EEPROM_ERASE(DATA_START_ADDR, FLASH_PAGE_SIZE);
g_systemDataRecord.canBootloaderUpgrade = 0;
IAP_EEPROM_WRITE(DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4);
IAP_EEPROM_READ( DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4 );
if (g_systemDataRecord.canBootloaderUpgrade == upgradeFlag)
{
return 0;
}
else
{
return -1;
}
}
/**
* goToApp
*
* @param[in] none
* @return : none
*
* @brief APP跳转
*/
void goToApp(void)
{
/* global reset */
/* soft reset flash */
// flash.sw_rst = true;//跳转前先非初始化
// sdrv_spi_nor_deinit(&flash);
// /* soft reset xspi host */
// sdrv_spi_nor_drv_deinit(&flash);
printf("goToApp\r\n");
sdrv_gpio_set_pin_output_level(GPIO_B9, 0); //测量时间
arch_invalidate_cache_range(0x01978000,0x8000);//清除 dcache
sdrv_core_force_remap(SDRV_REMAP_SF, APP_Flash_adr+0x10000000);
}
/**
* CAN_BootExecutiveCommand
*
* @param[in] pRxMessage CAN总线消息
* @return : none
*
* @brief 执行主机下发的命令
*/
void CAN_BootExecutiveCommand(ENET_RxBuf *pRxMessage)
{
uint16_t canCmd = 0;//ID的bit0~bit3位为命令码
uint16_t crcData = 0;
static uint32_t s_startAddr = 0;
static uint32_t RgEasySize = 0;
uint8_t ENETTxMessage[8] = {0,0,0,0,0,0,0};
static uint8_t CAN_BootExecutiveStt = 0;
uint8_t WriteE2adr = 0;//写地址中间值
static uint8_t EnterRegion = 0;//区域
uint8_t psn_data[4]__attribute__((__aligned__(4))); //实际数据接收数据 注意4字节对齐 注意需要4字节对齐。
//---------------------------------------------------------------------------
canCmd = (pRxMessage->RxData[0] << 8) + pRxMessage->RxData[1];
printf("Flash_RxBufLenNow :0x%x,Flash_RxBufSta :0x%x,Flash_RxBufLen:0x%x\r\n",Flash_RxBuf_1.Flash_RxBufLenNow, Flash_RxBuf_1.Flash_RxBufSta,Flash_RxBuf_1.Flash_RxBufLen);
printf("Flash2_RxBufLenNow :0x%x,Flash2_RxBufSta :0x%x,Flash2_RxBufLen:0x%x\r\n",Flash_RxBuf_2.Flash_RxBufLenNow, Flash_RxBuf_2.Flash_RxBufSta,Flash_RxBuf_2.Flash_RxBufLen);
printf("CAN_BootExecutiveStt :0x%x, canCmd:0x%x\r\n", CAN_BootExecutiveStt,canCmd);
switch(canCmd)
{
case ENTER_UPDATE_MODE: //boot重启
/* global reset */
/* soft reset flash */
flash.sw_rst = true;
sdrv_spi_nor_deinit(&flash);
/* soft reset xspi host */
sdrv_spi_nor_drv_deinit(&flash);
//20250822 修改为点击连接就修改IP这样不需要外部来修改参数
wrbyte_24c02(BOOT_DES_IP, (pRxMessage->RxData[2]));
wrbyte_24c02(BOOT_DES_IP+1,(pRxMessage->RxData[3]));
wrbyte_24c02(BOOT_DES_IP+2,(pRxMessage->RxData[4]));
wrbyte_24c02(BOOT_DES_IP+3,(pRxMessage->RxData[5]));
for(;;)
{
ssdk_printf(SSDK_INFO, "Restart!\r\n");
udelay(100000);
}
break;
case READ_VERSION:
if(BOOT0_index == (pRxMessage->RxData[2]))
{
ENETTxMessage[0] = (uint8_t)(READ_VERSION>>8);
ENETTxMessage[1] = (uint8_t)(READ_VERSION);
ENETTxMessage[2] = BOOT0_index;
ENETTxMessage[3] = rdbyte_24c02(BOOT0_VERSION_E2adr);
ENETTxMessage[4] = rdbyte_24c02(BOOT0_VERSION_E2adr+1);
ENETTxMessage[5] = rdbyte_24c02(BOOT0_VERSION_E2adr+2);
ENETTxMessage[6] = rdbyte_24c02(BOOT0_VERSION_E2adr+3);
ENETTxMessage[7] = rdbyte_24c02(BOOT0_VERSION_E2adr+4);
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8);
}
else if(BOOT1_index == (pRxMessage->RxData[2]))
{
ENETTxMessage[0] = (uint8_t)(READ_VERSION>>8);
ENETTxMessage[1] = (uint8_t)(READ_VERSION);
ENETTxMessage[2] = BOOT1_index;
ENETTxMessage[3] = rdbyte_24c02(BOOT1_VERSION_E2adr);
ENETTxMessage[4] = rdbyte_24c02(BOOT1_VERSION_E2adr+1);
ENETTxMessage[5] = rdbyte_24c02(BOOT1_VERSION_E2adr+2);
ENETTxMessage[6] = rdbyte_24c02(BOOT1_VERSION_E2adr+3);
ENETTxMessage[7] = rdbyte_24c02(BOOT1_VERSION_E2adr+4);
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8);
}
else if(APP_index == (pRxMessage->RxData[2]))
{
ENETTxMessage[0] = (uint8_t)(READ_VERSION>>8);
ENETTxMessage[1] = (uint8_t)(READ_VERSION);
ENETTxMessage[2] = APP_index;
ENETTxMessage[3] = rdbyte_24c02(APP_VERSION_E2adr);
ENETTxMessage[4] = rdbyte_24c02(APP_VERSION_E2adr+1);
ENETTxMessage[5] = rdbyte_24c02(APP_VERSION_E2adr+2);
ENETTxMessage[6] = rdbyte_24c02(APP_VERSION_E2adr+3);
ENETTxMessage[7] = rdbyte_24c02(APP_VERSION_E2adr+4);
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8);
}
else{}
break;
case CRC_UPDATE:
switch(CAN_BootExecutiveStt)
{
case 0:
if(BOOT0_index == (pRxMessage->RxData[4]))
{
IAP_EEPROM_ERASE(BOOT0_Flash_adr,FLASH_BLOCK_SIZE);// 擦除4K
s_startAddr = BOOT0_Flash_adr;
}
else if(BOOT1_index == (pRxMessage->RxData[4]))
{
IAP_EEPROM_ERASE(BOOT1_Flash_adr,FLASH_BLOCK_SIZE);//
s_startAddr = BOOT1_Flash_adr;
}
else if(APP_index == (pRxMessage->RxData[4]))
{
IAP_EEPROM_ERASE(APP_Flash_adr,FLASH_BLOCK_SIZE);//
s_startAddr = APP_Flash_adr;
}
else{}
RgEasySize = FLASH_BLOCK_SIZE;//擦除长度,擦除多长那就下载多长
CAN_BootExecutiveStt = 10;
break;
//循环烧写flash
case 10:
if(FlashBufComplete == (Flash_RxBuf_1.Flash_RxBufSta))//接收完成 缓存1
{
crcData = crc16_ccitt(&Flash_RxBuf_1.RxData[0], Flash_RxBuf_1.Flash_RxBufLen);
if(crcData == (Flash_RxBuf_1.Flash_RxBufCRC))
{
Flash_RxBuf_1.Flash_RxBufSta = FlashBufCRCPass;
ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8);
ENETTxMessage[1] = (uint8_t)(CRC_UPDATE);
ENETTxMessage[2] = CRC_Pass;
// ssdk_printf(SSDK_CRIT, "0x%x,ENETTxMessage[0]:0x%x,0x%x,CRC_Pass:0x%x\r\n",ENETTxMessage[0],ENETTxMessage[2]);
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3);
if(RgEasySize >= Flash_RxBuf_1.Flash_RxBufLen)//擦除长度是否大于写数据长度
{
// ssdk_printf(SSDK_CRIT, "RxData1[0] :0x%x,RxData1[1]:0x%x\r\n",Flash_RxBuf_1.RxData[0],Flash_RxBuf_1.RxData[1]);
External_wdt_refresh();//喂狗 4K喂狗一次
IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_1.RxData[0], Flash_RxBuf_1.Flash_RxBufLen);//20230209修改写flash不需要转换为32位就是单个字节
s_startAddr = s_startAddr + (Flash_RxBuf_1.Flash_RxBufLen);//烧写地址累加
RgEasySize = RgEasySize - Flash_RxBuf_1.Flash_RxBufLen;//擦除总长度-当前写入的长度
Flash_RxBuf_1.Flash_RxBufSta = FlashBufWrite;
CAN_BootExecutiveStt = 10;
}
else//擦除之后也得写1K已经校验通过了
{
External_wdt_refresh();//喂狗 4K喂狗一次
CAN_BootExecutiveStt = 10;//擦除长度写完,重新擦除
IAP_EEPROM_ERASE(s_startAddr,FLASH_BLOCK_SIZE);//
RgEasySize = FLASH_BLOCK_SIZE;//重新为4K
// ssdk_printf(SSDK_CRIT, "RxData1[0] :0x%x,RxData1[1]:0x%x\r\n",Flash_RxBuf_1.RxData[0],Flash_RxBuf_1.RxData[1]);
IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_1.RxData[0], Flash_RxBuf_1.Flash_RxBufLen);//20230209修改写flash不需要转换为32位就是单个字节
s_startAddr = s_startAddr + (Flash_RxBuf_1.Flash_RxBufLen);//烧写地址累加
RgEasySize = RgEasySize - Flash_RxBuf_1.Flash_RxBufLen;//擦除总长度-当前写入的长度
Flash_RxBuf_1.Flash_RxBufSta = FlashBufWrite;
}
}
else//CRC 校验不通过
{
CAN_BootExecutiveStt = 10;
Flash_RxBuf_1.Flash_RxBufSta = FlashBufCRCFail;
ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8);
ENETTxMessage[1] = (uint8_t)(CRC_UPDATE);
ENETTxMessage[2] = CRC_Fail;
ssdk_printf(SSDK_CRIT, "CCCRCfail:0x%x,RxCRCfail:0x%x\r\n",crcData,Flash_RxBuf_1.Flash_RxBufCRC);
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3);
}
}
else if(FlashBufComplete == (Flash_RxBuf_2.Flash_RxBufSta))//接收完成 缓存2
{
crcData = crc16_ccitt(&Flash_RxBuf_2.RxData[0], Flash_RxBuf_2.Flash_RxBufLen);
if(crcData == (Flash_RxBuf_2.Flash_RxBufCRC))
{
CAN_BootExecutiveStt = 10;
Flash_RxBuf_2.Flash_RxBufSta = FlashBufCRCPass;
ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8);
ENETTxMessage[1] = (uint8_t)(CRC_UPDATE);
ENETTxMessage[2] = CRC_Pass;
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3);
if(RgEasySize > 0)
{
// ssdk_printf(SSDK_CRIT, "RxData2[0] :0x%x,RxData2[1]:0x%x\r\n",Flash_RxBuf_2.RxData[0],Flash_RxBuf_2.RxData[1]);
External_wdt_refresh();//喂狗 4K喂狗一次
IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_2.RxData[0], Flash_RxBuf_2.Flash_RxBufLen);//20230209修改写flash不需要转换为32位就是单个字节
s_startAddr = s_startAddr + (Flash_RxBuf_2.Flash_RxBufLen);//烧写地址累加
RgEasySize = RgEasySize - Flash_RxBuf_2.Flash_RxBufLen;//擦除总长度-当前写入的长度
Flash_RxBuf_2.Flash_RxBufSta = FlashBufWrite;
CAN_BootExecutiveStt = 10;
}
else//擦除之后也得写1K已经校验通过了
{
External_wdt_refresh();//喂狗 4K喂狗一次
CAN_BootExecutiveStt = 10;//擦除长度写完,重新擦除
IAP_EEPROM_ERASE(s_startAddr,FLASH_BLOCK_SIZE);//
RgEasySize = FLASH_BLOCK_SIZE;//重新为4K
// ssdk_printf(SSDK_CRIT, "RxData2[0] :0x%x,RxData2[1]:0x%x\r\n",Flash_RxBuf_2.RxData[0],Flash_RxBuf_2.RxData[1]);
IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_2.RxData[0], Flash_RxBuf_2.Flash_RxBufLen);//20230209修改写flash不需要转换为32位就是单个字节
s_startAddr = s_startAddr + (Flash_RxBuf_2.Flash_RxBufLen);//烧写地址累加
RgEasySize = RgEasySize - Flash_RxBuf_2.Flash_RxBufLen;//擦除总长度-当前写入的长度
Flash_RxBuf_2.Flash_RxBufSta = FlashBufWrite;
}
}
else//CRC 校验不通过
{
CAN_BootExecutiveStt = 10;
Flash_RxBuf_2.Flash_RxBufSta = FlashBufCRCFail;
ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8);
ENETTxMessage[1] = (uint8_t)(CRC_UPDATE);
ENETTxMessage[2] = CRC_Fail;
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3);
ssdk_printf(SSDK_CRIT, "CCCRCfail:0x%x,RxCRCfail:0x%x\r\n",crcData,Flash_RxBuf_2.Flash_RxBufCRC);
}
}
else//都没有接收完成
{
CAN_BootExecutiveStt = 10;
}
break;
default:break;
}
break;
case Write_VERSION:
if(BOOT0_index == (pRxMessage->RxData[2]))
{
WriteE2adr = BOOT0_VERSION_E2adr;
}
else if(BOOT1_index == (pRxMessage->RxData[2]))
{
WriteE2adr = BOOT1_VERSION_E2adr;
}
else if(APP_index == (pRxMessage->RxData[2]))
{
WriteE2adr = APP_VERSION_E2adr;
}
else{}
EnterRegion = (pRxMessage->RxData[2]);//下次跳转区域
wrbyte_24c02(WriteE2adr,pRxMessage->RxData[3]);
wrbyte_24c02(WriteE2adr+1,pRxMessage->RxData[4]);
wrbyte_24c02(WriteE2adr+2,pRxMessage->RxData[5]);
wrbyte_24c02(WriteE2adr+3,pRxMessage->RxData[6]);
wrbyte_24c02(WriteE2adr+4,pRxMessage->RxData[7]);
ENETTxMessage[0] = (uint8_t)(Write_VERSION>>8); //读取E2看是否正常写入
ENETTxMessage[1] = (uint8_t)(Write_VERSION);
ENETTxMessage[2] = (pRxMessage->RxData[2]);
ENETTxMessage[3] = rdbyte_24c02(WriteE2adr);
ENETTxMessage[4] = rdbyte_24c02(WriteE2adr+1);
ENETTxMessage[5] = rdbyte_24c02(WriteE2adr+2);
ENETTxMessage[6] = rdbyte_24c02(WriteE2adr+3);
ENETTxMessage[7] = rdbyte_24c02(WriteE2adr+4);
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8);
break;
case ENTER_APP:
if((BOOT0_index == EnterRegion) || (BOOT1_index == EnterRegion))
{
flash.sw_rst = true;
sdrv_spi_nor_deinit(&flash);
/* soft reset xspi host */
sdrv_spi_nor_drv_deinit(&flash);
for(;;)
{
ssdk_printf(SSDK_INFO, "Restart!\r\n");
udelay(100000);
}//重启
}
else if(APP_index == (pRxMessage->RxData[2]))
{
goToApp();
}
else{}
break;
case EXCUTE_APP:
wrbyte_24c02(Update_Flg_E2adr,NORMAL_ON);
udelay(3000);//延时3ms
goToApp();
break;
case READ_PSN://读取PSN
if(BOOT0_index == (pRxMessage->RxData[2]))
{
IAP_EEPROM_READ( BOOT0_PSN_adr,psn_data,4);
}
else if(BOOT1_index == (pRxMessage->RxData[2]))
{
IAP_EEPROM_READ( BOOT1_PSN_adr,psn_data, 4);
}
else
{
}
ENETTxMessage[0] = (uint8_t)(READ_PSN>>8); //读取E2看是否正常写入
ENETTxMessage[1] = (uint8_t)(READ_PSN);
ENETTxMessage[2] = (pRxMessage->RxData[2]);
ENETTxMessage[3] = psn_data[3];
ENETTxMessage[4] = psn_data[2];
ENETTxMessage[5] = psn_data[1];
ENETTxMessage[6] = psn_data[0];
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 7);
break;
case WRITE_IP://修改IP 重启后有效
wrbyte_24c02(BOOT_DES_IP, (pRxMessage->RxData[2]));
wrbyte_24c02(BOOT_DES_IP+1,(pRxMessage->RxData[3]));
wrbyte_24c02(BOOT_DES_IP+2,(pRxMessage->RxData[4]));
wrbyte_24c02(BOOT_DES_IP+3,(pRxMessage->RxData[5]));
ENETTxMessage[0] = (uint8_t)(WRITE_IP>>8); //读取E2看是否正常写入
ENETTxMessage[1] = (uint8_t)(WRITE_IP);
ENETTxMessage[2] = rdbyte_24c02(BOOT_DES_IP );
ENETTxMessage[3] = rdbyte_24c02(BOOT_DES_IP+1);
ENETTxMessage[4] = rdbyte_24c02(BOOT_DES_IP+2);
ENETTxMessage[5] = rdbyte_24c02(BOOT_DES_IP+3);
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 6);
break;
case LOST_FRAME://丢帧
ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8);
ENETTxMessage[1] = (uint8_t)(CRC_UPDATE);
ENETTxMessage[2] = CRC_Fail;
printf("Lost Frame");
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3);
break;
default:break;
}
}
/**
* ReadUpgradeFlag
*
* @param[in]
* @return none
*
* @brief read upgrade flag from flash
*/
void ReadUpgradeFlag(void)
{
static uint16_t lost_cnt = 0;
uint8_t flash_buf[8] = {0,0,0,0,0,0,0,0};
//--------------------------------------------------------------------
if ( (g_canRxMsgFlag) || (Eth_Rx_Flag != 0) )
{
g_canRxMsgFlag = 0;
Eth_Rx_Flag --;
CAN_BootExecutiveCommand(&ENET_RxBuf_1);
}
if(1 == flash_eth_time)//超过2s标志未清楚认为是丢帧
{
lost_cnt ++;
if(lost_cnt >= 2000)//2s 定时
{
lost_cnt = 0;
flash_eth_time = 0;
ethCmdSTT = 0;//清空接收状态,重新开始接收
flash_buf[0] = (uint8_t)(CRC_UPDATE>>8);
flash_buf[1] = (uint8_t)(CRC_UPDATE);
flash_buf[2] = CRC_Fail;
printf("Lost Frame");
bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, flash_buf, 3);
}
}
else
{
lost_cnt = 0;
}
}