ls1c_pin.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. switch (port)
  37. {
  38. case 0:
  39. switch (remap)
  40. {
  41. case PIN_REMAP_FIRST:
  42. reg = (volatile unsigned int *)LS1C_CBUS_FIRST0;
  43. break;
  44. case PIN_REMAP_SECOND:
  45. reg = (volatile unsigned int *)LS1C_CBUS_SECOND0;
  46. break;
  47. case PIN_REMAP_THIRD:
  48. reg = (volatile unsigned int *)LS1C_CBUS_THIRD0;
  49. break;
  50. case PIN_REMAP_FOURTH:
  51. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH0;
  52. break;
  53. case PIN_REMAP_FIFTH:
  54. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH0;
  55. break;
  56. }
  57. break;
  58. case 1:
  59. switch (remap)
  60. {
  61. case PIN_REMAP_FIRST:
  62. reg = (volatile unsigned int *)LS1C_CBUS_FIRST1;
  63. break;
  64. case PIN_REMAP_SECOND:
  65. reg = (volatile unsigned int *)LS1C_CBUS_SECOND1;
  66. break;
  67. case PIN_REMAP_THIRD:
  68. reg = (volatile unsigned int *)LS1C_CBUS_THIRD1;
  69. break;
  70. case PIN_REMAP_FOURTH:
  71. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH1;
  72. break;
  73. case PIN_REMAP_FIFTH:
  74. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH1;
  75. break;
  76. }
  77. break;
  78. case 2:
  79. switch (remap)
  80. {
  81. case PIN_REMAP_FIRST:
  82. reg = (volatile unsigned int *)LS1C_CBUS_FIRST2;
  83. break;
  84. case PIN_REMAP_SECOND:
  85. reg = (volatile unsigned int *)LS1C_CBUS_SECOND2;
  86. break;
  87. case PIN_REMAP_THIRD:
  88. reg = (volatile unsigned int *)LS1C_CBUS_THIRD2;
  89. break;
  90. case PIN_REMAP_FOURTH:
  91. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH2;
  92. break;
  93. case PIN_REMAP_FIFTH:
  94. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH2;
  95. break;
  96. }
  97. break;
  98. case 3:
  99. switch (remap)
  100. {
  101. case PIN_REMAP_FIRST:
  102. reg = (volatile unsigned int *)LS1C_CBUS_FIRST3;
  103. break;
  104. case PIN_REMAP_SECOND:
  105. reg = (volatile unsigned int *)LS1C_CBUS_SECOND3;
  106. break;
  107. case PIN_REMAP_THIRD:
  108. reg = (volatile unsigned int *)LS1C_CBUS_THIRD3;
  109. break;
  110. case PIN_REMAP_FOURTH:
  111. reg = (volatile unsigned int *)LS1C_CBUS_FOURTH3;
  112. break;
  113. case PIN_REMAP_FIFTH:
  114. reg = (volatile unsigned int *)LS1C_CBUS_FIFTH3;
  115. break;
  116. }
  117. break;
  118. default:
  119. return ;
  120. }
  121. // 置1
  122. reg_set_one_bit(reg, pin);
  123. return ;
  124. }