Merge pull request #6057 from tannewt/board_pin_reset
Allow ESP boards to customize how a pin is reset
This commit is contained in:
commit
1c3e03d1b1
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue