drv_pinctrl.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * Copyright (c) 2006-2025 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <rtthread.h>
  7. #include <ioremap.h>
  8. #include "board.h"
  9. #include "drv_pinctrl.h"
  10. #include <rtdbg.h>
  11. #define DBG_TAG "PINCTRL"
  12. #ifdef RT_DEBUG
  13. #define DBG_LVL DBG_LOG
  14. #else
  15. #define DBG_LVL DBG_WARNING
  16. #endif
  17. #define DBG_COLOR
  18. #define MAX_NUM_PIN 64
  19. #define IO_CFG_SEL_MASK 0x7
  20. #define IO_CFG_SEL_OFFSET 11
  21. #define IO_CFG_IE_MASK 0x1
  22. #define IO_CFG_IE_OFFSET 8
  23. #define IO_CFG_OE_MASK 0x1
  24. #define IO_CFG_OE_OFFSET 7
  25. #define IO_CFG_PU_MASK 0x1
  26. #define IO_CFG_PU_OFFSET 6
  27. #define IO_CFG_PD_MASK 0x1
  28. #define IO_CFG_PD_OFFSET 5
  29. #define IO_CFG_DRV_MASK 0xF
  30. #define IO_CFG_DRV_OFFSET 1
  31. #define IO_CFG_ST_MASK 0x1
  32. #define IO_CFG_ST_OFFSET 0
  33. volatile static rt_ubase_t pinctrl_base;
  34. static int check_pin(rt_uint32_t pin)
  35. {
  36. if (pin < 0 || pin > MAX_NUM_PIN)
  37. {
  38. LOG_E("pin %d is not valid\n", pin);
  39. return -RT_EINVAL;
  40. }
  41. return 0;
  42. }
  43. rt_inline rt_uint32_t _read32(rt_uint32_t pin)
  44. {
  45. return HWREG32(pinctrl_base + (pin * 4));
  46. }
  47. rt_inline void _write32(rt_uint32_t pin, rt_uint32_t value)
  48. {
  49. HWREG32(pinctrl_base + (pin * 4)) = value;
  50. }
  51. void k230_pinctrl_set_function(rt_uint32_t pin, rt_uint32_t func)
  52. {
  53. if (check_pin(pin) != 0)
  54. return;
  55. if (func > IOMUX_FUNC5)
  56. return;
  57. rt_uint32_t val = _read32(pin);
  58. val &= ~(IO_CFG_SEL_MASK << IO_CFG_SEL_OFFSET); /* Clear bits 11-13 */
  59. /* Set bits 11-13 to the function value */
  60. val |= (func << IO_CFG_SEL_OFFSET);
  61. _write32(pin, val);
  62. }
  63. void k230_pinctrl_set_ie(rt_uint32_t pin, rt_uint32_t ie)
  64. {
  65. if (check_pin(pin) != 0)
  66. return;
  67. rt_uint32_t val = _read32(pin);
  68. if (ie)
  69. val |= IO_CFG_IE_MASK << IO_CFG_IE_OFFSET;
  70. else
  71. val &= ~(IO_CFG_IE_MASK << IO_CFG_IE_OFFSET);
  72. _write32(pin, val);
  73. }
  74. void k230_pinctrl_set_oe(rt_uint32_t pin, rt_uint32_t oe)
  75. {
  76. if (check_pin(pin) != 0)
  77. return;
  78. rt_uint32_t val = _read32(pin);
  79. if (oe)
  80. val |= IO_CFG_OE_MASK << IO_CFG_OE_OFFSET;
  81. else
  82. val &= ~(IO_CFG_OE_MASK << IO_CFG_OE_OFFSET);
  83. _write32(pin, val);
  84. }
  85. void k230_pinctrl_set_pu(rt_uint32_t pin, rt_uint32_t pu)
  86. {
  87. if (check_pin(pin) != 0)
  88. return;
  89. rt_uint32_t val = _read32(pin);
  90. if (pu)
  91. val |= IO_CFG_PU_MASK << IO_CFG_PU_OFFSET;
  92. else
  93. val &= ~(IO_CFG_PU_MASK << IO_CFG_PU_OFFSET);
  94. _write32(pin, val);
  95. }
  96. void k230_pinctrl_set_pd(rt_uint32_t pin, rt_uint32_t pd)
  97. {
  98. if (check_pin(pin) != 0)
  99. return;
  100. rt_uint32_t val = _read32(pin);
  101. if (pd)
  102. val |= IO_CFG_PD_MASK << IO_CFG_PD_OFFSET;
  103. else
  104. val &= ~(IO_CFG_PD_MASK << IO_CFG_PD_OFFSET);
  105. _write32(pin, val);
  106. }
  107. void k230_pinctrl_set_drv(rt_uint32_t pin, rt_uint32_t drv)
  108. {
  109. if (check_pin(pin) != 0)
  110. return;
  111. /* FIXME: Unsupported yet */
  112. }
  113. void k230_pinctrl_set_st(rt_uint32_t pin, rt_uint32_t st)
  114. {
  115. if (check_pin(pin) != 0)
  116. return;
  117. rt_uint32_t val = _read32(pin);
  118. if (st)
  119. val |= IO_CFG_ST_MASK << IO_CFG_ST_OFFSET;
  120. else
  121. val &= ~(IO_CFG_ST_MASK << IO_CFG_ST_OFFSET);
  122. _write32(pin, val);
  123. }
  124. rt_uint32_t k230_pinctrl_get_regval(rt_uint32_t pin)
  125. {
  126. if (check_pin(pin) != 0)
  127. return 0;
  128. return _read32(pin);
  129. }
  130. int k230_pinctrl_init(void)
  131. {
  132. rt_err_t ret;
  133. pinctrl_base = (rt_ubase_t)rt_ioremap((void *)IOMUX_BASE_ADDR, IOMUX_IO_SIZE);
  134. return RT_EOK;
  135. }
  136. INIT_BOARD_EXPORT(k230_pinctrl_init);