#ifndef __LIBCPNV_H
#define __LIBCPNV_H


enum FS_PARTITION_NO {
	FS_IMAGEFS,
	FS_RESOURCEFS,
	FS_NVROFS,
	FS_PARTITION_NO_MAX
};

#define SYSCALL_jffs2_quick_gc_wait_done   385

#define CPNV_OK     (0)
#define CPNV_ERROR (0xFFFFFFFF)

/**
 * @brief 写CP侧NVRW区NV项
 * @param NvItemID      入参，NV项ID
 * @param NvItemData    入参，写入NV项数据缓冲区
 * @param NvItemLen     入参，写入NV项数据缓冲区长度
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning 数据先写到内存，定时刷新到flash。如果要求及时刷新到flash需要再调用cpnv_NvramFlush刷新
 */
extern unsigned int cpnv_NvItemWrite(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen);

/**
 * @brief 读取CP侧NVRW区NV项
 * @param NvItemID      入参，NV项ID
 * @param NvItemData    出参，读取NV项数据缓冲区
 * @param NvItemLen     入参，读取NV项数据缓冲区长度
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning
 */
extern unsigned int cpnv_NvItemRead(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen);

/**
 * @brief  刷新NVRW区缓存数据到flash
 * @param  无
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning
 */
extern unsigned int cpnv_NvramFlush(void);

/**
 * @brief 写CP侧NVFAC区NV项
 * @param NvItemID      入参，NV项ID
 * @param NvItemData    入参，写入NV项数据缓冲区
 * @param NvItemLen     入参，写入NV项数据缓冲区长度
 * @return 无
 * @retval
 * @note
 * @warning
 */
void cpnv_NvItemWriteFactory(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen);

/**
 * @brief 写CP侧NVRO区NV项
 * @param NvItemID      入参，NV项ID
 * @param NvItemData    入参，写入NV项数据缓冲区
 * @param NvItemLen     入参，写入NV项数据缓冲区长度
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note 调用之前要用cpnv_ChangeNvRoAttr设置为可写
 * @warning 调用后要用cpnv_ChangeNvRoAttr设置为只读，保护NVRO区数据
 */
unsigned int cpnv_NvItemWriteNvro(unsigned int NvItemID, unsigned char *NvItemData, unsigned int NvItemLen);

/**
 * @brief  NV恢复出厂数据
 * @param  无
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning
 */
unsigned int cpnv_ResetNVFactory(void);

/**
 * @brief  设置NVRO区读写属性
 * @param  writable为0设置NVRO区为只读，其他值设置为可写
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning
 */
unsigned int cpnv_ChangeNvRoAttr(int writable);

/**
 * @brief  设置imagefs/resource/nvrofs分区可写属性
 * @param  partition_no取值自enum FS_PARTITION_NO；writable为0设置为只读，其他值设置为可写
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning
 */
unsigned int cpnv_ChangeFsPartitionAttr(int partition_no, int writable);

/**
 * @brief  等待imagefs/resource/nvrofs 文件系统垃圾回收，partition_no取值自enum FS_PARTITION_NO
 * @param  partition_no取值自enum FS_PARTITION_NO
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning 只能在整个该分区文件系统都写完毕后调用才有意义
 */
unsigned int cpnv_FsGcWait(int partition_no);

/**
 * @brief  nvro备份
 * @param  无
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning nvrofs里nvroall.bin、nvroc0wall.bin备份到nvrofs2
 */
unsigned int cpnv_NvroBackup(void);

/**
 * @brief  nvro恢复
 * @param  无
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning nvrofs2里nvroall.bin、nvroc0wall.bin恢复到nvrofs
 */
unsigned int cpnv_NvroRestore(void);

/**
 * @brief  nvro完整性检查
 * @param  flag: 2 检查nvroall.bin和nvroc0wall.bin; 其他值只检查nvroall.bin
 * @return CPNV_OK 成功，CPNV_ERROR 失败
 * @retval
 * @note
 * @warning 执行cpnv_NvroBackup后，才会进行真正检查
 */
unsigned int cpnv_nvro_check(int flag);

#endif // __LIBCPNV_H
