diff --git a/pkg/driver_sx126x/Kconfig b/pkg/driver_sx126x/Kconfig new file mode 100644 index 0000000000..8233a61e51 --- /dev/null +++ b/pkg/driver_sx126x/Kconfig @@ -0,0 +1,20 @@ +# Copyright (c) 2021 Inria +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. +# + +config PACKAGE_DRIVER_SX126X + bool "LLCC68 driver package" + depends on TEST_KCONFIG + depends on HAS_PERIPH_SPI + select MODULE_PERIPH_SPI + select MODULE_ZTIMER + select MODULE_ZTIMER_USEC + select MODULE_DRIVER_SX126X_HAL + +config MODULE_DRIVER_SX126X_HAL + bool + help + HAL implementation for the SX126X LoRa radio driver. diff --git a/pkg/driver_sx126x/Makefile b/pkg/driver_sx126x/Makefile new file mode 100644 index 0000000000..4f18518f0c --- /dev/null +++ b/pkg/driver_sx126x/Makefile @@ -0,0 +1,9 @@ +PKG_NAME=driver_sx126x +PKG_URL=https://github.com/Lora-net/sx126x_driver +PKG_VERSION=ba61312213450ae94a4293d75285c1d8f30c04b3 +PKG_LICENSE=BSD + +include $(RIOTBASE)/pkg/pkg.mk + +all: + $(QQ)"$(MAKE)" -C $(PKG_SOURCE_DIR)/src -f $(CURDIR)/$(PKG_NAME).mk diff --git a/pkg/driver_sx126x/Makefile.dep b/pkg/driver_sx126x/Makefile.dep new file mode 100644 index 0000000000..7445a56abe --- /dev/null +++ b/pkg/driver_sx126x/Makefile.dep @@ -0,0 +1,7 @@ +# module dependencies +USEMODULE += driver_sx126x_hal +USEMODULE += ztimer +USEMODULE += ztimer_usec + +# required features +FEATURES_REQUIRED += periph_spi diff --git a/pkg/driver_sx126x/Makefile.include b/pkg/driver_sx126x/Makefile.include new file mode 100644 index 0000000000..1dc9126938 --- /dev/null +++ b/pkg/driver_sx126x/Makefile.include @@ -0,0 +1,3 @@ +INCLUDES += -I$(PKGDIRBASE)/driver_sx126x/src + +DIRS += $(RIOTBASE)/pkg/driver_sx126x/contrib diff --git a/pkg/driver_sx126x/contrib/Makefile b/pkg/driver_sx126x/contrib/Makefile new file mode 100644 index 0000000000..0ee8bc8c92 --- /dev/null +++ b/pkg/driver_sx126x/contrib/Makefile @@ -0,0 +1,3 @@ +MODULE = driver_sx126x_hal + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/driver_sx126x/contrib/driver_sx126x_hal.c b/pkg/driver_sx126x/contrib/driver_sx126x_hal.c new file mode 100644 index 0000000000..4d789469cb --- /dev/null +++ b/pkg/driver_sx126x/contrib/driver_sx126x_hal.c @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2021 Inria + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup pkg_driver_sx126x + * @{ + * + * @file + * @brief HAL implementation for the SX1261/2 LoRa radio driver + * + * @author Alexandre Abadie + * + * @} + */ + +#include "ztimer.h" + +#include "periph/gpio.h" +#include "periph/spi.h" + +#include "sx126x.h" +#include "sx126x_hal.h" + +#define ENABLE_DEBUG 0 +#include "debug.h" + +#define SX126X_SPI_SPEED (SPI_CLK_1MHZ) +#define SX126X_SPI_MODE (SPI_MODE_0) + +sx126x_hal_status_t sx126x_hal_write(const void *context, + const uint8_t *command, const uint16_t command_length, + const uint8_t *data, const uint16_t data_length) +{ + (void)data; + (void)data_length; + sx126x_t *dev = (sx126x_t *)context; + + /* wait for the device to not be busy anymore */ + while (gpio_read(dev->params->busy_pin)) {} + + spi_acquire(dev->params->spi, SPI_CS_UNDEF, SX126X_SPI_MODE, SX126X_SPI_SPEED); + spi_transfer_bytes(dev->params->spi, dev->params->nss_pin, data_length != 0, command, NULL, + command_length); + if (data_length) { + spi_transfer_bytes(dev->params->spi, dev->params->nss_pin, false, data, NULL, data_length); + } + spi_release(dev->params->spi); + return 0; +} + +sx126x_hal_status_t sx126x_hal_read(const void *context, + const uint8_t *command, const uint16_t command_length, + uint8_t *data, const uint16_t data_length) +{ + sx126x_t *dev = (sx126x_t *)context; + + /* wait for the device to not be busy anymore */ + while (gpio_read(dev->params->busy_pin)) {} + + spi_acquire(dev->params->spi, SPI_CS_UNDEF, SX126X_SPI_MODE, SX126X_SPI_SPEED); + spi_transfer_bytes(dev->params->spi, dev->params->nss_pin, true, command, NULL, command_length); + spi_transfer_bytes(dev->params->spi, dev->params->nss_pin, false, NULL, data, data_length); + spi_release(dev->params->spi); + return 0; +} + +sx126x_hal_status_t sx126x_hal_reset(const void *context) +{ + DEBUG("[sx126x_hal] reset\n"); + sx126x_t *dev = (sx126x_t *)context; + + gpio_set(dev->params->reset_pin); + gpio_clear(dev->params->reset_pin); + /* it takes 100us for the radio to be ready after reset */ + ztimer_sleep(ZTIMER_USEC, 100); + gpio_set(dev->params->reset_pin); + return 0; +} + +sx126x_hal_status_t sx126x_hal_wakeup(const void *context) +{ + DEBUG("[sx126x_hal] wakeup\n"); + sx126x_t *dev = (sx126x_t *)context; + + spi_acquire(dev->params->spi, SPI_CS_UNDEF, SX126X_SPI_MODE, SX126X_SPI_SPEED); + gpio_clear(dev->params->nss_pin); + gpio_set(dev->params->nss_pin); + spi_release(dev->params->spi); + + /* it takes 500us for the radio device to be ready after waking up */ + ztimer_sleep(ZTIMER_USEC, 500); + return 0; +} diff --git a/pkg/driver_sx126x/doc.txt b/pkg/driver_sx126x/doc.txt new file mode 100644 index 0000000000..aeaca868d8 --- /dev/null +++ b/pkg/driver_sx126x/doc.txt @@ -0,0 +1,7 @@ +/** + * @defgroup pkg_driver_sx126x SX1261/2 LoRa radio driver + * @ingroup pkg + * @brief This package is an implementation of the SX1261/2 LoRa radio driver. + * + * @see https://github.com/Lora-net/sx126x_driver + */ diff --git a/pkg/driver_sx126x/driver_sx126x.mk b/pkg/driver_sx126x/driver_sx126x.mk new file mode 100644 index 0000000000..0ed96f8ba2 --- /dev/null +++ b/pkg/driver_sx126x/driver_sx126x.mk @@ -0,0 +1,3 @@ +MODULE = driver_sx126x + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/driver_sx126x/patches/0001-adapt-to-RIOT.patch b/pkg/driver_sx126x/patches/0001-adapt-to-RIOT.patch new file mode 100644 index 0000000000..ae478f0b8b --- /dev/null +++ b/pkg/driver_sx126x/patches/0001-adapt-to-RIOT.patch @@ -0,0 +1,62 @@ +From c68e8e74d3de1235c4d818d96573e33e42cbcb74 Mon Sep 17 00:00:00 2001 +From: Alexandre Abadie +Date: Thu, 11 Mar 2021 17:06:43 +0100 +Subject: [PATCH 1/1] adapt to RIOT + +--- + src/sx126x.c | 4 ++-- + src/{sx126x.h => sx126x_driver.h} | 6 +++--- + src/{sx126x_regs.h => sx126x_driver_regs.h} | 0 + 3 files changed, 5 insertions(+), 5 deletions(-) + rename src/{sx126x.h => sx126x_driver.h} (99%) + rename src/{sx126x_regs.h => sx126x_driver_regs.h} (100%) + +diff --git a/src/sx126x.c b/src/sx126x.c +index a61c3ce..2fa7d88 100644 +--- a/src/sx126x.c ++++ b/src/sx126x.c +@@ -35,9 +35,9 @@ + */ + + #include // memcpy +-#include "sx126x.h" ++#include "sx126x_driver.h" + #include "sx126x_hal.h" +-#include "sx126x_regs.h" ++#include "sx126x_driver_regs.h" + + /* + * ----------------------------------------------------------------------------- +diff --git a/src/sx126x.h b/src/sx126x_driver.h +similarity index 99% +rename from src/sx126x.h +rename to src/sx126x_driver.h +index 634ed82..e5ed101 100644 +--- a/src/sx126x.h ++++ b/src/sx126x_driver.h +@@ -29,8 +29,8 @@ + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-#ifndef SX126X_H +-#define SX126X_H ++#ifndef SX126X_DRIVER_H ++#define SX126X_DRIVER_H + + #ifdef __cplusplus + extern "C" { +@@ -1517,6 +1517,6 @@ sx126x_status_t sx126x_set_trimming_capacitor_values( const void* context, const + } + #endif + +-#endif // SX126X_H ++#endif // SX126X_DRIVER_H + + /* --- EOF ------------------------------------------------------------------ */ +diff --git a/src/sx126x_regs.h b/src/sx126x_driver_regs.h +similarity index 100% +rename from src/sx126x_regs.h +rename to src/sx126x_driver_regs.h +-- +2.27.0 +