156 lines
5.5 KiB
C
156 lines
5.5 KiB
C
|
#ifndef _VM_H_
|
|||
|
#define _VM_H_
|
|||
|
|
|||
|
#include "ioctl.h"
|
|||
|
#include "device/device.h"
|
|||
|
|
|||
|
#define IOCTL_SET_VM_INFO _IOW('V', 1, 1)
|
|||
|
#define IOCTL_GET_VM_INFO _IOW('V', 2, 1)
|
|||
|
// enum {
|
|||
|
// #<{(|
|
|||
|
// * 用户自定义配置项 (0-64)
|
|||
|
// |)}>#
|
|||
|
// #<{(| ... |)}>#
|
|||
|
// }
|
|||
|
|
|||
|
// VM define and api
|
|||
|
typedef u16 vm_hdl;
|
|||
|
|
|||
|
struct vm_table {
|
|||
|
u16 index;
|
|||
|
u16 value_byte;
|
|||
|
int value; //cache value which value_byte <= 4
|
|||
|
};
|
|||
|
|
|||
|
typedef enum _vm_err {
|
|||
|
VM_ERR_NONE = 0,
|
|||
|
VM_INDEX_ERR = -0x100,
|
|||
|
VM_INDEX_EXIST, //0xFF
|
|||
|
VM_DATA_LEN_ERR, //0xFE
|
|||
|
VM_READ_NO_INDEX, //0xFD
|
|||
|
VM_READ_DATA_ERR, //0xFC
|
|||
|
VM_WRITE_OVERFLOW, //0xFB
|
|||
|
VM_NOT_INIT,
|
|||
|
VM_INIT_ALREADY,
|
|||
|
VM_DEFRAG_ERR,
|
|||
|
VM_ERR_INIT,
|
|||
|
VM_ERR_PROTECT
|
|||
|
} VM_ERR;
|
|||
|
|
|||
|
enum {
|
|||
|
LOAD_SPI_CODE_NO_NEED,
|
|||
|
LOAD_SPI_CODE2CACHE,
|
|||
|
LOAD_SPI_REGION_CODE2CACHE,
|
|||
|
};
|
|||
|
|
|||
|
// vm api
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief VM区域擦除函数
|
|||
|
@param void
|
|||
|
@note VM_ERR VM_ERR vm错误码
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
VM_ERR vm_eraser(void);
|
|||
|
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
/**
|
|||
|
* @brief VM初始化函数,所有VM操作之前都必须先初始化
|
|||
|
*
|
|||
|
* @param [in] dev_hdl NULL
|
|||
|
* @param [in] vm_addr VM起始地址
|
|||
|
* @param [in] vm_len VM总大小空间
|
|||
|
* @param [in] vm_mode 设置最小操作单元,目前支持按sector和按page写入
|
|||
|
*
|
|||
|
* @return VM_ERR vm错误码
|
|||
|
*/
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
VM_ERR vm_init(void *dev_hdl, u32 vm_addr, u32 vm_len, u8 vm_mode);
|
|||
|
|
|||
|
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
/**
|
|||
|
* @brief 返回vm区域已经使用了多少。
|
|||
|
*
|
|||
|
* @return 大小(单位:bit)
|
|||
|
*/
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
u32 vm_get_usage(void);
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
/**
|
|||
|
* @brief 按照百分比的形式返回vm区域已经使用了多少。建议设置在main函数的board_early_init函数的前面
|
|||
|
*
|
|||
|
* @return 百分比(0-99)
|
|||
|
*/
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
u8 vm_get_usage_percent(void);
|
|||
|
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
/**
|
|||
|
* @brief 按百分比的形式设置vm模块触发区域整理的警告线高度。注:该函数应该在vm_init初始化之前调用,否则vm_init会默认设置为vm_warning_line_num默认参数(80%)
|
|||
|
*
|
|||
|
* @param [in] vm_warning_line_num 警告线百分比(0-100)
|
|||
|
*/
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
void vm_set_warning_line(u8 vm_warning_line_num);
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief VM_WARNING_LINE检测函数
|
|||
|
@param void:默认检测单前使用区域
|
|||
|
@return FALSE:未到达警告线,TRUE:以到达警告
|
|||
|
@note 用于整理VM前检测
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
bool vm_warning_line_check(void);
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief VM检测是否到达百分比警告线,到达则整理VM区域,不到达则清除一个flash最小操作单元
|
|||
|
@param level:0:查询VM是否需要整理,并进行一次擦除vm未使用区域的操作 1:整理全VM区域
|
|||
|
@return NON
|
|||
|
@note 当调用vm_write写入的累计内容到达百分比警告线时会触发vm整理区域机制,会长时间操作flash,因此出现系统卡顿现象。虽然vm写操作会擦除一次最小flash操作单元,但不一定能保证在vm已经使用区域大小到达警告线的时候可以完全擦除vm的未使用区域,所以外部app应该在实现流程不忙碌的时候调用vm_check_all(0)参数查询VM是否需要整理,并进行一次擦除操作。
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void vm_check_all(u8 level); //level : default 0
|
|||
|
|
|||
|
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
/**
|
|||
|
* @brief VM不检测是否到达警告线,立即快速清除已经使用的flash空间并整理VM区域
|
|||
|
*
|
|||
|
* @return VM_ERR vm错误码
|
|||
|
*/
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
VM_ERR vm_defrag_used(void);
|
|||
|
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
/**
|
|||
|
* @brief VM不检测是否到达警告线,立即清除全部使用的flash空间并整理VM区域。注:该函数会擦除整块属于vm使用的flash区域,耗时较长,建议使用vm_defrag_used
|
|||
|
*
|
|||
|
* @return VM_ERR vm错误码
|
|||
|
*/
|
|||
|
/* --------------------------------------------------------------------------*/
|
|||
|
VM_ERR vm_defrag_all(void);
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief VM模块重置,擦除掉vm占用的flash的内容,耗时较长。
|
|||
|
@return VM_ERR vm错误码
|
|||
|
@note 用于整理VM前检测
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
VM_ERR vm_reset(void);
|
|||
|
|
|||
|
u8 get_vm_statu(void);
|
|||
|
// io api
|
|||
|
//s32 vm_read(vm_hdl hdl, void *data_buf, u16 len);
|
|||
|
//s32 vm_write(vm_hdl hdl, const void *data_buf, u16 len);
|
|||
|
|
|||
|
void spi_port_hd(u8 level);
|
|||
|
|
|||
|
bool sfc_erase_zone(u32 addr, u32 len);
|
|||
|
|
|||
|
void vm_api_write_mult(u16 start_id, u16 end_id, void *buf, u16 len, u32 delay);
|
|||
|
int vm_api_read_mult(u16 start_id, u16 end_id, void *buf, u16 len);
|
|||
|
|
|||
|
|
|||
|
#endif //_VM_H_
|
|||
|
|