regi2c_ctrl.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "soc/soc.h"
  7. #include "soc/syscon_reg.h"
  8. #include "regi2c_ctrl.h"
  9. #include "regi2c_brownout.h"
  10. #define I2C_RTC_WIFI_CLK_EN (SYSCON_WIFI_CLK_EN_REG)
  11. #define I2C_RTC_CLK_GATE_EN (BIT(18))
  12. #define I2C_RTC_CLK_GATE_EN_M (BIT(18))
  13. #define I2C_RTC_CLK_GATE_EN_V 0x1
  14. #define I2C_RTC_CLK_GATE_EN_S 18
  15. #define I2C_RTC_CONFIG0 0x6000e048
  16. #define I2C_RTC_MAGIC_CTRL 0x00001FFF
  17. #define I2C_RTC_MAGIC_CTRL_M ((I2C_RTC_MAGIC_CTRL_V)<<(I2C_RTC_MAGIC_CTRL_S))
  18. #define I2C_RTC_MAGIC_CTRL_V 0x1FFF
  19. #define I2C_RTC_MAGIC_CTRL_S 4
  20. #define I2C_RTC_CONFIG1 0x6000e044
  21. #define I2C_RTC_BOD_MASK (BIT(22))
  22. #define I2C_RTC_BOD_MASK_M (BIT(22))
  23. #define I2C_RTC_BOD_MASK_V 0x1
  24. #define I2C_RTC_BOD_MASK_S 22
  25. #define I2C_RTC_SAR_MASK (BIT(18))
  26. #define I2C_RTC_SAR_MASK_M (BIT(18))
  27. #define I2C_RTC_SAR_MASK_V 0x1
  28. #define I2C_RTC_SAR_MASK_S 18
  29. #define I2C_RTC_BBPLL_MASK (BIT(17))
  30. #define I2C_RTC_BBPLL_MASK_M (BIT(17))
  31. #define I2C_RTC_BBPLL_MASK_V 0x1
  32. #define I2C_RTC_BBPLL_MASK_S 17
  33. #define I2C_RTC_APLL_MASK (BIT(14))
  34. #define I2C_RTC_APLL_MASK_M (BIT(14))
  35. #define I2C_RTC_APLL_MASK_V 0x1
  36. #define I2C_RTC_APLL_MASK_S 14
  37. #define I2C_RTC_ALL_MASK 0x00007FFF
  38. #define I2C_RTC_ALL_MASK_M ((I2C_RTC_ALL_MASK_V)<<(I2C_RTC_ALL_MASK_S))
  39. #define I2C_RTC_ALL_MASK_V 0x7FFF
  40. #define I2C_RTC_ALL_MASK_S 8
  41. #define I2C_RTC_CONFIG2 0x6000e000
  42. #define I2C_RTC_BUSY (BIT(25))
  43. #define I2C_RTC_BUSY_M (BIT(25))
  44. #define I2C_RTC_BUSY_V 0x1
  45. #define I2C_RTC_BUSY_S 25
  46. #define I2C_RTC_WR_CNTL (BIT(24))
  47. #define I2C_RTC_WR_CNTL_M (BIT(24))
  48. #define I2C_RTC_WR_CNTL_V 0x1
  49. #define I2C_RTC_WR_CNTL_S 24
  50. #define I2C_RTC_DATA 0x000000FF
  51. #define I2C_RTC_DATA_M ((I2C_RTC_DATA_V)<<(I2C_RTC_DATA_S))
  52. #define I2C_RTC_DATA_V 0xFF
  53. #define I2C_RTC_DATA_S 16
  54. #define I2C_RTC_ADDR 0x000000FF
  55. #define I2C_RTC_ADDR_M ((I2C_RTC_ADDR_V)<<(I2C_RTC_ADDR_S))
  56. #define I2C_RTC_ADDR_V 0xFF
  57. #define I2C_RTC_ADDR_S 8
  58. #define I2C_RTC_SLAVE_ID 0x000000FF
  59. #define I2C_RTC_SLAVE_ID_M ((I2C_RTC_SLAVE_ID_V)<<(I2C_RTC_SLAVE_ID_S))
  60. #define I2C_RTC_SLAVE_ID_V 0xFF
  61. #define I2C_RTC_SLAVE_ID_S 0
  62. #define I2C_RTC_MAGIC_DEFAULT (0x1c40)
  63. static void i2c_rtc_enable_block(uint8_t block)
  64. {
  65. REG_SET_FIELD(I2C_RTC_CONFIG0, I2C_RTC_MAGIC_CTRL, I2C_RTC_MAGIC_DEFAULT);
  66. REG_SET_FIELD(I2C_RTC_CONFIG1, I2C_RTC_ALL_MASK, I2C_RTC_ALL_MASK_V);
  67. REG_SET_BIT(I2C_RTC_WIFI_CLK_EN, I2C_RTC_CLK_GATE_EN);
  68. switch (block) {
  69. case I2C_APLL:
  70. REG_CLR_BIT(I2C_RTC_CONFIG1, I2C_RTC_APLL_MASK);
  71. break;
  72. case I2C_BBPLL:
  73. REG_CLR_BIT(I2C_RTC_CONFIG1, I2C_RTC_BBPLL_MASK);
  74. break;
  75. case I2C_SAR_ADC:
  76. REG_CLR_BIT(I2C_RTC_CONFIG1, I2C_RTC_SAR_MASK);
  77. break;
  78. case I2C_BOD:
  79. REG_CLR_BIT(I2C_RTC_CONFIG1, I2C_RTC_BOD_MASK);
  80. break;
  81. }
  82. }
  83. uint8_t i2c_rtc_read_reg(uint8_t block, uint8_t host_id, uint8_t reg_add)
  84. {
  85. i2c_rtc_enable_block(block);
  86. uint32_t temp = ((block & I2C_RTC_SLAVE_ID_V) << I2C_RTC_SLAVE_ID_S)
  87. | (reg_add & I2C_RTC_ADDR_V) << I2C_RTC_ADDR_S;
  88. REG_WRITE(I2C_RTC_CONFIG2, temp);
  89. while (REG_GET_BIT(I2C_RTC_CONFIG2, I2C_RTC_BUSY));
  90. return REG_GET_FIELD(I2C_RTC_CONFIG2, I2C_RTC_DATA);
  91. }
  92. uint8_t i2c_rtc_read_reg_mask(uint8_t block, uint8_t host_id, uint8_t reg_add, uint8_t msb, uint8_t lsb)
  93. {
  94. assert(msb - lsb < 8);
  95. i2c_rtc_enable_block(block);
  96. uint32_t temp = ((block & I2C_RTC_SLAVE_ID_V) << I2C_RTC_SLAVE_ID_S)
  97. | (reg_add & I2C_RTC_ADDR_V) << I2C_RTC_ADDR_S;
  98. REG_WRITE(I2C_RTC_CONFIG2, temp);
  99. while (REG_GET_BIT(I2C_RTC_CONFIG2, I2C_RTC_BUSY));
  100. uint32_t data = REG_GET_FIELD(I2C_RTC_CONFIG2, I2C_RTC_DATA);
  101. return (uint8_t)((data >> lsb) & (~(0xFFFFFFFF << (msb - lsb + 1))));
  102. }
  103. void i2c_rtc_write_reg(uint8_t block, uint8_t host_id, uint8_t reg_add, uint8_t data)
  104. {
  105. i2c_rtc_enable_block(block);
  106. uint32_t temp = ((block & I2C_RTC_SLAVE_ID_V) << I2C_RTC_SLAVE_ID_S)
  107. | ((reg_add & I2C_RTC_ADDR_V) << I2C_RTC_ADDR_S)
  108. | ((0x1 & I2C_RTC_WR_CNTL_V) << I2C_RTC_WR_CNTL_S)
  109. | (((uint32_t)data & I2C_RTC_DATA_V) << I2C_RTC_DATA_S);
  110. REG_WRITE(I2C_RTC_CONFIG2, temp);
  111. while (REG_GET_BIT(I2C_RTC_CONFIG2, I2C_RTC_BUSY));
  112. }
  113. void i2c_rtc_write_reg_mask(uint8_t block, uint8_t host_id, uint8_t reg_add, uint8_t msb, uint8_t lsb, uint8_t data)
  114. {
  115. assert(msb - lsb < 8);
  116. i2c_rtc_enable_block(block);
  117. /*Read the i2c bus register*/
  118. uint32_t temp = ((block & I2C_RTC_SLAVE_ID_V) << I2C_RTC_SLAVE_ID_S)
  119. | (reg_add & I2C_RTC_ADDR_V) << I2C_RTC_ADDR_S;
  120. REG_WRITE(I2C_RTC_CONFIG2, temp);
  121. while (REG_GET_BIT(I2C_RTC_CONFIG2, I2C_RTC_BUSY));
  122. temp = REG_GET_FIELD(I2C_RTC_CONFIG2, I2C_RTC_DATA);
  123. /*Write the i2c bus register*/
  124. temp &= ((~(0xFFFFFFFF << lsb)) | (0xFFFFFFFF << (msb + 1)));
  125. temp = (((uint32_t)data & (~(0xFFFFFFFF << (msb - lsb + 1)))) << lsb) | temp;
  126. temp = ((block & I2C_RTC_SLAVE_ID_V) << I2C_RTC_SLAVE_ID_S)
  127. | ((reg_add & I2C_RTC_ADDR_V) << I2C_RTC_ADDR_S)
  128. | ((0x1 & I2C_RTC_WR_CNTL_V) << I2C_RTC_WR_CNTL_S)
  129. | ((temp & I2C_RTC_DATA_V) << I2C_RTC_DATA_S);
  130. REG_WRITE(I2C_RTC_CONFIG2, temp);
  131. while (REG_GET_BIT(I2C_RTC_CONFIG2, I2C_RTC_BUSY));
  132. }