ls1b_pin.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2017-09-06 勤为本 first version
  9. * 2021-02-02 michael5hzg@gmail.com adapt to ls1b
  10. */
  11. // 引脚功能(普通gpio,pwm,复用等)相关接口
  12. #include "ls1b_public.h"
  13. #include "ls1b_regs.h"
  14. #include "ls1b_gpio.h"
  15. #include "ls1b_pin.h"
  16. /*
  17. * 把指定pin设置为指定用途(普通gpio,非gpio)
  18. * @gpio gpio引脚编号
  19. * @purpose 用途
  20. */
  21. void pin_set_purpose(unsigned int gpio, pin_purpose_t purpose)
  22. {
  23. volatile unsigned int *gpio_cfgx; // GPIO_CFGx寄存器
  24. unsigned int pin = GPIO_GET_PIN(gpio);
  25. gpio_cfgx = gpio_get_cfg_reg(gpio);
  26. if (PIN_PURPOSE_GPIO == purpose) // 引脚用作普通gpio
  27. {
  28. reg_set_one_bit(gpio_cfgx, pin);
  29. }
  30. else // 引脚用作其它功能(非gpio)
  31. {
  32. reg_clr_one_bit(gpio_cfgx, pin);
  33. }
  34. return ;
  35. }
  36. /*
  37. * 设置指定pin为第n复用
  38. * @gpio gpio编号
  39. * @remap 第n复用
  40. */
  41. void pin_set_remap(unsigned int gpio, pin_remap_t remap)
  42. {
  43. volatile unsigned int *reg = NULL; // 复用寄存器
  44. unsigned int port = GPIO_GET_PORT(gpio);
  45. unsigned int pin = GPIO_GET_PIN(gpio);
  46. int i;
  47. /*指定全部pin复用为0*/
  48. for (i = 0; i <= 4; i++)
  49. {
  50. reg = (volatile unsigned int *)((LS1B_CBUS_FIRST0) + ((port) * 0x04) + ((i) * 0x10));
  51. // 置0
  52. reg_clr_one_bit(reg, pin);
  53. }
  54. if (remap == PIN_REMAP_DEFAULT) return;
  55. switch (port)
  56. {
  57. case 0:
  58. switch (remap)
  59. {
  60. case PIN_REMAP_FIRST:
  61. reg = (volatile unsigned int *)LS1B_CBUS_FIRST0;
  62. break;
  63. case PIN_REMAP_SECOND:
  64. reg = (volatile unsigned int *)LS1B_CBUS_SECOND0;
  65. break;
  66. case PIN_REMAP_THIRD:
  67. reg = (volatile unsigned int *)LS1B_CBUS_THIRD0;
  68. break;
  69. case PIN_REMAP_FOURTH:
  70. reg = (volatile unsigned int *)LS1B_CBUS_FOURTH0;
  71. break;
  72. case PIN_REMAP_FIFTH:
  73. reg = (volatile unsigned int *)LS1B_CBUS_FIFTH0;
  74. break;
  75. }
  76. break;
  77. case 1:
  78. switch (remap)
  79. {
  80. case PIN_REMAP_FIRST:
  81. reg = (volatile unsigned int *)LS1B_CBUS_FIRST1;
  82. break;
  83. case PIN_REMAP_SECOND:
  84. reg = (volatile unsigned int *)LS1B_CBUS_SECOND1;
  85. break;
  86. case PIN_REMAP_THIRD:
  87. reg = (volatile unsigned int *)LS1B_CBUS_THIRD1;
  88. break;
  89. case PIN_REMAP_FOURTH:
  90. reg = (volatile unsigned int *)LS1B_CBUS_FOURTH1;
  91. break;
  92. case PIN_REMAP_FIFTH:
  93. reg = (volatile unsigned int *)LS1B_CBUS_FIFTH1;
  94. break;
  95. }
  96. break;
  97. case 2:
  98. switch (remap)
  99. {
  100. case PIN_REMAP_FIRST:
  101. reg = (volatile unsigned int *)LS1B_CBUS_FIRST2;
  102. break;
  103. case PIN_REMAP_SECOND:
  104. reg = (volatile unsigned int *)LS1B_CBUS_SECOND2;
  105. break;
  106. case PIN_REMAP_THIRD:
  107. reg = (volatile unsigned int *)LS1B_CBUS_THIRD2;
  108. break;
  109. case PIN_REMAP_FOURTH:
  110. reg = (volatile unsigned int *)LS1B_CBUS_FOURTH2;
  111. break;
  112. case PIN_REMAP_FIFTH:
  113. reg = (volatile unsigned int *)LS1B_CBUS_FIFTH2;
  114. break;
  115. }
  116. break;
  117. case 3:
  118. switch (remap)
  119. {
  120. case PIN_REMAP_FIRST:
  121. reg = (volatile unsigned int *)LS1B_CBUS_FIRST3;
  122. break;
  123. case PIN_REMAP_SECOND:
  124. reg = (volatile unsigned int *)LS1B_CBUS_SECOND3;
  125. break;
  126. case PIN_REMAP_THIRD:
  127. reg = (volatile unsigned int *)LS1B_CBUS_THIRD3;
  128. break;
  129. case PIN_REMAP_FOURTH:
  130. reg = (volatile unsigned int *)LS1B_CBUS_FOURTH3;
  131. break;
  132. case PIN_REMAP_FIFTH:
  133. reg = (volatile unsigned int *)LS1B_CBUS_FIFTH3;
  134. break;
  135. }
  136. break;
  137. default:
  138. return ;
  139. }
  140. // 置1
  141. reg_set_one_bit(reg, pin);
  142. return ;
  143. }