1 /*
2  * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #pragma once
8 
9 #include <stdint.h>
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 // ESP32S3 does not have DPORT bus, so these macros are all same as the non-DPORT versions
16 
17 #define DPORT_INTERRUPT_DISABLE()
18 #define DPORT_INTERRUPT_RESTORE()
19 
20 /**
21  * @brief Read a sequence of DPORT registers to the buffer.
22  *
23  * @param[out] buff_out  Contains the read data.
24  * @param[in]  address   Initial address for reading registers.
25  * @param[in]  num_words The number of words.
26  */
27 void esp_dport_access_read_buffer(uint32_t *buff_out, uint32_t address, uint32_t num_words);
28 
29 // _DPORT_REG_WRITE & DPORT_REG_WRITE are equivalent.
30 #define _DPORT_REG_READ(_r)        (*(volatile uint32_t *)(_r))
31 #define _DPORT_REG_WRITE(_r, _v)   (*(volatile uint32_t *)(_r)) = (_v)
32 
33 // Write value to DPORT register (does not require protecting)
34 #define DPORT_REG_WRITE(_r, _v)   _DPORT_REG_WRITE((_r), (_v))
35 
36 #define DPORT_REG_READ(_r)    _DPORT_REG_READ(_r)
37 #define DPORT_SEQUENCE_REG_READ(_r)    _DPORT_REG_READ(_r)
38 
39 //get bit or get bits from register
40 #define DPORT_REG_GET_BIT(_r, _b)  (DPORT_REG_READ(_r) & (_b))
41 
42 //set bit or set bits to register
43 #define DPORT_REG_SET_BIT(_r, _b)  DPORT_REG_WRITE((_r), (DPORT_REG_READ(_r)|(_b)))
44 
45 //clear bit or clear bits of register
46 #define DPORT_REG_CLR_BIT(_r, _b)  DPORT_REG_WRITE((_r), (DPORT_REG_READ(_r) & (~(_b))))
47 
48 //set bits of register controlled by mask
49 #define DPORT_REG_SET_BITS(_r, _b, _m) DPORT_REG_WRITE((_r), ((DPORT_REG_READ(_r) & (~(_m))) | ((_b) & (_m))))
50 
51 //get field from register, uses field _S & _V to determine mask
52 #define DPORT_REG_GET_FIELD(_r, _f) ((DPORT_REG_READ(_r) >> (_f##_S)) & (_f##_V))
53 
54 //set field to register, used when _f is not left shifted by _f##_S
55 #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))))
56 
57 //get field value from a variable, used when _f is not left shifted by _f##_S
58 #define DPORT_VALUE_GET_FIELD(_r, _f) (((_r) >> (_f##_S)) & (_f))
59 
60 //get field value from a variable, used when _f is left shifted by _f##_S
61 #define DPORT_VALUE_GET_FIELD2(_r, _f) (((_r) & (_f))>> (_f##_S))
62 
63 //set field value to a variable, used when _f is not left shifted by _f##_S
64 #define DPORT_VALUE_SET_FIELD(_r, _f, _v) ((_r)=(((_r) & ~((_f) << (_f##_S)))|((_v)<<(_f##_S))))
65 
66 //set field value to a variable, used when _f is left shifted by _f##_S
67 #define DPORT_VALUE_SET_FIELD2(_r, _f, _v) ((_r)=(((_r) & ~(_f))|((_v)<<(_f##_S))))
68 
69 //generate a value from a field value, used when _f is not left shifted by _f##_S
70 #define DPORT_FIELD_TO_VALUE(_f, _v) (((_v)&(_f))<<_f##_S)
71 
72 //generate a value from a field value, used when _f is left shifted by _f##_S
73 #define DPORT_FIELD_TO_VALUE2(_f, _v) (((_v)<<_f##_S) & (_f))
74 
75 //Register read macros with an underscore prefix access DPORT memory directly. In IDF apps, use the non-underscore versions to be SMP-safe.
76 #define _DPORT_READ_PERI_REG(addr) (*((volatile uint32_t *)(addr)))
77 #define _DPORT_WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)(addr))) = (uint32_t)(val)
78 #define _DPORT_REG_SET_BIT(_r, _b)  _DPORT_REG_WRITE((_r), (_DPORT_REG_READ(_r)|(_b)))
79 #define _DPORT_REG_CLR_BIT(_r, _b)  _DPORT_REG_WRITE((_r), (_DPORT_REG_READ(_r) & (~(_b))))
80 
81 #define DPORT_READ_PERI_REG(addr)       _DPORT_READ_PERI_REG(addr)
82 
83 //write value to register
84 #define DPORT_WRITE_PERI_REG(addr, val) _DPORT_WRITE_PERI_REG((addr), (val))
85 
86 //clear bits of register controlled by mask
87 #define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask))))
88 
89 //set bits of register controlled by mask
90 #define DPORT_SET_PERI_REG_MASK(reg, mask)   DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask)))
91 
92 //get bits of register controlled by mask
93 #define DPORT_GET_PERI_REG_MASK(reg, mask)   (DPORT_READ_PERI_REG(reg) & (mask))
94 
95 //get bits of register controlled by highest bit and lowest bit
96 #define DPORT_GET_PERI_REG_BITS(reg, hipos,lowpos)     ((DPORT_READ_PERI_REG(reg)>>(lowpos))&((1<<((hipos)-(lowpos)+1))-1))
97 
98 //set bits of register controlled by mask and shift
99 #define DPORT_SET_PERI_REG_BITS(reg,bit_map,value,shift) DPORT_WRITE_PERI_REG((reg), ((DPORT_READ_PERI_REG(reg)&(~((bit_map)<<(shift))))|(((value) & bit_map)<<(shift))))
100 
101 //get field of register
102 #define DPORT_GET_PERI_REG_BITS2(reg, mask,shift)      ((DPORT_READ_PERI_REG(reg)>>(shift))&(mask))
103 //}}
104 
105 #ifdef __cplusplus
106 }
107 #endif
108