gpio.c 5.8 KB

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