/*
 * @Description: OTA模块-svc层
 * @Author: yangsw
 * @Date: 2021-06-21 10:44:09
 * @LastEditTime: 2023-02-28 23:10:57
 * @LastEditors: Lida
 * @Reference: 
 */
#ifndef H_SVC_OTA_H
#define H_SVC_OTA_H

#include "../../com/svc/svc_com.h"

/*固件信息地址*/
#define OTA_FIRMWARE_PARA_ADDR      (gw_u32)0x00025000
/*固件数据地址*/
#define OTA_FIRMWARE_ADDR           (gw_u32)0x00026000

/*真实固件的偏移量*/
#define OTA_FIRMWARE_BIN_INDEX      32 
/*单包升级固件大小*/
#define OTA_BUF_SIZE             2048

//前64个Block是bootloader程序存放位置，不能擦除，96*128=12288=0x3000=0xB000-0x8000
//#define FLASH_BLOCKS_NUM 960 //((0x0801FFFF-0x08002000 + (128 - 1))/128)=960
#define BLOCK_BYTES          128
#define FLASH_PAGE_SIZE      2048  
#define  FLASH_START          FLASH_BASE
#define  FLASH_END            (uint32_t)0x08003FFF 

#define BOOTLOADER_SIZE         0x4000
/*APP起始地址*/
#define APPLICATION_ADDRESS     (FLASH_START+BOOTLOADER_SIZE)

typedef struct{
    /*写入标志*/
    gw_u8 u8Sig;
    /*新固件标志*/
    gw_u8 u8IsNewFirmware;
    /*固件总长度*/
    gw_u32 u32FirmwareLen;
    gw_u8 u8softversion[2];
    //固件MD5
    gw_u8 u8Md5[16];
    /*校验和*/
    gw_u8 u8Sum; 
}S_Ota_Para;

typedef struct{
    gw_u8  pu8Buf[OTA_BUF_SIZE];
    S_Ota_Para s_para; 
}S_Ota;



S_Ota* Svc_Ota_Get_Data(void);
E_Result_State Svc_Ota_Save_Para(void);
E_Result_State Svc_Ota_Read_Para(S_Ota_Para *ps_ota_para);
E_Result_State Svc_Ota_Check(void);
void Svc_Ota_Load(void);
FLASH_STS MID_FLASH_E2P_Write(u32 addr, const u8* src, u32 len);
#endif