summaryrefslogtreecommitdiff
path: root/ports/esp32s2/common-hal/digitalio/DigitalInOut.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/esp32s2/common-hal/digitalio/DigitalInOut.c')
-rw-r--r--ports/esp32s2/common-hal/digitalio/DigitalInOut.c86
1 files changed, 44 insertions, 42 deletions
diff --git a/ports/esp32s2/common-hal/digitalio/DigitalInOut.c b/ports/esp32s2/common-hal/digitalio/DigitalInOut.c
index 349da6bf4..7745a9c0a 100644
--- a/ports/esp32s2/common-hal/digitalio/DigitalInOut.c
+++ b/ports/esp32s2/common-hal/digitalio/DigitalInOut.c
@@ -30,24 +30,18 @@
#include "driver/gpio.h"
-
-#include "esp_log.h"
-
-static const char* TAG = "CircuitPython digitalio";
+#include "esp-idf/components/soc/include/hal/gpio_hal.h"
void common_hal_digitalio_digitalinout_never_reset(
digitalio_digitalinout_obj_t *self) {
- (void)self;
+ never_reset_pin_number(self->pin->number);
}
digitalinout_result_t common_hal_digitalio_digitalinout_construct(
digitalio_digitalinout_obj_t *self, const mcu_pin_obj_t *pin) {
-
- // claim_pin(pin);
+ claim_pin(pin);
self->pin = pin;
- ESP_EARLY_LOGW(TAG, "construct %d", pin->number);
-
return DIGITALINOUT_OK;
}
@@ -60,78 +54,86 @@ void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t *self
return;
}
- // reset_pin_number(0, self->pin->number);
+ reset_pin_number(self->pin->number);
self->pin = mp_const_none;
}
void common_hal_digitalio_digitalinout_switch_to_input(
digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) {
- gpio_config_t config = {
- .pin_bit_mask = 1 << self->pin->number,
- .mode = GPIO_MODE_INPUT
- };
- if (pull == PULL_UP) {
- config.pull_up_en = GPIO_PULLUP_ENABLE;
- } else if (pull == PULL_DOWN) {
- config.pull_down_en = GPIO_PULLDOWN_ENABLE;
- }
-
- gpio_config(&config);
+ common_hal_digitalio_digitalinout_set_pull(self, pull);
+ gpio_set_direction(self->pin->number, GPIO_MODE_DEF_INPUT);
}
-void common_hal_digitalio_digitalinout_switch_to_output(
+digitalinout_result_t common_hal_digitalio_digitalinout_switch_to_output(
digitalio_digitalinout_obj_t *self, bool value,
digitalio_drive_mode_t drive_mode) {
- gpio_config_t config = {
- .pin_bit_mask = 1ULL << self->pin->number,
- .mode = GPIO_MODE_OUTPUT
- };
- if (drive_mode == DRIVE_MODE_OPEN_DRAIN) {
- config.mode = GPIO_MODE_OUTPUT_OD;
- }
gpio_set_level(self->pin->number, value);
- gpio_config(&config);
+ return common_hal_digitalio_digitalinout_set_drive_mode(self, drive_mode);
}
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
digitalio_digitalinout_obj_t *self) {
-
+ uint32_t iomux = READ_PERI_REG(GPIO_PIN_MUX_REG[self->pin->number]);
+ if ((iomux & FUN_IE) != 0) {
+ return DIRECTION_INPUT;
+ }
return DIRECTION_OUTPUT;
}
void common_hal_digitalio_digitalinout_set_value(
digitalio_digitalinout_obj_t *self, bool value) {
- ESP_EARLY_LOGW(TAG, "set %d %d", self->pin->number, value);
gpio_set_level(self->pin->number, value);
}
bool common_hal_digitalio_digitalinout_get_value(
digitalio_digitalinout_obj_t *self) {
- return true;
+ return gpio_get_level(self->pin->number) == 1;
}
-void common_hal_digitalio_digitalinout_set_drive_mode(
+digitalinout_result_t common_hal_digitalio_digitalinout_set_drive_mode(
digitalio_digitalinout_obj_t *self,
digitalio_drive_mode_t drive_mode) {
- (void)self;
- (void)drive_mode;
+ gpio_num_t number = self->pin->number;
+ gpio_mode_t mode;
+ if (drive_mode == DRIVE_MODE_OPEN_DRAIN) {
+ mode = GPIO_MODE_DEF_OD;
+ } else {
+ mode = GPIO_MODE_DEF_OUTPUT;
+ }
+ esp_err_t result = gpio_set_direction(number, mode);
+ if (result != ESP_OK) {
+ return DIGITALINOUT_INPUT_ONLY;
+ }
+ return DIGITALINOUT_OK;
}
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
digitalio_digitalinout_obj_t *self) {
- // if (common_hal_digitalio_digitalinout_get_direction(self) == DIRECTION_OUTPUT)
- // return DRIVE_MODE_PUSH_PULL;
- // else
- return DRIVE_MODE_OPEN_DRAIN;
+ if (GPIO_HAL_GET_HW(GPIO_PORT_0)->pin[self->pin->number].pad_driver == 1) {
+ return DRIVE_MODE_OPEN_DRAIN;
+ }
+ return DRIVE_MODE_PUSH_PULL;
}
void common_hal_digitalio_digitalinout_set_pull(
digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) {
- (void)self;
- (void)pull;
+ gpio_num_t number = self->pin->number;
+ gpio_pullup_dis(number);
+ gpio_pulldown_dis(number);
+ if (pull == PULL_UP) {
+ gpio_pullup_en(number);
+ } else if (pull == PULL_DOWN) {
+ gpio_pulldown_en(number);
+ }
}
digitalio_pull_t common_hal_digitalio_digitalinout_get_pull(
digitalio_digitalinout_obj_t *self) {
+ gpio_num_t gpio_num = self->pin->number;
+ if (REG_GET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PU) == 1) {
+ return PULL_UP;
+ } else if (REG_GET_BIT(GPIO_PIN_MUX_REG[gpio_num], FUN_PD) == 1) {
+ return PULL_DOWN;
+ }
return PULL_NONE;
}