From 911ffca2c4b9234f863e8ca1479623fbefb0e437 Mon Sep 17 00:00:00 2001 From: elphmatt Date: Mon, 24 Jun 2024 10:47:52 -0500 Subject: [PATCH 1/3] Changes to improve useability with class C devices - added a function called int lorawan_change_device_class(DeviceClass_t newClass) that changes the global variable deivceClass to newClass and runs the LmHandlerRequestClass function -changed the iqr call for dio_gpio_callback to be a raw irq handler in order to free up the default gpio iqr callback mechanism for the user application --- src/boards/rp2040/sx1276-board.c | 38 +++++++++++++++++++++++++++----- src/include/pico/lorawan.h | 2 ++ src/lorawan.c | 17 ++++++++++---- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/boards/rp2040/sx1276-board.c b/src/boards/rp2040/sx1276-board.c index f6721bf..229b4bf 100644 --- a/src/boards/rp2040/sx1276-board.c +++ b/src/boards/rp2040/sx1276-board.c @@ -67,11 +67,26 @@ const struct Radio_s Radio = static DioIrqHandler** irq_handlers; -void dio_gpio_callback(uint gpio, uint32_t events) +// void dio_gpio_callback(uint gpio, uint32_t events) +// { +// if (gpio == SX1276.DIO0.pin) { +// irq_handlers[0](NULL); +// } else if (gpio == SX1276.DIO1.pin) { +// irq_handlers[1](NULL); +// } +// } + + +void dio_gpio_callback() { - if (gpio == SX1276.DIO0.pin) { + if(gpio_get_irq_event_mask(SX1276.DIO0.pin) & GPIO_IRQ_EDGE_RISE) + { + gpio_acknowledge_irq(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE); irq_handlers[0](NULL); - } else if (gpio == SX1276.DIO1.pin) { + } + if(gpio_get_irq_event_mask(SX1276.DIO1.pin) & GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL) + { + gpio_acknowledge_irq(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL); irq_handlers[1](NULL); } } @@ -122,8 +137,19 @@ void SX1276IoIrqInit( DioIrqHandler **irqHandlers ) { irq_handlers = irqHandlers; - gpio_set_irq_enabled_with_callback(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true, &dio_gpio_callback); - gpio_set_irq_enabled_with_callback(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &dio_gpio_callback); + gpio_set_irq_enabled(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true); + gpio_add_raw_irq_handler(SX1276.DIO0.pin,&dio_gpio_callback); + + irq_set_enabled(IO_IRQ_BANK0,true); + + + gpio_set_irq_enabled(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true); + gpio_add_raw_irq_handler(SX1276.DIO1.pin,&dio_gpio_callback); + + irq_set_enabled(IO_IRQ_BANK0,true); + + // gpio_set_irq_enabled_with_callback(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true, &dio_gpio_callback); + // gpio_set_irq_enabled_with_callback(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &dio_gpio_callback); } /*! @@ -217,4 +243,4 @@ static uint8_t SX1276GetPaSelect( int8_t power ) uint32_t SX1276GetBoardTcxoWakeupTime( void ) { return 0; -} +} \ No newline at end of file diff --git a/src/include/pico/lorawan.h b/src/include/pico/lorawan.h index be0a71f..85436d3 100644 --- a/src/include/pico/lorawan.h +++ b/src/include/pico/lorawan.h @@ -44,6 +44,8 @@ struct lorawan_otaa_settings { const char* channel_mask; }; +int lorawan_change_device_class(DeviceClass_t newClass); + const char* lorawan_default_dev_eui(char* dev_eui); int lorawan_init(const struct lorawan_sx1276_settings* sx1276_settings, LoRaMacRegion_t region); diff --git a/src/lorawan.c b/src/lorawan.c index dc24e60..a283ae2 100644 --- a/src/lorawan.c +++ b/src/lorawan.c @@ -52,14 +52,14 @@ * * \remark Please note that when ADR is enabled the end-device should be static */ -#define LORAWAN_ADR_STATE LORAMAC_HANDLER_ADR_ON +#define LORAWAN_ADR_STATE LORAMAC_HANDLER_ADR_OFF /*! * Default datarate * * \remark Please note that LORAWAN_DEFAULT_DATARATE is used only when ADR is disabled */ -#define LORAWAN_DEFAULT_DATARATE DR_0 +#define LORAWAN_DEFAULT_DATARATE DR_1 /*! * LoRaWAN confirmed messages @@ -76,7 +76,7 @@ * * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes */ -#define LORAWAN_DUTYCYCLE_ON true +#define LORAWAN_DUTYCYCLE_ON false /*! * Indicates if the end-device is to be connected to a private or public network @@ -184,6 +184,15 @@ static bool Debug = false; extern void EepromMcuInit(); extern uint8_t EepromMcuFlush(); + +static DeviceClass_t deviceClass = LORAWAN_DEFAULT_CLASS; + +int lorawan_change_device_class(DeviceClass_t newClass) +{ + deviceClass = newClass; + return LmHandlerRequestClass( deviceClass ); +} + const char* lorawan_default_dev_eui(char* dev_eui) { uint8_t boardId[8]; @@ -582,7 +591,7 @@ static void OnJoinRequest( LmHandlerJoinParams_t* params ) } else { - LmHandlerRequestClass( LORAWAN_DEFAULT_CLASS ); + LmHandlerRequestClass( deviceClass ); } } From 0a5436b2dba9b80524dbccf73ed3c9534e8c6894 Mon Sep 17 00:00:00 2001 From: elphmatt Date: Tue, 25 Jun 2024 11:06:02 -0500 Subject: [PATCH 2/3] forgot to put LORAWAN_ADR_STATE, LORAWAN_DEFAULT_DATARATE, and LORAWAN_DUTYCYCLE_ON back to original --- src/lorawan.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lorawan.c b/src/lorawan.c index a283ae2..5dbaf60 100644 --- a/src/lorawan.c +++ b/src/lorawan.c @@ -52,14 +52,14 @@ * * \remark Please note that when ADR is enabled the end-device should be static */ -#define LORAWAN_ADR_STATE LORAMAC_HANDLER_ADR_OFF +#define LORAWAN_ADR_STATE LORAMAC_HANDLER_ADR_ON /*! * Default datarate * * \remark Please note that LORAWAN_DEFAULT_DATARATE is used only when ADR is disabled */ -#define LORAWAN_DEFAULT_DATARATE DR_1 +#define LORAWAN_DEFAULT_DATARATE DR_0 /*! * LoRaWAN confirmed messages @@ -76,7 +76,7 @@ * * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes */ -#define LORAWAN_DUTYCYCLE_ON false +#define LORAWAN_DUTYCYCLE_ON true /*! * Indicates if the end-device is to be connected to a private or public network From b9acd4bf3cf23b7660b1e7e02f1341ab5f53bcb9 Mon Sep 17 00:00:00 2001 From: elphmatt Date: Mon, 7 Oct 2024 13:52:53 -0400 Subject: [PATCH 3/3] fix for the 2.0.0 SDK have to pass the raw irq handler before enabling the irq --- src/boards/rp2040/sx1276-board.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/boards/rp2040/sx1276-board.c b/src/boards/rp2040/sx1276-board.c index 229b4bf..c734b37 100644 --- a/src/boards/rp2040/sx1276-board.c +++ b/src/boards/rp2040/sx1276-board.c @@ -137,14 +137,13 @@ void SX1276IoIrqInit( DioIrqHandler **irqHandlers ) { irq_handlers = irqHandlers; - gpio_set_irq_enabled(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true); gpio_add_raw_irq_handler(SX1276.DIO0.pin,&dio_gpio_callback); + gpio_set_irq_enabled(SX1276.DIO0.pin, GPIO_IRQ_EDGE_RISE, true); irq_set_enabled(IO_IRQ_BANK0,true); - - gpio_set_irq_enabled(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true); gpio_add_raw_irq_handler(SX1276.DIO1.pin,&dio_gpio_callback); + gpio_set_irq_enabled(SX1276.DIO1.pin, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true); irq_set_enabled(IO_IRQ_BANK0,true);