SPINAND 库设计说明
27 Nov 2024
Read time: 6 minute(s)
SPINAND 库数据结构设计
struct aic_spinand
定义了 SPINAND 控制器管理信息:
struct aic_spinand {
const struct aic_spinand_info *info;
struct spinand_id id;
void *user_data;
void *lock;
u8 use_continuous_read;
u8 qspi_dl_width;
u8 IsInited;
u8 *databuf;
u8 *oobbuf;
struct nand_bbt bbt;
};
提示:
info
表示 SPINAND 设备信息
use_continuous_read
表示 SPINAND 使能了连续读取模式(部分厂家芯片支持)
qspi_dl_width
表示 qspi 总线数据宽度 bbt
表示坏块管理信息
struct aic_spinand_info
定义了 SPINAND
设备配置信息
/* SPI NAND flash information */
struct aic_spinand_info {
u32 devid;
u16 page_size;
u16 oob_size;
u32 block_per_lun;
u32 pages_per_eraseblock;
u8 is_die_select;
const char *sz_description;
struct spi_nand_cmd_cfg *cmd;
};
struct spi_nand_cmd_cfg
定义了 SPINAND
操作命令配置的格式
struct spi_nand_cmd_cfg {
u8 opcode;
u8 opcode_bits;
u8 addr_bytes;
u8 addr_bits;
u8 dummy_bytes;
u8 data_bits;
};
SPINAND 库相关接口介绍
函数原型 | int spinand_flash_init(struct aic_spinand *flash); |
功能说明 | 初始化 spinand 芯片 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |
函数原型 | int spinand_read_id_op(struct aic_spinand *flash, u8 *id); |
功能说明 | 读取 spinand 芯片的 id |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u8 *id
读取 spinand id 缓存地址
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |
函数原型 | int spinand_read(struct aic_spinand *flash, u8 *addr, u32 offset, u32 size); |
功能说明 | 从 spinand 读取数据 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u8 *addr
读取 spinand 数据缓存地址
u32 offset
从 spinand 读取数据的偏移地址
u32 size
从 spinand 读取数据的长度
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | offset 需要与 page 大小对齐 |
函数原型 | int spinand_write(struct aic_spinand *flash, u8 *addr, u32 offset, u32 size); |
功能说明 | 写入数据到 spinand |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u8 *addr
写入 spinand 数据缓存地址
u32 offset
写入 spinand 数据的偏移地址
u32 size
写入 spinand 数据的长度
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | offset 需要与 page 大小对齐 |
函数原型 | int spinand_erase(struct aic_spinand *flash, u32 offset, u32 size); |
功能说明 | 擦除 spinand 数据 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u32 offset
擦除 spinand 数据的偏移地址
u32 size
擦除 spinand 数据的长度
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | offset 和 size 需要与 block 大小对齐 |
函数原型 | int spinand_block_erase(struct aic_spinand *flash, u16 blk); |
功能说明 | 擦除 spinand 指定块地址的块数据 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u16 blk
spinand 块地址
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |
函数原型 | int spinand_block_isbad(struct aic_spinand *flash, u16 blk); |
功能说明 | 判断 spinand 指定块地址的块是否是坏块 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u16 blk
spinand 块地址
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |
函数原型 | int spinand_block_markbad(struct aic_spinand *flash, u16 blk); |
功能说明 | 标记 spinand 指定块地址的块为坏块 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u16 blk
spinand 块地址
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |
函数原型 |
int spinand_read_page(struct aic_spinand *flash, u32 page,
u8 *data,
u32 data_len, u8 *spare, u32 spare_len);
|
功能说明 | 读取 spinand 指定 page 上的数据 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u32 page
spinand 页地址
u8 *data
读 page 主区域数据的缓存地址
u32 data_len
读 page 主区域数据的长度
u8 *spare
读 page spare 区域数据的缓存地址
u32 spare_len
读 page spare 区域数据的长度
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |
函数原型 |
int spinand_write_page(struct aic_spinand *flash, u32 page,
const u8 *data,
u32 data_len, const u8 *spare, u32 spare_len);
|
功能说明 | 写入数据到 spinand 指定 page 上 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u32 page
spinand 页地址
u8 *data
写 page 主区域数据的缓存地址
u32 data_len
写 page 主区域数据的长度
u8 *spare
写 page spare 区域数据的缓存地址
u32 spare_len
写 page spare 区域数据的长度
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |
函数原型 |
int spinand_continuous_read(struct aic_spinand *flash, u32
page, u8 *data, u32 size);
|
功能说明 | 使用连续读取模式读取 spinand 上指定长度的数据 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u32 page
spinand 页地址
u8 *data
读 spinand 数据的缓存地址
u32 size
读 spinand 数据的长度
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | size 需要大于等于 2 个 page 大小 |
函数原型 | int spinand_config_set(struct aic_spinand *flash, u8 mask, u8 val); |
功能说明 | 设置 spinand 配置寄存器的值 |
参数定义 |
struct aic_spinand *flash
spinand 设备对象
u8 mask
配置寄存器的掩码
u8 val
配置寄存器的值
|
返回值 |
0: 成功
其他: 失败
|
注意事项 | - |