驱动组成由以下所示 :
. ├── fnand_bbm.c ├── fnand_bbm.h ├── fnand.c ├── fnand_dma.c ├── fnand_dma.h ├── fnand_ecc.c ├── fnand_ecc.h ├── fnand_g.c ├── fnand.h ├── fnand_hw.c ├── fnand_hw.h ├── fnand_intr.c ├── fnand_option.c ├── fnand_sinit.c ├── fnand_timing.c ├── fnand_timing.h ├── fnand_toggle.c └── fnand_toggle.h
其中fnand.h 为用户开发者主要使用接口,提供了以下功能:
typedef struct _FNand
{
u32 is_ready; /* Device is ininitialized and ready*/
FNandConfig config;
u32 work_mode; /* NAND controler work mode */
/* nand flash info */
FNandInterMode inter_mode[FNAND_CONNECT_MAX_NUM]; /* NAND controler timing work mode */
FNandTimingMode timing_mode[FNAND_CONNECT_MAX_NUM];
u32 nand_flash_interface[FNAND_CONNECT_MAX_NUM] ; /* Nand Flash Interface , followed by FNAND_ONFI_MODE \ FNAND_TOGGLE_MODE*/
struct FNandDmaBuffer dma_data_buffer; /* DMA data buffer */
struct FNandDmaBuffer descriptor_buffer; /* DMA descriptor */
struct FNandDmaDescriptor descriptor[2]; /* DMA descriptor */
struct FNandSdrTimings sdr_timing; /* SDR NAND chip timings */
/* bbm */
FNandBadBlockManager bbt_manager[FNAND_CONNECT_MAX_NUM]; /* bad block manager handler */
/* nand detect */
FNandNandGeometry nand_geometry[FNAND_CONNECT_MAX_NUM]; /* nand flash infomation */
/* dma 页操作 */
FnandIrqEventHandler irq_event_fun_p; /* Interrupt event response function */
void *irq_args;
FNandOperationWaitIrqCallback wait_irq_fun_p; /* The NAND controller operates the wait function */
void *wait_args;
/* operations */
FNandTransferP write_p ; /* Write page function */
FNandTransferP read_p ; /* Read page function */
FNandTransferP write_oob_p ; /* Write page spare space function */
FNandTransferP read_oob_p ; /* Read page spare space function */
FNandTransferP write_hw_ecc_p ; /* Write page with hardware function */
FNandTransferP read_hw_ecc_p ; /* Read page with hardware function */
FNandEraseP erase_p; /* Erase block function */
} FNand;
FNAND_ERR_OPERATION /* NAND 控制器操作NAND flash 失败 */
FNAND_ERR_INVAILD_PARAMETER /* 当NAND 控制器配置信息不存在 */
FNAND_IS_BUSY /* NAND 控制器操作NAND flash ,控制器正忙 */
FNAND_OP_TIMEOUT /* NAND 控制器操作超时*/
FNAND_VALUE_ERROR /* NAND 控制器在进行BBM 搜索过程时,获取坏块管理信息不匹配 */
FNAND_VALUE_FAILURE /* 获取的数据与预期不相符合 */
FNAND_NOT_FET_TOGGLE_MODE /* toggle 模式 */
FNAND_ERR_READ_ECC /* 读取过程中,进行硬件ecc ,错误超过纠错的范围 */
FNAND_ERR_IRQ_OP_FAILED /* 中断进行读/写/擦操作时,回调函数反馈错误 */
FNAND_ERR_IRQ_LACK_OF_CALLBACK /* 中断进行读/写/擦操作时,缺少回调函数 */
FNAND_ERR_IRQ_OP_FAILED /* 等待中断回应失败 */
FNAND_ERR_NOT_MATCH /* 进行flash id 检测时,检测结果与预期不符合 */
baremetal/example/peripheral/nand/nand_test
FNandConfig *FNandLookupConfig(u32 instance_id)
FGicConfig * :静态默认配置
FError FNandCfgInitialize(FNand *instance_p,FNandConfig *config_p)
FError FNandScan(FNand *instance_p)
FError FNandWritePage(FNand *instance_p,u32 page_addr,u8 *buffer,u32 page_copy_offset ,u32 length,u8 *oob_buffer,u32 oob_copy_offset,u32 oob_length,u32 chip_addr)
FError FNandWritePageRaw(FNand *instance_p,u32 page_addr,u8 *buffer,u32 page_copy_offset ,u32 length,u8 *oob_buffer,u32 oob_copy_offset,u32 oob_length,u32 chip_addr)
FError FNandReadPage(FNand *instance_p,u32 page_addr,u8 *buffer,u32 page_copy_offset,u32 length,u8 *oob_buffer,u32 oob_copy_offset,u32 oob_length,u32 chip_addr)
FNand *instance_p FNand 控制器实例的指针
u32 page_addr 页操作地址,单位为页
u8 *buffer 指向读出内容缓冲区的指针
u32 page_copy_offset 读出某一页中的具体位置,当此参数非0 时,读出的地址为 ,在page_addr 对应的页面下 0 + page_copy_offset 开始的地址
u32 length 数据读出页面下的长度
u8 *oob_buffer 指向读出spare space内容 缓冲区的指针
u32 oob_copy_offset 读出某一页中spare space 的具体位置,当此参数非0 时,在page_addr 对应的页面下,读出的地址为 页长度 + page_copy_offset 开始的地址
u32 oob_length spare space数据读出的长度
u32 chip_addr 芯片地址
FError FNandReadPageRaw(FNand *instance_p,u32 page_addr,u8 *buffer,u32 page_copy_offset,u32 length,u8 *oob_buffer,u32 oob_copy_offset,u32 oob_length,u32 chip_addr)
FNand *instance_p FNand 控制器实例的指针
u32 page_addr 页操作地址,单位为页
u8 *buffer 指向读出内容缓冲区的指针
u32 page_copy_offset 读出某一页中的具体位置,当此参数非0 时,读出的地址为 ,在page_addr 对应的页面下 0 + page_copy_offset 开始的地址
u32 length 数据读出页面下的长度
u8 *oob_buffer 指向读出spare space内容 缓冲区的指针
u32 oob_copy_offset 读出某一页中spare space 的具体位置,当此参数非0 时,在page_addr 对应的页面下,读出的地址为 页长度 + page_copy_offset 开始的地址
u32 oob_length spare space数据读出的长度
u32 chip_addr 芯片地址
FError FNandEraseBlock(FNand *instance_p, u32 block, u32 chip_addr)
FNand *instance_p FNand 控制器实例的指针 u32 block 块的位置号 u32 chip_addr 芯片地址
FError FNandReadPageOOb(FNand *instance_p,u32 page_addr,u8 *oob_buffer,u32 oob_copy_offset,u32 oob_length,u32 chip_addr)
FError FNandWritePageOOb(FNand *instance_p,u32 page_addr,u8 *oob_buffer,u32 page_copy_offset,u32 oob_length,u32 chip_addr)
void FNandSetIsrHandler(FNand *instance_p, FnandIrqEventHandler event_p, void *irq_args)
无
void FNandIrqHandler(s32 vector, void *param)
void FNandInitBbtDesc(FNand *instance_p)
FError FNandScanBbt(FNand *instance_p, u32 target_addr)
FError FNandIsBlockBad(FNand *instance_p, u32 block, u32 target_addr)
void FNandOperationWaitIrqRegister(FNand *instance_p,FNandOperationWaitIrqCallback wait_irq_fun_p ,void *wait_args)
无
依据options 选项参数,配置对应参数
FError FNandSetOption(FNand *instance_p,u32 options,u32 value)