gpio.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "gpio.h"
  2. /* all pins used as gpio(input/output/irq) must be defined here */
  3. void gpio_init(void){
  4. rcu_periph_clock_enable(RCU_GPIOA);
  5. rcu_periph_clock_enable(RCU_GPIOB);
  6. rcu_periph_clock_enable(RCU_GPIOC);
  7. rcu_periph_clock_enable(RCU_GPIOF);
  8. #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700)
  9. //hall 2 detect
  10. gpio_mode_input(GPIOC, GPIO_PUPD_PULLUP, GPIO_PIN_13);
  11. //hall 1 detect
  12. gpio_mode_input(GPIOC, GPIO_PUPD_PULLUP, GPIO_PIN_15);
  13. //IR uart0 enable
  14. gpio_mode_output(GPIOC, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_14);
  15. //IR uart2 enable
  16. gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
  17. //cs1180 power enable
  18. gpio_mode_output(GPIOB, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_12);
  19. //detect cs1180 ready
  20. gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_0);
  21. //CS1180 cs
  22. gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
  23. cs1180_cs(1);
  24. #ifdef SHARK_BOARD_SP700_OLD_CS1180
  25. //老的sp700+cs1180上,GPIOA8和GPIOB15连在一起,为了不影响B15 pin的spi 功能,A8pin需要设置为输入
  26. gpio_mode_analog_input(GPIOA, GPIO_PIN_8);
  27. #endif
  28. #elif (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600)
  29. //rs485 INT ,this can be used detect rs485 in/out, then open rs485 power, and then detect GPIOF0
  30. gpio_mode_input(GPIOC, GPIO_PUPD_NONE, GPIO_PIN_13);
  31. //rs485 pwr enable
  32. gpio_mode_output(GPIOC, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_14);
  33. //rs485 in/out detect, only works when rs485 pwr on
  34. gpio_mode_input(GPIOF, GPIO_PUPD_NONE, GPIO_PIN_0);
  35. //cs1180 pwr enable
  36. gpio_mode_output(GPIOC, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_15);
  37. //detect cs1180 ready
  38. gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_12);
  39. //CS1180 cs
  40. gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
  41. cs1180_cs(1);
  42. //LED 0,1,2
  43. gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2|GPIO_PIN_3);
  44. gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_6);
  45. //LED3,4
  46. gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10|GPIO_PIN_9);
  47. #endif
  48. //temp senser enable
  49. gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
  50. //charger detect
  51. gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_10);
  52. //aux 12v power enable
  53. gpio_mode_output(GPIOB, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  54. //aux 12v lock detect
  55. gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_11);
  56. //DC-DC enable
  57. gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_11);
  58. //DC-DC power good indicat
  59. gpio_mode_input(GPIOF, GPIO_PUPD_NONE, GPIO_PIN_7);
  60. //ms5238 irq, This pin is a NMOS open drain output pin and output is “L” level if interrupted
  61. gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_12);
  62. //ML5238 cs
  63. gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
  64. #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600)
  65. RS485_PWR_ENABLE(1);
  66. #endif
  67. }
  68. static int _exti4_15_irq_enable = 0;
  69. static void enable_exti4_15_irq(int enable){
  70. __disable_irq();
  71. if (enable) {
  72. if (_exti4_15_irq_enable++ == 0){
  73. nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U);
  74. }
  75. }else {
  76. if (_exti4_15_irq_enable-- == 1){
  77. nvic_irq_disable(EXTI4_15_IRQn);
  78. }
  79. if (_exti4_15_irq_enable < 0){
  80. _exti4_15_irq_enable = 0;
  81. }
  82. }
  83. __enable_irq();
  84. }
  85. void charger_detect_irq_enable(int enable){
  86. if (enable){
  87. syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN10);
  88. exti_init(EXTI_10, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  89. exti_flag_clear(EXTI_10);
  90. enable_exti4_15_irq(1);
  91. }else {
  92. enable_exti4_15_irq(0);
  93. exti_interrupt_disable(EXTI_10);
  94. exti_flag_clear(EXTI_10);
  95. }
  96. }
  97. void ml5238_irq_enable(int enable){
  98. if (enable){
  99. syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN12);
  100. exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  101. exti_flag_clear(EXTI_12);
  102. enable_exti4_15_irq(1);
  103. }else {
  104. enable_exti4_15_irq(0);
  105. exti_interrupt_disable(EXTI_12);
  106. exti_flag_clear(EXTI_12);
  107. }
  108. }
  109. #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700)
  110. void hall_1_detect_irq_enable(int enable){
  111. if (enable){
  112. syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN15);
  113. exti_flag_clear(EXTI_15);
  114. exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  115. enable_exti4_15_irq(1);
  116. }else {
  117. enable_exti4_15_irq(0);
  118. exti_interrupt_disable(EXTI_15);
  119. exti_flag_clear(EXTI_15);
  120. }
  121. }
  122. #else
  123. void hall_1_detect_irq_enable(int enable){
  124. }
  125. #endif
  126. void hall_2_detect_irq_enable(int enable){
  127. if (enable){
  128. syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN13);
  129. exti_flag_clear(EXTI_13);
  130. exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  131. enable_exti4_15_irq(1);
  132. }else {
  133. enable_exti4_15_irq(0);
  134. exti_interrupt_disable(EXTI_13);
  135. exti_flag_clear(EXTI_13);
  136. }
  137. }
  138. void small_current_short_irq_enable(int enable){
  139. if (enable){
  140. syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN11);
  141. exti_flag_clear(EXTI_11);
  142. exti_init(EXTI_11, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  143. enable_exti4_15_irq(1);
  144. }else {
  145. enable_exti4_15_irq(0);
  146. exti_interrupt_disable(EXTI_11);
  147. exti_flag_clear(EXTI_11);
  148. }
  149. }
  150. void dcdc_pwr_detect_irq_enable(int enable){
  151. if (enable){
  152. syscfg_exti_line_config(EXTI_SOURCE_GPIOF, EXTI_SOURCE_PIN7);
  153. exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  154. exti_flag_clear(EXTI_7);
  155. enable_exti4_15_irq(1);
  156. }else {
  157. enable_exti4_15_irq(0);
  158. exti_interrupt_disable(EXTI_7);
  159. exti_flag_clear(EXTI_7);
  160. }
  161. }