Merge pull request #9815 from leandrolanzieri/sx127x_multi_dio
drivers/sx127x: Add initial support for multi interrupt pins
This commit is contained in:
commit
a4be4bb53a
@ -22,5 +22,7 @@ else
|
||||
include $(RIOTMAKE)/tools/bossa.inc.mk
|
||||
endif
|
||||
|
||||
CFLAGS += -DSX127X_USE_DIO_MULTI
|
||||
|
||||
# setup the boards dependencies
|
||||
include $(RIOTBOARD)/$(BOARD)/Makefile.dep
|
||||
|
||||
@ -129,18 +129,17 @@ extern "C" {
|
||||
|
||||
#define SX127X_PARAM_RESET GPIO_UNDEF
|
||||
|
||||
#define SX127X_PARAM_DIOMULTI XBEE1_INT_PIN /* D24 */
|
||||
#define SX127X_PARAM_DIO0 GPIO_UNDEF
|
||||
|
||||
#define SX127X_PARAM_DIO1 GPIO_UNDEF
|
||||
|
||||
#define SX127X_PARAM_DIO2 GPIO_UNDEF
|
||||
|
||||
#define SX127X_PARAM_DIO3 GPIO_UNDEF
|
||||
|
||||
#define SX127X_PARAM_DIO_MULTI XBEE1_INT_PIN /* D24 */
|
||||
|
||||
#define SX127X_PARAM_PASELECT (SX127X_PA_BOOST)
|
||||
|
||||
#define SX127X_PARAMS { .spi = SX127X_PARAM_SPI, \
|
||||
.nss_pin = SX127X_PARAM_SPI_NSS, \
|
||||
.reset_pin = SX127X_PARAM_RESET, \
|
||||
.dio0_pin = SX127X_PARAM_DIOMULTI,\
|
||||
.dio1_pin = SX127X_PARAM_DIO1, \
|
||||
.dio2_pin = SX127X_PARAM_DIO2, \
|
||||
.dio3_pin = SX127X_PARAM_DIO3, \
|
||||
.paselect = SX127X_PARAM_PASELECT }
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
||||
@ -92,6 +92,9 @@ extern "C" {
|
||||
#define SX127X_IRQ_DIO3 (1<<3) /**< DIO3 IRQ */
|
||||
#define SX127X_IRQ_DIO4 (1<<4) /**< DIO4 IRQ */
|
||||
#define SX127X_IRQ_DIO5 (1<<5) /**< DIO5 IRQ */
|
||||
#ifdef SX127X_USE_DIO_MULTI
|
||||
#define SX127X_IRQ_DIO_MULTI (1<<6) /**< DIO MULTI IRQ */
|
||||
#endif
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
@ -208,6 +211,9 @@ typedef struct {
|
||||
gpio_t dio3_pin; /**< Interrupt line DIO3 (CAD done) */
|
||||
gpio_t dio4_pin; /**< Interrupt line DIO4 (not used) */
|
||||
gpio_t dio5_pin; /**< Interrupt line DIO5 (not used) */
|
||||
#ifdef SX127X_USE_DIO_MULTI
|
||||
gpio_t dio_multi_pin; /**< Interrupt line for multiple IRQs */
|
||||
#endif
|
||||
uint8_t paselect; /**< Power amplifier mode (RFO or PABOOST) */
|
||||
} sx127x_params_t;
|
||||
|
||||
@ -246,7 +252,7 @@ void sx127x_setup(sx127x_t *dev, const sx127x_params_t *params);
|
||||
*
|
||||
* @param[in] dev The sx127x device descriptor
|
||||
*/
|
||||
void sx127x_reset(const sx127x_t *dev);
|
||||
int sx127x_reset(const sx127x_t *dev);
|
||||
|
||||
/**
|
||||
* @brief Initializes the transceiver.
|
||||
|
||||
@ -60,19 +60,35 @@ extern "C" {
|
||||
#define SX127X_PARAM_DIO3 GPIO_PIN(1, 4) /* D5 */
|
||||
#endif
|
||||
|
||||
#ifndef SX127X_PARAM_DIO_MULTI
|
||||
#define SX127X_PARAM_DIO_MULTI GPIO_UNDEF
|
||||
#endif
|
||||
|
||||
#ifndef SX127X_PARAM_PASELECT
|
||||
#define SX127X_PARAM_PASELECT (SX127X_PA_RFO)
|
||||
#endif
|
||||
|
||||
#ifndef SX127X_PARAMS
|
||||
#define SX127X_PARAMS { .spi = SX127X_PARAM_SPI, \
|
||||
.nss_pin = SX127X_PARAM_SPI_NSS, \
|
||||
.reset_pin = SX127X_PARAM_RESET, \
|
||||
.dio0_pin = SX127X_PARAM_DIO0, \
|
||||
.dio1_pin = SX127X_PARAM_DIO1, \
|
||||
.dio2_pin = SX127X_PARAM_DIO2, \
|
||||
.dio3_pin = SX127X_PARAM_DIO3, \
|
||||
.paselect = SX127X_PARAM_PASELECT }
|
||||
#ifdef SX127X_USE_DIO_MULTI
|
||||
#define SX127X_PARAMS { .spi = SX127X_PARAM_SPI, \
|
||||
.nss_pin = SX127X_PARAM_SPI_NSS, \
|
||||
.reset_pin = SX127X_PARAM_RESET, \
|
||||
.dio0_pin = SX127X_PARAM_DIO0, \
|
||||
.dio1_pin = SX127X_PARAM_DIO1, \
|
||||
.dio2_pin = SX127X_PARAM_DIO2, \
|
||||
.dio3_pin = SX127X_PARAM_DIO3, \
|
||||
.dio_multi_pin = SX127X_PARAM_DIO_MULTI,\
|
||||
.paselect = SX127X_PARAM_PASELECT }
|
||||
#else
|
||||
#define SX127X_PARAMS { .spi = SX127X_PARAM_SPI, \
|
||||
.nss_pin = SX127X_PARAM_SPI_NSS, \
|
||||
.reset_pin = SX127X_PARAM_RESET, \
|
||||
.dio0_pin = SX127X_PARAM_DIO0, \
|
||||
.dio1_pin = SX127X_PARAM_DIO1, \
|
||||
.dio2_pin = SX127X_PARAM_DIO2, \
|
||||
.dio3_pin = SX127X_PARAM_DIO3, \
|
||||
.paselect = SX127X_PARAM_PASELECT }
|
||||
#endif
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
|
||||
@ -48,11 +48,14 @@ static void _on_tx_timeout(void *arg);
|
||||
static void _on_rx_timeout(void *arg);
|
||||
|
||||
/* SX127X DIO interrupt handlers initialization */
|
||||
#ifndef SX127X_USE_DIO_MULTI
|
||||
static void sx127x_on_dio0_isr(void *arg);
|
||||
static void sx127x_on_dio1_isr(void *arg);
|
||||
static void sx127x_on_dio2_isr(void *arg);
|
||||
static void sx127x_on_dio3_isr(void *arg);
|
||||
|
||||
#else
|
||||
static void sx127x_on_dio_multi_isr(void *arg);
|
||||
#endif
|
||||
|
||||
void sx127x_setup(sx127x_t *dev, const sx127x_params_t *params)
|
||||
{
|
||||
@ -61,7 +64,7 @@ void sx127x_setup(sx127x_t *dev, const sx127x_params_t *params)
|
||||
memcpy(&dev->params, params, sizeof(sx127x_params_t));
|
||||
}
|
||||
|
||||
void sx127x_reset(const sx127x_t *dev)
|
||||
int sx127x_reset(const sx127x_t *dev)
|
||||
{
|
||||
/*
|
||||
* This reset scheme complies with 7.2 chapter of the SX1272/1276 datasheet
|
||||
@ -72,6 +75,13 @@ void sx127x_reset(const sx127x_t *dev)
|
||||
* 2. Set NReset in Hi-Z state
|
||||
* 3. Wait at least 5 milliseconds
|
||||
*/
|
||||
|
||||
/* Check if the reset pin is defined */
|
||||
if (dev->params.reset_pin == GPIO_UNDEF) {
|
||||
DEBUG("[sx127x] error: No reset pin defined.\n");
|
||||
return -SX127X_ERR_GPIOS;
|
||||
}
|
||||
|
||||
gpio_init(dev->params.reset_pin, GPIO_OUT);
|
||||
|
||||
/* Set reset pin to 0 */
|
||||
@ -85,6 +95,8 @@ void sx127x_reset(const sx127x_t *dev)
|
||||
|
||||
/* Wait 10 ms */
|
||||
xtimer_usleep(1000 * 10);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sx127x_init(sx127x_t *dev)
|
||||
@ -187,6 +199,7 @@ static void sx127x_on_dio_isr(sx127x_t *dev, sx127x_flags_t flag)
|
||||
sx127x_isr((netdev_t *)dev);
|
||||
}
|
||||
|
||||
#ifndef SX127X_USE_DIO_MULTI
|
||||
static void sx127x_on_dio0_isr(void *arg)
|
||||
{
|
||||
sx127x_on_dio_isr((sx127x_t*) arg, SX127X_IRQ_DIO0);
|
||||
@ -206,37 +219,81 @@ static void sx127x_on_dio3_isr(void *arg)
|
||||
{
|
||||
sx127x_on_dio_isr((sx127x_t*) arg, SX127X_IRQ_DIO3);
|
||||
}
|
||||
#else
|
||||
static void sx127x_on_dio_multi_isr(void *arg)
|
||||
{
|
||||
sx127x_on_dio_isr((sx127x_t*) arg, SX127X_IRQ_DIO_MULTI);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Internal event handlers */
|
||||
static int _init_gpios(sx127x_t *dev)
|
||||
{
|
||||
int res = gpio_init_int(dev->params.dio0_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio0_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO0 pin\n");
|
||||
return res;
|
||||
int res;
|
||||
|
||||
#ifndef SX127X_USE_DIO_MULTI
|
||||
/* Check if DIO0 pin is defined */
|
||||
if (dev->params.dio0_pin != GPIO_UNDEF) {
|
||||
res = gpio_init_int(dev->params.dio0_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio0_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO0 pin\n");
|
||||
return res;
|
||||
}
|
||||
}
|
||||
else {
|
||||
DEBUG("[sx127x] error: no DIO0 pin defined\n");
|
||||
DEBUG("[sx127x] error: at least one interrupt should be defined\n");
|
||||
return SX127X_ERR_GPIOS;
|
||||
}
|
||||
|
||||
res = gpio_init_int(dev->params.dio1_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio1_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO1 pin\n");
|
||||
return res;
|
||||
/* Check if DIO1 pin is defined */
|
||||
if (dev->params.dio1_pin != GPIO_UNDEF) {
|
||||
res = gpio_init_int(dev->params.dio1_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio1_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO1 pin\n");
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
res = gpio_init_int(dev->params.dio2_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio2_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO2 pin\n");
|
||||
return res;
|
||||
/* check if DIO2 pin is defined */
|
||||
if (dev->params.dio2_pin != GPIO_UNDEF) {
|
||||
res = gpio_init_int(dev->params.dio2_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio2_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO2 pin\n");
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
res = gpio_init_int(dev->params.dio3_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio3_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO3 pin\n");
|
||||
return res;
|
||||
/* check if DIO3 pin is defined */
|
||||
if (dev->params.dio3_pin != GPIO_UNDEF) {
|
||||
res = gpio_init_int(dev->params.dio3_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio3_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO3 pin\n");
|
||||
return res;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (dev->params.dio_multi_pin != GPIO_UNDEF) {
|
||||
DEBUG("[sx127x] info: Trying to initialize DIO MULTI pin\n");
|
||||
res = gpio_init_int(dev->params.dio_multi_pin, GPIO_IN, GPIO_RISING,
|
||||
sx127x_on_dio_multi_isr, dev);
|
||||
if (res < 0) {
|
||||
DEBUG("[sx127x] error: failed to initialize DIO MULTI pin\n");
|
||||
return res;
|
||||
}
|
||||
|
||||
DEBUG("[sx127x] info: DIO MULTI pin initialized successfully\n");
|
||||
}
|
||||
else {
|
||||
DEBUG("[sx127x] error: no DIO MULTI pin defined\n");
|
||||
DEBUG("[sx127x] error at least one interrupt should be defined\n");
|
||||
return SX127X_ERR_GPIOS;
|
||||
}
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -240,6 +240,37 @@ static void _isr(netdev_t *netdev)
|
||||
sx127x_t *dev = (sx127x_t *) netdev;
|
||||
|
||||
uint8_t irq = dev->irq;
|
||||
|
||||
#ifdef SX127X_USE_DIO_MULTI
|
||||
/* if the IRQ is from an OR'd pin check the actual IRQ on the registers */
|
||||
if (irq == SX127X_IRQ_DIO_MULTI) {
|
||||
uint8_t interruptReg = sx127x_reg_read(dev, SX127X_REG_LR_IRQFLAGS);
|
||||
|
||||
switch (interruptReg) {
|
||||
case SX127X_RF_LORA_IRQFLAGS_TXDONE:
|
||||
case SX127X_RF_LORA_IRQFLAGS_RXDONE:
|
||||
irq = SX127X_IRQ_DIO0;
|
||||
break;
|
||||
|
||||
case SX127X_RF_LORA_IRQFLAGS_RXTIMEOUT:
|
||||
irq = SX127X_IRQ_DIO1;
|
||||
break;
|
||||
|
||||
case SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL:
|
||||
irq = SX127X_IRQ_DIO2;
|
||||
break;
|
||||
|
||||
case SX127X_RF_LORA_IRQFLAGS_CADDETECTED:
|
||||
case SX127X_RF_LORA_IRQFLAGS_CADDONE:
|
||||
irq = SX127X_IRQ_DIO3;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
dev->irq = 0;
|
||||
|
||||
switch (irq) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user