From cb31222e8b83049257d4349b845e443b40b4ba6a Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Thu, 17 Aug 2017 14:16:21 +1000 Subject: [PATCH] dport access: Add _DPORT_REG_SET_BIT & _DPORT_REG_CLR_BIT --- components/esp32/include/esp_dport_access.h | 2 ++ .../soc/esp32/include/soc/dport_access.h | 21 +++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/components/esp32/include/esp_dport_access.h b/components/esp32/include/esp_dport_access.h index 8b081c5ae3..d66b119bcc 100644 --- a/components/esp32/include/esp_dport_access.h +++ b/components/esp32/include/esp_dport_access.h @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include + #ifndef _ESP_DPORT_ACCESS_H_ #define _ESP_DPORT_ACCESS_H_ diff --git a/components/soc/esp32/include/soc/dport_access.h b/components/soc/esp32/include/soc/dport_access.h index d1d264cbce..817ac98e7b 100644 --- a/components/soc/esp32/include/soc/dport_access.h +++ b/components/soc/esp32/include/soc/dport_access.h @@ -25,14 +25,21 @@ extern "C" { //Registers Operation {{ -//Register read macros with an underscore prefix access DPORT memory directly. In IDF apps, use the non-underscore versions to be SMP-safe. +// The _DPORT_xxx register read macros access DPORT memory directly (as opposed to +// DPORT_REG_READ which applies SMP-safe protections). +// +// Use DPORT_REG_READ versions to be SMP-safe in IDF apps. If you want to +// make a sequence of DPORT reads, use DPORT_STALL_OTHER_CPU_START() macro +// explicitly and then use _DPORT_REG_READ macro while other CPU is stalled. +// +// _DPORT_REG_WRITE & DPORT_REG_WRITE are equivalent. #define _DPORT_REG_READ(_r) (*(volatile uint32_t *)(_r)) #define _DPORT_REG_WRITE(_r, _v) (*(volatile uint32_t *)(_r)) = (_v) -//write value to register +// Write value to DPORT register (does not require protecting) #define DPORT_REG_WRITE(_r, _v) _DPORT_REG_WRITE((_r), (_v)) -//read value from register +// Read value from register, SMP-safe version. static inline uint32_t IRAM_ATTR DPORT_REG_READ(uint32_t reg) { uint32_t val; @@ -40,7 +47,7 @@ static inline uint32_t IRAM_ATTR DPORT_REG_READ(uint32_t reg) DPORT_STALL_OTHER_CPU_START(); val = _DPORT_REG_READ(reg); DPORT_STALL_OTHER_CPU_END(); - + return val; } @@ -81,8 +88,10 @@ static inline uint32_t IRAM_ATTR DPORT_REG_READ(uint32_t reg) #define DPORT_FIELD_TO_VALUE2(_f, _v) (((_v)<<_f##_S) & (_f)) //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_READ_PERI_REG(addr) (*((volatile uint32_t *)(addr))) -#define _DPORT_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) +#define _DPORT_REG_SET_BIT(_r, _b) _DPORT_REG_WRITE((_r), (_DPORT_REG_READ(_r)|(_b))) +#define _DPORT_REG_CLR_BIT(_r, _b) _DPORT_REG_WRITE((_r), (_DPORT_REG_READ(_r) & (~(_b)))) //read value from register static inline uint32_t IRAM_ATTR DPORT_READ_PERI_REG(uint32_t addr)