Merge branch 'bugfix/lib_dport_access' into 'master'
component/esp32 : fix library dport access protections. 1. add esp32 library access DPORT register protections. 2. add bluetooth library access DPORT register protections. 3. change register operation(suffix/prefix) to new style. See merge request !757
This commit is contained in:
commit
9229902dff
5 changed files with 29 additions and 19 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit cbdf2b94b13a9e7df47c83a45fb82c71ba718f7c
|
Subproject commit 3d6345f075e3dc4a192d1b8e61ee6e94391f19b0
|
|
@ -131,6 +131,16 @@ void IRAM_ATTR esp_dport_access_stall_other_cpu_end(void)
|
||||||
#endif /* CONFIG_FREERTOS_UNICORE */
|
#endif /* CONFIG_FREERTOS_UNICORE */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR esp_dport_access_stall_other_cpu_start_wrap(void)
|
||||||
|
{
|
||||||
|
DPORT_STALL_OTHER_CPU_START();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR esp_dport_access_stall_other_cpu_end_wrap(void)
|
||||||
|
{
|
||||||
|
DPORT_STALL_OTHER_CPU_END();
|
||||||
|
}
|
||||||
|
|
||||||
static void dport_access_init_core0(void *arg)
|
static void dport_access_init_core0(void *arg)
|
||||||
{
|
{
|
||||||
int core_id = xPortGetCoreID();
|
int core_id = xPortGetCoreID();
|
||||||
|
|
|
@ -19,4 +19,12 @@ void esp_dport_access_stall_other_cpu_start(void);
|
||||||
void esp_dport_access_stall_other_cpu_end(void);
|
void esp_dport_access_stall_other_cpu_end(void);
|
||||||
void esp_dport_access_int_init(void);
|
void esp_dport_access_int_init(void);
|
||||||
|
|
||||||
|
#if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !defined(ESP_PLATFORM)
|
||||||
|
#define DPORT_STALL_OTHER_CPU_START()
|
||||||
|
#define DPORT_STALL_OTHER_CPU_END()
|
||||||
|
#else
|
||||||
|
#define DPORT_STALL_OTHER_CPU_START() esp_dport_access_stall_other_cpu_start()
|
||||||
|
#define DPORT_STALL_OTHER_CPU_END() esp_dport_access_stall_other_cpu_end()
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _ESP_DPORT_ACCESS_H_ */
|
#endif /* _ESP_DPORT_ACCESS_H_ */
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0c6d1e05a127dc1fef7c7b66d5ebf7c14111a77a
|
Subproject commit a197e872e0d96a0f5f57c7d4babefe2c77db4cf4
|
|
@ -17,20 +17,11 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
|
#include "esp_dport_access.h"
|
||||||
void esp_dport_access_stall_other_cpu_start(void);
|
|
||||||
void esp_dport_access_stall_other_cpu_end(void);
|
|
||||||
|
|
||||||
#if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !defined(ESP_PLATFORM)
|
|
||||||
#define DPORT_STALL_OTHER_CPU_START()
|
|
||||||
#define DPORT_STALL_OTHER_CPU_END()
|
|
||||||
#else
|
|
||||||
#define DPORT_STALL_OTHER_CPU_START() esp_dport_access_stall_other_cpu_start()
|
|
||||||
#define DPORT_STALL_OTHER_CPU_END() esp_dport_access_stall_other_cpu_end()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Registers Operation {{
|
//Registers Operation {{
|
||||||
//Origin access operation for the base and some special scene
|
|
||||||
|
//Register read macros with an underscore prefix access DPORT memory directly. In IDF apps, use the non-underscore versions to be SMP-safe.
|
||||||
#define _DPORT_REG_READ(_r) (*(volatile uint32_t *)(_r))
|
#define _DPORT_REG_READ(_r) (*(volatile uint32_t *)(_r))
|
||||||
#define _DPORT_REG_WRITE(_r, _v) (*(volatile uint32_t *)(_r)) = (_v)
|
#define _DPORT_REG_WRITE(_r, _v) (*(volatile uint32_t *)(_r)) = (_v)
|
||||||
|
|
||||||
|
@ -65,7 +56,7 @@ static inline uint32_t IRAM_ATTR DPORT_REG_READ(uint32_t reg)
|
||||||
#define DPORT_REG_GET_FIELD(_r, _f) ((DPORT_REG_READ(_r) >> (_f##_S)) & (_f##_V))
|
#define DPORT_REG_GET_FIELD(_r, _f) ((DPORT_REG_READ(_r) >> (_f##_S)) & (_f##_V))
|
||||||
|
|
||||||
//set field to register, used when _f is not left shifted by _f##_S
|
//set field to register, used when _f is not left shifted by _f##_S
|
||||||
#define DPORT_REG_SET_FIELD(_r, _f, _v) DPORT_REG_WRITE((_r), ((DPORT_REG_READ(_r) & (~((_f) << (_f##_S))))|(((_v) & (_f))<<(_f##_S))))
|
#define DPORT_REG_SET_FIELD(_r, _f, _v) DPORT_REG_WRITE((_r), ((DPORT_REG_READ(_r) & (~((_f##_V) << (_f##_S))))|(((_v) & (_f##_V))<<(_f##_S))))
|
||||||
|
|
||||||
//get field value from a variable, used when _f is not left shifted by _f##_S
|
//get field value from a variable, used when _f is not left shifted by _f##_S
|
||||||
#define DPORT_VALUE_GET_FIELD(_r, _f) (((_r) >> (_f##_S)) & (_f))
|
#define DPORT_VALUE_GET_FIELD(_r, _f) (((_r) >> (_f##_S)) & (_f))
|
||||||
|
@ -85,8 +76,9 @@ static inline uint32_t IRAM_ATTR DPORT_REG_READ(uint32_t reg)
|
||||||
//generate a value from a field value, used when _f is left shifted by _f##_S
|
//generate a value from a field value, used when _f is left shifted by _f##_S
|
||||||
#define DPORT_FIELD_TO_VALUE2(_f, _v) (((_v)<<_f##_S) & (_f))
|
#define DPORT_FIELD_TO_VALUE2(_f, _v) (((_v)<<_f##_S) & (_f))
|
||||||
|
|
||||||
#define _READ_PERI_REG(addr) (*((volatile uint32_t *)(addr)))
|
//Register read macros with an underscore prefix access DPORT memory directly. In IDF apps, use the non-underscore versions to be SMP-safe.
|
||||||
#define _WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)(addr))) = (uint32_t)(val)
|
#define _DPORT_READ_PERI_REG(addr) (*((volatile uint32_t *)(addr)))
|
||||||
|
#define _DPORT_WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)(addr))) = (uint32_t)(val)
|
||||||
|
|
||||||
//read value from register
|
//read value from register
|
||||||
static inline uint32_t IRAM_ATTR DPORT_READ_PERI_REG(uint32_t addr)
|
static inline uint32_t IRAM_ATTR DPORT_READ_PERI_REG(uint32_t addr)
|
||||||
|
@ -94,14 +86,14 @@ static inline uint32_t IRAM_ATTR DPORT_READ_PERI_REG(uint32_t addr)
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
|
|
||||||
DPORT_STALL_OTHER_CPU_START();
|
DPORT_STALL_OTHER_CPU_START();
|
||||||
val = _READ_PERI_REG(addr);
|
val = _DPORT_READ_PERI_REG(addr);
|
||||||
DPORT_STALL_OTHER_CPU_END();
|
DPORT_STALL_OTHER_CPU_END();
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
//write value to register
|
//write value to register
|
||||||
#define DPORT_WRITE_PERI_REG(addr, val) _WRITE_PERI_REG(addr, val)
|
#define DPORT_WRITE_PERI_REG(addr, val) _DPORT_WRITE_PERI_REG(addr, val)
|
||||||
|
|
||||||
//clear bits of register controlled by mask
|
//clear bits of register controlled by mask
|
||||||
#define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask))))
|
#define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask))))
|
||||||
|
|
Loading…
Reference in a new issue