Files
2025-12-03 11:12:34 +08:00

85 lines
2.3 KiB
C

#ifndef _FTL_API_H
#define _FTL_API_H
#include "generic/typedef.h"
enum ftl_error_t {
FTL_ERR_NO = 0x00,
FTL_ERR_1BIT_ECC = 0x01,
FTL_ERR_READ = 0x02,
FTL_ERR_WRITE = 0x04,
FTL_ERR_NO_MEM = 0x08,
FTL_ERR_NO_BLOCK = 0x10,
FTL_ERR_INVALID = 0x20,
FTL_ERR_ADDR_OVER = 0x40,
};
struct ftl_nand_flash {
u8 block_size_shift;
u8 page_size_shift;
u8 page_num; //每个block的page数量
u16 block_begin; //需要管理的起始block
u16 block_end; //需要管理的结束block(不包含)
u16 logic_block_num; //虚拟出的逻辑block数量, 需要预留一定比例的坏块,
//要比物理block数量少
u16 page_size; //page大小(byte)
u16 oob_user_offset[2]; //可以使用的oob地址偏移(相对于oob起始地址)
u16 oob_user_size[2]; //可使用oob区域大小(byte)
u16 oob_size; //oob区域大小(byte)
u32 max_erase_cnt; //block的最大擦除次数
u8 plane_number; //plane的数量
enum ftl_error_t (*page_read)(u16 block, u8 page, u16 offset, u8 *buf, int len);
enum ftl_error_t (*page_write)(u16 block, u8 page, u8 *buf, int len);
enum ftl_error_t (*erase_block)(u32 addr);
};
struct ftl_config {
u8 page_buf_num; //page缓存数量,最少1个,影响读取和写入速度
u16 delayed_write_msec; //写入数据没满一个page时,延时写入flash的时间,
//0表示每次都直接写入
};
int ftl_init(struct ftl_nand_flash *flash, struct ftl_config *config);
int ftl_read_bytes(u32 addr, u8 *buf, u32 len, enum ftl_error_t *error);
int ftl_write_bytes(u32 addr, u8 *buf, u32 len, enum ftl_error_t *error);
/*
* 返回flash block size, 单位KByte
*/
int ftl_get_block_size();
/*
* 返回flash容量, 单位KByte
*/
int ftl_get_capacity();
/*
* 擦除逻辑地址, 地址要按block大小对齐
*/
int ftl_erase_lgc_addr(u32 addr);
int ftl_format();
/*
* 释放掉ftl管理申请的memory和任务
*/
void ftl_uninit();
/*
* 返回擦除次数大于等于 check_erase_cnt 的block的数量
*/
int ftl_erase_cnt_check(int check_erase_cnt);
/*
* 打印block信息*debug使用
*/
void ftl_dump_block_info();
/*
低功耗释放缓存
*/
void ftl_free_page_buf();
#endif