driver: flash: Add Set/ Get write protect function
Add Set_WP function to set SPI flash WP line to low Add Get_WP function to obtain status of the SPI flash WP line Signed-off-by: Benson Huang <benson7633769@gmail.com>
This commit is contained in:
parent
42aef1be54
commit
3e8ec3aaf2
3 changed files with 41 additions and 6 deletions
|
@ -427,9 +427,36 @@ static int flash_read_sr2(const struct device *dev, uint8_t *val)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_FLASH_EX_OP_ENABLED
|
||||||
|
static int flash_set_wp(const struct device *dev, uint8_t *val)
|
||||||
|
{
|
||||||
|
const struct flash_rts5912_dev_config *config = dev->config;
|
||||||
|
volatile struct reg_spic_reg *spic_reg = config->regs;
|
||||||
|
|
||||||
|
if (!val) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*val) {
|
||||||
|
spic_reg->CTRLR2 |= SPIC_CTRLR2_WPN_SET;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int flash_get_wp(const struct device *dev, uint8_t *val)
|
||||||
|
{
|
||||||
|
const struct flash_rts5912_dev_config *config = dev->config;
|
||||||
|
volatile struct reg_spic_reg *spic_reg = config->regs;
|
||||||
|
|
||||||
|
*val = (uint8_t)(spic_reg->CTRLR2 & SPIC_CTRLR2_WPN_SET);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int flash_wait_till_ready(const struct device *dev)
|
static int flash_wait_till_ready(const struct device *dev)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
int timeout = TIMEOUT_SPIBUSY;
|
int timeout = TIMEOUT_SPIBUSY;
|
||||||
uint8_t sr = 0;
|
uint8_t sr = 0;
|
||||||
|
|
||||||
|
@ -437,10 +464,7 @@ static int flash_wait_till_ready(const struct device *dev)
|
||||||
* while a program page requires about 40 cycles.
|
* while a program page requires about 40 cycles.
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
ret = flash_read_sr(dev, &sr);
|
flash_read_sr(dev, &sr);
|
||||||
if (ret < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
if (!(sr & SPI_NOR_WIP_BIT)) {
|
if (!(sr & SPI_NOR_WIP_BIT)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -751,6 +775,12 @@ static int flash_rts5912_ex_op(const struct device *dev, uint16_t opcode, const
|
||||||
case FLASH_RTS5912_EX_OP_RD_SR2:
|
case FLASH_RTS5912_EX_OP_RD_SR2:
|
||||||
ret = flash_read_sr2(dev, (uint8_t *)in);
|
ret = flash_read_sr2(dev, (uint8_t *)in);
|
||||||
break;
|
break;
|
||||||
|
case FLASH_RTS5912_EX_OP_SET_WP:
|
||||||
|
ret = flash_set_wp(dev, (uint8_t *)out);
|
||||||
|
break;
|
||||||
|
case FLASH_RTS5912_EX_OP_GET_WP:
|
||||||
|
ret = flash_get_wp(dev, (uint8_t *)in);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
k_sem_give(&dev_data->sem);
|
k_sem_give(&dev_data->sem);
|
||||||
|
|
|
@ -13,6 +13,8 @@ enum flash_rts5912_ex_ops {
|
||||||
FLASH_RTS5912_EX_OP_WR_SR2,
|
FLASH_RTS5912_EX_OP_WR_SR2,
|
||||||
FLASH_RTS5912_EX_OP_RD_SR,
|
FLASH_RTS5912_EX_OP_RD_SR,
|
||||||
FLASH_RTS5912_EX_OP_RD_SR2,
|
FLASH_RTS5912_EX_OP_RD_SR2,
|
||||||
|
FLASH_RTS5912_EX_OP_SET_WP,
|
||||||
|
FLASH_RTS5912_EX_OP_GET_WP,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ZEPHYR_INCLUDE_DRIVERS_RTS5912_FLASH_API_EX_H__ */
|
#endif /* __ZEPHYR_INCLUDE_DRIVERS_RTS5912_FLASH_API_EX_H__ */
|
||||||
|
|
|
@ -37,7 +37,8 @@ struct reg_spic_reg {
|
||||||
uint16_t HALF;
|
uint16_t HALF;
|
||||||
uint32_t WORD;
|
uint32_t WORD;
|
||||||
} DR;
|
} DR;
|
||||||
const uint32_t RESERVED2[44];
|
const uint32_t RESERVED2[43];
|
||||||
|
uint32_t CTRLR2;
|
||||||
uint32_t FBAUD;
|
uint32_t FBAUD;
|
||||||
uint32_t USERLENGTH;
|
uint32_t USERLENGTH;
|
||||||
const uint32_t RESERVED3[3];
|
const uint32_t RESERVED3[3];
|
||||||
|
@ -107,6 +108,8 @@ struct reg_spic_reg {
|
||||||
#define SPIC_RISR_FSEIR BIT(5UL)
|
#define SPIC_RISR_FSEIR BIT(5UL)
|
||||||
#define SPIC_RISR_USEIR BIT(9UL)
|
#define SPIC_RISR_USEIR BIT(9UL)
|
||||||
#define SPIC_RISR_TFSIR BIT(10UL)
|
#define SPIC_RISR_TFSIR BIT(10UL)
|
||||||
|
/* CTRLR2 */
|
||||||
|
#define SPIC_CTRLR2_WPN_SET BIT(1UL)
|
||||||
/* USERLENGTH */
|
/* USERLENGTH */
|
||||||
#define SPIC_USERLENGTH_RDDUMMYLEN_Pos (0UL)
|
#define SPIC_USERLENGTH_RDDUMMYLEN_Pos (0UL)
|
||||||
#define SPIC_USERLENGTH_RDDUMMYLEN_Msk GENMASK(11, 0)
|
#define SPIC_USERLENGTH_RDDUMMYLEN_Msk GENMASK(11, 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue