gpio.c 6.2 KB

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