ls1c_pin.c 3.9 KB

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