ulp_riscv_gpio.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #pragma once
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. #include "soc/rtc_io_reg.h"
  11. #include "soc/sens_reg.h"
  12. typedef enum {
  13. GPIO_NUM_0 = 0, /*!< GPIO0, input and output */
  14. GPIO_NUM_1 = 1, /*!< GPIO1, input and output */
  15. GPIO_NUM_2 = 2, /*!< GPIO2, input and output */
  16. GPIO_NUM_3 = 3, /*!< GPIO3, input and output */
  17. GPIO_NUM_4 = 4, /*!< GPIO4, input and output */
  18. GPIO_NUM_5 = 5, /*!< GPIO5, input and output */
  19. GPIO_NUM_6 = 6, /*!< GPIO6, input and output */
  20. GPIO_NUM_7 = 7, /*!< GPIO7, input and output */
  21. GPIO_NUM_8 = 8, /*!< GPIO8, input and output */
  22. GPIO_NUM_9 = 9, /*!< GPIO9, input and output */
  23. GPIO_NUM_10 = 10, /*!< GPIO10, input and output */
  24. GPIO_NUM_11 = 11, /*!< GPIO11, input and output */
  25. GPIO_NUM_12 = 12, /*!< GPIO12, input and output */
  26. GPIO_NUM_13 = 13, /*!< GPIO13, input and output */
  27. GPIO_NUM_14 = 14, /*!< GPIO14, input and output */
  28. GPIO_NUM_15 = 15, /*!< GPIO15, input and output */
  29. GPIO_NUM_16 = 16, /*!< GPIO16, input and output */
  30. GPIO_NUM_17 = 17, /*!< GPIO17, input and output */
  31. GPIO_NUM_18 = 18, /*!< GPIO18, input and output */
  32. GPIO_NUM_19 = 19, /*!< GPIO19, input and output */
  33. GPIO_NUM_20 = 20,
  34. GPIO_NUM_21 = 21, /*!< GPIO21, input and output */
  35. } gpio_num_t;
  36. typedef enum {
  37. RTCIO_MODE_OUTPUT = 0,
  38. RTCIO_MODE_OUTPUT_OD = 1,
  39. } rtc_io_out_mode_t;
  40. static inline void ulp_riscv_gpio_init(gpio_num_t gpio_num)
  41. {
  42. #if CONFIG_IDF_TARGET_ESP32S2
  43. SET_PERI_REG_MASK(SENS_SAR_IO_MUX_CONF_REG, SENS_IOMUX_CLK_GATE_EN_M);
  44. #elif CONFIG_IDF_TARGET_ESP32S3
  45. SET_PERI_REG_MASK(SENS_SAR_PERI_CLK_GATE_CONF_REG, SENS_IOMUX_CLK_EN_M);
  46. #endif
  47. SET_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_MUX_SEL);
  48. REG_SET_FIELD(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_FUN_SEL, 0);
  49. }
  50. static inline void ulp_riscv_gpio_deinit(gpio_num_t gpio_num)
  51. {
  52. CLEAR_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_MUX_SEL);
  53. }
  54. static inline void ulp_riscv_gpio_output_enable(gpio_num_t gpio_num)
  55. {
  56. REG_SET_FIELD(RTC_GPIO_ENABLE_W1TS_REG, RTC_GPIO_ENABLE_W1TS, BIT(gpio_num));
  57. }
  58. static inline void ulp_riscv_gpio_output_disable(gpio_num_t gpio_num)
  59. {
  60. REG_SET_FIELD(RTC_GPIO_ENABLE_W1TC_REG, RTC_GPIO_ENABLE_W1TC, BIT(gpio_num));
  61. }
  62. static inline void ulp_riscv_gpio_input_enable(gpio_num_t gpio_num)
  63. {
  64. SET_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_FUN_IE);
  65. }
  66. static inline void ulp_riscv_gpio_input_disable(gpio_num_t gpio_num)
  67. {
  68. CLEAR_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_FUN_IE);
  69. }
  70. static inline void ulp_riscv_gpio_output_level(gpio_num_t gpio_num, uint8_t level)
  71. {
  72. if (level) {
  73. REG_SET_FIELD(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TS, BIT(gpio_num));
  74. } else {
  75. REG_SET_FIELD(RTC_GPIO_OUT_W1TC_REG, RTC_GPIO_OUT_DATA_W1TS, BIT(gpio_num));
  76. }
  77. }
  78. static inline uint8_t ulp_riscv_gpio_get_level(gpio_num_t gpio_num)
  79. {
  80. return (uint8_t)((REG_GET_FIELD(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT) & BIT(gpio_num)) ? 1 : 0);
  81. }
  82. static inline void ulp_riscv_gpio_set_output_mode(gpio_num_t gpio_num, rtc_io_out_mode_t mode)
  83. {
  84. REG_SET_FIELD(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_DRV, mode);
  85. }
  86. static inline void ulp_riscv_gpio_pullup(gpio_num_t gpio_num)
  87. {
  88. SET_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_RUE);
  89. }
  90. static inline void ulp_riscv_gpio_pullup_disable(gpio_num_t gpio_num)
  91. {
  92. CLEAR_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_RUE);
  93. }
  94. static inline void ulp_riscv_gpio_pulldown(gpio_num_t gpio_num)
  95. {
  96. SET_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_RDE);
  97. }
  98. static inline void ulp_riscv_gpio_pulldown_disable(gpio_num_t gpio_num)
  99. {
  100. CLEAR_PERI_REG_MASK(RTC_IO_TOUCH_PAD0_REG + gpio_num*4, RTC_IO_TOUCH_PAD0_RDE);
  101. }
  102. #ifdef __cplusplus
  103. }
  104. #endif