diff --git a/arch/xtensa/include/esp32/partition.h b/arch/xtensa/include/esp32/partition.h index da9f53d0cfe8a..20a8c21bb061a 100644 --- a/arch/xtensa/include/esp32/partition.h +++ b/arch/xtensa/include/esp32/partition.h @@ -55,4 +55,24 @@ enum ota_img_bootseq OTA_IMG_BOOT_SEQ_MAX }; +/**************************************************************************** + * Name: esp32_partition_read_decrypt + * + * Description: + * Read data from SPI Flash at designated address. (with decryption) + * + * Input Parameters: + * label - Partition label + * offset - Offset in SPI Flash + * buf - Data buffer pointer + * size - Data number + * + * Returned Value: + * 0 if success or a negative value if fail. + * + ****************************************************************************/ + +int esp32_partition_read_decrypt(const char *label, size_t offset, + void *buf, size_t size); + #endif /* __ARCH_XTENSA_INCLUDE_ESP32_PARTITION_H */ diff --git a/arch/xtensa/src/esp32/esp32_partition.c b/arch/xtensa/src/esp32/esp32_partition.c index 94b94d1783529..397eba66adc99 100644 --- a/arch/xtensa/src/esp32/esp32_partition.c +++ b/arch/xtensa/src/esp32/esp32_partition.c @@ -1038,6 +1038,56 @@ int esp32_partition_read(const char *label, size_t offset, void *buf, return OK; } +/**************************************************************************** + * Name: esp32_partition_read_decrypt + * + * Description: + * Read data from SPI Flash at designated address. (with decryption) + * + * Input Parameters: + * label - Partition label + * offset - Offset in SPI Flash + * buf - Data buffer pointer + * size - Data number + * + * Returned Value: + * 0 if success or a negative value if fail. + * + ****************************************************************************/ + +int esp32_partition_read_decrypt(const char *label, size_t offset, void *buf, + size_t size) +{ + int ret; + int partion_offset; + DEBUGASSERT(label != NULL && buf != NULL); + struct mtd_dev_s *mtd; + + partion_offset = partition_get_offset(label, strlen(label)); + if (partion_offset < 0) + { + ferr("ERROR: Failed to get partition: %s offset\n", label); + return partion_offset; + } + + mtd = esp32_spiflash_encrypt_get_mtd(); + if (!mtd) + { + ferr("ERROR: Failed to get SPI flash MTD\n"); + return -ENOSYS; + } + + ret = MTD_READ(mtd, partion_offset + offset, + size, (uint8_t *)buf); + if (ret != size) + { + ferr("ERROR: Failed to get read data from MTD\n"); + return -EIO; + } + + return OK; +} + /**************************************************************************** * Name: esp32_partition_write *