From 8b395f91d57d12c2fbd838a5289ca1f340b83eb5 Mon Sep 17 00:00:00 2001 From: Gao Feng Date: Mon, 24 Feb 2025 17:09:49 +0800 Subject: [PATCH] xtensa/esp32: write encrypt func implementation based on spec, 16 bytes alignment is checked. --- arch/xtensa/src/esp32/esp32_spiflash.c | 72 +++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/arch/xtensa/src/esp32/esp32_spiflash.c b/arch/xtensa/src/esp32/esp32_spiflash.c index 8b8b563eb7d62..81c6afcae34cf 100644 --- a/arch/xtensa/src/esp32/esp32_spiflash.c +++ b/arch/xtensa/src/esp32/esp32_spiflash.c @@ -281,6 +281,8 @@ static ssize_t esp32_bread_decrypt(struct mtd_dev_s *dev, #ifdef CONFIG_MTD_BYTE_WRITE static ssize_t esp32_write(struct mtd_dev_s *dev, off_t offset, size_t nbytes, const uint8_t *buffer); +static ssize_t esp32_write_encrypt(FAR struct mtd_dev_s *dev, off_t offset, + size_t nbytes, FAR const uint8_t *buffer); #endif static ssize_t esp32_bwrite(struct mtd_dev_s *dev, off_t startblock, size_t nblocks, const uint8_t *buffer); @@ -334,7 +336,7 @@ static struct esp32_spiflash_s g_esp32_spiflash1_encrypt = .read = esp32_read_decrypt, .ioctl = esp32_ioctl_encrypt, #ifdef CONFIG_MTD_BYTE_WRITE - .write = NULL, + .write = esp32_write_encrypt, #endif .name = "esp32_mainflash_encrypt" }, @@ -2091,6 +2093,74 @@ static ssize_t esp32_write(struct mtd_dev_s *dev, off_t offset, return ret; } + +/**************************************************************************** + * Name: esp32_write_encrypt + * + * Description: + * write data to SPI Flash at designated address by SPI Flash hardware + * encryption. + * + * Input Parameters: + * dev - ESP32 MTD device data + * offset - target address offset + * nbytes - data number + * buffer - data buffer pointer + * + * Returned Value: + * Writen bytes if success or a negative value if fail. + * + ****************************************************************************/ + +static ssize_t esp32_write_encrypt(FAR struct mtd_dev_s *dev, off_t offset, + size_t nbytes, FAR const uint8_t *buffer) +{ + ssize_t ret; + struct esp32_spiflash_s *priv = MTD2PRIV(dev); + + ASSERT(buffer); + + if ((offset % SPI_FLASH_ENCRYPT_MIN_SIZE) || + (nbytes % SPI_FLASH_ENCRYPT_MIN_SIZE)) + { + return -EINVAL; + } + +#ifdef CONFIG_ESP32_SPIFLASH_DEBUG + finfo("esp32_write_encrypt(%p, 0x%x, %zu, %p)\n", dev, offset, + nbytes, buffer); +#endif + + /* Acquire the mutex. */ + + ret = nxmutex_lock(&g_lock); + if (ret < 0) + { + return ret; + } + +#ifdef CONFIG_ESP32_SPI_FLASH_SUPPORT_PSRAM_STACK + if (stack_is_psram()) + { + ret = esp32_async_op(SPIFLASH_OP_CODE_ENCRYPT_WRITE, priv, + offset, buffer, nbytes, NULL, NULL, 0); + } + else + { + ret = esp32_writeblk_encrypted(priv, offset, buffer, nbytes); + } +#else + ret = esp32_writeblk_encrypted(priv, offset, buffer, nbytes); +#endif + + nxmutex_unlock(&g_lock); + +#ifdef CONFIG_ESP32_SPIFLASH_DEBUG + finfo("esp32_write_encrypt()=%d\n", ret); +#endif + + return ret; +} #endif /****************************************************************************