diff --git a/arch b/arch index 0295d52281b..a91eb08c8ab 160000 --- a/arch +++ b/arch @@ -1 +1 @@ -Subproject commit 0295d52281bd513853b347afe64ee34db51199cc +Subproject commit a91eb08c8abc2cbcd3b72732dbc2ac0dfa2f2f61 diff --git a/configs b/configs index 8c8d6ec2de5..a1a06e149f0 160000 --- a/configs +++ b/configs @@ -1 +1 @@ -Subproject commit 8c8d6ec2de52b4a8e10abc0d36f6ac4391a1f202 +Subproject commit a1a06e149f09bc7b1cb7317ba8dc50c730634558 diff --git a/drivers/mtd/s25fl1.c b/drivers/mtd/s25fl1.c index 47cd6739fd3..c2a8f05ba2e 100644 --- a/drivers/mtd/s25fl1.c +++ b/drivers/mtd/s25fl1.c @@ -712,7 +712,8 @@ static int s25fl1_unprotect(FAR struct s25fl1_dev_s *priv, priv->cmdbuf[1] = sf25fl1_read_status2(priv); priv->cmdbuf[2] = sf25fl1_read_status3(priv); - if ((priv->cmdbuf[0] & STATUS1_BP_MASK) == STATUS1_BP_NONE) + if ((priv->cmdbuf[0] & STATUS1_BP_MASK) == STATUS1_BP_NONE && + (priv->cmdbuf[1] & STATUS2_CMP_MASK) == 0) { /* Protection already disabled */ @@ -729,13 +730,14 @@ static int s25fl1_unprotect(FAR struct s25fl1_dev_s *priv, s25fl1_write_status(priv); } - /* Set the protection mask to zero. + /* Set the protection mask to zero (and not complemented). * REVISIT: This logic should really just re-write the BP bits as * necessary to unprotect the range of sectors. */ priv->cmdbuf[0] &= ~STATUS1_BP_MASK; - s25fl1_write_status(priv); + priv->cmdbuf[1] &= ~STATUS2_CMP_MASK; + s25fl1_write_status(priv); /* Check the new status */ @@ -1422,7 +1424,7 @@ static int s25fl1_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg) * ************************************************************************************/ -FAR struct mtd_dev_s *s25fl1_initialize(FAR struct qspi_dev_s *qspi) +FAR struct mtd_dev_s *s25fl1_initialize(FAR struct qspi_dev_s *qspi, bool unprotect) { FAR struct s25fl1_dev_s *priv; int ret; @@ -1494,6 +1496,17 @@ FAR struct mtd_dev_s *s25fl1_initialize(FAR struct qspi_dev_s *qspi) usleep(50*1000); } + /* Unprotect FLASH sectors if so requested. */ + + if (unprotect) + { + ret = s25fl1_unprotect(priv, 0, priv->nsectors - 1); + if (ret < 0) + { + fdbg("ERROR: Sector unprotect failed\n"); + } + } + #ifdef CONFIG_S25FL1_SECTOR512 /* Simulate a 512 byte sector */ /* Allocate a buffer for the erase block cache */ diff --git a/include/nuttx/mtd/mtd.h b/include/nuttx/mtd/mtd.h index c7fdde1618a..7f4e8f83404 100644 --- a/include/nuttx/mtd/mtd.h +++ b/include/nuttx/mtd/mtd.h @@ -45,6 +45,7 @@ #include #include +#include #include @@ -484,7 +485,8 @@ FAR struct mtd_dev_s *w25_initialize(FAR struct spi_dev_s *dev); ****************************************************************************/ struct qspi_dev_s; /* Forward reference */ -FAR struct mtd_dev_s *s25fl1_initialize(FAR struct qspi_dev_s *qspi); +FAR struct mtd_dev_s *s25fl1_initialize(FAR struct qspi_dev_s *qspi, + bool unprotect); /**************************************************************************** * Name: up_flashinitialize