
#ifndef __STIAP_H__
#define __STIAP_H__

#include "config.h"
#include "stflash.h"
#include "stapp.h"

#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
#include "norflash.h"
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
#include "corefmc.h"
#endif
//-------------------------------------------------------------------------------
/*
	iap 控制程序
	通过 bootloader 编程 app 区域
	支持 接收升级数据到 norflash exram st-flash ，然后写入app区域
*/
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)

#define NOR_SAVE_BASE		(SNF_UPDATE_BEGIN) 					// NORflash中存放IAP数据的基地址 = 32MB-512KB
#define	NOR_SAVE_SIZE		(SNF_UPDATE_SIZE)					// NORflash中存放IAP数据区域大小

#define	NOR_SAVE_END		(NOR_SAVE_BASE+NOR_SAVE_SIZE)

#define NOR_MARK_ADDR     	(NOR_SAVE_BASE) 	   				// NORflash中存放升级标志地址，长度1K
#define NOR_APP_ADDR	    (NOR_SAVE_BASE+STM32_BOOT_SIZE) 	// 存放在NORflash中应用程序起始地址

#define MASK_BUF_LEN		0x80


	#define	APP_SAVE_BASE		NOR_SAVE_BASE
	#define APP_ADDR_BEG		NOR_APP_ADDR
	#define APP_MARK_ADDR		NOR_MARK_ADDR


#elif (APP_SAVE_TO == APP_SAVE_EXRAM)

#define	EXRAM_SAVE_BASE		CORE_SDRAM2_ADDR_BEG	//

#define	EXRAM_APP_ADDR		(EXRAM_SAVE_BASE + STM32_BOOT_SIZE)		// APP 数据起始地址
#define	TMP_SEC_ADDR		EXRAM_SAVE_BASE							// 临时数据存储地址
#define MAX_TMP_SIZE		(STM32_BOOT_SIZE)		// STM32_BOOT_SIZE

#define	EXRAM_MARK_ADDR		TMP_SEC_ADDR

#define MASK_BUF_LEN		0x80

	#define	APP_SAVE_BASE		EXRAM_SAVE_BASE
	#define APP_ADDR_BEG		EXRAM_APP_ADDR
	#define APP_MARK_ADDR		EXRAM_MARK_ADDR

#elif (APP_SAVE_TO == APP_SAVE_INFLASH)

#define INFLASH_SAVE_BASE		STF_UPDATE_BEGIN

#define INFLASH_MARK_ADDR		INFLASH_SAVE_BASE
#define INFLASH_APP_ADDR		(INFLASH_SAVE_BASE+MARK_SIZE)

	#define MASK_BUF_LEN		0x80

	#define	APP_SAVE_BASE		INFLASH_SAVE_BASE
	#define APP_ADDR_BEG		INFLASH_APP_ADDR
	#define APP_MARK_ADDR		INFLASH_MARK_ADDR
#else

#define MASK_BUF_LEN		0x80
#define	APP_SAVE_BASE		0
#define APP_ADDR_BEG		0
#define APP_MARK_ADDR		0

#endif

//--------------------------------------------------------------------

#define	IAPHEAD_LEN			(1*1024)

//--------------------------------------------------------------------

#define STM32_MARK    		"APP_CAN_UPDATE" 	 			// 关键字
#define APP_RIGHT			"APP_FILE_RIGHT"

typedef struct
{
	char upmask[MASK_BUF_LEN];
	u32 rdaddr;		// 数据读取偏移地址
	u32 wraddr;		// 数据写入偏移地址
	u32 size;		// 数据长度（字节数）
	u32 wsize;		// 写入长度
	u32 appcheck;	// app 数据的校验字

	u8 rev[IAPHEAD_LEN - MASK_BUF_LEN - 4*5 - 4];
	u32 checkcrc;	// 校验
}  __attribute__ ((packed)) IapHead;

//--------------------------------------------------------------------

//bootloader 接口函数
int UpdateApp(void);	        						// 升级主控文件
int JumpToApp(void);									// 执行flash里面的app程序

//主控 接口函数
void IAPCleanUpdateArea(void);							// 擦除升级区域norflash的块
void IapWritePara(u32 rdAddr, u32 wrAddr, u32 len, u32 wlen, u32 check);	// 写入升级起始地址和长度和升级标志
void IapRestartMcu(void);	        					// STM32软件复位

void CloseAllPeripheral(void);

//--------------------------------------------------------------------


//--------------------------------------------------------------------

#endif

