ls1c_pin.c 4.3 KB

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