esp_efuse_rtc_calib.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <esp_bit_defs.h>
  7. #include "esp_log.h"
  8. #include "esp_efuse.h"
  9. #include "esp_efuse_table.h"
  10. #include "esp_efuse_rtc_calib.h"
  11. #include "hal/adc_types.h"
  12. int esp_efuse_rtc_calib_get_ver(void)
  13. {
  14. uint32_t blk_ver_major = 0;
  15. esp_efuse_read_field_blob(ESP_EFUSE_BLK_VERSION_MAJOR, &blk_ver_major, ESP_EFUSE_BLK_VERSION_MAJOR[0]->bit_count); // IDF-5366
  16. uint32_t cali_version = (blk_ver_major == 0) ? ESP_EFUSE_ADC_CALIB_VER : 0;
  17. if (!cali_version) {
  18. ESP_LOGW("eFuse", "calibration efuse version does not match, set default version to 0");
  19. }
  20. return cali_version;
  21. }
  22. uint32_t esp_efuse_rtc_calib_get_init_code(int version, uint32_t adc_unit, int atten)
  23. {
  24. assert((version >= ESP_EFUSE_ADC_CALIB_VER_MIN) &&
  25. (version <= ESP_EFUSE_ADC_CALIB_VER_MAX));
  26. assert(atten <= ADC_ATTEN_DB_12);
  27. (void) adc_unit;
  28. if (atten == ADC_ATTEN_DB_2_5 || atten == ADC_ATTEN_DB_6) {
  29. /**
  30. * - ESP32C2 only supports HW calibration on ADC_ATTEN_DB_0 and ADC_ATTEN_DB_12
  31. * - For other attenuation, we just return default value, which is 0.
  32. */
  33. return 0;
  34. }
  35. int32_t adc_icode_diff_atten0 = 0;
  36. int32_t adc_icode_diff_atten3 = 0;
  37. int efuse_icode_bits = 0;
  38. efuse_icode_bits = esp_efuse_get_field_size(ESP_EFUSE_ADC1_INIT_CODE_ATTEN0);
  39. ESP_ERROR_CHECK(esp_efuse_read_field_blob(ESP_EFUSE_ADC1_INIT_CODE_ATTEN0, &adc_icode_diff_atten0, efuse_icode_bits));
  40. adc_icode_diff_atten0 = ((adc_icode_diff_atten0 & BIT(7)) != 0) ? -(adc_icode_diff_atten0 & 0x7f): adc_icode_diff_atten0;
  41. efuse_icode_bits = esp_efuse_get_field_size(ESP_EFUSE_ADC1_INIT_CODE_ATTEN3);
  42. ESP_ERROR_CHECK(esp_efuse_read_field_blob(ESP_EFUSE_ADC1_INIT_CODE_ATTEN3, &adc_icode_diff_atten3, efuse_icode_bits));
  43. ESP_EARLY_LOGV("eFuse", "adc_icode_diff_atten0: 0d%"PRId32", adc_icode_diff_atten3: 0d%"PRId32, adc_icode_diff_atten0, adc_icode_diff_atten3);
  44. uint32_t init_code = 0;
  45. if (atten == ADC_ATTEN_DB_0) {
  46. init_code = adc_icode_diff_atten0 + 2160;
  47. } else {
  48. //ADC_ATTEN_DB_12
  49. init_code = adc_icode_diff_atten3 + adc_icode_diff_atten0 + 2160;
  50. }
  51. return init_code;
  52. }
  53. esp_err_t esp_efuse_rtc_calib_get_cal_voltage(int version, uint32_t adc_unit, int atten, uint32_t *out_digi, uint32_t *out_vol_mv)
  54. {
  55. (void) adc_unit;
  56. if ((version < ESP_EFUSE_ADC_CALIB_VER_MIN) ||
  57. (version > ESP_EFUSE_ADC_CALIB_VER_MAX)) {
  58. return ESP_ERR_INVALID_ARG;
  59. }
  60. if (atten >= 4 || atten < 0) {
  61. return ESP_ERR_INVALID_ARG;
  62. }
  63. if (atten == ADC_ATTEN_DB_2_5 || atten == ADC_ATTEN_DB_6) {
  64. /**
  65. * - ESP32C2 only supports SW calibration on ADC_ATTEN_DB_0 and ADC_ATTEN_DB_12
  66. * - For other attenuation, we need to return an error, informing upper layer SW calibration driver
  67. * to deal with the error.
  68. */
  69. return ESP_ERR_INVALID_ARG;
  70. }
  71. int32_t adc_vol_diff_atten0 = 0;
  72. int32_t adc_vol_diff_atten3 = 0;
  73. int efuse_vol_bits = 0;
  74. efuse_vol_bits = esp_efuse_get_field_size(ESP_EFUSE_ADC1_CAL_VOL_ATTEN0);
  75. ESP_ERROR_CHECK(esp_efuse_read_field_blob(ESP_EFUSE_ADC1_CAL_VOL_ATTEN0, &adc_vol_diff_atten0, efuse_vol_bits));
  76. adc_vol_diff_atten0 = ((adc_vol_diff_atten0 & BIT(7)) != 0) ? -(adc_vol_diff_atten0 & 0x7f): adc_vol_diff_atten0;
  77. efuse_vol_bits = esp_efuse_get_field_size(ESP_EFUSE_ADC1_CAL_VOL_ATTEN3);
  78. ESP_ERROR_CHECK(esp_efuse_read_field_blob(ESP_EFUSE_ADC1_CAL_VOL_ATTEN3, &adc_vol_diff_atten3, efuse_vol_bits));
  79. adc_vol_diff_atten3 = ((adc_vol_diff_atten3 & BIT(5)) != 0) ? -(adc_vol_diff_atten3 & 0x1f): adc_vol_diff_atten3;
  80. ESP_EARLY_LOGV("eFuse", "adc_vol_diff_atten0: 0d%"PRId32", adc_vol_diff_atten3: 0d%"PRId32, adc_vol_diff_atten0, adc_vol_diff_atten3);
  81. if (atten == ADC_ATTEN_DB_0) {
  82. *out_digi = adc_vol_diff_atten0 + 1540;
  83. *out_vol_mv = 400;
  84. } else {
  85. //ADC_ATTEN_DB_12
  86. *out_digi = adc_vol_diff_atten0 + 1540 - adc_vol_diff_atten3 - 123;
  87. *out_vol_mv = 1370;
  88. }
  89. return ESP_OK;
  90. }
  91. esp_err_t esp_efuse_rtc_calib_get_tsens_val(float* tsens_cal)
  92. {
  93. // Currently calibration is not supported on ESP32-C2, IDF-5236
  94. *tsens_cal = 0.0;
  95. return ESP_OK;
  96. }