44 lines
1.5 KiB
C
44 lines
1.5 KiB
C
#include "parallel_nand_pcan_gas.h"
|
|
|
|
static pcan_gas_status_t convert(parallel_nand_gas_result_t result)
|
|
{
|
|
switch (result) {
|
|
case PNAND_GAS_OK: return PCAN_GAS_OK;
|
|
case PNAND_GAS_NO_REG: return PCAN_GAS_NO_REG;
|
|
case PNAND_GAS_READ_ONLY: return PCAN_GAS_READ_ONLY;
|
|
default: return PCAN_GAS_REJECTED;
|
|
}
|
|
}
|
|
|
|
static pcan_gas_status_t read_reg(const pcan_gas_region_t *region,
|
|
uint16_t offset, uint16_t *value)
|
|
{
|
|
parallel_nand_gas_t *gas = (parallel_nand_gas_t *)region->user;
|
|
unsigned int portable_value;
|
|
parallel_nand_gas_result_t result = parallel_nand_gas_read(
|
|
gas, (unsigned int)region->base + offset, &portable_value);
|
|
if (result == PNAND_GAS_OK) *value = (uint16_t)portable_value;
|
|
return convert(result);
|
|
}
|
|
|
|
static pcan_gas_status_t write_reg(const pcan_gas_region_t *region,
|
|
uint16_t offset, uint16_t value)
|
|
{
|
|
parallel_nand_gas_t *gas = (parallel_nand_gas_t *)region->user;
|
|
return convert(parallel_nand_gas_write(
|
|
gas, (unsigned int)region->base + offset, value));
|
|
}
|
|
|
|
void parallel_nand_pcan_gas_region_init(pcan_gas_region_t *region,
|
|
parallel_nand_gas_t *gas)
|
|
{
|
|
region->base = (uint16_t)gas->base;
|
|
region->count = PNAND_GAS_REGION_REGS;
|
|
region->storage = 0;
|
|
region->read = read_reg;
|
|
region->write = write_reg;
|
|
region->flags = 0U;
|
|
region->user = gas;
|
|
region->name = "parallel-nand";
|
|
}
|