From 48b02af144c35167a12afbcf9a977616aaec28ef Mon Sep 17 00:00:00 2001 From: Przemyslaw Stekiel Date: Thu, 14 Nov 2019 14:59:17 +0100 Subject: [PATCH] Fix for Cypress GPIO driver --- .../TARGET_Cypress/TARGET_PSOC6/cy_gpio_api.c | 5 +++-- .../TARGET_Cypress/TARGET_PSOC6/gpio_object.h | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_gpio_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/cy_gpio_api.c index 336a34a57fa..d51d498f528 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/cy_gpio_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_gpio_api.c @@ -39,9 +39,9 @@ void apply_config(gpio_t *obj) } if (obj->drive_mode == PullUp) { - gpio_write(obj, 1); + gpio_set_pull(obj, 1); } else if (obj->drive_mode == PullDown) { - gpio_write(obj, 0); + gpio_set_pull(obj, 0); } } @@ -80,6 +80,7 @@ void gpio_dir(gpio_t *obj, PinDirection direction) } else if (direction == PIN_OUTPUT) { // mbed reads from input buffer instead of DR even for output pins so always leave input buffer enabled obj->direction = CYHAL_GPIO_DIR_BIDIRECTIONAL; + gpio_write(obj, obj->output_val); if (obj->drive_mode == CYHAL_GPIO_DRIVE_NONE || obj->drive_mode == CYHAL_GPIO_DRIVE_ANALOG) { obj->drive_mode = CYHAL_GPIO_DRIVE_STRONG; } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/gpio_object.h b/targets/TARGET_Cypress/TARGET_PSOC6/gpio_object.h index 3bfc4c3b4c2..ebb769239d8 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/gpio_object.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/gpio_object.h @@ -35,6 +35,7 @@ typedef struct { cyhal_gpio_t pin; cyhal_gpio_direction_t direction; cyhal_gpio_drive_mode_t drive_mode; + int output_val; } gpio_t; struct gpio_irq_s { @@ -57,6 +58,21 @@ struct port_s { * @param value The value to be set */ static inline void gpio_write(gpio_t *obj, int value) +{ + if (obj->direction != CYHAL_GPIO_DIR_INPUT) { + MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE); + cyhal_gpio_write(obj->pin, value != 0); + } else { + obj->output_val = value; + } +} + +/** Set the pull value + * + * @param obj The GPIO object + * @param value The pull value to be set + */ +static inline void gpio_set_pull(gpio_t *obj, int value) { MBED_ASSERT(obj->pin != CYHAL_NC_PIN_VALUE); cyhal_gpio_write(obj->pin, value != 0);