test_efuse.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdio.h>
  7. #include <ctype.h>
  8. #include <errno.h>
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include "unity.h"
  12. #include "esp_log.h"
  13. #include <string.h>
  14. #include "esp_efuse.h"
  15. #include "esp_efuse_table.h"
  16. #include "esp_efuse_utility.h"
  17. #include "esp_efuse_test_table.h"
  18. #include "bootloader_random.h"
  19. #include "freertos/FreeRTOS.h"
  20. #include "freertos/task.h"
  21. #include "freertos/semphr.h"
  22. #include "test_utils.h"
  23. #include "sdkconfig.h"
  24. #include "esp_rom_efuse.h"
  25. #include "bootloader_common.h"
  26. __attribute__((unused)) static const char* TAG = "efuse_test";
  27. #ifdef CONFIG_EFUSE_VIRTUAL
  28. static void test_wp(esp_efuse_block_t blk, const esp_efuse_desc_t* field[])
  29. {
  30. size_t out_cnt;
  31. TEST_ESP_OK(esp_efuse_set_write_protect(blk));
  32. esp_efuse_read_field_cnt(field, &out_cnt);
  33. TEST_ASSERT_EQUAL_INT(1, out_cnt);
  34. }
  35. static void test_rp(esp_efuse_block_t blk, const esp_efuse_desc_t* field[], bool read_first)
  36. {
  37. size_t out_cnt;
  38. if (read_first) {
  39. esp_efuse_read_field_cnt(field, &out_cnt);
  40. TEST_ASSERT_EQUAL_INT(0, out_cnt);
  41. }
  42. TEST_ESP_OK(esp_efuse_set_read_protect(blk));
  43. esp_efuse_read_field_cnt(field, &out_cnt);
  44. TEST_ASSERT_EQUAL_INT(1, out_cnt);
  45. if (read_first) {
  46. TEST_ESP_ERR(ESP_ERR_EFUSE_CNT_IS_FULL, esp_efuse_set_read_protect(blk));
  47. }
  48. }
  49. TEST_CASE("Test a write/read protection", "[efuse]")
  50. {
  51. esp_efuse_utility_reset();
  52. esp_efuse_utility_erase_virt_blocks();
  53. esp_efuse_utility_debug_dump_blocks();
  54. TEST_ESP_ERR(ESP_ERR_NOT_SUPPORTED, esp_efuse_set_write_protect(EFUSE_BLK0));
  55. TEST_ESP_ERR(ESP_ERR_NOT_SUPPORTED, esp_efuse_set_read_protect(EFUSE_BLK0));
  56. size_t out_cnt;
  57. esp_efuse_read_field_cnt(ESP_EFUSE_WR_DIS_BLK1, &out_cnt);
  58. TEST_ASSERT_EQUAL_INT(0, out_cnt);
  59. TEST_ESP_OK(esp_efuse_set_write_protect(EFUSE_BLK1));
  60. esp_efuse_read_field_cnt(ESP_EFUSE_WR_DIS_BLK1, &out_cnt);
  61. TEST_ASSERT_EQUAL_INT(1, out_cnt);
  62. TEST_ESP_ERR(ESP_ERR_EFUSE_CNT_IS_FULL, esp_efuse_set_write_protect(EFUSE_BLK1));
  63. test_wp(EFUSE_BLK2, ESP_EFUSE_WR_DIS_BLK2);
  64. test_wp(EFUSE_BLK3, ESP_EFUSE_WR_DIS_BLK3);
  65. esp_efuse_utility_debug_dump_blocks();
  66. test_rp(EFUSE_BLK1, ESP_EFUSE_RD_DIS_BLK1, true);
  67. test_rp(EFUSE_BLK2, ESP_EFUSE_RD_DIS_BLK2, false);
  68. test_rp(EFUSE_BLK3, ESP_EFUSE_RD_DIS_BLK3, false);
  69. esp_efuse_utility_debug_dump_blocks();
  70. esp_efuse_utility_reset();
  71. esp_efuse_utility_erase_virt_blocks();
  72. }
  73. #endif // #ifdef CONFIG_EFUSE_VIRTUAL