bootloader_random_esp32h2.c 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "sdkconfig.h"
  7. #include "bootloader_random.h"
  8. #include "soc/soc.h"
  9. #include "soc/pcr_reg.h"
  10. #include "soc/apb_saradc_reg.h"
  11. #include "soc/pmu_reg.h"
  12. #include "hal/regi2c_ctrl.h"
  13. #include "soc/regi2c_saradc.h"
  14. #include "esp_log.h"
  15. static const uint32_t SAR2_CHANNEL = 9;
  16. static const uint32_t PATTERN_BIT_WIDTH = 6;
  17. static const uint32_t SAR1_ATTEN = 1;
  18. static const uint32_t SAR2_ATTEN = 1;
  19. void bootloader_random_enable(void)
  20. {
  21. REG_SET_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_RST_EN);
  22. REG_CLR_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_RST_EN);
  23. REG_SET_BIT(PCR_SARADC_CONF_REG, PCR_SARADC_REG_CLK_EN);
  24. REG_SET_BIT(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_EN);
  25. // select XTAL clock (40 MHz) source for ADC_CTRL_CLK
  26. REG_SET_FIELD(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_SEL, 0);
  27. REG_SET_FIELD(PCR_SARADC_CLKM_CONF_REG, PCR_SARADC_CLKM_DIV_NUM, 0);
  28. // some ADC sensor registers are in power group PERIF_I2C and need to be enabled via PMU
  29. SET_PERI_REG_MASK(PMU_RF_PWC_REG, PMU_XPD_PERIF_I2C);
  30. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_DTEST, 0);
  31. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_ENT_SAR, 1);
  32. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_EN_TOUT_SAR1_BUS, 1);
  33. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_MSB, 0X08);
  34. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_LSB, 0X66);
  35. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_MSB, 0X08);
  36. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_LSB, 0X66);
  37. // create patterns and set them in pattern table
  38. uint32_t pattern_one = (SAR2_CHANNEL << 2) | SAR2_ATTEN;
  39. uint32_t pattern_two = SAR1_ATTEN; // we want channel 0 with max attenuation, channel doesn't really matter here
  40. uint32_t pattern_table = 0 | (pattern_two << 3 * PATTERN_BIT_WIDTH) | pattern_one << 2 * PATTERN_BIT_WIDTH;
  41. REG_WRITE(APB_SARADC_SAR_PATT_TAB1_REG, pattern_table);
  42. // set pattern length to 2 (APB_SARADC_SAR_PATT_LEN counts from 0)
  43. REG_SET_FIELD(APB_SARADC_CTRL_REG, APB_SARADC_SARADC_SAR_PATT_LEN, 0);
  44. // Same as in C3
  45. REG_SET_FIELD(APB_SARADC_CTRL_REG, APB_SARADC_SARADC_SAR_CLK_DIV, 15);
  46. // set timer expiry (timer is ADC_CTRL_CLK)
  47. REG_SET_FIELD(APB_SARADC_CTRL2_REG, APB_SARADC_SARADC_TIMER_TARGET, 200);
  48. // ENABLE_TIMER
  49. REG_SET_BIT(APB_SARADC_CTRL2_REG, APB_SARADC_SARADC_TIMER_EN);
  50. }
  51. void bootloader_random_disable(void)
  52. {
  53. // disable timer
  54. REG_CLR_BIT(APB_SARADC_CTRL2_REG, APB_SARADC_SARADC_TIMER_EN);
  55. // Write reset value of this register
  56. REG_WRITE(APB_SARADC_SAR_PATT_TAB1_REG, 0xFFFFFF);
  57. // Revert ADC I2C configuration and initial voltage source setting
  58. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_MSB, 0x60);
  59. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR2_INIT_CODE_LSB, 0x0);
  60. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_MSB, 0x60);
  61. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_SAR1_INIT_CODE_LSB, 0x0);
  62. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_DTEST, 0);
  63. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_ENT_SAR, 0);
  64. REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_EN_TOUT_SAR1_BUS, 0);
  65. // disable ADC_CTRL_CLK (SAR ADC function clock)
  66. REG_WRITE(PCR_SARADC_CLKM_CONF_REG, 0x00404000);
  67. // Set PCR_SARADC_CONF_REG to initial state
  68. REG_WRITE(PCR_SARADC_CONF_REG, 0x5);
  69. }