/********************************** (C) COPYRIGHT  *******************************
* File Name          : iap.h
* Author             : WCH
* Version            : V1.0.0
* Date               : 2020/12/16
* Description        : IAP
*******************************************************************************/
#ifndef __IAP_H
#define __IAP_H 	

#include "ch32f20x.h"
#include "stdio.h"
#include "usb_desc.h"

/* Debug */
#define PRINT     1   //0 失能， 1 使能printf

/* 版本 */
#define Version_Num   0x0100   //V0100 


#define BUILD_UINT16(loByte, hiByte) ((uint16_t)(((loByte) & 0x00FF) | (((hiByte) & 0x00FF) << 8)))
#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \
          ((UINT32)((UINT32)((Byte0) & 0x00FF) \
          + ((((UINT32)Byte1) & 0x00FF) << 8) \
          + ((((UINT32)Byte2) & 0x00FF) << 16) \
          + ((((UINT32)Byte3) & 0x00FF) << 24)))

/* 串口通信发送同步帧头 */
#define Uart_Sync_Head1   0x57
#define Uart_Sync_Head2   0xab


/*以下为IAP下载命令定义*/
#define CMD_IAP_PROM      0x80        // ISP编程命令
#define CMD_IAP_ERASE     0x81        // ISP擦除命令
#define CMD_IAP_VERIFY    0x82        // ISP校验命令
#define CMD_IAP_END       0x83        // ISP结束标志

/* 状态返回，2字节 */
#define ERR_SCUESS        0x00
#define ERR_ERROR         0x01
#define ERR_End           0x02

/* 数据结构体 */
typedef struct _ISP_CMD{
	u8 Cmd;                              // 命令 
	u8 Len;                              // 1字节数据长度
	u8 adr[2];                           // 2字节地址       
	u8 data[64];	
}isp_cmd;



typedef  void (*iapfun)(void);				//定义一个函数类型的参数.   


extern u32 Program_Verity_addr;
extern u32 User_APP_Addr_offset;
extern u8 EP2_IN_Flag;
extern u8 EP2_OUT_Flag;
extern u8 EP2_Rx_Buffer[USBD_DATA_SIZE];
extern u16 EP2_Rx_Cnt;
extern u8 EP2_Tx_Buffer[2];
extern u16 EP2_Tx_Cnt; 



void EP2_RecData_Deal(void); 
void GPIO_Cfg_init(void);
u8 PA0_Check(void);
void iap_load_app(u32 appxaddr);
void USART1_CFG(u32 baudrate);
void USBD_CFG(void);
void UART_Rx_Deal(void);

#endif
