summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--components/drivers/spi/sfud/inc/sfud_def.h2
-rw-r--r--components/drivers/spi/sfud/src/sfud.c42
-rw-r--r--components/drivers/spi/sfud/src/sfud_sfdp.c6
-rw-r--r--components/drivers/spi/spi_flash_sfud.c2
4 files changed, 29 insertions, 23 deletions
diff --git a/components/drivers/spi/sfud/inc/sfud_def.h b/components/drivers/spi/sfud/inc/sfud_def.h
index 5bfa0c2f3e..44dd03c745 100644
--- a/components/drivers/spi/sfud/inc/sfud_def.h
+++ b/components/drivers/spi/sfud/inc/sfud_def.h
@@ -73,7 +73,7 @@ if (!(EXPR)) \
else {if (__delay_temp) {__delay_temp();} retry --;}
/* software version number */
-#define SFUD_SW_VERSION "0.10.06"
+#define SFUD_SW_VERSION "0.10.14"
/*
* all defined supported command
*/
diff --git a/components/drivers/spi/sfud/src/sfud.c b/components/drivers/spi/sfud/src/sfud.c
index b7c04f4b04..b616e3fad8 100644
--- a/components/drivers/spi/sfud/src/sfud.c
+++ b/components/drivers/spi/sfud/src/sfud.c
@@ -354,7 +354,7 @@ sfud_err sfud_chip_erase(const sfud_flash *flash) {
/* set the flash write enable */
result = set_write_enabled(flash, true);
if (result != SFUD_SUCCESS) {
- goto exit;
+ goto __exit;
}
cmd_data[0] = SFUD_CMD_ERASE_CHIP;
@@ -369,11 +369,13 @@ sfud_err sfud_chip_erase(const sfud_flash *flash) {
}
if (result != SFUD_SUCCESS) {
SFUD_INFO("Error: Flash chip erase SPI communicate error.");
- goto exit;
+ goto __exit;
}
result = wait_busy(flash);
-exit:
+__exit:
+ /* set the flash write disable */
+ set_write_enabled(flash, false);
/* unlock SPI */
if (spi->unlock) {
spi->unlock(spi);
@@ -438,7 +440,7 @@ sfud_err sfud_erase(const sfud_flash *flash, uint32_t addr, size_t size) {
/* set the flash write enable */
result = set_write_enabled(flash, true);
if (result != SFUD_SUCCESS) {
- break;
+ goto __exit;
}
cmd_data[0] = cur_erase_cmd;
@@ -447,11 +449,11 @@ sfud_err sfud_erase(const sfud_flash *flash, uint32_t addr, size_t size) {
result = spi->wr(spi, cmd_data, cmd_size, NULL, 0);
if (result != SFUD_SUCCESS) {
SFUD_INFO("Error: Flash erase SPI communicate error.");
- break;
+ goto __exit;
}
result = wait_busy(flash);
if (result != SFUD_SUCCESS) {
- break;
+ goto __exit;
}
/* make erase align and calculate next erase address */
if (addr % cur_erase_size != 0) {
@@ -459,18 +461,21 @@ sfud_err sfud_erase(const sfud_flash *flash, uint32_t addr, size_t size) {
size -= cur_erase_size - (addr % cur_erase_size);
addr += cur_erase_size - (addr % cur_erase_size);
} else {
- break;
+ goto __exit;
}
} else {
if (size > cur_erase_size) {
size -= cur_erase_size;
addr += cur_erase_size;
} else {
- break;
+ goto __exit;
}
}
}
+__exit:
+ /* set the flash write disable */
+ set_write_enabled(flash, false);
/* unlock SPI */
if (spi->unlock) {
spi->unlock(spi);
@@ -517,7 +522,7 @@ static sfud_err page256_or_1_byte_write(const sfud_flash *flash, uint32_t addr,
/* set the flash write enable */
result = set_write_enabled(flash, true);
if (result != SFUD_SUCCESS) {
- break;
+ goto __exit;
}
cmd_data[0] = SFUD_CMD_PAGE_PROGRAM;
make_adress_byte_array(flash, addr, &cmd_data[1]);
@@ -545,15 +550,18 @@ static sfud_err page256_or_1_byte_write(const sfud_flash *flash, uint32_t addr,
result = spi->wr(spi, cmd_data, cmd_size + data_size, NULL, 0);
if (result != SFUD_SUCCESS) {
SFUD_INFO("Error: Flash write SPI communicate error.");
- break;
+ goto __exit;
}
result = wait_busy(flash);
if (result != SFUD_SUCCESS) {
- break;
+ goto __exit;
}
data += data_size;
}
+__exit:
+ /* set the flash write disable */
+ set_write_enabled(flash, false);
/* unlock SPI */
if (spi->unlock) {
spi->unlock(spi);
@@ -599,7 +607,7 @@ static sfud_err aai_write(const sfud_flash *flash, uint32_t addr, size_t size, c
/* set the flash write enable */
result = set_write_enabled(flash, true);
if (result != SFUD_SUCCESS) {
- goto exit;
+ goto __exit;
}
/* loop write operate. write unit is write granularity */
cmd_data[0] = SFUD_CMD_AAI_WORD_PROGRAM;
@@ -632,21 +640,21 @@ static sfud_err aai_write(const sfud_flash *flash, uint32_t addr, size_t size, c
result = spi->wr(spi, cmd_data, cmd_size + data_size, NULL, 0);
if (result != SFUD_SUCCESS) {
SFUD_INFO("Error: Flash write SPI communicate error.");
- goto exit;
+ goto __exit;
}
result = wait_busy(flash);
if (result != SFUD_SUCCESS) {
- goto exit;
+ goto __exit;
}
size -= 2;
data += data_size;
}
- /* set the flash write disable */
- result = set_write_enabled(flash, false);
- exit:
+__exit:
+ /* set the flash write disable for exist AAI mode */
+ set_write_enabled(flash, false);
/* unlock SPI */
if (spi->unlock) {
spi->unlock(spi);
diff --git a/components/drivers/spi/sfud/src/sfud_sfdp.c b/components/drivers/spi/sfud/src/sfud_sfdp.c
index 7d37e11e8b..95157e613f 100644
--- a/components/drivers/spi/sfud/src/sfud_sfdp.c
+++ b/components/drivers/spi/sfud/src/sfud_sfdp.c
@@ -105,8 +105,6 @@ static bool read_sfdp_header(sfud_flash *flash) {
uint32_t header_addr = 0;
/* each parameter header being 2 DWORDs (64-bit) */
uint8_t header[2 * 4] = { 0 };
- /* number of parameter headers */
- uint8_t npn = 0;
SFUD_ASSERT(flash);
@@ -126,12 +124,12 @@ static bool read_sfdp_header(sfud_flash *flash) {
}
sfdp->minor_rev = header[4];
sfdp->major_rev = header[5];
- npn = header[6];
if (sfdp->major_rev > SUPPORT_MAX_SFDP_MAJOR_REV) {
SFUD_INFO("Error: This reversion(V%d.%d) SFDP is not supported.", sfdp->major_rev, sfdp->minor_rev);
return false;
}
- SFUD_DEBUG("Check SFDP header is OK. The reversion is V%d.%d, NPN is %d.", sfdp->major_rev, sfdp->minor_rev, npn);
+ SFUD_DEBUG("Check SFDP header is OK. The reversion is V%d.%d, NPN is %d.", sfdp->major_rev, sfdp->minor_rev,
+ header[6]);
return true;
}
diff --git a/components/drivers/spi/spi_flash_sfud.c b/components/drivers/spi/spi_flash_sfud.c
index 427673378c..d70c9f8451 100644
--- a/components/drivers/spi/spi_flash_sfud.c
+++ b/components/drivers/spi/spi_flash_sfud.c
@@ -264,7 +264,7 @@ rt_spi_flash_device_t rt_sfud_flash_probe(const char *spi_flash_dev_name, const
{
/* RT-Thread SPI device initialize */
rtt_dev->rt_spi_device = (struct rt_spi_device *) rt_device_find(spi_dev_name);
- if (rtt_dev->rt_spi_device == RT_NULL) {
+ if (rtt_dev->rt_spi_device == RT_NULL || rtt_dev->rt_spi_device->parent.type != RT_Device_Class_SPIDevice) {
rt_kprintf("ERROR: SPI device %s not found!\n", spi_dev_name);
goto error;
}