/platform/mcu/stm32l4xx_cube/hal/hal_gpio_stm32l4.c

https://github.com/alibaba/AliOS-Things · C · 557 lines · 465 code · 88 blank · 4 comment · 89 complexity · 151a0d8f8f6ede4d4b3a5399b0734d78 MD5 · raw file

  1. /*
  2. * Copyright (C) 2015-2017 Alibaba Group Holding Limited
  3. */
  4. #include <k_api.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "aos/hal/gpio.h"
  8. #include "stm32l4xx_hal.h"
  9. #include "hal_gpio_stm32l4.h"
  10. #ifdef HAL_GPIO_MODULE_ENABLED
  11. /*adjust*/
  12. #define GPIO_IRQ_SLOP_MAX (16)
  13. typedef struct gpio_irq_slop {
  14. int32_t pin_num;
  15. int32_t irq_num;
  16. gpio_irq_handler_t handler;
  17. void * priv;
  18. } gpio_irq_slop_t;
  19. static gpio_irq_slop_t gGpioSlop[GPIO_IRQ_SLOP_MAX]= {
  20. {.pin_num=-1},{.pin_num=-1},{.pin_num=-1},{.pin_num=-1},
  21. {.pin_num=-1},{.pin_num=-1},{.pin_num=-1},{.pin_num=-1},
  22. {.pin_num=-1},{.pin_num=-1},{.pin_num=-1},{.pin_num=-1},
  23. {.pin_num=-1},{.pin_num=-1},{.pin_num=-1},{.pin_num=-1},
  24. };
  25. static int32_t gpio_para_transform(gpio_dev_t *gpio, GPIO_InitTypeDef * init_str);
  26. static int32_t get_gpio_group(gpio_dev_t *gpio, GPIO_TypeDef **GPIOx);
  27. static uint32_t get_gpio_pin(uint8_t pin);
  28. int32_t gpio_has_priv(gpio_dev_t *gpio, GPIO_InitTypeDef * init_str);
  29. static gpio_irq_slop_t * gpio_slop_get(int32_t pin_num)
  30. {
  31. int32_t index = -1;
  32. int8_t found = 0;
  33. for(index=0; index<GPIO_IRQ_SLOP_MAX; ++index) {
  34. if(pin_num == gGpioSlop[index].pin_num){
  35. return &gGpioSlop[index];
  36. }
  37. }
  38. return(NULL);
  39. }
  40. static int8_t gpio_slop_irq(int32_t irq_num)
  41. {
  42. int32_t index = -1;
  43. int8_t found = 0;
  44. for(index=0; index<GPIO_IRQ_SLOP_MAX; ++index) {
  45. if(irq_num != gGpioSlop[index].irq_num)continue;
  46. if(NULL == gGpioSlop[index].handler)continue;
  47. gGpioSlop[index].handler(gGpioSlop[index].priv);
  48. }
  49. return(0);
  50. }
  51. void EXTI0_IRQHandler(void)
  52. {
  53. krhino_intrpt_enter();
  54. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  55. krhino_intrpt_exit();
  56. }
  57. void EXTI1_IRQHandler(void)
  58. {
  59. krhino_intrpt_enter();
  60. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  61. krhino_intrpt_exit();
  62. }
  63. void EXTI2_IRQHandler(void)
  64. {
  65. krhino_intrpt_enter();
  66. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  67. krhino_intrpt_exit();
  68. }
  69. void EXTI3_IRQHandler(void)
  70. {
  71. krhino_intrpt_enter();
  72. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  73. krhino_intrpt_exit();
  74. }
  75. void EXTI4_IRQHandler(void)
  76. {
  77. krhino_intrpt_enter();
  78. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  79. krhino_intrpt_exit();
  80. }
  81. void EXTI9_5_IRQHandler(void)
  82. {
  83. krhino_intrpt_enter();
  84. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
  85. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
  86. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
  87. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
  88. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
  89. krhino_intrpt_exit();
  90. }
  91. void EXTI15_10_IRQHandler(void)
  92. {
  93. krhino_intrpt_enter();
  94. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
  95. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
  96. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
  97. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  98. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
  99. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  100. krhino_intrpt_exit();
  101. }
  102. int32_t hal_gpio_init(gpio_dev_t *gpio)
  103. {
  104. int32_t ret = -1;
  105. GPIO_TypeDef *GPIOx = NULL;
  106. GPIO_InitTypeDef GPIO_InitStruct;
  107. if (gpio == NULL) {
  108. return -1;
  109. }
  110. ret = get_gpio_group(gpio, &GPIOx);
  111. if (ret) {
  112. return ret;
  113. }
  114. if (GPIOx == GPIOA) {
  115. __HAL_RCC_GPIOA_CLK_ENABLE();
  116. } else if (GPIOx == GPIOB) {
  117. __HAL_RCC_GPIOB_CLK_ENABLE();
  118. } else if (GPIOx == GPIOC) {
  119. __HAL_RCC_GPIOC_CLK_ENABLE();
  120. }
  121. #if defined(GPIOD)
  122. else if (GPIOx == GPIOD) {
  123. __HAL_RCC_GPIOD_CLK_ENABLE();
  124. }
  125. #endif
  126. #if defined(GPIOE)
  127. else if (GPIOx == GPIOE) {
  128. __HAL_RCC_GPIOE_CLK_ENABLE();
  129. }
  130. #endif
  131. #if defined(GPIOF)
  132. else if (GPIOx == GPIOF) {
  133. __HAL_RCC_GPIOF_CLK_ENABLE();
  134. }
  135. #endif
  136. #if defined(GPIOG)
  137. else if (GPIOx == GPIOG) {
  138. __HAL_RCC_GPIOG_CLK_ENABLE();
  139. }
  140. #endif
  141. #if defined(GPIOH)
  142. else if (GPIOx == GPIOH) {
  143. __HAL_RCC_GPIOH_CLK_ENABLE();
  144. }
  145. #endif
  146. else {
  147. return -1;
  148. }
  149. ret = gpio_para_transform(gpio, &GPIO_InitStruct);
  150. if (ret) {
  151. return ret;
  152. }
  153. GPIO_InitStruct.Pin = get_gpio_pin(gpio->port);
  154. HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
  155. ret |= gpio_has_priv(gpio, &GPIO_InitStruct);
  156. return ret;
  157. }
  158. int32_t hal_gpio_output_high(gpio_dev_t *gpio)
  159. {
  160. uint16_t pin = 0;
  161. GPIO_TypeDef* GPIOx = NULL;
  162. int32_t ret = 0;
  163. if (gpio == NULL) {
  164. return -1;
  165. }
  166. ret = get_gpio_group(gpio, &GPIOx);
  167. if (ret == 0) {
  168. pin = get_gpio_pin(gpio->port);
  169. HAL_GPIO_WritePin(GPIOx, pin, GPIO_PIN_SET);
  170. };
  171. return ret;
  172. }
  173. int32_t hal_gpio_output_low(gpio_dev_t *gpio)
  174. {
  175. uint16_t pin = 0;
  176. GPIO_TypeDef* GPIOx = NULL;
  177. int32_t ret = 0;
  178. if (gpio == NULL) {
  179. return -1;
  180. }
  181. ret = get_gpio_group(gpio, &GPIOx);
  182. if (ret == 0) {
  183. pin = get_gpio_pin(gpio->port);
  184. HAL_GPIO_WritePin(GPIOx, pin, GPIO_PIN_RESET);
  185. };
  186. return ret;
  187. }
  188. int32_t hal_gpio_output_toggle(gpio_dev_t *gpio)
  189. {
  190. uint16_t pin = 0;
  191. GPIO_TypeDef* GPIOx = NULL;
  192. int32_t ret = 0;
  193. if (gpio == NULL) {
  194. return -1;
  195. }
  196. ret = get_gpio_group(gpio, &GPIOx);
  197. if (ret == 0) {
  198. pin = get_gpio_pin(gpio->port);
  199. HAL_GPIO_TogglePin(GPIOx, pin);
  200. };
  201. return ret;
  202. }
  203. int32_t hal_gpio_input_get(gpio_dev_t *gpio, uint32_t *value)
  204. {
  205. GPIO_TypeDef* GPIOx = NULL;
  206. int32_t ret = 0;
  207. if (gpio == NULL) {
  208. return -1;
  209. }
  210. ret = get_gpio_group(gpio, &GPIOx);
  211. if (ret == 0) {
  212. *value = HAL_GPIO_ReadPin(GPIOx, get_gpio_pin(gpio->port));
  213. };
  214. return ret;
  215. }
  216. int32_t gpio_get_int_num(IRQn_Type *pirqn, uint8_t port)
  217. {
  218. uint32_t gpio_pin = 0;
  219. if (pirqn == NULL)
  220. return -1;
  221. gpio_pin = get_gpio_pin(port);
  222. switch (gpio_pin) {
  223. case GPIO_PIN_0:
  224. *pirqn = EXTI0_IRQn;
  225. break;
  226. case GPIO_PIN_5:
  227. case GPIO_PIN_6:
  228. case GPIO_PIN_7:
  229. case GPIO_PIN_8:
  230. case GPIO_PIN_9:
  231. *pirqn = EXTI9_5_IRQn;
  232. break;
  233. case GPIO_PIN_10:
  234. case GPIO_PIN_11:
  235. case GPIO_PIN_12:
  236. case GPIO_PIN_13:
  237. case GPIO_PIN_14:
  238. case GPIO_PIN_15:
  239. *pirqn = EXTI15_10_IRQn;
  240. break;
  241. default:
  242. return -1;
  243. }
  244. return 0;
  245. }
  246. int32_t gpio_has_priv(gpio_dev_t *gpio, GPIO_InitTypeDef * init_str)
  247. {
  248. int32_t ret = 0;
  249. if (gpio->priv == NULL) {
  250. return 0;
  251. }
  252. switch (gpio->config) {
  253. case IRQ_MODE:
  254. switch (*(gpio_irq_trigger_t *)gpio->priv) {
  255. case IRQ_TRIGGER_RISING_EDGE:
  256. init_str->Mode = GPIO_MODE_IT_RISING;
  257. init_str->Pull = GPIO_NOPULL;
  258. break;
  259. case IRQ_TRIGGER_FALLING_EDGE:
  260. init_str->Mode = GPIO_MODE_IT_FALLING;
  261. init_str->Pull = GPIO_NOPULL;
  262. break;
  263. case IRQ_TRIGGER_BOTH_EDGES:
  264. init_str->Mode = GPIO_MODE_IT_RISING_FALLING;
  265. init_str->Pull = GPIO_NOPULL;
  266. break;
  267. default:
  268. ret = -1;
  269. break;
  270. }
  271. break;
  272. case OUTPUT_PUSH_PULL:
  273. case OUTPUT_OPEN_DRAIN_NO_PULL:
  274. case OUTPUT_OPEN_DRAIN_PULL_UP:
  275. switch (*(uint8_t *)gpio->priv) {
  276. case 1:
  277. hal_gpio_output_high(gpio);
  278. break;
  279. case 0:
  280. hal_gpio_output_low(gpio);
  281. break;
  282. default:
  283. ret = -1;
  284. break;
  285. }
  286. break;
  287. default:
  288. break;
  289. }
  290. return ret;
  291. }
  292. int32_t gpio_para_transform(gpio_dev_t *gpio, GPIO_InitTypeDef * init_str)
  293. {
  294. int32_t ret = 0;
  295. IRQn_Type pirqn = 0;
  296. switch (gpio->config) {
  297. case ANALOG_MODE:
  298. init_str->Mode = GPIO_MODE_ANALOG;
  299. break;
  300. case IRQ_MODE:
  301. ret = gpio_get_int_num(&pirqn, gpio->port);
  302. if (ret == 0) {
  303. HAL_NVIC_SetPriority(pirqn, 0, 0);
  304. HAL_NVIC_EnableIRQ(pirqn);
  305. }
  306. ret |= gpio_has_priv(gpio, init_str);
  307. break;
  308. case INPUT_PULL_UP:
  309. init_str->Mode = GPIO_MODE_INPUT;
  310. init_str->Pull = GPIO_PULLUP;
  311. break;
  312. case INPUT_PULL_DOWN:
  313. init_str->Mode = GPIO_MODE_INPUT;
  314. init_str->Pull = GPIO_PULLDOWN;
  315. break;
  316. case INPUT_HIGH_IMPEDANCE:
  317. init_str->Mode = GPIO_MODE_INPUT;
  318. init_str->Pull = GPIO_NOPULL;
  319. break;
  320. case OUTPUT_PUSH_PULL:
  321. init_str->Mode = GPIO_MODE_OUTPUT_PP;
  322. init_str->Pull = GPIO_NOPULL;
  323. init_str->Speed = GPIO_SPEED_FREQ_LOW;
  324. break;
  325. case OUTPUT_OPEN_DRAIN_NO_PULL:
  326. init_str->Mode = GPIO_MODE_OUTPUT_OD;
  327. init_str->Pull = GPIO_NOPULL;
  328. init_str->Speed = GPIO_SPEED_FREQ_LOW;
  329. break;
  330. case OUTPUT_OPEN_DRAIN_PULL_UP:
  331. init_str->Mode = GPIO_MODE_OUTPUT_OD;
  332. init_str->Pull = GPIO_PULLUP;
  333. init_str->Speed = GPIO_SPEED_FREQ_LOW;
  334. break;
  335. default:
  336. ret = -1;
  337. break;
  338. }
  339. return ret;
  340. }
  341. int32_t get_gpio_group(gpio_dev_t *gpio, GPIO_TypeDef **GPIOx)
  342. {
  343. uint16_t group = 0;
  344. int32_t ret = 0;
  345. if (gpio == NULL) {
  346. return -1;
  347. }
  348. group = gpio->port / PINS_IN_GROUP;
  349. switch (group) {
  350. case GROUP_GPIOA:
  351. *GPIOx = GPIOA;
  352. break;
  353. case GROUP_GPIOB:
  354. *GPIOx = GPIOB;
  355. break;
  356. case GROUP_GPIOC:
  357. *GPIOx = GPIOC;
  358. break;
  359. #if defined(GROUP_GPIOD) && defined(GPIOD)
  360. case GROUP_GPIOD:
  361. *GPIOx = GPIOD;
  362. break;
  363. #endif
  364. #if defined(GROUP_GPIOE) && defined(GPIOE)
  365. case GROUP_GPIOE:
  366. *GPIOx = GPIOE;
  367. break;
  368. #endif
  369. #if defined(GROUP_GPIOF) && defined(GPIOF)
  370. case GROUP_GPIOF:
  371. *GPIOx = GPIOF;
  372. break;
  373. #endif
  374. #if defined(GROUP_GPIOG) && defined(GPIOG)
  375. case GROUP_GPIOG:
  376. *GPIOx = GPIOG;
  377. break;
  378. #endif
  379. #if defined(GROUP_GPIOH) && defined(GPIOH)
  380. case GROUP_GPIOH:
  381. *GPIOx = GPIOH;
  382. break;
  383. #endif
  384. default:
  385. ret = -1;
  386. break;
  387. }
  388. return ret;
  389. }
  390. uint32_t get_gpio_pin(uint8_t pin)
  391. {
  392. uint32_t result = 1;
  393. uint8_t pin_t = pin % PINS_IN_GROUP;
  394. result = 1u << pin_t;
  395. return result;
  396. }
  397. static int32_t gpio_irq_mode_init(gpio_dev_t *gpio,gpio_irq_trigger_t trigger)
  398. {
  399. int32_t ret = -1;
  400. gpio_irq_trigger_t * new_irq = calloc(1,sizeof(*new_irq));
  401. if(NULL == new_irq) {
  402. return (-1);
  403. }
  404. *new_irq = trigger;
  405. gpio->priv = new_irq;
  406. ret = hal_gpio_init(gpio);
  407. if(NULL != new_irq) {
  408. free(new_irq);
  409. new_irq = NULL;
  410. }
  411. return ret;
  412. }
  413. int32_t hal_gpio_enable_irq(gpio_dev_t *gpio, gpio_irq_trigger_t trigger,gpio_irq_handler_t handler, void *arg)
  414. {
  415. int32_t ret = -1;
  416. if (IRQ_MODE != gpio->config) {
  417. return (-1);
  418. }
  419. gpio_irq_slop_t * slop = gpio_slop_get(-1);
  420. if(NULL == slop) {
  421. return(-1);
  422. }
  423. ret = gpio_irq_mode_init(gpio,trigger);
  424. if(0 != ret) {
  425. return (-1);
  426. }
  427. slop->pin_num = gpio->port;
  428. slop->irq_num = get_gpio_pin(gpio->port);
  429. slop->handler = handler;
  430. slop->priv = arg;
  431. return (0);
  432. }
  433. int32_t hal_gpio_disable_irq(gpio_dev_t *gpio)
  434. {
  435. int32_t ret = -1;
  436. if (IRQ_MODE != gpio->config) {
  437. return (-1);
  438. }
  439. IRQn_Type pirqn = 0;
  440. gpio_irq_slop_t * slop = gpio_slop_get(gpio->port);
  441. if(NULL == slop) {
  442. return(-1);
  443. }
  444. ret = gpio_get_int_num(&pirqn, gpio->port);
  445. if (0 != ret) {
  446. return (-1);
  447. }
  448. HAL_NVIC_DisableIRQ(pirqn);
  449. return 0;
  450. }
  451. int32_t hal_gpio_clear_irq(gpio_dev_t *gpio)
  452. {
  453. gpio_irq_slop_t * slop = gpio_slop_get(gpio->port);
  454. if(NULL == slop)return(-1);
  455. slop->pin_num = -1;
  456. slop->irq_num = -1;
  457. slop->handler = NULL;
  458. slop->priv = NULL;
  459. return 0;
  460. }
  461. int32_t hal_gpio_finalize(gpio_dev_t *gpio)
  462. {
  463. return 0;
  464. }
  465. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  466. {
  467. gpio_slop_irq(GPIO_Pin);
  468. }
  469. #endif