Добавить переносимый драйвер parallel NAND
This commit is contained in:
68
c/parallel-nand/include/parallel_nand.h
Normal file
68
c/parallel-nand/include/parallel_nand.h
Normal file
@@ -0,0 +1,68 @@
|
||||
#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
|
||||
84
c/parallel-nand/include/parallel_nand_gas.h
Normal file
84
c/parallel-nand/include/parallel_nand_gas.h
Normal file
@@ -0,0 +1,84 @@
|
||||
#ifndef PARALLEL_NAND_GAS_H
|
||||
#define PARALLEL_NAND_GAS_H
|
||||
|
||||
#include "parallel_nand.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define PNAND_GAS_DEFAULT_BASE 0xE000U
|
||||
#define PNAND_GAS_REGION_REGS 0x0520U
|
||||
#define PNAND_GAS_DATA_OFFSET 0x0100U
|
||||
#define PNAND_GAS_DATA_REGS 1024U
|
||||
#define PNAND_GAS_OOB_OFFSET 0x0500U
|
||||
#define PNAND_GAS_OOB_REGS 32U
|
||||
|
||||
enum {
|
||||
PNAND_GAS_REG_SIGNATURE = 0x0000,
|
||||
PNAND_GAS_REG_VERSION = 0x0001,
|
||||
PNAND_GAS_REG_STATUS = 0x0002,
|
||||
PNAND_GAS_REG_ERROR = 0x0003,
|
||||
PNAND_GAS_REG_COMMAND = 0x0004,
|
||||
PNAND_GAS_REG_PAGE_LO = 0x0005,
|
||||
PNAND_GAS_REG_PAGE_HI = 0x0006,
|
||||
PNAND_GAS_REG_PAGE_MAIN = 0x0007,
|
||||
PNAND_GAS_REG_PAGE_OOB = 0x0008,
|
||||
PNAND_GAS_REG_PAGES_PER_BLOCK = 0x0009,
|
||||
PNAND_GAS_REG_BLOCKS = 0x000A,
|
||||
PNAND_GAS_REG_MANUFACTURER_ID = 0x000B,
|
||||
PNAND_GAS_REG_DEVICE_ID = 0x000C,
|
||||
PNAND_GAS_REG_BAD_BLOCK = 0x000D,
|
||||
PNAND_GAS_REG_GENERATION_LO = 0x000E,
|
||||
PNAND_GAS_REG_GENERATION_HI = 0x000F
|
||||
};
|
||||
|
||||
enum {
|
||||
PNAND_GAS_CMD_NONE = 0,
|
||||
PNAND_GAS_CMD_RESET = 1,
|
||||
PNAND_GAS_CMD_READ_ID = 2,
|
||||
PNAND_GAS_CMD_READ_PAGE = 3
|
||||
};
|
||||
|
||||
#define PNAND_GAS_STATUS_READY 0x0001U
|
||||
#define PNAND_GAS_STATUS_BUSY 0x0002U
|
||||
#define PNAND_GAS_STATUS_PAGE_VALID 0x0004U
|
||||
#define PNAND_GAS_STATUS_BAD_BLOCK 0x0008U
|
||||
#define PNAND_GAS_STATUS_ERROR 0x8000U
|
||||
|
||||
typedef struct {
|
||||
parallel_nand_t *nand;
|
||||
unsigned int base;
|
||||
unsigned int status;
|
||||
int error;
|
||||
unsigned long selected_page;
|
||||
unsigned long generation;
|
||||
unsigned long cached_block;
|
||||
int cached_bad_block;
|
||||
int block_cache_valid;
|
||||
pnand_octet_t id[8];
|
||||
pnand_octet_t main_data[PNAND_MT29F1G08_PAGE_MAIN];
|
||||
pnand_octet_t oob[PNAND_MT29F1G08_PAGE_OOB];
|
||||
} parallel_nand_gas_t;
|
||||
|
||||
void parallel_nand_gas_init(parallel_nand_gas_t *gas,
|
||||
parallel_nand_t *nand, unsigned int base);
|
||||
|
||||
/* Portable GAS callbacks. Values and addresses are exactly 16 bits on wire. */
|
||||
typedef enum {
|
||||
PNAND_GAS_OK = 0,
|
||||
PNAND_GAS_NO_REG,
|
||||
PNAND_GAS_READ_ONLY,
|
||||
PNAND_GAS_REJECTED
|
||||
} parallel_nand_gas_result_t;
|
||||
|
||||
parallel_nand_gas_result_t parallel_nand_gas_read(
|
||||
parallel_nand_gas_t *gas, unsigned int address, unsigned int *value);
|
||||
parallel_nand_gas_result_t parallel_nand_gas_write(
|
||||
parallel_nand_gas_t *gas, unsigned int address, unsigned int value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
11
c/parallel-nand/include/parallel_nand_pcan_gas.h
Normal file
11
c/parallel-nand/include/parallel_nand_pcan_gas.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef PARALLEL_NAND_PCAN_GAS_H
|
||||
#define PARALLEL_NAND_PCAN_GAS_H
|
||||
|
||||
#include "parallel_nand_gas.h"
|
||||
#include "pcan_gas.h"
|
||||
|
||||
/* Adapter for targets where c/set-protocol pcan_gas is available. */
|
||||
void parallel_nand_pcan_gas_region_init(pcan_gas_region_t *region,
|
||||
parallel_nand_gas_t *gas);
|
||||
|
||||
#endif
|
||||
28
c/parallel-nand/include/parallel_nand_port.h
Normal file
28
c/parallel-nand/include/parallel_nand_port.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef PARALLEL_NAND_PORT_H
|
||||
#define PARALLEL_NAND_PORT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Один octet хранится в целом типе: это важно для C28x с 16-битным char. */
|
||||
typedef unsigned short pnand_octet_t;
|
||||
|
||||
typedef struct {
|
||||
int (*init)(void);
|
||||
void (*select)(void);
|
||||
void (*deselect)(void);
|
||||
void (*write_command)(pnand_octet_t value);
|
||||
void (*write_address)(pnand_octet_t value);
|
||||
void (*write_data)(pnand_octet_t value);
|
||||
pnand_octet_t (*read_data)(void);
|
||||
int (*is_ready)(void);
|
||||
void (*set_write_protect)(int enabled);
|
||||
void (*delay_us)(unsigned long us);
|
||||
} parallel_nand_port_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user