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 <tomasz.bursztyka@linux.intel.com> Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
This commit is contained in:
parent
4046de5cae
commit
3587fe2fe3
4 changed files with 116 additions and 68 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,21 @@
|
|||
#include <sys/atomic.h>
|
||||
#include <drivers/spi.h>
|
||||
|
||||
#include <drivers/ieee802154/cc2520.h>
|
||||
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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 <device.h>
|
||||
|
||||
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_ */
|
Loading…
Add table
Add a link
Reference in a new issue