]> granicus.if.org Git - esp-idf/commitdiff
dport access: Add _DPORT_REG_SET_BIT & _DPORT_REG_CLR_BIT
authorAngus Gratton <angus@espressif.com>
Thu, 17 Aug 2017 04:16:21 +0000 (14:16 +1000)
committerAngus Gratton <gus@projectgus.com>
Fri, 25 Aug 2017 06:08:02 +0000 (16:08 +1000)
components/esp32/include/esp_dport_access.h
components/soc/esp32/include/soc/dport_access.h

index 8b081c5ae3fb94de19112ad2ec1176e923827f3e..d66b119bcc9b122168fe8af1fbfb3e882a78a35e 100644 (file)
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <sdkconfig.h>
+
 #ifndef _ESP_DPORT_ACCESS_H_
 #define _ESP_DPORT_ACCESS_H_
 
index d1d264cbce56d7ff7783792ba56b62ca007c01a0..817ac98e7b7e30f709c35211db975ae0b01c34e9 100644 (file)
@@ -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)