drivers/bus: Change QSPI read_cmd signature to return an error code.
Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
7ee5afe8d1
commit
b042fd5120
|
@ -43,7 +43,7 @@ typedef struct _mp_qspi_proto_t {
|
||||||
int (*ioctl)(void *self, uint32_t cmd);
|
int (*ioctl)(void *self, uint32_t cmd);
|
||||||
int (*write_cmd_data)(void *self, uint8_t cmd, size_t len, uint32_t data);
|
int (*write_cmd_data)(void *self, uint8_t cmd, size_t len, uint32_t data);
|
||||||
int (*write_cmd_addr_data)(void *self, uint8_t cmd, uint32_t addr, size_t len, const uint8_t *src);
|
int (*write_cmd_addr_data)(void *self, uint8_t cmd, uint32_t addr, size_t len, const uint8_t *src);
|
||||||
uint32_t (*read_cmd)(void *self, uint8_t cmd, size_t len);
|
int (*read_cmd)(void *self, uint8_t cmd, size_t len, uint32_t *dest);
|
||||||
int (*read_cmd_qaddr_qdata)(void *self, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest);
|
int (*read_cmd_qaddr_qdata)(void *self, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest);
|
||||||
} mp_qspi_proto_t;
|
} mp_qspi_proto_t;
|
||||||
|
|
||||||
|
|
|
@ -178,13 +178,14 @@ STATIC int mp_soft_qspi_write_cmd_addr_data(void *self_in, uint8_t cmd, uint32_t
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC uint32_t mp_soft_qspi_read_cmd(void *self_in, uint8_t cmd, size_t len) {
|
STATIC int mp_soft_qspi_read_cmd(void *self_in, uint8_t cmd, size_t len, uint32_t *dest) {
|
||||||
mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
|
mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
|
||||||
uint32_t cmd_buf = cmd;
|
uint32_t cmd_buf = cmd;
|
||||||
CS_LOW(self);
|
CS_LOW(self);
|
||||||
mp_soft_qspi_transfer(self, 1 + len, (uint8_t*)&cmd_buf, (uint8_t*)&cmd_buf);
|
mp_soft_qspi_transfer(self, 1 + len, (uint8_t*)&cmd_buf, (uint8_t*)&cmd_buf);
|
||||||
CS_HIGH(self);
|
CS_HIGH(self);
|
||||||
return cmd_buf >> 8;
|
*dest = cmd_buf >> 8;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC int mp_soft_qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
|
STATIC int mp_soft_qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
|
||||||
|
|
|
@ -109,17 +109,16 @@ STATIC int mp_spiflash_transfer_cmd_addr_data(mp_spiflash_t *self, uint8_t cmd,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC uint32_t mp_spiflash_read_cmd(mp_spiflash_t *self, uint8_t cmd, size_t len) {
|
STATIC int mp_spiflash_read_cmd(mp_spiflash_t *self, uint8_t cmd, size_t len, uint32_t *dest) {
|
||||||
const mp_spiflash_config_t *c = self->config;
|
const mp_spiflash_config_t *c = self->config;
|
||||||
if (c->bus_kind == MP_SPIFLASH_BUS_SPI) {
|
if (c->bus_kind == MP_SPIFLASH_BUS_SPI) {
|
||||||
uint32_t buf;
|
|
||||||
mp_hal_pin_write(c->bus.u_spi.cs, 0);
|
mp_hal_pin_write(c->bus.u_spi.cs, 0);
|
||||||
c->bus.u_spi.proto->transfer(c->bus.u_spi.data, 1, &cmd, NULL);
|
c->bus.u_spi.proto->transfer(c->bus.u_spi.data, 1, &cmd, NULL);
|
||||||
c->bus.u_spi.proto->transfer(c->bus.u_spi.data, len, (void*)&buf, (void*)&buf);
|
c->bus.u_spi.proto->transfer(c->bus.u_spi.data, len, (void*)dest, (void*)dest);
|
||||||
mp_hal_pin_write(c->bus.u_spi.cs, 1);
|
mp_hal_pin_write(c->bus.u_spi.cs, 1);
|
||||||
return buf;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return c->bus.u_qspi.proto->read_cmd(c->bus.u_qspi.data, cmd, len);
|
return c->bus.u_qspi.proto->read_cmd(c->bus.u_qspi.data, cmd, len, dest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,9 +138,12 @@ STATIC int mp_spiflash_write_cmd(mp_spiflash_t *self, uint8_t cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC int mp_spiflash_wait_sr(mp_spiflash_t *self, uint8_t mask, uint8_t val, uint32_t timeout) {
|
STATIC int mp_spiflash_wait_sr(mp_spiflash_t *self, uint8_t mask, uint8_t val, uint32_t timeout) {
|
||||||
uint8_t sr;
|
|
||||||
do {
|
do {
|
||||||
sr = mp_spiflash_read_cmd(self, CMD_RDSR, 1);
|
uint32_t sr;
|
||||||
|
int ret = mp_spiflash_read_cmd(self, CMD_RDSR, 1, &sr);
|
||||||
|
if (ret != 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
if ((sr & mask) == val) {
|
if ((sr & mask) == val) {
|
||||||
return 0; // success
|
return 0; // success
|
||||||
}
|
}
|
||||||
|
@ -180,17 +182,23 @@ void mp_spiflash_init(mp_spiflash_t *self) {
|
||||||
|
|
||||||
#if defined(CHECK_DEVID)
|
#if defined(CHECK_DEVID)
|
||||||
// Validate device id
|
// Validate device id
|
||||||
uint32_t devid = mp_spiflash_read_cmd(self, CMD_RD_DEVID, 3);
|
uint32_t devid;
|
||||||
if (devid != CHECK_DEVID) {
|
int ret = mp_spiflash_read_cmd(self, CMD_RD_DEVID, 3, &devid);
|
||||||
return 0;
|
if (ret != 0 || devid != CHECK_DEVID) {
|
||||||
|
mp_spiflash_release_bus(self);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (self->config->bus_kind == MP_SPIFLASH_BUS_QSPI) {
|
if (self->config->bus_kind == MP_SPIFLASH_BUS_QSPI) {
|
||||||
// Set QE bit
|
// Set QE bit
|
||||||
uint32_t data = (mp_spiflash_read_cmd(self, CMD_RDSR, 1) & 0xff)
|
uint32_t sr = 0, cr = 0;
|
||||||
| (mp_spiflash_read_cmd(self, CMD_RDCR, 1) & 0xff) << 8;
|
int ret = mp_spiflash_read_cmd(self, CMD_RDSR, 1, &sr);
|
||||||
if (!(data & (QSPI_QE_MASK << 8))) {
|
if (ret == 0) {
|
||||||
|
ret = mp_spiflash_read_cmd(self, CMD_RDCR, 1, &cr);
|
||||||
|
}
|
||||||
|
uint32_t data = (sr & 0xff) | (cr & 0xff) << 8;
|
||||||
|
if (ret == 0 && !(data & (QSPI_QE_MASK << 8))) {
|
||||||
data |= QSPI_QE_MASK << 8;
|
data |= QSPI_QE_MASK << 8;
|
||||||
mp_spiflash_write_cmd(self, CMD_WREN);
|
mp_spiflash_write_cmd(self, CMD_WREN);
|
||||||
mp_spiflash_write_cmd_data(self, CMD_WRSR, 2, data);
|
mp_spiflash_write_cmd_data(self, CMD_WRSR, 2, data);
|
||||||
|
|
|
@ -312,7 +312,7 @@ STATIC int qspi_write_cmd_addr_data(void *self_in, uint8_t cmd, uint32_t addr, s
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC uint32_t qspi_read_cmd(void *self_in, uint8_t cmd, size_t len) {
|
STATIC int qspi_read_cmd(void *self_in, uint8_t cmd, size_t len, uint32_t *dest) {
|
||||||
(void)self_in;
|
(void)self_in;
|
||||||
|
|
||||||
QUADSPI->FCR = QUADSPI_FCR_CTCF; // clear TC flag
|
QUADSPI->FCR = QUADSPI_FCR_CTCF; // clear TC flag
|
||||||
|
@ -334,7 +334,6 @@ STATIC uint32_t qspi_read_cmd(void *self_in, uint8_t cmd, size_t len) {
|
||||||
// Wait for read to finish
|
// Wait for read to finish
|
||||||
while (!(QUADSPI->SR & QUADSPI_SR_TCF)) {
|
while (!(QUADSPI->SR & QUADSPI_SR_TCF)) {
|
||||||
if (QUADSPI->SR & QUADSPI_SR_TEF) {
|
if (QUADSPI->SR & QUADSPI_SR_TEF) {
|
||||||
// Not sure that calling functions will deal with this appropriately
|
|
||||||
return -MP_EIO;
|
return -MP_EIO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,7 +341,9 @@ STATIC uint32_t qspi_read_cmd(void *self_in, uint8_t cmd, size_t len) {
|
||||||
QUADSPI->FCR = QUADSPI_FCR_CTCF; // clear TC flag
|
QUADSPI->FCR = QUADSPI_FCR_CTCF; // clear TC flag
|
||||||
|
|
||||||
// Read result
|
// Read result
|
||||||
return QUADSPI->DR;
|
*dest = QUADSPI->DR;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC int qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
|
STATIC int qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
|
||||||
|
|
Loading…
Reference in New Issue