ls1c_pin.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. */
  10. // 引脚功能(普通gpio,pwm,复用等)相关接口
  11. #include "ls1c_public.h"
  12. #include "ls1c_regs.h"
  13. #include "ls1c_gpio.h"
  14. #include "ls1c_pin.h"
  15. /*
  16. * 把指定pin设置为指定用途(普通gpio,非gpio)
  17. * @gpio gpio引脚编号
  18. * @purpose 用途
  19. */
  20. void pin_set_purpose(unsigned int gpio, pin_purpose_t purpose)
  21. {
  22. volatile unsigned int *gpio_cfgx; // GPIO_CFGx寄存器
  23. unsigned int pin = GPIO_GET_PIN(gpio);
  24. gpio_cfgx = gpio_get_cfg_reg(gpio);
  25. if (PIN_PURPOSE_GPIO == purpose) // 引脚用作普通gpio
  26. {
  27. reg_set_one_bit(gpio_cfgx, pin);
  28. }
  29. else // 引脚用作其它功能(非gpio)
  30. {
  31. reg_clr_one_bit(gpio_cfgx, pin);
  32. }
  33. return ;
  34. }
  35. /*
  36. * 设置指定pin为第n复用
  37. * @gpio gpio编号
  38. * @remap 第n复用
  39. */
  40. void pin_set_remap(unsigned int gpio, pin_remap_t remap)
  41. {
  42. volatile unsigned int *reg = NULL; // 复用寄存器
  43. unsigned int port = GPIO_GET_PORT(gpio);
  44. unsigned int pin = GPIO_GET_PIN(gpio);
  45. int i;
  46. /*指定全部pin复用为0*/
  47. for (i = 0; i <= 4; i++)
  48. {
  49. reg = (volatile unsigned int *)((LS1C_CBUS_FIRST0) + ((port) * 0x04) + ((i) * 0x10));
  50. // 置0
  51. reg_clr_one_bit(reg, pin);
  52. }
  53. if (remap == PIN_REMAP_DEFAULT) return;
  54. switch (port)
  55. {
  56. case 0:
  57. switch (remap)
  58. {
  59. case PIN_REMAP_FIRST:
  60. reg = (volatile unsigned int *)LS1C_CBUS_FIRST0;
  61. break;
  62. case PIN_REMAP_SECOND:
  63. reg = (volatile unsigned int *)LS1C_CBUS_SECOND0;
  64. break;
  65. case PIN_REMAP_THIRD:
  66. reg = (volatile unsigned int *)LS1C_CBUS_THIRD0;
  67. break;
  68. case PIN_REMAP_FOURTH:
  69. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH0;
  70. break;
  71. case PIN_REMAP_FIFTH:
  72. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH0;
  73. break;
  74. }
  75. break;
  76. case 1:
  77. switch (remap)
  78. {
  79. case PIN_REMAP_FIRST:
  80. reg = (volatile unsigned int *)LS1C_CBUS_FIRST1;
  81. break;
  82. case PIN_REMAP_SECOND:
  83. reg = (volatile unsigned int *)LS1C_CBUS_SECOND1;
  84. break;
  85. case PIN_REMAP_THIRD:
  86. reg = (volatile unsigned int *)LS1C_CBUS_THIRD1;
  87. break;
  88. case PIN_REMAP_FOURTH:
  89. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH1;
  90. break;
  91. case PIN_REMAP_FIFTH:
  92. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH1;
  93. break;
  94. }
  95. break;
  96. case 2:
  97. switch (remap)
  98. {
  99. case PIN_REMAP_FIRST:
  100. reg = (volatile unsigned int *)LS1C_CBUS_FIRST2;
  101. break;
  102. case PIN_REMAP_SECOND:
  103. reg = (volatile unsigned int *)LS1C_CBUS_SECOND2;
  104. break;
  105. case PIN_REMAP_THIRD:
  106. reg = (volatile unsigned int *)LS1C_CBUS_THIRD2;
  107. break;
  108. case PIN_REMAP_FOURTH:
  109. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH2;
  110. break;
  111. case PIN_REMAP_FIFTH:
  112. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH2;
  113. break;
  114. }
  115. break;
  116. case 3:
  117. switch (remap)
  118. {
  119. case PIN_REMAP_FIRST:
  120. reg = (volatile unsigned int *)LS1C_CBUS_FIRST3;
  121. break;
  122. case PIN_REMAP_SECOND:
  123. reg = (volatile unsigned int *)LS1C_CBUS_SECOND3;
  124. break;
  125. case PIN_REMAP_THIRD:
  126. reg = (volatile unsigned int *)LS1C_CBUS_THIRD3;
  127. break;
  128. case PIN_REMAP_FOURTH:
  129. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH3;
  130. break;
  131. case PIN_REMAP_FIFTH:
  132. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH3;
  133. break;
  134. }
  135. break;
  136. default:
  137. return ;
  138. }
  139. // 置1
  140. reg_set_one_bit(reg, pin);
  141. return ;
  142. }