Files
templates/c/parallel-nand/include/parallel_nand.h

69 lines
2.3 KiB
C

#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