From 4b60ab07fe25c0a6e54220ae187c6d2593422b7a Mon Sep 17 00:00:00 2001 From: korotkoves Date: Thu, 31 Jan 2019 13:46:38 +0300 Subject: [PATCH 1/4] sx127x: fix for sending in implicit headers mode --- drivers/sx127x/sx127x_netdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/sx127x/sx127x_netdev.c b/drivers/sx127x/sx127x_netdev.c index e9c533719ed8..759e079a6826 100644 --- a/drivers/sx127x/sx127x_netdev.c +++ b/drivers/sx127x/sx127x_netdev.c @@ -59,7 +59,9 @@ static int _send(netdev_t *netdev, const iolist_t *iolist) break; case SX127X_MODEM_LORA: /* Initializes the payload size */ - sx127x_set_payload_length(dev, size); + if (!sx127x_get_fixed_header_len_mode(dev)) { + sx127x_set_payload_length(dev, size); + } /* Full buffer used for Tx */ sx127x_reg_write(dev, SX127X_REG_LR_FIFOTXBASEADDR, 0x00); From 4ccdb3ac80c8ce6a5856e3f663d201c9662e69ad Mon Sep 17 00:00:00 2001 From: korotkoves Date: Thu, 31 Jan 2019 13:57:04 +0300 Subject: [PATCH 2/4] sx127x: remove duplicate code + fix for sending --- drivers/sx127x/sx127x_getset.c | 11 ++++++++--- drivers/sx127x/sx127x_netdev.c | 24 +----------------------- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/drivers/sx127x/sx127x_getset.c b/drivers/sx127x/sx127x_getset.c index ec60723425dd..bfbaab5d2628 100644 --- a/drivers/sx127x/sx127x_getset.c +++ b/drivers/sx127x/sx127x_getset.c @@ -351,17 +351,18 @@ void sx127x_set_tx(sx127x_t *dev) } else { + /* Enable TXDONE interrupt */ 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 | - /* RFLR_IRQFLAGS_TXDONE | */ + /* SX127X_RF_LORA_IRQFLAGS_TXDONE | */ SX127X_RF_LORA_IRQFLAGS_CADDONE | SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL | SX127X_RF_LORA_IRQFLAGS_CADDETECTED); - /* DIO0=TxDone */ + /* Set TXDONE interrupt to the DIO0 line */ sx127x_reg_write(dev, SX127X_REG_DIOMAPPING1, (sx127x_reg_read(dev, SX127X_REG_DIOMAPPING1) & SX127X_RF_LORA_DIOMAPPING1_DIO0_MASK) | @@ -371,10 +372,14 @@ void sx127x_set_tx(sx127x_t *dev) break; } - sx127x_set_state(dev, SX127X_RF_RX_RUNNING); + sx127x_set_state(dev, SX127X_RF_TX_RUNNING); + + /* Start TX timeout timer */ if (dev->settings.lora.tx_timeout != 0) { xtimer_set(&(dev->_internal.tx_timeout_timer), dev->settings.lora.tx_timeout); } + + /* Put chip into transfer mode */ sx127x_set_op_mode(dev, SX127X_RF_OPMODE_TRANSMITTER ); } diff --git a/drivers/sx127x/sx127x_netdev.c b/drivers/sx127x/sx127x_netdev.c index 759e079a6826..011c75497353 100644 --- a/drivers/sx127x/sx127x_netdev.c +++ b/drivers/sx127x/sx127x_netdev.c @@ -84,29 +84,7 @@ static int _send(netdev_t *netdev, const iolist_t *iolist) break; } - /* Enable TXDONE interrupt */ - 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_TXDONE | */ - SX127X_RF_LORA_IRQFLAGS_CADDONE | - SX127X_RF_LORA_IRQFLAGS_FHSSCHANGEDCHANNEL | - SX127X_RF_LORA_IRQFLAGS_CADDETECTED); - - /* Set TXDONE interrupt to the DIO0 line */ - 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_01); - - /* Start TX timeout timer */ - xtimer_set(&dev->_internal.tx_timeout_timer, dev->settings.lora.tx_timeout); - - /* Put chip into transfer mode */ - sx127x_set_state(dev, SX127X_RF_TX_RUNNING); - sx127x_set_op_mode(dev, SX127X_RF_OPMODE_TRANSMITTER); + sx127x_set_tx(dev); return 0; } From 433ccc9a11b8742f29fd01304c16e85a53e9d0f7 Mon Sep 17 00:00:00 2001 From: korotkoves Date: Thu, 31 Jan 2019 16:17:20 +0300 Subject: [PATCH 3/4] sx127x: set ValidHeader interrupt to NETDEV_EVENT_RX_STARTED event --- drivers/sx127x/sx127x_getset.c | 24 +++++++++------- drivers/sx127x/sx127x_netdev.c | 51 ++++++++++++++++++++++++---------- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/drivers/sx127x/sx127x_getset.c b/drivers/sx127x/sx127x_getset.c index bfbaab5d2628..c9e0f1504bae 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 011c75497353..c9778123a53b 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: + 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); + break; + default: + puts("[sx127x] netdev: sx127x_on_dio3: unknown modem"); + break; + } 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); + 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); - /* 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); + 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; } } From 36affe13c2245e4a354f35bbe704121bfa10b3c2 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Fri, 8 Mar 2019 08:45:42 +0100 Subject: [PATCH 4/4] tests/driver_sx127x: handle RX started netdev event --- tests/driver_sx127x/main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/driver_sx127x/main.c b/tests/driver_sx127x/main.c index 5261b869d223..a6ccad86feb2 100644 --- a/tests/driver_sx127x/main.c +++ b/tests/driver_sx127x/main.c @@ -326,6 +326,10 @@ static void _event_cb(netdev_t *dev, netdev_event_t event) size_t len; netdev_sx127x_lora_packet_info_t packet_info; switch (event) { + case NETDEV_EVENT_RX_STARTED: + puts("Data reception started"); + break; + case NETDEV_EVENT_RX_COMPLETE: len = dev->driver->recv(dev, NULL, 0, 0); dev->driver->recv(dev, message, len, &packet_info);