Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 28898e3

Browse filesBrowse files
committed
[MP1] Add GPIO locking
1 parent ed24c12 commit 28898e3
Copy full SHA for 28898e3

File tree

6 files changed

+180
-0
lines changed
Filter options

6 files changed

+180
-0
lines changed

‎cores/arduino/stm32/hw_config.c

Copy file name to clipboardExpand all lines: cores/arduino/stm32/hw_config.c
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ void hw_config_init(void)
6666
USBD_CDC_init();
6767
#endif
6868

69+
#if defined (STM32MP1xx)
70+
__HAL_RCC_HSEM_CLK_ENABLE();
71+
#endif
72+
6973
}
7074
#ifdef __cplusplus
7175
}

‎cores/arduino/stm32/lock_resource.c

Copy file name to clipboard
+95Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
******************************************************************************
3+
* @file lock_resource.c
4+
* @author MCD Application Team
5+
* @brief This sample code provides hardware semaphore using HSEM for
6+
* synchronization and mutual exclusion between heterogeneous processors
7+
* and those not operating under a single, shared operating system.
8+
******************************************************************************
9+
* @attention
10+
*
11+
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
12+
* All rights reserved.</center></h2>
13+
*
14+
* This software component is licensed by ST under BSD 3-Clause license,
15+
* the "License"; You may not use this file except in compliance with the
16+
* License. You may obtain a copy of the License at:
17+
* opensource.org/licenses/BSD-3-Clause
18+
*
19+
******************************************************************************
20+
*/
21+
22+
/* Includes ------------------------------------------------------------------*/
23+
#include "lock_resource.h"
24+
25+
#if defined(HAL_HSEM_MODULE_ENABLED)
26+
27+
/* Private macro -------------------------------------------------------------*/
28+
29+
/*
30+
* This macro provides a semaphore id for a dedicated peripheral.
31+
* This macro shall be configured by user according its needs and aligned with remote processors
32+
* (e.g. same semaphore id shall be used between processors for a dedicated peripheral)
33+
*/
34+
#define GET_HSEM_SEM_INDEX(__Peripheral__) (uint8_t)(((GPIO_TypeDef *)(__Peripheral__) == (GPIOA))? 0U :\
35+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOB))? 0U :\
36+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOC))? 0U :\
37+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOD))? 0U :\
38+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOE))? 0U :\
39+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOF))? 0U :\
40+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOG))? 0U :\
41+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOH))? 0U :\
42+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOI))? 0U :\
43+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOJ))? 0U :\
44+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOK))? 0U :\
45+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOZ))? 0U :\
46+
((EXTI_TypeDef *)(__Peripheral__) == (EXTI))? 1U : HSEM_SEMID_MAX + 1U)
47+
48+
/* Private user code ---------------------------------------------------------*/
49+
50+
51+
/**
52+
* @brief Periph_Lock function is used for register protection of shared @Peripheral
53+
* and shall be called before accessing registers of this shared @Peripheral
54+
* If Semaphore id is already taken, the function will busy loop waiting for it to
55+
* be released, but give up after @Timeout msecs have elapsed.
56+
* @param Peripheral: used to identify which peripheral to protect.
57+
* Semaphore id deduced from this peripheral.
58+
* Timeout: timeout value in msecs
59+
* @retval Return Status
60+
*/
61+
LockResource_Status_t Periph_Lock(void* Peripheral, uint32_t Timeout)
62+
{
63+
uint32_t tickstart = 0U;
64+
LockResource_Status_t ret = LOCK_RESOURCE_STATUS_OK;
65+
66+
/* Init tickstart for timeout management*/
67+
tickstart = HAL_GetTick();
68+
69+
/* Try to Take HSEM assigned to the Peripheral */
70+
while (HAL_HSEM_FastTake(GET_HSEM_SEM_INDEX(Peripheral)) != HAL_OK)
71+
{
72+
73+
if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
74+
{
75+
ret = LOCK_RESOURCE_STATUS_TIMEOUT;
76+
Error_Handler();
77+
}
78+
}
79+
80+
return ret;
81+
}
82+
83+
/**
84+
* @brief The Periph_Unlock released a previously-acquired semaphore which we want to unlock
85+
* @param Peripheral: used to identify which peripheral and the related semaphore
86+
* @retval None
87+
*/
88+
void Periph_Unlock(void* Peripheral)
89+
{
90+
/* Release HSEM */
91+
HAL_HSEM_Release(GET_HSEM_SEM_INDEX(Peripheral), 0);
92+
93+
}
94+
95+
#endif // defined(HAL_HSEM_MODULE_ENABLED)

‎cores/arduino/stm32/lock_resource.h

