#ifndef __IAP_TASK_H__ #define __IAP_TASK_H__ #include #include #include #include #include #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__ */