#ifndef PARALLEL_NAND_H #define PARALLEL_NAND_H #include "parallel_nand_port.h" #ifdef __cplusplus extern "C" { #endif #define PNAND_MT29F1G08_PAGE_MAIN 2048UL #define PNAND_MT29F1G08_PAGE_OOB 64UL #define PNAND_MT29F1G08_PAGES_PER_BLOCK 64UL #define PNAND_MT29F1G08_BLOCKS 1024UL #define PNAND_MT29F1G08_COLUMN_CYCLES 2U #define PNAND_MT29F1G08_ROW_CYCLES 2U #define PNAND_MT29F1G08_PAGE_TOTAL \ (PNAND_MT29F1G08_PAGE_MAIN + PNAND_MT29F1G08_PAGE_OOB) typedef enum { PNAND_OK = 0, PNAND_ERROR_ARGUMENT = -1, PNAND_ERROR_PORT = -2, PNAND_ERROR_TIMEOUT = -3, PNAND_ERROR_RANGE = -4, PNAND_ERROR_BUFFER = -5 } parallel_nand_result_t; typedef struct { unsigned long page_main_size; unsigned long page_oob_size; unsigned long pages_per_block; unsigned long block_count; unsigned int column_cycles; unsigned int row_cycles; unsigned long ready_timeout_us; } parallel_nand_geometry_t; typedef struct { const parallel_nand_port_t *port; parallel_nand_geometry_t geometry; } parallel_nand_t; extern const parallel_nand_geometry_t parallel_nand_mt29f1g08_geometry; int parallel_nand_init(parallel_nand_t *nand, const parallel_nand_port_t *port, const parallel_nand_geometry_t *geometry); int parallel_nand_reset(parallel_nand_t *nand); int parallel_nand_read_status(parallel_nand_t *nand, pnand_octet_t *status); int parallel_nand_read_id(parallel_nand_t *nand, pnand_octet_t address, pnand_octet_t *id, unsigned int count); int parallel_nand_read_page(parallel_nand_t *nand, unsigned long page, pnand_octet_t *main_data, unsigned long main_capacity, pnand_octet_t *oob, unsigned long oob_capacity); int parallel_nand_read_page_slice(parallel_nand_t *nand, unsigned long page, unsigned long column, pnand_octet_t *out, unsigned long count); int parallel_nand_is_bad_block(parallel_nand_t *nand, unsigned long block, int *is_bad); unsigned long parallel_nand_page_count(const parallel_nand_t *nand); #ifdef __cplusplus } #endif #endif