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.
 
 
 
 
 
 

372 lines
8.6 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 "stm32l0xx.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. assert_param( LMN_STATUS_ERROR );
  67. }
  68. GPIO_InitStructure.Pin = obj->pinIndex ;
  69. GPIO_InitStructure.Pull = obj->pull = type;
  70. GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  71. if( mode == PIN_INPUT )
  72. {
  73. GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
  74. }
  75. else if( mode == PIN_ANALOGIC )
  76. {
  77. GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  78. }
  79. else if( mode == PIN_ALTERNATE_FCT )
  80. {
  81. if( config == PIN_OPEN_DRAIN )
  82. {
  83. GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
  84. }
  85. else
  86. {
  87. GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
  88. }
  89. GPIO_InitStructure.Alternate = value;
  90. }
  91. else // mode output
  92. {
  93. if( config == PIN_OPEN_DRAIN )
  94. {
  95. GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
  96. }
  97. else
  98. {
  99. GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  100. }
  101. }
  102. // Sets initial output value
  103. if( mode == PIN_OUTPUT )
  104. {
  105. GpioMcuWrite( obj, value );
  106. }
  107. HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
  108. }
  109. else
  110. {
  111. #if defined( BOARD_IOE_EXT )
  112. // IOExt Pin
  113. GpioIoeInit( obj, pin, mode, config, type, value );
  114. #endif
  115. }
  116. }
  117. void GpioMcuSetContext( Gpio_t *obj, void* context )
  118. {
  119. obj->Context = context;
  120. }
  121. void GpioMcuSetInterrupt( Gpio_t *obj, IrqModes irqMode, IrqPriorities irqPriority, GpioIrqHandler *irqHandler )
  122. {
  123. if( obj->pin < IOE_0 )
  124. {
  125. uint32_t priority = 0;
  126. IRQn_Type IRQnb = EXTI0_1_IRQn;
  127. GPIO_InitTypeDef GPIO_InitStructure;
  128. if( irqHandler == NULL )
  129. {
  130. return;
  131. }
  132. obj->IrqHandler = irqHandler;
  133. GPIO_InitStructure.Pin = obj->pinIndex;
  134. if( irqMode == IRQ_RISING_EDGE )
  135. {
  136. GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
  137. }
  138. else if( irqMode == IRQ_FALLING_EDGE )
  139. {
  140. GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
  141. }
  142. else
  143. {
  144. GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING_FALLING;
  145. }
  146. GPIO_InitStructure.Pull = obj->pull;
  147. GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  148. HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
  149. switch( irqPriority )
  150. {
  151. case IRQ_VERY_LOW_PRIORITY:
  152. case IRQ_LOW_PRIORITY:
  153. priority = 3;
  154. break;
  155. case IRQ_MEDIUM_PRIORITY:
  156. priority = 2;
  157. break;
  158. case IRQ_HIGH_PRIORITY:
  159. priority = 1;
  160. break;
  161. case IRQ_VERY_HIGH_PRIORITY:
  162. default:
  163. priority = 0;
  164. break;
  165. }
  166. switch( obj->pinIndex )
  167. {
  168. case GPIO_PIN_0:
  169. case GPIO_PIN_1:
  170. IRQnb = EXTI0_1_IRQn;
  171. break;
  172. case GPIO_PIN_2:
  173. case GPIO_PIN_3:
  174. IRQnb = EXTI2_3_IRQn;
  175. break;
  176. case GPIO_PIN_4:
  177. case GPIO_PIN_5:
  178. case GPIO_PIN_6:
  179. case GPIO_PIN_7:
  180. case GPIO_PIN_8:
  181. case GPIO_PIN_9:
  182. case GPIO_PIN_10:
  183. case GPIO_PIN_11:
  184. case GPIO_PIN_12:
  185. case GPIO_PIN_13:
  186. case GPIO_PIN_14:
  187. case GPIO_PIN_15:
  188. IRQnb = EXTI4_15_IRQn;
  189. break;
  190. default:
  191. break;
  192. }
  193. GpioIrq[( obj->pin ) & 0x0F] = obj;
  194. HAL_NVIC_SetPriority( IRQnb , priority, 0 );
  195. HAL_NVIC_EnableIRQ( IRQnb );
  196. }
  197. else
  198. {
  199. #if defined( BOARD_IOE_EXT )
  200. // IOExt Pin
  201. GpioIoeSetInterrupt( obj, irqMode, irqPriority, irqHandler );
  202. #endif
  203. }
  204. }
  205. void GpioMcuRemoveInterrupt( Gpio_t *obj )
  206. {
  207. if( obj->pin < IOE_0 )
  208. {
  209. // Clear callback before changing pin mode
  210. GpioIrq[( obj->pin ) & 0x0F] = NULL;
  211. GPIO_InitTypeDef GPIO_InitStructure;
  212. GPIO_InitStructure.Pin = obj->pinIndex ;
  213. GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  214. HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
  215. }
  216. else
  217. {
  218. #if defined( BOARD_IOE_EXT )
  219. // IOExt Pin
  220. GpioIoeRemoveInterrupt( obj );
  221. #endif
  222. }
  223. }
  224. void GpioMcuWrite( Gpio_t *obj, uint32_t value )
  225. {
  226. if( obj->pin < IOE_0 )
  227. {
  228. if( obj == NULL )
  229. {
  230. assert_param( LMN_STATUS_ERROR );
  231. }
  232. // Check if pin is not connected
  233. if( obj->pin == NC )
  234. {
  235. return;
  236. }
  237. HAL_GPIO_WritePin( obj->port, obj->pinIndex , ( GPIO_PinState )value );
  238. }
  239. else
  240. {
  241. #if defined( BOARD_IOE_EXT )
  242. // IOExt Pin
  243. GpioIoeWrite( obj, value );
  244. #endif
  245. }
  246. }
  247. void GpioMcuToggle( Gpio_t *obj )
  248. {
  249. if( obj->pin < IOE_0 )
  250. {
  251. if( obj == NULL )
  252. {
  253. assert_param( LMN_STATUS_ERROR );
  254. }
  255. // Check if pin is not connected
  256. if( obj->pin == NC )
  257. {
  258. return;
  259. }
  260. HAL_GPIO_TogglePin( obj->port, obj->pinIndex );
  261. }
  262. else
  263. {
  264. #if defined( BOARD_IOE_EXT )
  265. // IOExt Pin
  266. GpioIoeToggle( obj );
  267. #endif
  268. }
  269. }
  270. uint32_t GpioMcuRead( Gpio_t *obj )
  271. {
  272. if( obj->pin < IOE_0 )
  273. {
  274. if( obj == NULL )
  275. {
  276. assert_param( LMN_STATUS_ERROR );
  277. }
  278. // Check if pin is not connected
  279. if( obj->pin == NC )
  280. {
  281. return 0;
  282. }
  283. return HAL_GPIO_ReadPin( obj->port, obj->pinIndex );
  284. }
  285. else
  286. {
  287. #if defined( BOARD_IOE_EXT )
  288. // IOExt Pin
  289. return GpioIoeRead( obj );
  290. #else
  291. return 0;
  292. #endif
  293. }
  294. }
  295. void EXTI0_1_IRQHandler( void )
  296. {
  297. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_0 );
  298. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_1 );
  299. }
  300. void EXTI2_3_IRQHandler( void )
  301. {
  302. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_2 );
  303. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_3 );
  304. }
  305. void EXTI4_15_IRQHandler( void )
  306. {
  307. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_4 );
  308. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_5 );
  309. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_6 );
  310. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_7 );
  311. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_8 );
  312. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_9 );
  313. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_10 );
  314. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_11 );
  315. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_12 );
  316. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_13 );
  317. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_14 );
  318. HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_15 );
  319. }
  320. void HAL_GPIO_EXTI_Callback( uint16_t gpioPin )
  321. {
  322. uint8_t callbackIndex = 0;
  323. if( gpioPin > 0 )
  324. {
  325. while( gpioPin != 0x01 )
  326. {
  327. gpioPin = gpioPin >> 1;
  328. callbackIndex++;
  329. }
  330. }
  331. if( ( GpioIrq[callbackIndex] != NULL ) && ( GpioIrq[callbackIndex]->IrqHandler != NULL ) )
  332. {
  333. GpioIrq[callbackIndex]->IrqHandler( GpioIrq[callbackIndex]->Context );
  334. }
  335. }