289 lines
8.9 KiB
C
289 lines
8.9 KiB
C
|
||
#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__ */
|