From 433ccc9a11b8742f29fd01304c16e85a53e9d0f7 Mon Sep 17 00:00:00 2001 From: korotkoves Date: Thu, 31 Jan 2019 16:17:20 +0300 Subject: [PATCH] sx127x: set ValidHeader interrupt to NETDEV_EVENT_RX_STARTED event --- drivers/sx127x/sx127x_getset.c | 24 ++++++++------- drivers/sx127x/sx127x_netdev.c | 53 ++++++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/drivers/sx127x/sx127x_getset.c b/drivers/sx127x/sx127x_getset.c index bfbaab5d26..c9e0f1504b 100644 --- a/drivers/sx127x/sx127x_getset.c +++ b/drivers/sx127x/sx127x_getset.c @@ -269,37 +269,41 @@ void sx127x_set_rx(sx127x_t *dev) sx127x_reg_write(dev, SX127X_REG_LR_IRQFLAGSMASK, /* SX127X_RF_LORA_IRQFLAGS_RXTIMEOUT | SX127X_RF_LORA_IRQFLAGS_RXDONE | - SX127X_RF_LORA_IRQFLAGS_PAYLOADCRCERROR | */ - SX127X_RF_LORA_IRQFLAGS_VALIDHEADER | + SX127X_RF_LORA_IRQFLAGS_PAYLOADCRCERROR | + SX127X_RF_LORA_IRQFLAGS_VALIDHEADER | */ SX127X_RF_LORA_IRQFLAGS_TXDONE | SX127X_RF_LORA_IRQFLAGS_CADDONE | /* SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL | */ SX127X_RF_LORA_IRQFLAGS_CADDETECTED); - /* DIO0=RxDone, DIO2=FhssChangeChannel */ + /* DIO0=RxDone, DIO2=FhssChangeChannel, DIO3=ValidHeader */ sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & SX127X_RF_LORA_DIOMAPPING1_DIO0_MASK & - SX127X_RF_LORA_DIOMAPPING1_DIO2_MASK) | + SX127X_RF_LORA_DIOMAPPING1_DIO2_MASK & + SX127X_RF_LORA_DIOMAPPING1_DIO3_MASK) | SX127X_RF_LORA_DIOMAPPING1_DIO0_00 | - SX127X_RF_LORA_DIOMAPPING1_DIO2_00); + SX127X_RF_LORA_DIOMAPPING1_DIO2_00 | + SX127X_RF_LORA_DIOMAPPING1_DIO3_01); } else { sx127x_reg_write(dev, SX127X_REG_LR_IRQFLAGSMASK, /* SX127X_RF_LORA_IRQFLAGS_RXTIMEOUT | SX127X_RF_LORA_IRQFLAGS_RXDONE | - SX127X_RF_LORA_IRQFLAGS_PAYLOADCRCERROR | */ - SX127X_RF_LORA_IRQFLAGS_VALIDHEADER | + SX127X_RF_LORA_IRQFLAGS_PAYLOADCRCERROR | + SX127X_RF_LORA_IRQFLAGS_VALIDHEADER | */ SX127X_RF_LORA_IRQFLAGS_TXDONE | SX127X_RF_LORA_IRQFLAGS_CADDONE | SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL | SX127X_RF_LORA_IRQFLAGS_CADDETECTED); - /* DIO0=RxDone */ + /* DIO0=RxDone, DIO3=ValidHeader */ sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & - SX127X_RF_LORA_DIOMAPPING1_DIO0_MASK) | - SX127X_RF_LORA_DIOMAPPING1_DIO0_00); + SX127X_RF_LORA_DIOMAPPING1_DIO0_MASK & + SX127X_RF_LORA_DIOMAPPING1_DIO3_MASK) | + SX127X_RF_LORA_DIOMAPPING1_DIO0_00 | + SX127X_RF_LORA_DIOMAPPING1_DIO3_01); } sx127x_reg_write(dev, SX127X_REG_LR_FIFORXBASEADDR, 0); diff --git a/drivers/sx127x/sx127x_netdev.c b/drivers/sx127x/sx127x_netdev.c index 011c754973..c9778123a5 100644 --- a/drivers/sx127x/sx127x_netdev.c +++ b/drivers/sx127x/sx127x_netdev.c @@ -80,7 +80,8 @@ static int _send(netdev_t *netdev, const iolist_t *iolist) } break; default: - puts("sx127x_netdev, Unsupported modem"); + DEBUG("[sx127x] netdev: Unsupported modem (%d)\n", + dev->settings.modem); break; } @@ -241,6 +242,7 @@ static void _isr(netdev_t *netdev) case SX127X_RF_LORA_IRQFLAGS_CADDETECTED: case SX127X_RF_LORA_IRQFLAGS_CADDONE: + case SX127X_RF_LORA_IRQFLAGS_VALIDHEADER: irq = SX127X_IRQ_DIO3; break; @@ -690,23 +692,44 @@ void _on_dio3_irq(void *arg) sx127x_t *dev = (sx127x_t *) arg; netdev_t *netdev = (netdev_t *) dev; - switch (dev->settings.modem) { - case SX127X_MODEM_FSK: - break; - case SX127X_MODEM_LORA: - /* Clear IRQ */ - sx127x_reg_write(dev, SX127X_REG_LR_IRQFLAGS, - SX127X_RF_LORA_IRQFLAGS_CADDETECTED | - SX127X_RF_LORA_IRQFLAGS_CADDONE); + switch (dev->settings.state) { + case SX127X_RF_CAD: + switch (dev->settings.modem) { + case SX127X_MODEM_FSK: + break; + case SX127X_MODEM_LORA: + /* Clear IRQ */ + sx127x_reg_write(dev, SX127X_REG_LR_IRQFLAGS, + SX127X_RF_LORA_IRQFLAGS_CADDETECTED | + SX127X_RF_LORA_IRQFLAGS_CADDONE); - /* Send event message */ - dev->_internal.is_last_cad_success = ((sx127x_reg_read(dev, SX127X_REG_LR_IRQFLAGS) & - SX127X_RF_LORA_IRQFLAGS_CADDETECTED) == - SX127X_RF_LORA_IRQFLAGS_CADDETECTED); - netdev->event_callback(netdev, NETDEV_EVENT_CAD_DONE); + /* Send event message */ + dev->_internal.is_last_cad_success = ((sx127x_reg_read(dev, SX127X_REG_LR_IRQFLAGS) & + SX127X_RF_LORA_IRQFLAGS_CADDETECTED) == + SX127X_RF_LORA_IRQFLAGS_CADDETECTED); + netdev->event_callback(netdev, NETDEV_EVENT_CAD_DONE); + break; + default: + puts("[sx127x] netdev: sx127x_on_dio3: unknown modem"); + break; + } + break; + case SX127X_RF_RX_RUNNING: + switch (dev->settings.modem) { + case SX127X_MODEM_FSK: + break; + case SX127X_MODEM_LORA: + /* Clear IRQ */ + sx127x_reg_write(dev, SX127X_REG_LR_IRQFLAGS, SX127X_RF_LORA_IRQFLAGS_VALIDHEADER); + + netdev->event_callback(netdev, NETDEV_EVENT_RX_STARTED); + break; + default: + break; + } break; default: - puts("[sx127x] netdev: sx127x_on_dio3: unknown modem"); + DEBUG("[sx127x] netdev: sx127x_on_dio3: unknown state"); break; } }