Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 41 additions & 30 deletions drivers/ieee802154/ieee802154_cc1200.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down
21 changes: 20 additions & 1 deletion drivers/ieee802154/ieee802154_cc1200.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,33 @@

#include <drivers/ieee802154/cc1200.h>

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

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;
Expand Down
124 changes: 94 additions & 30 deletions drivers/ieee802154/ieee802154_cc2520.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
18 changes: 16 additions & 2 deletions drivers/ieee802154/ieee802154_cc2520.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,29 @@
#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
***************************
*/
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;
Expand Down
5 changes: 5 additions & 0 deletions dts/bindings/ieee802154/ti,cc1200.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading