From d690371e8cd9b26beeda36295240276b50235ca9 Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Mon, 27 Jan 2020 15:10:48 +0100 Subject: [PATCH 1/2] drivers/ieee802154: Adapt cc2520 driver to new GPIO API Update to use new API for GPIO pin configuration and operation. Fix invalid arithmetic on void pointer. Mark all CC2520 GPIOs as required in binding. Signed-off-by: Tomasz Bursztyka Signed-off-by: Peter Bigot --- drivers/ieee802154/ieee802154_cc2520.c | 124 +++++++++++++++++++------ drivers/ieee802154/ieee802154_cc2520.h | 18 +++- dts/bindings/ieee802154/ti,cc2520.yaml | 12 +-- include/drivers/ieee802154/cc2520.h | 30 ------ 4 files changed, 116 insertions(+), 68 deletions(-) delete mode 100644 include/drivers/ieee802154/cc2520.h diff --git a/drivers/ieee802154/ieee802154_cc2520.c b/drivers/ieee802154/ieee802154_cc2520.c index 14adacec4e1c1..19d040d6c57f2 100644 --- a/drivers/ieee802154/ieee802154_cc2520.c +++ b/drivers/ieee802154/ieee802154_cc2520.c @@ -354,24 +354,24 @@ static inline void set_reset(struct device *dev, u32_t value) { struct cc2520_context *cc2520 = dev->driver_data; - gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_RESET].dev, - cc2520->gpios[CC2520_GPIO_IDX_RESET].pin, value); + gpio_pin_set_raw(cc2520->gpios[CC2520_GPIO_IDX_RESET].dev, + cc2520->gpios[CC2520_GPIO_IDX_RESET].pin, value); } static inline void set_vreg_en(struct device *dev, u32_t value) { struct cc2520_context *cc2520 = dev->driver_data; - gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].dev, - cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin, value); + gpio_pin_set_raw(cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].dev, + cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin, value); } static inline u32_t get_fifo(struct cc2520_context *cc2520) { u32_t pin_value; - gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFO].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin, &pin_value); + pin_value = gpio_pin_get_raw(cc2520->gpios[CC2520_GPIO_IDX_FIFO].dev, + cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin); return pin_value; } @@ -380,8 +380,8 @@ static inline u32_t get_fifop(struct cc2520_context *cc2520) { u32_t pin_value; - gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin, &pin_value); + pin_value = gpio_pin_get_raw(cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin); return pin_value; } @@ -390,8 +390,8 @@ static inline u32_t get_cca(struct cc2520_context *cc2520) { u32_t pin_value; - gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_CCA].dev, - cc2520->gpios[CC2520_GPIO_IDX_CCA].pin, &pin_value); + pin_value = gpio_pin_get_raw(cc2520->gpios[CC2520_GPIO_IDX_CCA].dev, + cc2520->gpios[CC2520_GPIO_IDX_CCA].pin); return pin_value; } @@ -429,29 +429,19 @@ static inline void fifop_int_handler(struct device *port, static void enable_fifop_interrupt(struct cc2520_context *cc2520, bool enable) { - if (enable) { - gpio_pin_enable_callback( - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin); - } else { - gpio_pin_disable_callback( - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin); - } + gpio_pin_interrupt_configure( + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin, + enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE); } static void enable_sfd_interrupt(struct cc2520_context *cc2520, bool enable) { - if (enable) { - gpio_pin_enable_callback( - cc2520->gpios[CC2520_GPIO_IDX_SFD].dev, - cc2520->gpios[CC2520_GPIO_IDX_SFD].pin); - } else { - gpio_pin_disable_callback( - cc2520->gpios[CC2520_GPIO_IDX_SFD].dev, - cc2520->gpios[CC2520_GPIO_IDX_SFD].pin); - } + gpio_pin_interrupt_configure( + cc2520->gpios[CC2520_GPIO_IDX_SFD].dev, + cc2520->gpios[CC2520_GPIO_IDX_SFD].pin, + enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE); } static inline void setup_gpio_callbacks(struct device *dev) @@ -973,6 +963,81 @@ static int power_on_and_setup(struct device *dev) return 0; } +static struct cc2520_gpio_configuration *configure_gpios(struct device *dev) +{ + struct cc2520_context *cc2520 = dev->driver_data; + struct device *gpio; + + /* VREG_EN */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_VREG_EN_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin = DT_INST_0_TI_CC2520_VREG_EN_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin, + GPIO_OUTPUT_LOW | DT_INST_0_TI_CC2520_VREG_EN_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].dev = gpio; + + /* RESET */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_RESET_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_RESET].pin = DT_INST_0_TI_CC2520_RESET_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_RESET].pin, + GPIO_OUTPUT_LOW | DT_INST_0_TI_CC2520_RESET_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_RESET].dev = gpio; + + /*FIFO */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_FIFO_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin = DT_INST_0_TI_CC2520_FIFO_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_FIFO_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_FIFO].dev = gpio; + + /* CCA */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_CCA_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_CCA].pin = DT_INST_0_TI_CC2520_CCA_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_CCA].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_CCA_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_CCA].dev = gpio; + + /* SFD */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_SFD_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_SFD].pin = DT_INST_0_TI_CC2520_SFD_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_SFD].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_SFD_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_SFD].dev = gpio; + + /* FIFOP */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_FIFOP_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin = DT_INST_0_TI_CC2520_FIFOP_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_SFD_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev = gpio; + + return cc2520->gpios; +} + + static inline int configure_spi(struct device *dev) { struct cc2520_context *cc2520 = dev->driver_data; @@ -1019,8 +1084,7 @@ static int cc2520_init(struct device *dev) k_sem_init(&cc2520->access_lock, 1, 1); #endif - cc2520->gpios = cc2520_configure_gpios(); - if (!cc2520->gpios) { + if (!configure_gpios(dev)) { LOG_ERR("Configuring GPIOS failed"); return -EIO; } diff --git a/drivers/ieee802154/ieee802154_cc2520.h b/drivers/ieee802154/ieee802154_cc2520.h index 7e56bb02db297..dd3d3eaf2ff02 100644 --- a/drivers/ieee802154/ieee802154_cc2520.h +++ b/drivers/ieee802154/ieee802154_cc2520.h @@ -13,7 +13,21 @@ #include #include -#include +enum cc2520_gpio_index { + CC2520_GPIO_IDX_VREG_EN = 0, + CC2520_GPIO_IDX_RESET, + CC2520_GPIO_IDX_FIFO, + CC2520_GPIO_IDX_CCA, + CC2520_GPIO_IDX_SFD, + CC2520_GPIO_IDX_FIFOP, + + CC2520_GPIO_IDX_MAX, +}; + +struct cc2520_gpio_configuration { + struct device *dev; + u32_t pin; +}; /* Runtime context structure *************************** @@ -21,7 +35,7 @@ struct cc2520_context { struct net_if *iface; /**************************/ - struct cc2520_gpio_configuration *gpios; + struct cc2520_gpio_configuration gpios[CC2520_GPIO_IDX_MAX]; struct gpio_callback sfd_cb; struct gpio_callback fifop_cb; struct device *spi; diff --git a/dts/bindings/ieee802154/ti,cc2520.yaml b/dts/bindings/ieee802154/ti,cc2520.yaml index 1e00e223ad442..c310add544df6 100644 --- a/dts/bindings/ieee802154/ti,cc2520.yaml +++ b/dts/bindings/ieee802154/ti,cc2520.yaml @@ -10,24 +10,24 @@ include: spi-device.yaml properties: vreg-en-gpios: type: phandle-array - required: false + required: true reset-gpios: type: phandle-array - required: false + required: true fifo-gpios: type: phandle-array - required: false + required: true cca-gpios: type: phandle-array - required: false + required: true sfd-gpios: type: phandle-array - required: false + required: true fifop-gpios: type: phandle-array - required: false + required: true diff --git a/include/drivers/ieee802154/cc2520.h b/include/drivers/ieee802154/cc2520.h deleted file mode 100644 index 5913513524072..0000000000000 --- a/include/drivers/ieee802154/cc2520.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef ZEPHYR_INCLUDE_DRIVERS_IEEE802154_CC2520_H_ -#define ZEPHYR_INCLUDE_DRIVERS_IEEE802154_CC2520_H_ - -#include - -enum cc2520_gpio_index { - CC2520_GPIO_IDX_VREG_EN = 0, - CC2520_GPIO_IDX_RESET, - CC2520_GPIO_IDX_FIFO, - CC2520_GPIO_IDX_CCA, - CC2520_GPIO_IDX_SFD, - CC2520_GPIO_IDX_FIFOP, - - CC2520_GPIO_IDX_MAX, -}; - -struct cc2520_gpio_configuration { - struct device *dev; - u32_t pin; -}; - -struct cc2520_gpio_configuration *cc2520_configure_gpios(void); - -#endif /* ZEPHYR_INCLUDE_DRIVERS_IEEE802154_CC2520_H_ */ From 2acd30590a3672dae8cb04cbf5a30ca9f0c740e5 Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Mon, 27 Jan 2020 15:29:13 +0100 Subject: [PATCH 2/2] drivers/ieee802154: Adapt cc1200 driver to new GPIO API Update to use new API for GPIO pin configuration and operation. Fix invalid arithmetic on void pointer. Convert to support devicetree. Signed-off-by: Tomasz Bursztyka Signed-off-by: Peter Bigot --- drivers/ieee802154/ieee802154_cc1200.c | 71 +++++++++++++++----------- drivers/ieee802154/ieee802154_cc1200.h | 21 +++++++- dts/bindings/ieee802154/ti,cc1200.yaml | 5 ++ include/drivers/ieee802154/cc1200.h | 23 +-------- 4 files changed, 67 insertions(+), 53 deletions(-) diff --git a/drivers/ieee802154/ieee802154_cc1200.c b/drivers/ieee802154/ieee802154_cc1200.c index fa90eca45c841..483d312e65cbe 100644 --- a/drivers/ieee802154/ieee802154_cc1200.c +++ b/drivers/ieee802154/ieee802154_cc1200.c @@ -200,15 +200,10 @@ static inline void gpio0_int_handler(struct device *port, static void enable_gpio0_interrupt(struct cc1200_context *cc1200, bool enable) { - if (enable) { - gpio_pin_enable_callback( - cc1200->gpios[CC1200_GPIO_IDX_GPIO0].dev, - cc1200->gpios[CC1200_GPIO_IDX_GPIO0].pin); - } else { - gpio_pin_disable_callback( - cc1200->gpios[CC1200_GPIO_IDX_GPIO0].dev, - cc1200->gpios[CC1200_GPIO_IDX_GPIO0].pin); - } + gpio_pin_interrupt_configure( + cc1200->gpios[CC1200_GPIO_IDX_GPIO0].dev, + cc1200->gpios[CC1200_GPIO_IDX_GPIO0].pin, + enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE); } static void setup_gpio_callback(struct device *dev) @@ -333,8 +328,8 @@ rf_install_settings(struct device *dev, (void *)rf_settings->registers, CC1200_RF_NON_EXT_SPACE_REGS, false, true) || !z_cc1200_access_reg(cc1200, false, CC1200_REG_IF_MIX_CFG, - (void *)rf_settings->registers + - CC1200_RF_NON_EXT_SPACE_REGS, + (u8_t *)rf_settings->registers + + CC1200_RF_NON_EXT_SPACE_REGS, CC1200_RF_EXT_SPACE_REGS, true, true) || !write_reg_pkt_len(cc1200, 0xFF)) { LOG_ERR("Could not install RF settings"); @@ -732,37 +727,54 @@ static int power_on_and_setup(struct device *dev) return rf_calibrate(cc1200); } +static struct cc1200_gpio_configuration *configure_gpios(struct device *dev) +{ + struct cc1200_context *cc1200 = dev->driver_data; + struct device *gpio = device_get_binding(DT_INST_0_TI_CC1200_INT_GPIOS_CONTROLLER); + + if (!gpio) { + return NULL; + } + + cc1200->gpios[CC1200_GPIO_IDX_GPIO0].pin = DT_INST_0_TI_CC1200_INT_GPIOS_PIN; + gpio_pin_configure(gpio, cc1200->gpios[CC1200_GPIO_IDX_GPIO0].pin, + GPIO_INPUT | DT_INST_0_TI_CC1200_INT_GPIOS_FLAGS); + cc1200->gpios[CC1200_GPIO_IDX_GPIO0].dev = gpio; + + return cc1200->gpios; +} + static int configure_spi(struct device *dev) { struct cc1200_context *cc1200 = dev->driver_data; - cc1200->spi = device_get_binding(DT_IEEE802154_CC1200_SPI_DRV_NAME); + cc1200->spi = device_get_binding(DT_INST_0_TI_CC1200_BUS_NAME); if (!cc1200->spi) { LOG_ERR("Unable to get SPI device"); return -ENODEV; } - if (IS_ENABLED(CONFIG_IEEE802154_CC1200_GPIO_SPI_CS)) { - cs_ctrl.gpio_dev = device_get_binding( - DT_IEEE802154_CC1200_GPIO_SPI_CS_DRV_NAME); - if (!cs_ctrl.gpio_dev) { - LOG_ERR("Unable to get GPIO SPI CS device"); - return -ENODEV; - } +#if defined(CONFIG_IEEE802154_CC1200_GPIO_SPI_CS) + cs_ctrl.gpio_dev = device_get_binding( + DT_INST_0_TI_CC1200_CS_GPIOS_CONTROLLER); + if (!cs_ctrl.gpio_dev) { + LOG_ERR("Unable to get GPIO SPI CS device"); + return -ENODEV; + } - cs_ctrl.gpio_pin = DT_IEEE802154_CC1200_GPIO_SPI_CS_PIN; - cs_ctrl.delay = 0U; + cs_ctrl.gpio_pin = DT_INST_0_TI_CC1200_CS_GPIOS_PIN; + cs_ctrl.delay = 0U; - cc1200->spi_cfg.cs = &cs_ctrl; + cc1200->spi_cfg.cs = &cs_ctrl; - LOG_DBG("SPI GPIO CS configured on %s:%u", - DT_IEEE802154_CC1200_GPIO_SPI_CS_DRV_NAME, - DT_IEEE802154_CC1200_GPIO_SPI_CS_PIN); - } + LOG_DBG("SPI GPIO CS configured on %s:%u", + DT_INST_0_TI_CC1200_CS_GPIOS_CONTROLLER, + DT_INST_0_TI_CC1200_CS_GPIOS_PIN); +#endif /* CONFIG_IEEE802154_CC1200_GPIO_SPI_CS */ cc1200->spi_cfg.operation = SPI_WORD_SET(8); - cc1200->spi_cfg.frequency = DT_IEEE802154_CC1200_SPI_FREQ; - cc1200->spi_cfg.slave = DT_IEEE802154_CC1200_SPI_SLAVE; + cc1200->spi_cfg.frequency = DT_INST_0_TI_CC1200_SPI_MAX_FREQUENCY; + cc1200->spi_cfg.slave = DT_INST_0_TI_CC1200_BASE_ADDRESS; return 0; } @@ -777,8 +789,7 @@ static int cc1200_init(struct device *dev) k_sem_init(&cc1200->rx_lock, 0, 1); k_sem_init(&cc1200->tx_sync, 0, 1); - cc1200->gpios = cc1200_configure_gpios(); - if (!cc1200->gpios) { + if (!configure_gpios(dev)) { LOG_ERR("Configuring GPIOS failed"); return -EIO; } diff --git a/drivers/ieee802154/ieee802154_cc1200.h b/drivers/ieee802154/ieee802154_cc1200.h index 82464fe6a3cc6..70271f9396959 100644 --- a/drivers/ieee802154/ieee802154_cc1200.h +++ b/drivers/ieee802154/ieee802154_cc1200.h @@ -15,6 +15,25 @@ #include +/* Note for EMK & EM adapter booster pack users: + * SPI pins are easy, RESET as well, but when it comes to GPIO: + * CHIP -> EM adapter + * GPIO0 -> GPIOA + * GPIO1 -> reserved (it's SPI MISO) + * GPIO2 -> GPIOB + * GPIO3 -> GPIO3 + */ + +enum cc1200_gpio_index { + CC1200_GPIO_IDX_GPIO0, + CC1200_GPIO_IDX_MAX, +}; + +struct cc1200_gpio_configuration { + struct device *dev; + u32_t pin; +}; + /* Runtime context structure *************************** */ @@ -22,7 +41,7 @@ struct cc1200_context { struct net_if *iface; /**************************/ - struct cc1200_gpio_configuration *gpios; + struct cc1200_gpio_configuration gpios[CC1200_GPIO_IDX_MAX]; struct gpio_callback rx_tx_cb; struct device *spi; struct spi_config spi_cfg; diff --git a/dts/bindings/ieee802154/ti,cc1200.yaml b/dts/bindings/ieee802154/ti,cc1200.yaml index 03184f9cdb7b8..492d82dda398c 100644 --- a/dts/bindings/ieee802154/ti,cc1200.yaml +++ b/dts/bindings/ieee802154/ti,cc1200.yaml @@ -6,3 +6,8 @@ description: Texas Instruments CC1200 802.15.4 wireless transceiver compatible: "ti,cc1200" include: spi-device.yaml + +properties: + int-gpios: + type: phandle-array + required: true diff --git a/include/drivers/ieee802154/cc1200.h b/include/drivers/ieee802154/cc1200.h index 6a1fe9e02e8bc..3c14e8b3e32a6 100644 --- a/include/drivers/ieee802154/cc1200.h +++ b/include/drivers/ieee802154/cc1200.h @@ -17,7 +17,7 @@ * extended address 0x00 to 0x39 included * * If CONFIG_IEEE802154_CC1200_RF_PRESET is not used, one will need - * no provide 'cc1200_rf_settings' with proper settings. These can + * to provide 'cc1200_rf_settings' with proper settings. These can * be generated through TI's SmartRF application. * */ @@ -35,25 +35,4 @@ struct cc1200_rf_registers_set { extern const struct cc1200_rf_registers_set cc1200_rf_settings; #endif -/* Note for EMK & EM adapter booster pack users: - * SPI pins are easy, RESET as well, but when it comes to GPIO: - * CHIP -> EM adapter - * GPIO0 -> GPIOA - * GPIO1 -> reserved (it's SPI MISO) - * GPIO2 -> GPIOB - * GPIO3 -> GPIO3 - */ - -enum cc1200_gpio_index { - CC1200_GPIO_IDX_GPIO0, - CC1200_GPIO_IDX_MAX, -}; - -struct cc1200_gpio_configuration { - struct device *dev; - u32_t pin; -}; - -struct cc1200_gpio_configuration *cc1200_configure_gpios(void); - #endif /* ZEPHYR_INCLUDE_DRIVERS_IEEE802154_CC1200_H_ */