drivers: ieee802154: rf2xx: use gpio_dt_spec
Simplify the implementation by using gpio_dt_spec. Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
This commit is contained in:
parent
ec63ea78cd
commit
b15fb9cb2f
3 changed files with 51 additions and 106 deletions
|
@ -614,12 +614,11 @@ static int rf2xx_tx(const struct device *dev,
|
||||||
static int rf2xx_start(const struct device *dev)
|
static int rf2xx_start(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct rf2xx_config *conf = dev->config;
|
const struct rf2xx_config *conf = dev->config;
|
||||||
struct rf2xx_context *ctx = dev->data;
|
|
||||||
|
|
||||||
rf2xx_trx_set_state(dev, RF2XX_TRX_PHY_STATE_CMD_TRX_OFF);
|
rf2xx_trx_set_state(dev, RF2XX_TRX_PHY_STATE_CMD_TRX_OFF);
|
||||||
rf2xx_iface_reg_read(dev, RF2XX_IRQ_STATUS_REG);
|
rf2xx_iface_reg_read(dev, RF2XX_IRQ_STATUS_REG);
|
||||||
gpio_pin_interrupt_configure(ctx->irq_gpio, conf->irq.pin,
|
gpio_pin_interrupt_configure_dt(&conf->irq_gpio,
|
||||||
GPIO_INT_EDGE_TO_ACTIVE);
|
GPIO_INT_EDGE_TO_ACTIVE);
|
||||||
rf2xx_trx_set_rx_state(dev);
|
rf2xx_trx_set_rx_state(dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -628,10 +627,8 @@ static int rf2xx_start(const struct device *dev)
|
||||||
static int rf2xx_stop(const struct device *dev)
|
static int rf2xx_stop(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct rf2xx_config *conf = dev->config;
|
const struct rf2xx_config *conf = dev->config;
|
||||||
struct rf2xx_context *ctx = dev->data;
|
|
||||||
|
|
||||||
gpio_pin_interrupt_configure(ctx->irq_gpio, conf->irq.pin,
|
gpio_pin_interrupt_configure_dt(&conf->irq_gpio, GPIO_INT_DISABLE);
|
||||||
GPIO_INT_DISABLE);
|
|
||||||
rf2xx_trx_set_state(dev, RF2XX_TRX_PHY_STATE_CMD_TRX_OFF);
|
rf2xx_trx_set_state(dev, RF2XX_TRX_PHY_STATE_CMD_TRX_OFF);
|
||||||
rf2xx_iface_reg_read(dev, RF2XX_IRQ_STATUS_REG);
|
rf2xx_iface_reg_read(dev, RF2XX_IRQ_STATUS_REG);
|
||||||
|
|
||||||
|
@ -773,8 +770,8 @@ static int power_on_and_setup(const struct device *dev)
|
||||||
(1 << RF2XX_TRX_END);
|
(1 << RF2XX_TRX_END);
|
||||||
rf2xx_iface_reg_write(dev, RF2XX_IRQ_MASK_REG, config);
|
rf2xx_iface_reg_write(dev, RF2XX_IRQ_MASK_REG, config);
|
||||||
|
|
||||||
gpio_init_callback(&ctx->irq_cb, trx_isr_handler, BIT(conf->irq.pin));
|
gpio_init_callback(&ctx->irq_cb, trx_isr_handler, BIT(conf->irq_gpio.pin));
|
||||||
gpio_add_callback(ctx->irq_gpio, &ctx->irq_cb);
|
gpio_add_callback(conf->irq_gpio.port, &ctx->irq_cb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -782,58 +779,52 @@ static int power_on_and_setup(const struct device *dev)
|
||||||
static inline int configure_gpios(const struct device *dev)
|
static inline int configure_gpios(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct rf2xx_config *conf = dev->config;
|
const struct rf2xx_config *conf = dev->config;
|
||||||
struct rf2xx_context *ctx = dev->data;
|
|
||||||
|
|
||||||
/* Chip IRQ line */
|
/* Chip IRQ line */
|
||||||
ctx->irq_gpio = device_get_binding(conf->irq.devname);
|
if (!device_is_ready(conf->irq_gpio.port)) {
|
||||||
if (ctx->irq_gpio == NULL) {
|
LOG_ERR("IRQ GPIO device not ready");
|
||||||
LOG_ERR("Failed to get instance of %s device",
|
return -ENODEV;
|
||||||
conf->irq.devname);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
gpio_pin_configure(ctx->irq_gpio, conf->irq.pin, conf->irq.flags |
|
gpio_pin_configure_dt(&conf->irq_gpio, GPIO_INPUT);
|
||||||
GPIO_INPUT);
|
gpio_pin_interrupt_configure_dt(&conf->irq_gpio,
|
||||||
gpio_pin_interrupt_configure(ctx->irq_gpio, conf->irq.pin,
|
GPIO_INT_EDGE_TO_ACTIVE);
|
||||||
GPIO_INT_EDGE_TO_ACTIVE);
|
|
||||||
|
|
||||||
/* Chip RESET line */
|
/* Chip RESET line */
|
||||||
ctx->reset_gpio = device_get_binding(conf->reset.devname);
|
if (!device_is_ready(conf->reset_gpio.port)) {
|
||||||
if (ctx->reset_gpio == NULL) {
|
LOG_ERR("RESET GPIO device not ready");
|
||||||
LOG_ERR("Failed to get instance of %s device",
|
return -ENODEV;
|
||||||
conf->reset.devname);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
gpio_pin_configure(ctx->reset_gpio, conf->reset.pin, conf->reset.flags |
|
gpio_pin_configure_dt(&conf->reset_gpio, GPIO_OUTPUT_INACTIVE);
|
||||||
GPIO_OUTPUT_INACTIVE);
|
|
||||||
|
|
||||||
/* Chip SLPTR line */
|
/* Chip SLPTR line */
|
||||||
ctx->slptr_gpio = device_get_binding(conf->slptr.devname);
|
if (!device_is_ready(conf->slptr_gpio.port)) {
|
||||||
if (ctx->slptr_gpio == NULL) {
|
LOG_ERR("SLPTR GPIO device not ready");
|
||||||
LOG_ERR("Failed to get instance of %s device",
|
return -ENODEV;
|
||||||
conf->slptr.devname);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
gpio_pin_configure(ctx->slptr_gpio, conf->slptr.pin, conf->slptr.flags |
|
gpio_pin_configure_dt(&conf->slptr_gpio, GPIO_OUTPUT_INACTIVE);
|
||||||
GPIO_OUTPUT_INACTIVE);
|
|
||||||
|
|
||||||
/* Chip DIG2 line (Optional feature) */
|
/* Chip DIG2 line (Optional feature) */
|
||||||
ctx->dig2_gpio = device_get_binding(conf->dig2.devname);
|
if (conf->dig2_gpio.port != NULL) {
|
||||||
if (ctx->dig2_gpio != NULL) {
|
if (!device_is_ready(conf->dig2_gpio.port)) {
|
||||||
|
LOG_ERR("DIG2 GPIO device not ready");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
LOG_INF("Optional instance of %s device activated",
|
LOG_INF("Optional instance of %s device activated",
|
||||||
conf->dig2.devname);
|
conf->dig2_gpio.port->name);
|
||||||
gpio_pin_configure(ctx->dig2_gpio, conf->dig2.pin,
|
gpio_pin_configure_dt(&conf->dig2_gpio, GPIO_INPUT);
|
||||||
conf->dig2.flags | GPIO_INPUT);
|
gpio_pin_interrupt_configure_dt(&conf->dig2_gpio,
|
||||||
gpio_pin_interrupt_configure(ctx->dig2_gpio, conf->dig2.pin,
|
GPIO_INT_EDGE_TO_ACTIVE);
|
||||||
GPIO_INT_EDGE_TO_ACTIVE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Chip CLKM line (Optional feature) */
|
/* Chip CLKM line (Optional feature) */
|
||||||
ctx->clkm_gpio = device_get_binding(conf->clkm.devname);
|
if (conf->clkm_gpio.port != NULL) {
|
||||||
if (ctx->clkm_gpio != NULL) {
|
if (!device_is_ready(conf->clkm_gpio.port)) {
|
||||||
|
LOG_ERR("CLKM GPIO device not ready");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
LOG_INF("Optional instance of %s device activated",
|
LOG_INF("Optional instance of %s device activated",
|
||||||
conf->clkm.devname);
|
conf->clkm_gpio.port->name);
|
||||||
gpio_pin_configure(ctx->clkm_gpio, conf->clkm.pin,
|
gpio_pin_configure_dt(&conf->clkm_gpio, GPIO_INPUT);
|
||||||
conf->clkm.flags | GPIO_INPUT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -935,22 +926,6 @@ static struct ieee802154_radio_api rf2xx_radio_api = {
|
||||||
#endif
|
#endif
|
||||||
#endif /* CONFIG_IEEE802154_RAW_MODE */
|
#endif /* CONFIG_IEEE802154_RAW_MODE */
|
||||||
|
|
||||||
/*
|
|
||||||
* Optional features place holders, get a 0 if the "gpio" doesn't exist
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define DRV_INST_GPIO_LABEL(n, gpio_pha) \
|
|
||||||
UTIL_AND(DT_INST_NODE_HAS_PROP(n, gpio_pha), \
|
|
||||||
DT_INST_GPIO_LABEL(n, gpio_pha))
|
|
||||||
|
|
||||||
#define DRV_INST_GPIO_PIN(n, gpio_pha) \
|
|
||||||
UTIL_AND(DT_INST_NODE_HAS_PROP(n, gpio_pha), \
|
|
||||||
DT_INST_GPIO_PIN(n, gpio_pha))
|
|
||||||
|
|
||||||
#define DRV_INST_GPIO_FLAGS(n, gpio_pha) \
|
|
||||||
UTIL_AND(DT_INST_NODE_HAS_PROP(n, gpio_pha), \
|
|
||||||
DT_INST_GPIO_FLAGS(n, gpio_pha))
|
|
||||||
|
|
||||||
#define DRV_INST_LOCAL_MAC_ADDRESS(n) \
|
#define DRV_INST_LOCAL_MAC_ADDRESS(n) \
|
||||||
UTIL_AND(DT_INST_NODE_HAS_PROP(n, local_mac_address), \
|
UTIL_AND(DT_INST_NODE_HAS_PROP(n, local_mac_address), \
|
||||||
UTIL_AND(DT_INST_PROP_LEN(n, local_mac_address) == 8, \
|
UTIL_AND(DT_INST_PROP_LEN(n, local_mac_address) == 8, \
|
||||||
|
@ -960,27 +935,11 @@ static struct ieee802154_radio_api rf2xx_radio_api = {
|
||||||
static const struct rf2xx_config rf2xx_ctx_config_##n = { \
|
static const struct rf2xx_config rf2xx_ctx_config_##n = { \
|
||||||
.inst = n, \
|
.inst = n, \
|
||||||
.has_mac = DT_INST_NODE_HAS_PROP(n, local_mac_address), \
|
.has_mac = DT_INST_NODE_HAS_PROP(n, local_mac_address), \
|
||||||
\
|
.irq_gpio = GPIO_DT_SPEC_INST_GET(n, irq_gpios), \
|
||||||
.irq.devname = DRV_INST_GPIO_LABEL(n, irq_gpios), \
|
.reset_gpio = GPIO_DT_SPEC_INST_GET(n, reset_gpios), \
|
||||||
.irq.pin = DRV_INST_GPIO_PIN(n, irq_gpios), \
|
.slptr_gpio = GPIO_DT_SPEC_INST_GET(n, slptr_gpios), \
|
||||||
.irq.flags = DRV_INST_GPIO_FLAGS(n, irq_gpios), \
|
.dig2_gpio = GPIO_DT_SPEC_INST_GET_OR(n, dig2_gpios, {}), \
|
||||||
\
|
.clkm_gpio = GPIO_DT_SPEC_INST_GET_OR(n, clkm_gpios, {}), \
|
||||||
.reset.devname = DRV_INST_GPIO_LABEL(n, reset_gpios), \
|
|
||||||
.reset.pin = DRV_INST_GPIO_PIN(n, reset_gpios), \
|
|
||||||
.reset.flags = DRV_INST_GPIO_FLAGS(n, reset_gpios), \
|
|
||||||
\
|
|
||||||
.slptr.devname = DRV_INST_GPIO_LABEL(n, slptr_gpios), \
|
|
||||||
.slptr.pin = DRV_INST_GPIO_PIN(n, slptr_gpios), \
|
|
||||||
.slptr.flags = DRV_INST_GPIO_FLAGS(n, slptr_gpios), \
|
|
||||||
\
|
|
||||||
.dig2.devname = DRV_INST_GPIO_LABEL(n, dig2_gpios), \
|
|
||||||
.dig2.pin = DRV_INST_GPIO_PIN(n, dig2_gpios), \
|
|
||||||
.dig2.flags = DRV_INST_GPIO_FLAGS(n, dig2_gpios), \
|
|
||||||
\
|
|
||||||
.clkm.devname = DRV_INST_GPIO_LABEL(n, clkm_gpios), \
|
|
||||||
.clkm.pin = DRV_INST_GPIO_PIN(n, clkm_gpios), \
|
|
||||||
.clkm.flags = DRV_INST_GPIO_FLAGS(n, clkm_gpios), \
|
|
||||||
\
|
|
||||||
.spi = SPI_DT_SPEC_INST_GET(n, SPI_WORD_SET(8) | \
|
.spi = SPI_DT_SPEC_INST_GET(n, SPI_WORD_SET(8) | \
|
||||||
SPI_TRANSFER_MSB, 0), \
|
SPI_TRANSFER_MSB, 0), \
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,18 +74,12 @@ enum rf2xx_trx_model_t {
|
||||||
RF2XX_TRX_MODEL_233 = 0x0B,
|
RF2XX_TRX_MODEL_233 = 0x0B,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rf2xx_dt_gpio_t {
|
|
||||||
const char *devname;
|
|
||||||
uint32_t pin;
|
|
||||||
uint32_t flags;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rf2xx_config {
|
struct rf2xx_config {
|
||||||
struct rf2xx_dt_gpio_t irq;
|
struct gpio_dt_spec irq_gpio;
|
||||||
struct rf2xx_dt_gpio_t reset;
|
struct gpio_dt_spec reset_gpio;
|
||||||
struct rf2xx_dt_gpio_t slptr;
|
struct gpio_dt_spec slptr_gpio;
|
||||||
struct rf2xx_dt_gpio_t dig2;
|
struct gpio_dt_spec dig2_gpio;
|
||||||
struct rf2xx_dt_gpio_t clkm;
|
struct gpio_dt_spec clkm_gpio;
|
||||||
|
|
||||||
struct spi_dt_spec spi;
|
struct spi_dt_spec spi;
|
||||||
|
|
||||||
|
@ -98,12 +92,6 @@ struct rf2xx_context {
|
||||||
|
|
||||||
const struct device *dev;
|
const struct device *dev;
|
||||||
|
|
||||||
const struct device *irq_gpio;
|
|
||||||
const struct device *reset_gpio;
|
|
||||||
const struct device *slptr_gpio;
|
|
||||||
const struct device *dig2_gpio;
|
|
||||||
const struct device *clkm_gpio;
|
|
||||||
|
|
||||||
struct gpio_callback irq_cb;
|
struct gpio_callback irq_cb;
|
||||||
|
|
||||||
struct k_thread trx_thread;
|
struct k_thread trx_thread;
|
||||||
|
|
|
@ -27,30 +27,28 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
|
||||||
void rf2xx_iface_phy_rst(const struct device *dev)
|
void rf2xx_iface_phy_rst(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct rf2xx_config *conf = dev->config;
|
const struct rf2xx_config *conf = dev->config;
|
||||||
const struct rf2xx_context *ctx = dev->data;
|
|
||||||
|
|
||||||
/* Ensure control lines have correct levels. */
|
/* Ensure control lines have correct levels. */
|
||||||
gpio_pin_set(ctx->reset_gpio, conf->reset.pin, 0);
|
gpio_pin_set_dt(&conf->reset_gpio, 0);
|
||||||
gpio_pin_set(ctx->slptr_gpio, conf->slptr.pin, 0);
|
gpio_pin_set_dt(&conf->slptr_gpio, 0);
|
||||||
|
|
||||||
/* Wait typical time of timer TR1. */
|
/* Wait typical time of timer TR1. */
|
||||||
k_busy_wait(330);
|
k_busy_wait(330);
|
||||||
|
|
||||||
gpio_pin_set(ctx->reset_gpio, conf->reset.pin, 1);
|
gpio_pin_set_dt(&conf->reset_gpio, 1);
|
||||||
k_busy_wait(10);
|
k_busy_wait(10);
|
||||||
gpio_pin_set(ctx->reset_gpio, conf->reset.pin, 0);
|
gpio_pin_set_dt(&conf->reset_gpio, 0);
|
||||||
}
|
}
|
||||||
void rf2xx_iface_phy_tx_start(const struct device *dev)
|
void rf2xx_iface_phy_tx_start(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct rf2xx_config *conf = dev->config;
|
const struct rf2xx_config *conf = dev->config;
|
||||||
const struct rf2xx_context *ctx = dev->data;
|
|
||||||
|
|
||||||
/* Start TX transmission at rise edge */
|
/* Start TX transmission at rise edge */
|
||||||
gpio_pin_set(ctx->slptr_gpio, conf->slptr.pin, 1);
|
gpio_pin_set_dt(&conf->slptr_gpio, 1);
|
||||||
/* 16.125[μs] delay to detect signal */
|
/* 16.125[μs] delay to detect signal */
|
||||||
k_busy_wait(20);
|
k_busy_wait(20);
|
||||||
/* restore initial pin state */
|
/* restore initial pin state */
|
||||||
gpio_pin_set(ctx->slptr_gpio, conf->slptr.pin, 0);
|
gpio_pin_set_dt(&conf->slptr_gpio, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t rf2xx_iface_reg_read(const struct device *dev,
|
uint8_t rf2xx_iface_reg_read(const struct device *dev,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue