#ifndef INTERNAL_FLASH_H__
#define INTERNAL_FLASH_H__

typedef enum
{
    INT_FLASH_PASS = 0U,
    INT_FLASH_FAIL,
} Int_Flash_Result_en_t;

typedef enum
{
    INT_DATA_FLASH_IDLE = 0U,
    INT_DATA_FLASH_BUSY,
    INT_DATA_FLASH_ERROR,
} Int_Data_Flash_Status_en_t;

typedef void (*Int_Flash_Cb_Func_t)(void);

#define INT_DATA_FLASH_START_ADDR  (0xFF200000UL)
#define INT_DATA_FLASH_END_ADDR    (0xFF20FFFFUL)
#define INT_DATA_FLASH_BLOCK_SIZE  (64U)
#define INT_DATA_FLASH_BUFFER_SIZE (256U) /* 256 * 4 = 1024 bytes */

#define INT_CODE_FLASH_START_ADDR       (0x00000000UL)
#define INT_CODE_FLASH_END_ADDR         (0x003FFFFFUL)
#define INT_CODE_FLASH_8k_BLOCK_START   (0x00000000UL)
#define INT_CODE_FLASH_32k_BLOCK_START  (0x00010000UL)
#define INT_CODE_FLASH_BLOCK_0_7_SIZE   (8U * 1024U)
#define INT_CODE_FLASH_BLOCK_8_133_SIZE (32U * 1024U)
#define INT_CODE_FLASH_SIZE             (INT_CODE_FLASH_END_ADDR - INT_CODE_FLASH_START_ADDR + 1UL)

extern void Int_Flash_Init(void);

extern void                       Int_Data_Flash_Read(uint32_t u32Addr, uint32_t u32Data [], uint32_t u32Len);
extern void                       Int_Data_Flash_Erase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern uint32_t                   Int_Data_Flash_Blank_Check(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern void                       Int_Data_Flash_Write(uint32_t u32Addr, uint32_t u32Data [], uint32_t u32Len);
extern Int_Data_Flash_Status_en_t Int_Data_Flash_Status_Get(void);
extern void                       Int_Data_Flash_Register_P_E_Complete_Cb(Int_Flash_Cb_Func_t pfnCmpleteCb);
extern void                       Int_Data_Flash_Force_Stop(void);

extern Int_Flash_Result_en_t Int_Code_Flash_Read(uint32_t u32Addr, uint32_t u32Data [], uint32_t u32Len);
extern Int_Flash_Result_en_t Int_Code_Flash_Erase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern uint32_t              Int_Code_Flash_Blank_Check(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern Int_Flash_Result_en_t Int_Code_Flash_Write(uint32_t u32Addr, uint32_t u32Data [], uint32_t u32Len);
extern void                  Int_Code_Flash_Force_Stop(void);
extern Int_Flash_Result_en_t Int_Config_Set_Read(uint32_t u32Addr, uint16_t u16Data [], uint32_t u32Len);
extern Int_Flash_Result_en_t Int_Config_Program_Set_Write(uint32_t u32Addr, uint16_t u16Data [], uint32_t u32Len);

extern void Int_Flash_Ready_ISR(void);

#endif