|
16 | 16 | #define TEST_AREA_SIZE FIXED_PARTITION_SIZE(TEST_AREA) |
17 | 17 | #define TEST_AREA_MAX (TEST_AREA_OFFSET + TEST_AREA_SIZE) |
18 | 18 | #define TEST_AREA_DEVICE FIXED_PARTITION_DEVICE(TEST_AREA) |
| 19 | +#define TEST_AREA_DEVICE_REG DT_REG_ADDR(DT_MTD_FROM_FIXED_PARTITION(DT_NODELABEL(TEST_AREA))) |
19 | 20 |
|
20 | 21 | #define EXPECTED_SIZE 512 |
21 | 22 |
|
@@ -179,4 +180,71 @@ ZTEST(flash_stm32, test_stm32_readout_protection_disabled) |
179 | 180 | } |
180 | 181 | #endif |
181 | 182 |
|
| 183 | +#ifdef CONFIG_FLASH_STM32_BLOCK_REGISTERS |
| 184 | + |
| 185 | +#if defined(CONFIG_FLASH_STM32_WRITE_PROTECT) || defined(CONFIG_FLASH_STM32_READOUT_PROTECTION) |
| 186 | +#error Block Register tests unable to run other tests, because of locked registers. |
| 187 | +#endif |
| 188 | + |
| 189 | +int flash_stm32_option_bytes_lock(const struct device *dev, bool enable); |
| 190 | + |
| 191 | +static bool flash_opt_locked(void) |
| 192 | +{ |
| 193 | + FLASH_TypeDef *regs = (FLASH_TypeDef *)TEST_AREA_DEVICE_REG; |
| 194 | + |
| 195 | + return regs->OPTCR & FLASH_OPTCR_OPTLOCK; |
| 196 | +} |
| 197 | + |
| 198 | +static void flash_cr_unlock(void) |
| 199 | +{ |
| 200 | + FLASH_TypeDef *regs = (FLASH_TypeDef *)TEST_AREA_DEVICE_REG; |
| 201 | + |
| 202 | + regs->KEYR = FLASH_KEY1; |
| 203 | + regs->KEYR = FLASH_KEY2; |
| 204 | +} |
| 205 | + |
| 206 | +static bool flash_cr_locked(void) |
| 207 | +{ |
| 208 | + FLASH_TypeDef *regs = (FLASH_TypeDef *)TEST_AREA_DEVICE_REG; |
| 209 | + |
| 210 | + return regs->CR & FLASH_CR_LOCK; |
| 211 | +} |
| 212 | + |
| 213 | +ZTEST(flash_stm32, test_stm32_block_registers) |
| 214 | +{ |
| 215 | + /* Test OPT lock. */ |
| 216 | + TC_PRINT("Unlocking OPT\n"); |
| 217 | + flash_stm32_option_bytes_lock(flash_dev, false); |
| 218 | + zassert_false(flash_opt_locked(), "Unable to unlock OPT"); |
| 219 | + |
| 220 | + TC_PRINT("Blocking OPT\n"); |
| 221 | + flash_ex_op(flash_dev, FLASH_STM32_EX_OP_BLOCK_OPTION_REG, (uintptr_t)NULL, NULL); |
| 222 | + |
| 223 | + zassert_true(flash_opt_locked(), "Blocking OPT didn't lock OPT"); |
| 224 | + TC_PRINT("Try to unlock blocked OPT\n"); |
| 225 | + __set_FAULTMASK(1); |
| 226 | + flash_stm32_option_bytes_lock(flash_dev, false); |
| 227 | + /* Clear Bus Fault pending bit */ |
| 228 | + SCB->SHCSR &= ~SCB_SHCSR_BUSFAULTPENDED_Msk; |
| 229 | + __set_FAULTMASK(0); |
| 230 | + zassert_true(flash_opt_locked(), "OPT unlocked after being blocked"); |
| 231 | + |
| 232 | + /* Test CR lock. */ |
| 233 | + zassert_true(flash_cr_locked(), "CR should be locked by default"); |
| 234 | + TC_PRINT("Unlocking CR\n"); |
| 235 | + flash_cr_unlock(); |
| 236 | + zassert_false(flash_cr_locked(), "Unable to unlock CR"); |
| 237 | + TC_PRINT("Blocking CR\n"); |
| 238 | + flash_ex_op(flash_dev, FLASH_STM32_EX_OP_BLOCK_CONTROL_REG, (uintptr_t)NULL, NULL); |
| 239 | + zassert_true(flash_cr_locked(), "Blocking CR didn't lock CR"); |
| 240 | + __set_FAULTMASK(1); |
| 241 | + TC_PRINT("Try to unlock blocked CR\n"); |
| 242 | + flash_cr_unlock(); |
| 243 | + /* Clear Bus Fault pending bit */ |
| 244 | + SCB->SHCSR &= ~SCB_SHCSR_BUSFAULTPENDED_Msk; |
| 245 | + __set_FAULTMASK(0); |
| 246 | + zassert_true(flash_cr_locked(), "CR unlocked after being blocked"); |
| 247 | +} |
| 248 | +#endif |
| 249 | + |
182 | 250 | ZTEST_SUITE(flash_stm32, NULL, flash_stm32_setup, NULL, NULL, NULL); |
0 commit comments