1 /*
2  * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <stdint.h>
8 #include <sdkconfig.h>
9 #include "soc/soc_caps.h"
10 #include "soc/dport_access.h"
11 #include "esp_attr.h"
12 
esp_dport_access_reg_read(uint32_t reg)13 IRAM_ATTR uint32_t esp_dport_access_reg_read(uint32_t reg)
14 {
15 #if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !SOC_DPORT_WORKAROUND
16     return _DPORT_REG_READ(reg);
17 #else
18     uint32_t apb;
19     unsigned int intLvl;
20     __asm__ __volatile__ (\
21                   "rsil %[LVL], "XTSTR(SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL)"\n"\
22                   "movi %[APB], "XTSTR(0x3ff40078)"\n"\
23                   "l32i %[APB], %[APB], 0\n"\
24                   "l32i %[REG], %[REG], 0\n"\
25                   "wsr  %[LVL], "XTSTR(PS)"\n"\
26                   "rsync\n"\
27                   : [APB]"=a"(apb), [REG]"+a"(reg), [LVL]"=a"(intLvl)\
28                   : \
29                   : "memory" \
30                   );
31     return reg;
32 #endif
33 }
34 
esp_dport_access_sequence_reg_read(uint32_t reg)35 IRAM_ATTR uint32_t esp_dport_access_sequence_reg_read(uint32_t reg)
36 {
37 #if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !SOC_DPORT_WORKAROUND
38     return _DPORT_REG_READ(reg);
39 #else
40     uint32_t apb;
41     __asm__ __volatile__ (\
42                   "movi %[APB], "XTSTR(0x3ff40078)"\n"\
43                   "l32i %[APB], %[APB], 0\n"\
44                   "l32i %[REG], %[REG], 0\n"\
45                   : [APB]"=a"(apb), [REG]"+a"(reg)\
46                   : \
47                   : "memory" \
48                   );
49     return reg;
50 #endif
51 }
52