Merge pull request #6057 from tannewt/board_pin_reset

Allow ESP boards to customize how a pin is reset
This commit is contained in:
Dan Halbert 2022-02-17 21:12:11 -05:00 committed by GitHub
commit 1c3e03d1b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 20 deletions

View File

@ -71,14 +71,6 @@ uint8_t display_init_sequence[] = {
void board_init(void) { void board_init(void) {
// Never reset the I2C/TFT power pin because doing so will reset the display.
// Instead, on reset set the default value and free the pin for user use.
// Relying on the normal pin reset would briefly float/pull the pin that
// could lead to a power brownout.
common_hal_never_reset_pin(&pin_GPIO21);
reset_board();
busio_spi_obj_t *spi = common_hal_board_create_spi(0); busio_spi_obj_t *spi = common_hal_board_create_spi(0);
displayio_fourwire_obj_t *bus = &displays[0].fourwire_bus; displayio_fourwire_obj_t *bus = &displays[0].fourwire_bus;
bus->base.type = &displayio_fourwire_type; bus->base.type = &displayio_fourwire_type;
@ -99,7 +91,6 @@ void board_init(void) {
// workaround as board_init() is called before reset_port() in main.c // workaround as board_init() is called before reset_port() in main.c
pwmout_reset(); pwmout_reset();
common_hal_displayio_display_construct( common_hal_displayio_display_construct(
display, display,
bus, bus,
@ -138,12 +129,18 @@ bool board_requests_safe_mode(void) {
return false; return false;
} }
void reset_board(void) { bool espressif_board_reset_pin_number(gpio_num_t pin_number) {
// Turn on TFT and I2C // Override the I2C/TFT power pin reset to prevent resetting the display.
gpio_set_direction(21, GPIO_MODE_DEF_OUTPUT); if (pin_number == 21) {
gpio_set_level(21, true); // Turn on TFT and I2C
gpio_set_direction(21, GPIO_MODE_DEF_OUTPUT);
gpio_set_level(21, true);
return true;
}
return false;
}
free_pin_number(21); void reset_board(void) {
} }
void board_deinit(void) { void board_deinit(void) {

View File

@ -172,6 +172,25 @@ void reset_board(void) {
} }
bool espressif_board_reset_pin_number(gpio_num_t pin_number) {
// Pin 16 is speaker enable and it's pulled down on the board. We don't want
// to pull it high because then we'll compete with the external pull down.
// So, reset without any pulls internally.
if (pin_number == 16) {
gpio_config_t cfg = {
.pin_bit_mask = BIT64(16),
.mode = GPIO_MODE_DISABLE,
// The pin is externally pulled down, so we don't need to pull it.
.pull_up_en = false,
.pull_down_en = false,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&cfg);
return true;
}
return false;
}
void board_deinit(void) { void board_deinit(void) {
displayio_epaperdisplay_obj_t *display = &displays[0].epaper_display; displayio_epaperdisplay_obj_t *display = &displays[0].epaper_display;
if (display->base.type == &displayio_epaperdisplay_type) { if (display->base.type == &displayio_epaperdisplay_type) {

View File

@ -28,6 +28,8 @@
#include "mpconfigboard.h" #include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/microcontroller/Pin.h"
#include "components/driver/include/driver/gpio.h"
void board_init(void) { void board_init(void) {
// Debug UART // Debug UART
#ifdef DEBUG #ifdef DEBUG
@ -40,6 +42,17 @@ bool board_requests_safe_mode(void) {
return false; return false;
} }
bool espressif_board_reset_pin_number(gpio_num_t pin_number) {
// Pin 21 is a high side LED so pull it down to prevent lighting the LED.
if (pin_number == 21) {
gpio_reset_pin(21);
gpio_pullup_dis(21);
gpio_pulldown_en(21);
return true;
}
return false;
}
void reset_board(void) { void reset_board(void) {
} }

View File

@ -50,6 +50,10 @@ void common_hal_never_reset_pin(const mcu_pin_obj_t *pin) {
never_reset_pin_number(pin->number); never_reset_pin_number(pin->number);
} }
MP_WEAK bool espressif_board_reset_pin_number(gpio_num_t pin_number) {
return false;
}
STATIC void _reset_pin(gpio_num_t pin_number) { STATIC void _reset_pin(gpio_num_t pin_number) {
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
// Never ever reset pins used for flash and RAM. // Never ever reset pins used for flash and RAM.
@ -76,6 +80,11 @@ STATIC void _reset_pin(gpio_num_t pin_number) {
} }
#endif #endif
// Give the board a chance to reset the pin in a particular way.
if (espressif_board_reset_pin_number(pin_number)) {
return;
}
gpio_reset_pin(pin_number); gpio_reset_pin(pin_number);
#ifdef DOUBLE_TAP_PIN #ifdef DOUBLE_TAP_PIN
@ -133,10 +142,6 @@ void claim_pin(const mcu_pin_obj_t *pin) {
in_use[pin->number / 32] |= (1 << (pin->number % 32)); in_use[pin->number / 32] |= (1 << (pin->number % 32));
} }
void free_pin_number(gpio_num_t pin_number) {
in_use[pin_number / 32] &= ~(1 << (pin_number % 32));
}
void common_hal_mcu_pin_claim(const mcu_pin_obj_t *pin) { void common_hal_mcu_pin_claim(const mcu_pin_obj_t *pin) {
claim_pin(pin); claim_pin(pin);
} }

View File

@ -39,9 +39,13 @@ void common_hal_reset_pin(const mcu_pin_obj_t *pin);
void common_hal_never_reset_pin(const mcu_pin_obj_t *pin); void common_hal_never_reset_pin(const mcu_pin_obj_t *pin);
void claim_pin(const mcu_pin_obj_t *pin); void claim_pin(const mcu_pin_obj_t *pin);
void claim_pin_number(gpio_num_t pin_number); void claim_pin_number(gpio_num_t pin_number);
// Free the pin without resetting it.
void free_pin_number(gpio_num_t pin_number);
bool pin_number_is_free(gpio_num_t pin_number); bool pin_number_is_free(gpio_num_t pin_number);
void never_reset_pin_number(gpio_num_t pin_number); void never_reset_pin_number(gpio_num_t pin_number);
// Allow the board to reset a pin in a board-specific way. This can be used
// for LEDs or enable pins to put them in a state beside the default pull-up.
// Return true to indicate that the pin was reset. Returning false will lead to
// the port-default reset behavior.
bool espressif_board_reset_pin_number(gpio_num_t pin_number);
#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_MICROCONTROLLER_PIN_H #endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_MICROCONTROLLER_PIN_H