| /* |
| * Copyright (c) 2020 - 2021 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <platform/nrf_802154_gpiote.h> |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| |
| #include <zephyr/sys/__assert.h> |
| #include <zephyr/device.h> |
| #include <zephyr/toolchain.h> |
| #include <zephyr/drivers/gpio.h> |
| |
| #include <hal/nrf_gpio.h> |
| #include <nrf_802154_sl_coex.h> |
| #include <nrf_802154_sl_utils.h> |
| |
| static const struct device *dev; |
| static struct gpio_callback grant_cb; |
| static uint32_t pin_number = COEX_GPIO_PIN_INVALID; |
| |
| static void gpiote_irq_handler(const struct device *gpiob, struct gpio_callback *cb, |
| uint32_t pins) |
| { |
| ARG_UNUSED(gpiob); |
| ARG_UNUSED(cb); |
| ARG_UNUSED(pins); |
| |
| nrf_802154_wifi_coex_gpiote_irqhandler(); |
| } |
| |
| void nrf_802154_gpiote_init(void) |
| { |
| switch (nrf_802154_wifi_coex_interface_type_id_get()) { |
| case NRF_802154_WIFI_COEX_IF_NONE: |
| return; |
| |
| case NRF_802154_WIFI_COEX_IF_3WIRE: { |
| nrf_802154_wifi_coex_3wire_if_config_t cfg; |
| |
| nrf_802154_wifi_coex_cfg_3wire_get(&cfg); |
| |
| pin_number = cfg.grant_cfg.gpio_pin; |
| __ASSERT_NO_MSG(pin_number != COEX_GPIO_PIN_INVALID); |
| |
| bool use_port_1 = (pin_number > P0_PIN_NUM); |
| |
| /* Convert to the Zephyr primitive */ |
| pin_number = use_port_1 ? pin_number - P0_PIN_NUM : pin_number; |
| |
| uint32_t pull_up_down = cfg.grant_cfg.active_high ? |
| GPIO_PULL_UP : |
| GPIO_PULL_DOWN; |
| |
| #if DT_NODE_HAS_STATUS(DT_NODELABEL(gpio1), okay) |
| if (use_port_1) { |
| dev = DEVICE_DT_GET(DT_NODELABEL(gpio1)); |
| } else { |
| dev = DEVICE_DT_GET(DT_NODELABEL(gpio0)); |
| } |
| #else |
| dev = DEVICE_DT_GET(DT_NODELABEL(gpio0)); |
| #endif |
| __ASSERT_NO_MSG(device_is_ready(dev)); |
| |
| gpio_pin_configure(dev, pin_number, GPIO_INPUT | pull_up_down); |
| |
| gpio_init_callback(&grant_cb, gpiote_irq_handler, |
| BIT(pin_number)); |
| gpio_add_callback(dev, &grant_cb); |
| |
| gpio_pin_interrupt_configure(dev, pin_number, |
| GPIO_INT_EDGE_BOTH); |
| break; |
| } |
| |
| default: |
| __ASSERT_NO_MSG(false); |
| } |
| } |
| |
| void nrf_802154_gpiote_deinit(void) |
| { |
| switch (nrf_802154_wifi_coex_interface_type_id_get()) { |
| case NRF_802154_WIFI_COEX_IF_NONE: |
| break; |
| |
| case NRF_802154_WIFI_COEX_IF_3WIRE: |
| gpio_pin_interrupt_configure(dev, pin_number, GPIO_INT_DISABLE); |
| gpio_remove_callback(dev, &grant_cb); |
| pin_number = COEX_GPIO_PIN_INVALID; |
| break; |
| |
| default: |
| __ASSERT_NO_MSG(false); |
| } |
| } |