Skip to content

Commit f9e655d

Browse files
authored
Merge pull request #6962 from dhalbert/espressif-deep-sleep-hold-pins
Espressif: do not hold pins during deep sleep if not necessary
2 parents 1086052 + 9d1b120 commit f9e655d

File tree

4 files changed

+14
-8
lines changed

4 files changed

+14
-8
lines changed

ports/espressif/boards/adafruit_feather_esp32s2_tft/board.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,6 @@ void board_init(void) {
8888
displayio_display_obj_t *display = &displays[0].display;
8989
display->base.type = &displayio_display_type;
9090

91-
// workaround as board_init() is called before reset_port() in main.c
92-
/// pwmout_reset();
93-
9491
common_hal_displayio_display_construct(
9592
display,
9693
bus,
@@ -127,8 +124,8 @@ bool espressif_board_reset_pin_number(gpio_num_t pin_number) {
127124
// Override the I2C/TFT power pin reset to prevent resetting the display.
128125
if (pin_number == 21) {
129126
// Turn on TFT and I2C
130-
gpio_set_direction(21, GPIO_MODE_DEF_OUTPUT);
131-
gpio_set_level(21, true);
127+
gpio_set_direction(pin_number, GPIO_MODE_DEF_OUTPUT);
128+
gpio_set_level(pin_number, true);
132129
return true;
133130
}
134131
return false;

ports/espressif/common-hal/alarm/__init__.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,6 @@ void NORETURN common_hal_alarm_enter_deep_sleep(void) {
173173
// We no longer need to remember the pin preservations, since any pin resets are all done.
174174
clear_pin_preservations();
175175

176-
// Allow pin holds to work during deep sleep.
177-
gpio_deep_sleep_hold_en();
178-
179176
// The ESP-IDF caches the deep sleep settings and applies them before sleep.
180177
// We don't need to worry about resetting them in the interim.
181178
esp_deep_sleep_start();

ports/espressif/common-hal/microcontroller/Pin.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,12 @@ void preserve_pin_number(gpio_num_t pin_number) {
173173
gpio_hold_en(pin_number);
174174
_preserved_pin_mask |= PIN_BIT(pin_number);
175175
}
176+
if (_preserved_pin_mask) {
177+
// Allow pin holds to work during deep sleep. This increases power consumption noticeably
178+
// during deep sleep, so enable holds only if we actually are holding some pins.
179+
// 270uA or so extra current is consumed even with no pins held.
180+
gpio_deep_sleep_hold_en();
181+
}
176182
}
177183

178184
void clear_pin_preservations(void) {

shared-bindings/alarm/__init__.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(alarm_light_sleep_until_alarms_obj, 1, MP_OB
144144
//|
145145
//| On some microcontrollers, some pins cannot remain in their original state for hardware reasons.
146146
//|
147+
//| .. note::
148+
//| On Espressif chips, preserving pin settings during deep sleep may consume extra current.
149+
//| On ESP32, this was measured to be 250 uA or more.
150+
//| Consider not preserving pins unless you need to.
151+
//| Measure power consumption carefully both with no pins preserved and with the pins you might want to
152+
//| preserve to achieve the lowest consumption.
147153
//|
148154
//| **If CircuitPython is connected to a host computer via USB or BLE
149155
//| the first time a deep sleep is requested,

0 commit comments

Comments
 (0)