efuse_hal.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "sdkconfig.h"
  7. #include <sys/param.h>
  8. #include "soc/soc_caps.h"
  9. #include "hal/efuse_ll.h"
  10. #include "hal/assert.h"
  11. #include "hal/efuse_hal.h"
  12. #include "soc/syscon_reg.h"
  13. uint32_t efuse_hal_get_chip_revision(void)
  14. {
  15. uint8_t eco_bit0 = efuse_ll_get_chip_ver_rev1();
  16. uint8_t eco_bit1 = efuse_ll_get_chip_ver_rev2();
  17. uint8_t eco_bit2 = (REG_READ(SYSCON_DATE_REG) & 0x80000000) >> 31;
  18. uint32_t combine_value = (eco_bit2 << 2) | (eco_bit1 << 1) | eco_bit0;
  19. uint32_t chip_ver = 0;
  20. switch (combine_value) {
  21. case 0:
  22. chip_ver = 0;
  23. break;
  24. case 1:
  25. chip_ver = 1;
  26. break;
  27. case 3:
  28. chip_ver = 2;
  29. break;
  30. #if CONFIG_IDF_ENV_FPGA
  31. case 4: /* Empty efuses, but SYSCON_DATE_REG bit is set */
  32. chip_ver = 3;
  33. break;
  34. #endif // CONFIG_IDF_ENV_FPGA
  35. case 7:
  36. chip_ver = 3;
  37. break;
  38. default:
  39. chip_ver = 0;
  40. break;
  41. }
  42. return chip_ver;
  43. }
  44. uint32_t efuse_hal_get_rated_freq_mhz(void)
  45. {
  46. //Check if ESP32 is rated for a CPU frequency of 160MHz only
  47. if (efuse_ll_get_chip_cpu_freq_rated() && efuse_ll_get_chip_cpu_freq_low()) {
  48. return 160;
  49. }
  50. return 240;
  51. }
  52. /******************* eFuse control functions *************************/
  53. void efuse_hal_set_timing(uint32_t apb_freq_mhz)
  54. {
  55. uint32_t clk_sel0;
  56. uint32_t clk_sel1;
  57. uint32_t dac_clk_div;
  58. if (apb_freq_mhz <= 26) {
  59. clk_sel0 = 250;
  60. clk_sel1 = 255;
  61. dac_clk_div = 52;
  62. } else if (apb_freq_mhz <= 40) {
  63. clk_sel0 = 160;
  64. clk_sel1 = 255;
  65. dac_clk_div = 80;
  66. } else {
  67. clk_sel0 = 80;
  68. clk_sel1 = 128;
  69. dac_clk_div = 100;
  70. }
  71. efuse_ll_set_dac_clk_div(dac_clk_div);
  72. efuse_ll_set_dac_clk_sel0(clk_sel0);
  73. efuse_ll_set_dac_clk_sel1(clk_sel1);
  74. }
  75. void efuse_hal_read(void)
  76. {
  77. efuse_ll_set_conf_read_op_code();
  78. efuse_ll_set_read_cmd();
  79. while (efuse_ll_get_cmd() != 0) { };
  80. }
  81. void efuse_hal_clear_program_registers(void)
  82. {
  83. for (uint32_t r = EFUSE_BLK0_WDATA0_REG; r <= EFUSE_BLK0_WDATA6_REG; r += 4) {
  84. REG_WRITE(r, 0);
  85. }
  86. for (uint32_t r = EFUSE_BLK1_WDATA0_REG; r <= EFUSE_BLK1_WDATA7_REG; r += 4) {
  87. REG_WRITE(r, 0);
  88. }
  89. for (uint32_t r = EFUSE_BLK2_WDATA0_REG; r <= EFUSE_BLK2_WDATA7_REG; r += 4) {
  90. REG_WRITE(r, 0);
  91. }
  92. for (uint32_t r = EFUSE_BLK3_WDATA0_REG; r <= EFUSE_BLK3_WDATA7_REG; r += 4) {
  93. REG_WRITE(r, 0);
  94. }
  95. }
  96. void efuse_hal_program(uint32_t block)
  97. {
  98. (void) block;
  99. // Permanently update values written to the efuse write registers
  100. efuse_ll_set_conf_write_op_code();
  101. efuse_ll_set_pgm_cmd();
  102. while (efuse_ll_get_cmd() != 0) { };
  103. efuse_hal_read();
  104. }
  105. /******************* eFuse control functions *************************/
  106. bool efuse_hal_is_coding_error_in_block(unsigned block)
  107. {
  108. return block > 0 &&
  109. efuse_ll_get_coding_scheme() == 1 && // 3/4 coding scheme
  110. efuse_ll_get_dec_warnings(block);
  111. }