N25Q128 driver complete, to be tested.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9452 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
ceb256ed74
commit
eede81d562
|
@ -50,9 +50,9 @@ static flash_error_t erase_all(void *instance);
|
||||||
static flash_error_t erase_sectors(void *instance,
|
static flash_error_t erase_sectors(void *instance,
|
||||||
flash_sector_t sector,
|
flash_sector_t sector,
|
||||||
flash_sector_t n);
|
flash_sector_t n);
|
||||||
static flash_error_t are_sectors_erased(void *instance,
|
static flash_error_t verify_erase(void *instance,
|
||||||
flash_sector_t sector,
|
flash_sector_t sector,
|
||||||
flash_sector_t n);
|
flash_sector_t n);
|
||||||
static flash_error_t program(void *instance, flash_address_t addr,
|
static flash_error_t program(void *instance, flash_address_t addr,
|
||||||
const uint8_t *pp, size_t n);
|
const uint8_t *pp, size_t n);
|
||||||
static flash_error_t read(void *instance, flash_address_t addr,
|
static flash_error_t read(void *instance, flash_address_t addr,
|
||||||
|
@ -62,8 +62,7 @@ static flash_error_t read(void *instance, flash_address_t addr,
|
||||||
* @brief Virtual methods table.
|
* @brief Virtual methods table.
|
||||||
*/
|
*/
|
||||||
static const struct N25Q128DriverVMT n25q128_vmt = {
|
static const struct N25Q128DriverVMT n25q128_vmt = {
|
||||||
get_descriptor, erase_all, erase_sectors, are_sectors_erased,
|
get_descriptor, erase_all, erase_sectors, verify_erase, program, read
|
||||||
program, read
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -182,7 +181,7 @@ static flash_error_t erase_sectors(void *instance,
|
||||||
SPIDriver *spip = devp->config->spip;
|
SPIDriver *spip = devp->config->spip;
|
||||||
flash_address_t addr = (flash_address_t)(sector * SECTOR_SIZE);
|
flash_address_t addr = (flash_address_t)(sector * SECTOR_SIZE);
|
||||||
|
|
||||||
osalDbgCheck(instance != NULL);
|
osalDbgCheck((instance != NULL) && (n > 0U));
|
||||||
osalDbgCheck(sector + n <= descriptor.sectors_count);
|
osalDbgCheck(sector + n <= descriptor.sectors_count);
|
||||||
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
||||||
|
|
||||||
|
@ -227,19 +226,42 @@ static flash_error_t erase_sectors(void *instance,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static flash_error_t are_sectors_erased(void *instance,
|
static flash_error_t verify_erase(void *instance,
|
||||||
flash_sector_t sector,
|
flash_sector_t sector,
|
||||||
flash_sector_t n) {
|
flash_sector_t n) {
|
||||||
N25Q128Driver *devp = (N25Q128Driver *)instance;
|
N25Q128Driver *devp = (N25Q128Driver *)instance;
|
||||||
SPIDriver *spip = devp->config->spip;
|
SPIDriver *spip = devp->config->spip;
|
||||||
|
flash_error_t err;
|
||||||
|
|
||||||
osalDbgCheck(instance != NULL);
|
osalDbgCheck((instance != NULL) && (n > 0U));
|
||||||
osalDbgCheck(sector + n <= descriptor.sectors_count);
|
osalDbgCheck(sector + n <= descriptor.sectors_count);
|
||||||
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
||||||
|
|
||||||
(void)spip;
|
#if N25Q128_SHARED_SPI == TRUE
|
||||||
|
spiAcquireBus(spip);
|
||||||
|
spiStart(spip, devp->config->spicfg);
|
||||||
|
#endif
|
||||||
|
devp->state = FLASH_ACTIVE;
|
||||||
|
|
||||||
return FLASH_NO_ERROR;
|
/* Read command.*/
|
||||||
|
spiSelect(spip);
|
||||||
|
flash_send_cmd_addr(devp, N25Q128_CMD_READ, (size_t)(sector * SECTOR_SIZE));
|
||||||
|
n *= SECTOR_SIZE;
|
||||||
|
while (--n) {
|
||||||
|
if (spiPolledExchange(spip, 0xFF) != 0xFF) {
|
||||||
|
err = FLASH_VERIFY_FAILURE;
|
||||||
|
goto skip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spiUnselect(spip);
|
||||||
|
|
||||||
|
err = FLASH_NO_ERROR;
|
||||||
|
skip:
|
||||||
|
devp->state = FLASH_READY;
|
||||||
|
#if N25Q128_SHARED_SPI == TRUE
|
||||||
|
spiReleaseBus(spip);
|
||||||
|
#endif
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static flash_error_t program(void *instance, flash_address_t addr,
|
static flash_error_t program(void *instance, flash_address_t addr,
|
||||||
|
@ -248,7 +270,7 @@ static flash_error_t program(void *instance, flash_address_t addr,
|
||||||
SPIDriver *spip = devp->config->spip;
|
SPIDriver *spip = devp->config->spip;
|
||||||
flash_error_t err;
|
flash_error_t err;
|
||||||
|
|
||||||
osalDbgCheck((instance != NULL) && (pp != NULL));
|
osalDbgCheck((instance != NULL) && (pp != NULL) && (n > 0U));
|
||||||
osalDbgCheck((size_t)addr + n <= (size_t)descriptor.sectors_count *
|
osalDbgCheck((size_t)addr + n <= (size_t)descriptor.sectors_count *
|
||||||
(size_t)descriptor.sectors_size);
|
(size_t)descriptor.sectors_size);
|
||||||
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
||||||
|
@ -294,7 +316,6 @@ static flash_error_t program(void *instance, flash_address_t addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
devp->state = FLASH_READY;
|
devp->state = FLASH_READY;
|
||||||
|
|
||||||
#if N25Q128_SHARED_SPI == TRUE
|
#if N25Q128_SHARED_SPI == TRUE
|
||||||
spiReleaseBus(spip);
|
spiReleaseBus(spip);
|
||||||
#endif
|
#endif
|
||||||
|
@ -306,7 +327,7 @@ static flash_error_t read(void *instance, flash_address_t addr,
|
||||||
N25Q128Driver *devp = (N25Q128Driver *)instance;
|
N25Q128Driver *devp = (N25Q128Driver *)instance;
|
||||||
SPIDriver *spip = devp->config->spip;
|
SPIDriver *spip = devp->config->spip;
|
||||||
|
|
||||||
osalDbgCheck((instance != NULL) && (rp != NULL));
|
osalDbgCheck((instance != NULL) && (rp != NULL) && (n > 0U));
|
||||||
osalDbgCheck((size_t)addr + n <= (size_t)descriptor.sectors_count *
|
osalDbgCheck((size_t)addr + n <= (size_t)descriptor.sectors_count *
|
||||||
(size_t)descriptor.sectors_size);
|
(size_t)descriptor.sectors_size);
|
||||||
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
osalDbgAssert(devp->state == FLASH_READY, "invalid state");
|
||||||
|
|
|
@ -146,9 +146,9 @@ typedef struct {
|
||||||
flash_sector_t sector, \
|
flash_sector_t sector, \
|
||||||
flash_sector_t n); \
|
flash_sector_t n); \
|
||||||
/* Erase single sector.*/ \
|
/* Erase single sector.*/ \
|
||||||
flash_error_t (*are_sectors_erased)(void *instance, \
|
flash_error_t (*verify_erase)(void *instance, \
|
||||||
flash_sector_t sector, \
|
flash_sector_t sector, \
|
||||||
flash_sector_t n); \
|
flash_sector_t n); \
|
||||||
/* Write operation.*/ \
|
/* Write operation.*/ \
|
||||||
flash_error_t (*program)(void *instance, flash_address_t addr, \
|
flash_error_t (*program)(void *instance, flash_address_t addr, \
|
||||||
const uint8_t *pp, size_t n); \
|
const uint8_t *pp, size_t n); \
|
||||||
|
@ -241,8 +241,8 @@ typedef struct {
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
#define flashAreSectorsErased(ip, sector, n) \
|
#define flashVerifyErase(ip, sector, n) \
|
||||||
(ip)->vmt_baseflash->are_sectors_erased(ip, sector, n)
|
(ip)->vmt_baseflash->verify_erase(ip, sector, n)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write operation.
|
* @brief Write operation.
|
||||||
|
|
Loading…
Reference in New Issue