/*******************************************************************************
*
*
* File:        hal_system.h
* Description  hal 通用系统接口头文件
* Version      V0.1
* Date         2023-03-03
* Author       kevin
 *******************************************************************************/
#ifndef __HAL_FLASH_H__
#define __HAL_FLASH_H__
/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_common.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/

/*******************************************************************************
* 4.Global variable extern declarations
*******************************************************************************/

/*******************************************************************************
* 5.Global function prototypes
*******************************************************************************/

/**
* @brief  初始化flash 模块,使用完flash模块后需要deinit用于节省功耗
* @param
* @retval bool  无
*/
void hal_flash_init(void);

/**
* @brief  关闭flash 模块
* @param
* @retval bool  无
*/
void hal_flash_deinit(void);


/**
* @brief  flash ctl读取flash-uid操作
* @param  UID[16] 存放UID的数组,UID最大长度为16
* @param  UID 数组长度(最大16)
* @retval
*/
void hal_flash_read_uid(uint8_t *UID, uint8_t size);

/**
* @brief
* @param   flash_block:0-13，选择对应的block进行擦除,启动对某个block写之前需要先擦除对应64K数据
* @retval
*/
bool hal_flash_erase(uint8_t flash_block);


/**
* @brief  用户字节数组形式从flash读取数据,按页读取，每页1024字节
* @param  *usr_cfg_t_addr(数组首地址),
          usr_cfg_t_size(数组大小可以超过1024,超过1024时为跨页连续读)
          flash_block:选择操作的block(0-13,其中0-3为TDDI         Flash区域)
          flash_page :(一个block 页0~63)
          page_offset_addr:block = 64K
* @retval bool  无
*/
bool hal_flash_normal_read(uint8_t *usr_cfg_t_addr,
                           uint16_t usr_cfg_t_size,
                           uint8_t flash_block,
                           uint16_t flash_page,
                           uint16_t page_offset_addr);

/**
* @brief  用户字节数组形式存入flash(次数有限，不可频繁写入),按页写入，每页1024字节
         注意:写入某个block前确认使用hal_flash_erase进行擦除整个blocK,才能对该block的0-63page进行写入
* @param  *usr_cfg_t_addr(数组首地址),
         usr_cfg_t_size(数组大小可以超过1024,超过1024时为跨页连续写)
         flash_block:选择操作的block(0-13,其中0-3为TDDI Flash区域)
         flash_page （一个block 0~63页）
         page_offset_addr:0-1023 byte
* @retval bool  校验size是否超出
*/
bool hal_flash_normal_write(uint8_t *usr_cfg_t_addr,
                            uint16_t usr_cfg_t_size,
                            uint8_t flash_block,
                            uint16_t flash_page,
                            uint16_t page_offset_addr);

/**
* @brief  发送0xAB指令控制flash退出deep sleep power mode
* @param  none
* @retval null
*/
void hal_flash_release_power_down(void);

/**
* @brief  发送0xB9指令控制flash进入deep sleep power mode
* @param  none
* @retval null
*/
void hal_flash_power_down(void);

#endif //__HAL_FLASH_H__
