/*******************************************************************************
*
*
* 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
*******************************************************************************/

typedef struct
{
    uint8_t     flash_block;
    uint8_t     flash_page;
    uint16_t    data_size;
    uint16_t    page_offset_addr;
    uint8_t    *user_data;
} fls_ops_cfg_t;

/**
* @brief 用户空间的操作
*/
typedef enum
{
    FLASH_USERDATA_READ,
} fls_userdata_ops_e;


/**
* @brief 公共区域的操作
*/
typedef enum
{
    FLASH_PUBLIC_READ,
    FLASH_PUBLIC_WRITE,
    FLASH_PUBLIC_ERASE_4K,
    FLASH_PUBLIC_ERASE_32K
} fls_public_ops_e;


/*******************************************************************************
* 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  发送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);

/**
* @brief  配置共享flash开关(使用过后注意关闭,常开功耗会增加)
* @param  enable:true:可通过F_SPI访问内部flash , false:不可通过F_SPI访问内部flash
* @retval true/false
*/
bool hal_flash_share_mode(bool enable);

/**
* @brief  获取user_data的个数
* @param
* @retval 数据个数
*/
uint32_t hal_flash_get_user_data_size(void);

/**
* @brief  Flash user data区域,该区域由烧录器烧录,软件只读,不可写。
          Size从hal_flash_get_user_data_size接口获取
* @param  ops:选择操作的方式：读
          cfg: flash_block: flash block = userdata偏移地址/64K
               flash_page:  flash page = (userdata偏移地址%/64K)/1K
               page_offset_addr: userdata偏移地址%block(1K)，flash page内偏移地址(0-1023)
               data_size: 读取数据的总长度 (0-1023)
               user_data: 读取的数据
* @retval 无
*/
void hal_flash_user_region_ops(fls_userdata_ops_e ops, fls_ops_cfg_t *cfg);


/**
* @brief  Flash公共区域，可读写、擦除，大小32KB
* @param  ops:选择操作的方式：读/写/擦除
          cfg: flash_block:固定为0
               flash_page:0-31   (总共32KB)
               page_offset_addr: flash page内偏移地址(0-1023)
               data_size: 需要操作数据的总长度 (0-1023)
               user_data: 需要操作的数据
* @retval 无
*/
void hal_flash_public_region_ops(fls_public_ops_e ops, fls_ops_cfg_t *cfg);
#endif //__HAL_FLASH_H__
