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/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,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/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/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_ */ 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_ */