Files
E3_boot/IAP_Task.h
2025-08-22 09:29:06 +08:00

289 lines
8.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __IAP_TASK_H__
#define __IAP_TASK_H__
#include <stdbool.h>
#include <stdio.h>
#include <sdrv_spi_nor.h>
#include <DLib_Product_string.h>
#include <sdrv_flexcan.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define EN_24C02 0
#define UDP_RECE_BUF_LEN 1472
#define TimeOutPeriod 10 /* Timer period, in Ms. */
/*address assignment */
#define BIM_IMAGE_START_ADD ((uint32_t) 0x08000000)
#define BIM_IMAGE_MAX_SIZE 0xA000
#define USER_IMAGE_START_ADD ((uint32_t) 0x0800A000)
#define USER_IMAGE_MAX_SIZE 0x1B000
#define BACKUP_IMAGE_START_ADD ((uint32_t) 0x08025000)
#define BACKUP_IMAGE_MAX_SIZE 0x1B000
#define UPDATA_FLAG_STORAGE_ADD ((uint32_t) 0x0803FF00)
#define FLASH_BLOCK_SIZE 4096
#define READ_DATA_LEN 2048
#define FLASH_PAGE_SIZE 0x1000
#define FLASH_PAGE_Write 4//写读取对齐
/*Flash operation information*/
#define BIN_INF_LEN 512
#define BOOT_DEBUG 1
#define CMD_FAILD 0x0
#define ONLINE_CHECK 0x1
#define ERASE_FLASH 0x3
#define SET_BAUDRATE 0x4
#define BLOCK_WRITE_INFO 0x5
#define WRITE_BLOCK_FLASH 0x6
#define BLOCK_READ_INFO 0x7
#define READ_BLOCK_FLASH 0x8
#define CMD_SUCCESS 0xB
#define RESTART_Soft 0xD
#define ENTER_UPDATE_MODE 0x1
#define READ_VERSION 0x100
#define CRC_UPDATE 0x101
#define Write_VERSION 0x103
#define ENTER_APP 0x102
#define EXCUTE_APP 0x02
#define WDT_Refresh 0x200
#define READ_PSN 0x400
#define WRITE_IP 0x501
#define DELAY_LOST_FRAME 0x304//延时丢帧
#define LOST_FRAME 0x305//丢帧
#define CRC_Pass 0x1 //CRC校验通过
#define CRC_Fail 0x2 //CRC校验不通过
#define DOWNLOAD_CAN 0x0 //通过can下载程序
#define DOWNLOAD_ETH 0x1 //通过以太网下载程序
#define BOOT0_index 1
#define BOOT1_index 2
#define APP_index 3
#define BPT_PSN_adr 0xFF0 //PSN相对于BPT首部的地址
#define BPT_IPSN_adr 0xFF4 //IPSN相对于BPT首部的地址 相当于PSN的取反
#define BOOT0_Flash_adr 0x7000 //注意地址要4K对齐
#define BOOT0_PSN_adr BOOT0_Flash_adr + BPT_PSN_adr //boot0 的PSN
#define BOOT0_IPSN_adr BOOT0_Flash_adr + BPT_IPSN_adr //boot0 的IPSN
#define BOOT1_Flash_adr 0x9C000
#define BOOT1_PSN_adr BOOT1_Flash_adr + BPT_PSN_adr //boot1 的PSN
#define BOOT1_IPSN_adr BOOT1_Flash_adr + BPT_IPSN_adr //boot1 的IPSN
#define APP_Flash_adr 0x140000
#define Update_Flg_E2adr 0x0 //占用1个字节
#define BOOT0_VERSION_E2adr 0x1 //占用5个字节 日期+时间+版本号 20 24 08 08 01
#define BOOT1_VERSION_E2adr 0x6 //占用5个字节 日期+时间+版本号 20 24 08 08 01
#define APP_VERSION_E2adr 0xB //占用5个字节 日期+时间+版本号 20 24 08 08 01
#define BOOT_DES_IP 0x10 //占用4个字节 下载IP 192.168.17.3
#define CMD_WIDTH 4
#define CMD_MASK 0xF
#define ADDR_MASK 0x1FFFFFF
#define DATA_SIZE (0x100) /* 256 bytes */
#define DATA_START_ADDR ((uint32_t)0x0803FF00)//0x0803FF00 //最后256用于存放数据0x0803FF00- 0x0803FFFF 256K
typedef enum{
NORMAL_ON = 0,
CAN_BOOTLOADER_UPGRADE,
}UpgradeFlag;
typedef struct _CBL_CMD_LIST{
volatile uint8_t EraseFlash; //擦出APP储存扇区数据
volatile uint8_t WriteBlockFlash; //以多字节形式写数据
volatile uint8_t ReadBlockFlash; //以多字节形式读数据
volatile uint8_t BlockWriteInfo; //设置多字节写数据相关参数(写起始地址,数据量)
volatile uint8_t BlockReadInfo; //设置多字节数据读相关参数(读起始地址,数据量)
volatile uint8_t OnlineCheck; //检测节点是否在线
volatile uint8_t CmdSuccess; //命令执行成功
volatile uint8_t CmdFaild; //命令执行失败
volatile uint8_t SetBaudRate; //设置节点波特率
volatile uint8_t ExcuteApp; //执行应用程序
volatile uint8_t EnterUpdateMode; //进入升级模式
volatile uint8_t EnterAPP; //进入APP
volatile uint8_t Restart; //重启
volatile uint8_t Undefine2; //未定义
volatile uint8_t Undefine3; //未定义
} CBL_CMD_LIST,*PCBL_CMD_LIST;
typedef struct _Flash_RxBuf
{
uint8_t Flash_RxBufSta; // flash 缓存状态 0 数据没有接收完成1数据接收完成2CRC校验不通过3CRC校验通过4写完成
uint16_t Flash_RxBufCRC; //CRC
uint32_t Flash_RxBufLen; //长度
uint32_t Flash_RxBufLenNow; //当前长度
uint8_t Download_Mode; //下载模式 0 can 1以太网
uint8_t RxData[1024]__attribute__((__aligned__(4))); //实际数据接收数据 注意4字节对齐 注意需要4字节对齐。
}Flash_RxBuf,*UnFlash_RxBuf;
typedef struct _Flash_info
{
uint16_t length; //长度
uint8_t dataBuffer[1100]; //匹配can数据
}Flash_info,*UnFlash_info;
#define FlashBufInitial 0x0//1k数据初始状态
#define FlashBufInComplete 0x1//数据写完成
#define FlashBufComplete 0x2//1k数据接收完成
#define FlashBufCRCFail 0x3//CRC校验收失败
#define FlashBufCRCPass 0x4//CRC校验收成功
#define FlashBufWrite 0x5//数据写完成
//typedef struct
//{
// u8 iapFileFlag[8]; //8-byte IAP flag, fixed as "WCHNET", the extra space is 0
// u32 iapFileLen; //4 bytes IAP file length, which is bin file length + 512 bytes
// u32 iapFileCheckSum; //4-byte checksum
//}iapFileHeader;
//
//typedef struct{
// u16 readIndex;
// u16 writeIndex;
// u16 buffUsedLen;
// u8 *dataBuff;
//}ethDataDeal;
typedef struct _ENET_RxBuf
{
uint8_t readPos; ///< read position in buffer
uint8_t writePos; ///< write position in buffer
uint8_t recvCount; ///< receive message count in buffer
uint8_t RxData[8]; //实际数据接收数据
}ENET_RxBuf,*pENET_RxBuf;
typedef struct {
volatile uint8_t canBootloaderUpgrade; //CAN升级标志位
uint8_t test1;
uint8_t test2;
uint8_t test3;
} SystemDataRecord;//这个结构体需与APP同步
extern struct flash_info *flash_info;
extern struct spi_nor flash;
extern flexcan_handle_t *handle;
extern void flexcan_transfer_callback(flexcan_handle_t *handle,
flexcan_status_e status, uint32_t result,
void *userData);
//外部数据结构
extern u8 IPAddr[4];//IP address
extern u8 GWIPAddr[4];//Gateway IP address
extern u8 IPMask[4];//subnet mask
extern u8 DESIP[4];//destination IP address
extern u16 desport;//destination port
extern u16 srcport;//source port
extern SystemDataRecord g_systemDataRecord;
//extern ethDataDeal dataDeal;
//extern iapFileHeader iapPara;
extern u32 fileDataLen;
extern u32 fileCheckSum;
extern ENET_RxBuf ENET_RxBuf_1;
extern CBL_CMD_LIST g_cmdList;
extern volatile uint8_t g_canRxMsgFlag ;//接收到CAN数据后的标志
extern uint16_t g_canAddr;
extern uint8_t g_recvData[1028];
extern uint32_t g_recvLen;
extern uint32_t OTA_CANTxID ;//默认发送ID为0x02
extern uint32_t OTA_CANRxID ;//默认接收ID为0x01
extern uint32_t WDT_CANRxID ;//默认接收ID为0x03
extern Flash_RxBuf Flash_RxBuf_1;
extern Flash_RxBuf Flash_RxBuf_2;
extern bool WDTReFresh_flag;//busoff标志
extern volatile uint16_t Eth_Rx_Flag;//接收到CAN数据后的标志
extern uint8_t des_ipaddr[4];//本机IP
extern uint8_t flash_eth_time;//
extern uint8_t ethCmdSTT;
//外部函数
void goToApp(void);
u8 IAPCopyFlashDeal(void);
void IAPParaInit(void);
void saveUpdatedFile(void);
void receUpdatedFile(u8 id);
void IAPFileParaCheck(u8 id);
uint16_t CAN_BootGetAddrData(void);
void ReadUpgradeFlag(void);
void IAP_EEPROM_ERASE_108k(u32 StartAddr);
void IAP_EEPROM_READ( u32 StartAddr, u8 *Buffer, u32 Length );
void IAP_EEPROM_ERASE(uint32_t Page_Address, u32 Length);
void IAP_EEPROM_WRITE( u32 StartAddr, u8 *Buffer, u32 Length );
int DataRecord_WriteUpgrade(uint8_t upgradeFlag);
void WCHNET_HandleGlobalInt(void);
unsigned char rdbyte_24c02(unsigned int add);
void wrbyte_24c02(unsigned int add,unsigned char dat);
void initSpi();
#endif /* __IAP_TASK_H__ */