From 56c2ef0cc12548dbf164d16ea9874c336bfd286e Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sun, 5 Oct 2025 19:30:47 +0200 Subject: [PATCH] Fix alignment when programming OTP. Signed-off-by: Pol Henarejos --- src/fs/otp.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/fs/otp.c b/src/fs/otp.c index 3f32398..34c26cc 100644 --- a/src/fs/otp.c +++ b/src/fs/otp.c @@ -27,6 +27,7 @@ #endif #include "random.h" #include "mbedtls/ecdsa.h" +#include #ifdef PICO_RP2350 @@ -77,7 +78,7 @@ static bool is_otp_locked_page(uint8_t page) { static void otp_lock_page(uint8_t page) { if (!is_otp_locked_page(page)) { - uint32_t value = 0x3c3c3c; + alignas(4) uint32_t value = 0x3c3c3c; otp_write_data_raw(OTP_DATA_PAGE0_LOCK0_ROW + page*2 + 1, (uint8_t *)&value, sizeof(value)); } @@ -127,13 +128,13 @@ typedef esp_err_t otp_ret_t; int otp_enable_secure_boot(uint8_t bootkey, bool secure_lock) { int ret = 0; #ifdef PICO_RP2350 - uint8_t BOOTKEY[] = "\xe1\xd1\x6b\xa7\x64\xab\xd7\x12\xd4\xef\x6e\x3e\xdd\x74\x4e\xd5\x63\x8c\x26\xb\x77\x1c\xf9\x81\x51\x11\xb\xaf\xac\x9b\xc8\x71"; + alignas(2) uint8_t BOOTKEY[] = "\xe1\xd1\x6b\xa7\x64\xab\xd7\x12\xd4\xef\x6e\x3e\xdd\x74\x4e\xd5\x63\x8c\x26\xb\x77\x1c\xf9\x81\x51\x11\xb\xaf\xac\x9b\xc8\x71"; if (is_empty_otp_buffer(OTP_DATA_BOOTKEY0_0_ROW + 0x10*bootkey, 32)) { PICOKEY_CHECK(otp_write_data(OTP_DATA_BOOTKEY0_0_ROW + 0x10*bootkey, BOOTKEY, sizeof(BOOTKEY))); } uint8_t *boot_flags1 = otp_buffer_raw(OTP_DATA_BOOT_FLAGS1_ROW); - uint8_t flagsb1[] = { boot_flags1[0] | (1 << (bootkey + OTP_DATA_BOOT_FLAGS1_KEY_VALID_LSB)), boot_flags1[1], boot_flags1[2], 0x00 }; + alignas(4) uint8_t flagsb1[] = { boot_flags1[0] | (1 << (bootkey + OTP_DATA_BOOT_FLAGS1_KEY_VALID_LSB)), boot_flags1[1], boot_flags1[2], 0x00 }; if (secure_lock) { flagsb1[1] |= ((OTP_DATA_BOOT_FLAGS1_KEY_INVALID_BITS >> OTP_DATA_BOOT_FLAGS1_KEY_INVALID_LSB) & (~(1 << bootkey))); } @@ -143,7 +144,7 @@ int otp_enable_secure_boot(uint8_t bootkey, bool secure_lock) { PICOKEY_CHECK(otp_write_data_raw(OTP_DATA_BOOT_FLAGS1_R2_ROW, flagsb1, sizeof(flagsb1))); uint8_t *crit1 = otp_buffer_raw(OTP_DATA_CRIT1_ROW); - uint8_t flagsc1[] = { crit1[0] | (1 << OTP_DATA_CRIT1_SECURE_BOOT_ENABLE_LSB), crit1[1], crit1[2], 0x00 }; + alignas(4) uint8_t flagsc1[] = { crit1[0] | (1 << OTP_DATA_CRIT1_SECURE_BOOT_ENABLE_LSB), crit1[1], crit1[2], 0x00 }; if (secure_lock) { flagsc1[0] |= (1 << OTP_DATA_CRIT1_DEBUG_DISABLE_LSB); flagsc1[0] |= (1 << OTP_DATA_CRIT1_GLITCH_DETECTOR_ENABLE_LSB); @@ -161,11 +162,11 @@ int otp_enable_secure_boot(uint8_t bootkey, bool secure_lock) { if (secure_lock) { uint8_t *page1 = otp_buffer_raw(OTP_DATA_PAGE1_LOCK1_ROW); uint8_t page1v = page1[0] | (OTP_DATA_PAGE1_LOCK1_LOCK_BL_VALUE_READ_ONLY << OTP_DATA_PAGE1_LOCK1_LOCK_BL_LSB); - uint8_t flagsp1[] = { page1v, page1v, page1v, 0x00 }; + alignas(4) uint8_t flagsp1[] = { page1v, page1v, page1v, 0x00 }; PICOKEY_CHECK(otp_write_data_raw(OTP_DATA_PAGE1_LOCK1_ROW, flagsp1, sizeof(flagsp1))); uint8_t *page2 = otp_buffer_raw(OTP_DATA_PAGE2_LOCK1_ROW); uint8_t page2v = page2[0] | (OTP_DATA_PAGE2_LOCK1_LOCK_BL_VALUE_READ_ONLY << OTP_DATA_PAGE2_LOCK1_LOCK_BL_LSB); - uint8_t flagsp2[] = { page2v, page2v, page2v, 0x00 }; + alignas(4) uint8_t flagsp2[] = { page2v, page2v, page2v, 0x00 }; PICOKEY_CHECK(otp_write_data_raw(OTP_DATA_PAGE2_LOCK1_ROW, flagsp2, sizeof(flagsp2))); } #elif defined(ESP_PLATFORM)