#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) #define PNAND_HY27UF084G2M_PAGE_MAIN 2048UL #define PNAND_HY27UF084G2M_PAGE_OOB 64UL #define PNAND_HY27UF084G2M_PAGES_PER_BLOCK 64UL #define PNAND_HY27UF084G2M_BLOCKS 4096UL #define PNAND_HY27UF084G2M_COLUMN_CYCLES 2U #define PNAND_HY27UF084G2M_ROW_CYCLES 3U #define PNAND_HY27UF084G2M_MANUFACTURER_ID 0xADU #define PNAND_HY27UF084G2M_DEVICE_ID 0xDCU #define PNAND_HY27UF084G2M_ID3 0x80U #define PNAND_HY27UF084G2M_ID4 0x95U #define PNAND_HY27UF084G2M_PAGE_TOTAL \ (PNAND_HY27UF084G2M_PAGE_MAIN + PNAND_HY27UF084G2M_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, PNAND_ERROR_WRITE_PROTECTED = -6, PNAND_ERROR_PROGRAM_FAILED = -7, PNAND_ERROR_ERASE_FAILED = -8, PNAND_ERROR_BAD_BLOCK = -9, PNAND_ERROR_CONFIRMATION = -10 } 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; extern const parallel_nand_geometry_t parallel_nand_hy27uf084g2m_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_program_page(parallel_nand_t *nand, unsigned long page, const pnand_octet_t *main_data, unsigned long main_count, const pnand_octet_t *oob, unsigned long oob_count); int parallel_nand_erase_block(parallel_nand_t *nand, unsigned long block); 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