| /* |
| * Copyright (c) 2016 Piotr Mienkowski |
| * Copyright (c) 2021 ATL Electronics |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** @file |
| * @brief Cypress PSoC-6 MCU family General Purpose Input Output (GPIO) |
| * module HAL driver. |
| */ |
| |
| #include "soc_gpio.h" |
| #include "cy_gpio.h" |
| |
| static uint32_t soc_gpio_get_drv_mode(uint32_t flags) |
| { |
| uint32_t drv_mode = CY_GPIO_DM_ANALOG; |
| |
| flags = ((flags & SOC_GPIO_FLAGS_MASK) >> SOC_GPIO_FLAGS_POS); |
| |
| if (flags & SOC_GPIO_OPENDRAIN) { |
| drv_mode = CY_GPIO_DM_OD_DRIVESLOW_IN_OFF; |
| } else if (flags & SOC_GPIO_OPENSOURCE) { |
| drv_mode = CY_GPIO_DM_OD_DRIVESHIGH_IN_OFF; |
| } else if (flags & SOC_GPIO_PUSHPULL) { |
| drv_mode = CY_GPIO_DM_STRONG_IN_OFF; |
| } else if ((flags & SOC_GPIO_PULLUP) && (flags & SOC_GPIO_PULLDOWN)) { |
| drv_mode = CY_GPIO_DM_PULLUP_DOWN_IN_OFF; |
| } else if (flags & SOC_GPIO_PULLUP) { |
| drv_mode = CY_GPIO_DM_PULLUP_IN_OFF; |
| } else if (flags & SOC_GPIO_PULLDOWN) { |
| drv_mode = CY_GPIO_DM_PULLDOWN_IN_OFF; |
| } else { |
| ; |
| } |
| |
| if (flags & SOC_GPIO_INPUTENABLE) { |
| drv_mode |= CY_GPIO_DM_HIGHZ; |
| } |
| |
| return drv_mode; |
| } |
| |
| void soc_gpio_configure(const struct soc_gpio_pin *pin) |
| { |
| uint32_t drv_mode = soc_gpio_get_drv_mode(pin->flags); |
| uint32_t function = ((pin->flags & SOC_GPIO_FUNC_MASK) >> |
| SOC_GPIO_FUNC_POS); |
| |
| Cy_GPIO_SetHSIOM(pin->regs, pin->pinum, function); |
| Cy_GPIO_SetDrivemode(pin->regs, pin->pinum, drv_mode); |
| } |
| |
| void soc_gpio_list_configure(const struct soc_gpio_pin pins[], size_t size) |
| { |
| for (size_t i = 0; i < size; i++) { |
| soc_gpio_configure(&pins[i]); |
| } |
| } |