Select one of the symbols to view example projects that use it.
 
Outline
#include "freertos/FreeRTOS.h"
#include "esp_attr.h"
#include "esp_private/periph_ctrl.h"
#include "soc/soc_caps.h"
#include "hal/clk_gate_ll.h"
#include "esp_private/esp_modem_clock.h"
periph_spinlock
ref_counts
periph_rcc_enter()
periph_rcc_exit()
periph_rcc_acquire_enter(periph_module_t)
periph_rcc_acquire_exit(periph_module_t, uint8_t)
periph_rcc_release_enter(periph_module_t)
periph_rcc_release_exit(periph_module_t, uint8_t)
periph_module_enable(periph_module_t)
periph_module_disable(periph_module_t)
periph_module_reset(periph_module_t)
wifi_bt_common_module_enable()
wifi_bt_common_module_disable()
wifi_module_enable()
wifi_module_disable()
Files
loading...
SourceVuESP-IDF Framework and ExamplesESP-IDFcomponents/esp_hw_support/periph_ctrl.c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/* * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 *//* ... */ #include "freertos/FreeRTOS.h" #include "esp_attr.h" #include "esp_private/periph_ctrl.h" #include "soc/soc_caps.h" #ifdef __PERIPH_CTRL_ALLOW_LEGACY_API #include "hal/clk_gate_ll.h" #endif #if SOC_MODEM_CLOCK_IS_INDEPENDENT && SOC_MODEM_CLOCK_SUPPORTED #include "esp_private/esp_modem_clock.h" #endif /// @brief For simplicity and backward compatible, we are using the same spin lock for both bus clock on/off and reset /// @note We may want to split them into two spin locks in the future static portMUX_TYPE periph_spinlock = portMUX_INITIALIZER_UNLOCKED; static uint8_t ref_counts[PERIPH_MODULE_MAX] = {0}; IRAM_ATTR void periph_rcc_enter(void) { portENTER_CRITICAL_SAFE(&periph_spinlock); }{ ... } IRAM_ATTR void periph_rcc_exit(void) { portEXIT_CRITICAL_SAFE(&periph_spinlock); }{ ... } uint8_t periph_rcc_acquire_enter(periph_module_t periph) { periph_rcc_enter(); return ref_counts[periph]; }{ ... } void periph_rcc_acquire_exit(periph_module_t periph, uint8_t ref_count) { ref_counts[periph] = ++ref_count; periph_rcc_exit(); }{ ... } uint8_t periph_rcc_release_enter(periph_module_t periph) { periph_rcc_enter(); return ref_counts[periph] - 1; }{ ... } void periph_rcc_release_exit(periph_module_t periph, uint8_t ref_count) { ref_counts[periph] = ref_count; periph_rcc_exit(); }{ ... } void periph_module_enable(periph_module_t periph) { #ifdef __PERIPH_CTRL_ALLOW_LEGACY_API assert(periph < PERIPH_MODULE_MAX); portENTER_CRITICAL_SAFE(&periph_spinlock); if (ref_counts[periph] == 0) { periph_ll_enable_clk_clear_rst(periph); }{...} ref_counts[periph]++; portEXIT_CRITICAL_SAFE(&periph_spinlock);/* ... */ #endif }{ ... } void periph_module_disable(periph_module_t periph) { #ifdef __PERIPH_CTRL_ALLOW_LEGACY_API assert(periph < PERIPH_MODULE_MAX); portENTER_CRITICAL_SAFE(&periph_spinlock); ref_counts[periph]--; if (ref_counts[periph] == 0) { periph_ll_disable_clk_set_rst(periph); }{...} portEXIT_CRITICAL_SAFE(&periph_spinlock);/* ... */ #endif }{ ... } void periph_module_reset(periph_module_t periph) { #ifdef __PERIPH_CTRL_ALLOW_LEGACY_API assert(periph < PERIPH_MODULE_MAX); portENTER_CRITICAL_SAFE(&periph_spinlock); periph_ll_reset(periph); portEXIT_CRITICAL_SAFE(&periph_spinlock);/* ... */ #endif }{ ... } #if !SOC_IEEE802154_BLE_ONLY #if SOC_BT_SUPPORTED || SOC_WIFI_SUPPORTED || SOC_IEEE802154_SUPPORTED IRAM_ATTR void wifi_bt_common_module_enable(void) { #if SOC_MODEM_CLOCK_IS_INDEPENDENT modem_clock_module_enable(PERIPH_PHY_MODULE); #else portENTER_CRITICAL_SAFE(&periph_spinlock); if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { periph_ll_wifi_bt_module_enable_clk(); }{...} ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; portEXIT_CRITICAL_SAFE(&periph_spinlock);/* ... */ #endif }{ ... } IRAM_ATTR void wifi_bt_common_module_disable(void) { #if SOC_MODEM_CLOCK_IS_INDEPENDENT modem_clock_module_disable(PERIPH_PHY_MODULE); #else portENTER_CRITICAL_SAFE(&periph_spinlock); ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { periph_ll_wifi_bt_module_disable_clk(); }{...} portEXIT_CRITICAL_SAFE(&periph_spinlock);/* ... */ #endif }{ ... } #endif/* ... */ //#if SOC_BT_SUPPORTED || SOC_WIFI_SUPPORTED/* ... */ #endif //#if !SOC_IEEE802154_BLE_ONLY #if CONFIG_ESP_WIFI_ENABLED void wifi_module_enable(void) { #if SOC_MODEM_CLOCK_IS_INDEPENDENT modem_clock_module_enable(PERIPH_WIFI_MODULE); #else portENTER_CRITICAL_SAFE(&periph_spinlock); periph_ll_wifi_module_enable_clk_clear_rst(); portEXIT_CRITICAL_SAFE(&periph_spinlock);/* ... */ #endif }{ ... } void wifi_module_disable(void) { #if SOC_MODEM_CLOCK_IS_INDEPENDENT modem_clock_module_disable(PERIPH_WIFI_MODULE); #else portENTER_CRITICAL_SAFE(&periph_spinlock); periph_ll_wifi_module_disable_clk_set_rst(); portEXIT_CRITICAL_SAFE(&periph_spinlock);/* ... */ #endif }{ ... } #endif/* ... */ // CONFIG_ESP_WIFI_ENABLED
Details