Copy file name to clipboard
+53Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
******************************************************************************
3+
* @file lock_resource.h
4+
* @author MCD Application Team
5+
* @brief Header for lock_resource.c
6+
******************************************************************************
7+
* @attention
8+
*
9+
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
10+
* All rights reserved.</center></h2>
11+
*
12+
* This software component is licensed by ST under BSD 3-Clause license,
13+
* the "License"; You may not use this file except in compliance with the
14+
* License. You may obtain a copy of the License at:
15+
* opensource.org/licenses/BSD-3-Clause
16+
*
17+
******************************************************************************
18+
*/
19+
/* Define to prevent recursive inclusion -------------------------------------*/
20+
#ifndef _LOCK_RESOURCE_H
21+
#define _LOCK_RESOURCE_H
22+
23+
/* Includes ------------------------------------------------------------------*/
24+
#include "stm32_def.h"
25+
26+
27+
/* Exported types ------------------------------------------------------------*/
28+
typedef enum
29+
{
30+
LOCK_RESOURCE_STATUS_OK = 0x00U,
31+
LOCK_RESOURCE_STATUS_ERROR = 0x01U,
32+
LOCK_RESOURCE_STATUS_TIMEOUT = 0x02U
33+
} LockResource_Status_t;
34+
35+
/* Exported constants --------------------------------------------------------*/
36+
#define LOCK_RESOURCE_TIMEOUT 100U /* timeout in ms */
37+
38+
/* Exported macro ------------------------------------------------------------*/
39+
#define PERIPH_LOCK(__Periph__) Periph_Lock(__Periph__, LOCK_RESOURCE_TIMEOUT)
40+
#define PERIPH_UNLOCK(__Periph__) Periph_Unlock(__Periph__)
41+
42+
/* Exported functions ------------------------------------------------------- */
43+
LockResource_Status_t Periph_Lock(void* Peripheral, uint32_t Timeout);
44+
void Periph_Unlock(void* Peripheral);
45+
46+
47+
48+
49+
#endif /* _LOCK_RESOURCE_H */
50+
51+
52+
53+
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

‎cores/arduino/stm32/pinconfig.h

Copy file name to clipboardExpand all lines: cores/arduino/stm32/pinconfig.h
+16Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
#include "PinAF_STM32F1.h"
3535
#include "stm32yyxx_ll_gpio.h"
3636

37+
#if defined(STM32MP1xx)
38+
#include "lock_resource.h"
39+
#endif
40+
3741
static inline void pin_DisconnectDebug(PinName pin)
3842
{
3943
#ifdef STM32F1xx
@@ -45,6 +49,9 @@ static inline void pin_DisconnectDebug(PinName pin)
4549

4650
static inline void pin_PullConfig(GPIO_TypeDef *gpio, uint32_t ll_pin, uint32_t pull_config)
4751
{
52+
#if defined(STM32MP1xx)
53+
PERIPH_LOCK(gpio);
54+
#endif
4855
#ifdef STM32F1xx
4956
uint32_t function = LL_GPIO_GetPinMode(gpio, ll_pin);
5057
#endif
@@ -77,10 +84,16 @@ static inline void pin_PullConfig(GPIO_TypeDef *gpio, uint32_t ll_pin, uint32_t
7784
#endif
7885
break;
7986
}
87+
#if defined(STM32MP1xx)
88+
PERIPH_UNLOCK(gpio);
89+
#endif
8090
}
8191

8292
static inline void pin_SetAFPin(GPIO_TypeDef *gpio, PinName pin, uint32_t afnum)
8393
{
94+
#if defined(STM32MP1xx)
95+
PERIPH_LOCK(gpio);
96+
#endif
8497
#ifdef STM32F1xx
8598
UNUSED(gpio);
8699
UNUSED(pin);
@@ -94,6 +107,9 @@ static inline void pin_SetAFPin(GPIO_TypeDef *gpio, PinName pin, uint32_t afnum)
94107
LL_GPIO_SetAFPin_0_7(gpio, ll_pin, afnum);
95108
}
96109
#endif
110+
#if defined(STM32MP1xx)
111+
PERIPH_UNLOCK(gpio);
112+
#endif
97113
}
98114

99115
#endif

‎cores/arduino/stm32/pinmap.c

Copy file name to clipboardExpand all lines: cores/arduino/stm32/pinmap.c
+11Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
#include "pinconfig.h"
1919
#include "stm32yyxx_ll_gpio.h"
2020

21+
#if defined(STM32MP1xx)
22+
#include "lock_resource.h"
23+
#endif
24+
2125
/* Map STM_PIN to LL */
2226
const uint32_t pin_map_ll[16] = {
2327
LL_GPIO_PIN_0,
@@ -70,6 +74,9 @@ void pin_function(PinName pin, int function)
7074
/* Enable GPIO clock */
7175
GPIO_TypeDef *gpio = set_GPIO_Port_Clock(port);
7276

77+
#if defined(STM32MP1xx)
78+
PERIPH_LOCK(gpio);
79+
#endif
7380
/* Set default speed to high.
7481
* For most families there are dedicated registers so it is
7582
* not so important, register can be set at any time.
@@ -128,6 +135,10 @@ void pin_function(PinName pin, int function)
128135
pin_PullConfig(gpio, ll_pin, STM_PIN_PUPD(function));
129136

130137
pin_DisconnectDebug(pin);
138+
139+
#if defined(STM32MP1xx)
140+
PERIPH_UNLOCK(gpio);
141+
#endif
131142
}
132143

133144
void pinmap_pinout(PinName pin, const PinMap *map)

‎system/STM32MP1xx/stm32mp1xx_hal_conf_default.h

Copy file name to clipboardExpand all lines: system/STM32MP1xx/stm32mp1xx_hal_conf_default.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#define HAL_RTC_MODULE_DISABLED /* RTC MODULE on Cortex-M side is not supported.
4242
Linux on Cortex-A will handle this. */
4343
#define HAL_ETH_MODULE_DISABLED /* ETH module is also not intended to be used */
44+
#define HAL_HSEM_MODULE_ENABLED
4445
#define HAL_MDMA_MODULE_ENABLED /* Some other modules (e.g. USART) require this */
4546

4647
#if defined(ARDUINO_STM32MP157A_DK1) || defined(ARDUINO_STM32MP157A_DK2)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.