Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

397 lines
8.9 KiB

  1. /*!
  2. * \file gpio-board.c
  3. *
  4. * \brief Target board GPIO driver implementation
  5. *
  6. * \copyright Revised BSD License, see section \ref LICENSE.
  7. *
  8. * \code
  9. * ______ _
  10. * / _____) _ | |
  11. * ( (____ _____ ____ _| |_ _____ ____| |__
  12. * \____ \| ___ | (_ _) ___ |/ ___) _ \
  13. * _____) ) ____| | | || |_| ____( (___| | | |
  14. * (______/|_____)_|_|_| \__)_____)\____)_| |_|
  15. * (C)2013-2017 Semtech
  16. *
  17. * \endcode
  18. *
  19. * \author Miguel Luis ( Semtech )
  20. *
  21. * \author Gregory Cristian ( Semtech )
  22. */
  23. #include "stm32l4xx.h"
  24. #include "utilities.h"
  25. #include "sysIrqHandlers.h"
  26. #include "board-config.h"
  27. #include "rtc-board.h"
  28. #include "gpio-board.h"
  29. #if defined( BOARD_IOE_EXT )
  30. #include "gpio-ioe.h"
  31. #endif
  32. static Gpio_t *GpioIrq[16];
  33. void GpioMcuInit( Gpio_t *obj, PinNames pin, PinModes mode, PinConfigs config, PinTypes type, uint32_t value )
  34. {
  35. if( pin < IOE_0 )
  36. {
  37. GPIO_InitTypeDef GPIO_InitStructure;
  38. obj->pin = pin;
  39. if( pin == NC )
  40. {
  41. return;
  42. }
  43. obj->pinIndex = ( 0x01 << ( obj->pin & 0x0F ) );
  44. if( ( obj->pin & 0xF0 ) == 0x00 )
  45. {
  46. obj->port = GPIOA;
  47. __HAL_RCC_GPIOA_CLK_ENABLE( );
  48. }
  49. else if( ( obj->pin & 0xF0 ) == 0x10 )
  50. {
  51. obj->port = GPIOB;
  52. __HAL_RCC_GPIOB_CLK_ENABLE( );
  53. }
  54. else if( ( obj->pin & 0xF0 ) == 0x20 )
  55. {
  56. obj->port = GPIOC;
  57. __HAL_RCC_GPIOC_CLK_ENABLE( );
  58. }
  59. else if( ( obj->pin & 0xF0 ) == 0x30 )
  60. {
  61. obj->port = GPIOD;
  62. __HAL_RCC_GPIOD_CLK_ENABLE( );
  63. }
  64. else
  65. {
  66. obj->port = GPIOH;
  67. __HAL_RCC_GPIOH_CLK_ENABLE( );
  68. }
  69. GPIO_InitStructure.Pin = obj->pinIndex ;
  70. GPIO_InitStructure.Pull = obj->pull = type;
  71. GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  72. if( mode == PIN_INPUT )
  73. {
  74. GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
  75. }
  76. else if( mode == PIN_ANALOGIC )
  77. {
  78. GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  79. }
  80. else if( mode == PIN_ALTERNATE_FCT )
  81. {
  82. if( config == PIN_OPEN_DRAIN )
  83. {
  84. GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
  85. }
  86. else
  87. {
  88. GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
  89. }
  90. GPIO_InitStructure.Alternate = value;
  91. }
  92. else // mode output
  93. {
  94. if( config == PIN_OPEN_DRAIN )
  95. {
  96. GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
  97. }
  98. else
  99. {
  100. GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  101. }
  102. }
  103. // Sets initial output value
  104. if( mode == PIN_OUTPUT )
  105. {
  106. GpioMcuWrite( obj, value );
  107. }
  108. HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
  109. }
  110. else
  111. {
  112. #if defined( BOARD_IOE_EXT )
  113. // IOExt Pin
  114. GpioIoeInit( obj, pin, mode, config, type, value );
  115. #endif
  116. }
  117. }
  118. void GpioMcuSetContext( Gpio_t *obj, void* context )
  119. {
  120. obj->Context = context;
  121. }
  122. void GpioMcuSetInterrupt( Gpio_t *obj, IrqModes irqMode, IrqPriorities irqPriority, GpioIrqHandler *irqHandler )
  123. {
  124. if( obj->pin < IOE_0 )
  125. {
  126. uint32_t priority = 0;
  127. IRQn_Type IRQnb = EXTI0_IRQn;
  128. GPIO_InitTypeDef GPIO_InitStructure;
  129. if( irqHandler == NULL )
  130. {
  131. return;
  132. }
  133. obj->IrqHandler = irqHandler;
  134. GPIO_InitStructure.Pin = obj->pinIndex;
  135. if( irqMode == IRQ_RISING_EDGE )
  136. {
  137. GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
  138. }
  139. else if( irqMode == IRQ_FALLING_EDGE )
  140. {
  141. GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
  142. }
  143. else
  144. {
  145. GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING_FALLING;
  146. }
  147. GPIO_InitStructure.Pull = obj->pull;
  148. GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  149. HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
  150. switch( irqPriority )
  151. {
  152. case IRQ_VERY_LOW_PRIORITY:
  153. case IRQ_LOW_PRIORITY:
  154. priority = 3;
  155. break;
  156. case IRQ_MEDIUM_PRIORITY:
  157. priority = 2;
  158. break;
  159. case IRQ_HIGH_PRIORITY:
  160. priority = 1;
  161. break;
  162. case IRQ_VERY_HIGH_PRIORITY:
  163. default:
  164. priority = 0;
  165. break;
  166. }
  167. switch( obj->pinIndex )
  168. {
  169. case GPIO_PIN_0:
  170. IRQnb = EXTI0_IRQn;
  171. break;
  172. case GPIO_PIN_1:
  173. IRQnb = EXTI1_IRQn;
  174. break;
  175. case GPIO_PIN_2:
  176. IRQnb = EXTI2_IRQn;
  177. break;
  178. case GPIO_PIN_3:
  179. IRQnb = EXTI3_IRQn;
  180. break;
  181. case GPIO_PIN_4:
  182. IRQnb = EXTI4_IRQn;
  183. break;
  184. case GPIO_PIN_5:
  185. case GPIO_PIN_6:
  186. case GPIO_PIN_7:
  187. case GPIO_PIN_8:
  188. case GPIO_PIN_9:
  189. IRQnb = EXTI9_5_IRQn;
  190. break;
  191. case GPIO_PIN_10:
  192. case GPIO_PIN_11:
  193. case GPIO_PIN_12:
  194. case GPIO_PIN_13:
  195. case GPIO_PIN_14:
  196. case GPIO_PIN_15:
  197. IRQnb = EXTI15_10_IRQn;
  198. break;
  199. default:
  200. break;
  201. }
  202. GpioIrq[( obj->pin ) & 0x0F] = obj;
  203. HAL_NVIC_SetPriority( IRQnb , priority, 0 );
  204. HAL_NVIC_EnableIRQ( IRQnb );
  205. }
  206. else
  207. {
  208. #if defined( BOARD_IOE_EXT )
  209. // IOExt Pin
  210. GpioIoeSetInterrupt( obj, irqMode, irqPriority, irqHandler );
  211. #endif
  212. }
  213. }
  214. void GpioMcuRemoveInterrupt( Gpio_t *obj )
  215. {
  216. if( obj->pin < IOE_0 )
  217. {
  218. // Clear callback before changing pin mode
  219. GpioIrq[( obj->pin ) & 0x0F] = NULL;
  220. GPIO_InitTypeDef GPIO_InitStructure;
  221. GPIO_InitStructure.Pin = obj->pinIndex ;
  222. GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  223. HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
  224. }
  225. else
  226. {
  227. #if defined( BOARD_IOE_EXT )
  228. // IOExt Pin
  229. GpioIoeRemoveInterrupt( obj );
  230. #endif
  231. }
  232. }
  233. void GpioMcuWrite( Gpio_t *obj, uint32_t value )
  234. {
  235. if( obj->pin < IOE_0 )
  236. {
  237. if( obj == NULL )
  238. {
  239. assert_param( LMN_STATUS_ERROR );
  240. }
  241. // Check if pin is not connected
  242. if( obj->pin == NC )
  243. {
  244. return;
  245. }
  246. HAL_GPIO_WritePin( obj->port, obj->pinIndex , ( GPIO_PinState )value );
  247. }
  248. else
  249. {
  250. #if defined( BOARD_IOE_EXT )
  251. // IOExt Pin
  252. GpioIoeWrite( obj, value );
  253. #endif
  254. }
  255. }
  256. void GpioMcuToggle( Gpio_t *obj )
  257. {
  258. if( obj->pin < IOE_0 )
  259. {
  260. if( obj == NULL )
  261. {
  262. assert_param( LMN_STATUS_ERROR );
  263. }
  264. // Check if pin is not connected
  265. if( obj->pin == NC )
  266. {
  267. return;
  268. }
  269. HAL_GPIO_TogglePin( obj->port, obj->pinIndex );
  270. }
  271. else
  272. {
  273. #if defined( BOARD_IOE_EXT )
  274. // IOExt Pin
  275. GpioIoeToggle( obj );
  276. #endif
  277. }
  278. }
  279. uint32_t GpioMcuRead( Gpio_t *obj )
  280. {
  281. if( obj->pin < IOE_0 )
  282. {
  283. if( obj == NULL )
  284. {
  285. assert_param( LMN_STATUS_ERROR );
  286. }
  287. // Check if pin is not connected
  288. if( obj->pin == NC )
  289. {
  290. return 0;
  291. }
  292. return HAL_GPIO_ReadPin( obj->port, obj->pinIndex );
  293. }
  294. else
  295. {
  296. #if defined( BOARD_IOE_EXT )
  297. // IOExt Pin
  298. return GpioIoeRead( obj );
  299. #else
  300. return 0;
  301. #endif
  302. }
  303. }
  304. void EXTI0_IRQHandler( void )
  305. {
  306. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_0 );
  307. }
  308. void EXTI1_IRQHandler( void )
  309. {
  310. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_1 );
  311. }
  312. void EXTI2_IRQHandler( void )
  313. {
  314. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_2 );
  315. }
  316. void EXTI3_IRQHandler( void )
  317. {
  318. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_3 );
  319. }
  320. void EXTI4_IRQHandler( void )
  321. {
  322. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_4 );
  323. }
  324. void EXTI9_5_IRQHandler( void )
  325. {
  326. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_5 );
  327. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_6 );
  328. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_7 );
  329. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_8 );
  330. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_9 );
  331. }
  332. void EXTI15_10_IRQHandler( void )
  333. {
  334. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_10 );
  335. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_11 );
  336. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_12 );
  337. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_13 );
  338. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_14 );
  339. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_15 );
  340. }
  341. void HAL_GPIO_EXTI_Callback( uint16_t gpioPin )
  342. {
  343. uint8_t callbackIndex = 0;
  344. if( gpioPin > 0 )
  345. {
  346. while( gpioPin != 0x01 )
  347. {
  348. gpioPin = gpioPin >> 1;
  349. callbackIndex++;
  350. }
  351. }
  352. if( ( GpioIrq[callbackIndex] != NULL ) && ( GpioIrq[callbackIndex]->IrqHandler != NULL ) )
  353. {
  354. GpioIrq[callbackIndex]->IrqHandler( GpioIrq[callbackIndex]->Context );
  355. }
  356. }