From a0d20e874fabbb503a690aff392a61e6ca0f3523 Mon Sep 17 00:00:00 2001 From: "Kevin Witteveen (MartiniMarter)" Date: Sun, 16 Feb 2025 16:35:21 +0100 Subject: [PATCH 1/2] drivers/wireless/lpwan/sx126x: [Experimental] This adds a driver for the SX126x (SX1261 and SX1262) LoRa chips. All functions and definitions are coming directly from the DS SX1261-2 V2.1 datasheet. Signed-off-by: Kevin Witteveen (MartiniMarter) --- drivers/wireless/lpwan/Kconfig | 9 + drivers/wireless/lpwan/Make.defs | 1 + drivers/wireless/lpwan/sx126x/CMakeLists.txt | 24 + drivers/wireless/lpwan/sx126x/Kconfig | 28 + drivers/wireless/lpwan/sx126x/Make.defs | 35 + drivers/wireless/lpwan/sx126x/sx126x.c | 1407 ++++++++++++++++++ drivers/wireless/lpwan/sx126x/sx126x.h | 440 ++++++ include/nuttx/wireless/ioctl.h | 5 + include/nuttx/wireless/lpwan/sx126x.h | 418 ++++++ 9 files changed, 2367 insertions(+) create mode 100644 drivers/wireless/lpwan/sx126x/CMakeLists.txt create mode 100644 drivers/wireless/lpwan/sx126x/Kconfig create mode 100644 drivers/wireless/lpwan/sx126x/Make.defs create mode 100644 drivers/wireless/lpwan/sx126x/sx126x.c create mode 100644 drivers/wireless/lpwan/sx126x/sx126x.h create mode 100644 include/nuttx/wireless/lpwan/sx126x.h diff --git a/drivers/wireless/lpwan/Kconfig b/drivers/wireless/lpwan/Kconfig index eb8dae6258d9a..514d6532e5566 100644 --- a/drivers/wireless/lpwan/Kconfig +++ b/drivers/wireless/lpwan/Kconfig @@ -12,6 +12,15 @@ config LPWAN_SX127X ---help--- This options adds driver support for the Samtech SX127X chip. +config LPWAN_SX126X + bool "SX126X Low Power Long Range transceiver support" + default n + select SPI + ---help--- + This options adds driver support for the Samtech SX126X chip. + +source "drivers/wireless/lpwan/sx126x/Kconfig" + if LPWAN_SX127X config LPWAN_SX127X_RFFREQ_DEFAULT diff --git a/drivers/wireless/lpwan/Make.defs b/drivers/wireless/lpwan/Make.defs index 023bff806f2c5..4a12806ac7284 100644 --- a/drivers/wireless/lpwan/Make.defs +++ b/drivers/wireless/lpwan/Make.defs @@ -25,5 +25,6 @@ ifeq ($(CONFIG_DRIVERS_LPWAN),y) include wireless/lpwan/sx127x/Make.defs +include wireless/lpwan/sx126x/Make.defs endif # CONFIG_DRIVERS_LPWAN diff --git a/drivers/wireless/lpwan/sx126x/CMakeLists.txt b/drivers/wireless/lpwan/sx126x/CMakeLists.txt new file mode 100644 index 0000000000000..a69a176feb13d --- /dev/null +++ b/drivers/wireless/lpwan/sx126x/CMakeLists.txt @@ -0,0 +1,24 @@ +# ############################################################################## +# drivers/wireless/lpwan/sx126x/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## +if(CONFIG_LPWAN_SX126X) + target_sources(drivers PRIVATE sx126x.c) +endif() diff --git a/drivers/wireless/lpwan/sx126x/Kconfig b/drivers/wireless/lpwan/sx126x/Kconfig new file mode 100644 index 0000000000000..6a04e1952c034 --- /dev/null +++ b/drivers/wireless/lpwan/sx126x/Kconfig @@ -0,0 +1,28 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if LPWAN_SX126X + +config LPWAN_SX126X_RFFREQ_DEFAULT + int "SX126X default RF frequency Hz" + default 869252000 + +config LPWAN_SX126X_SF_DEFAULT + int "SX126X default spreading factor" + default 10 + +config LPWAN_SX126X_BW_DEFAULT + int "SX126X default bandwidth kHz" + default 125 + +config LPWAN_SX126X_CR_DEFAULT + int "SX126X default coding rate" + default 8 + +config LPWAN_SX126X_MAX_DEVICES + int "SX126X maximum devices" + default 1 + +endif # DRIVERS_LPWAN diff --git a/drivers/wireless/lpwan/sx126x/Make.defs b/drivers/wireless/lpwan/sx126x/Make.defs new file mode 100644 index 0000000000000..bdf2143d45653 --- /dev/null +++ b/drivers/wireless/lpwan/sx126x/Make.defs @@ -0,0 +1,35 @@ +############################################################################ +# drivers/wireless/lpwan/sx126x/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +# Include SX126X drivers into the build + +ifeq ($(CONFIG_LPWAN_SX126X),y) + +CSRCS += sx126x.c + +# Include SX126X build support + +DEPPATH += --dep-path wireless$(DELIM)lpwan$(DELIM)sx126x +VPATH += :wireless$(DELIM)lpwan$(DELIM)sx126x +CFLAGS += ${INCDIR_PREFIX}$(TOPDIR)$(DELIM)drivers$(DELIM)wireless$(DELIM)lpwan$(DELIM)sx126x + +endif # CONFIG_LPWAN_SX126X diff --git a/drivers/wireless/lpwan/sx126x/sx126x.c b/drivers/wireless/lpwan/sx126x/sx126x.c new file mode 100644 index 0000000000000..a6b8f11aea027 --- /dev/null +++ b/drivers/wireless/lpwan/sx126x/sx126x.c @@ -0,0 +1,1407 @@ +/**************************************************************************** + * drivers/wireless/lpwan/sx126x/sx126x.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include "sx126x.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/**************************************************************************** + * Private prototypes for file operations + ****************************************************************************/ + +static int sx126x_open(FAR struct file *filep); + +static int sx126x_close(FAR struct file *filep); + +static ssize_t sx126x_read(FAR struct file *filep, + FAR char *buffer, + size_t buflen); + +static ssize_t sx126x_write(FAR struct file *filep, + FAR const char *buf, + size_t buflen); + +static int sx126x_ioctl(FAR struct file *filep, + int cmd, + unsigned long arg); + +/**************************************************************************** + * Private data types + ****************************************************************************/ + +struct sx126x_dev_s +{ + struct spi_dev_s *spi; + const struct sx126x_lower_s *lower; + uint8_t times_opened; + mutex_t lock; /* Only let one user in at a time */ + sem_t rx_sem; + sem_t tx_sem; + uint16_t irqbits; + + /* Hardware settings */ + + bool invert_iq; + + /* Common settings */ + + uint8_t payload_len; + enum sx126x_packet_type_e packet_type; /* This will decide what modulation to use */ + uint32_t frequency_hz; + uint8_t power; + uint16_t preambles; + + /* LoRa settings */ + + enum sx126x_lora_sf_e lora_sf; + enum sx126x_lora_bw_e lora_bw; + enum sx126x_lora_cr_e lora_cr; + bool lora_crc; + bool lora_fixed_header; + bool low_datarate_optimization; + uint8_t syncword[SX126X_REG_SYNCWORD_LEN]; + + /* Interrupt handling */ + + uint16_t irq_mask; + struct work_s irq0_work; +}; + +enum sx126x_cmd_status +{ + SX126X_STATUS_RESERVED, SX126X_STATUS_RFU, SX126X_STATUS_DATA_AVAILABLE, + SX126X_STATUS_TIMEOUT, SX126X_STATUS_ERROR, SX126X_STATUS_EXECUTE_FAIL, + SX126X_STATUS_TX_DONE +}; + +enum sx126x_chip_mode +{ + SX126X_MODE_UNUSED, SX126X_MODE_RFU, SX126X_MODE_STBY_RC, + SX126X_MODE_STBY_XOSC, SX126X_MODE_FS, SX126X_MODE_RX, SX126X_MODE_TX +}; + +struct sx126x_status_s +{ + enum sx126x_cmd_status cmd; + enum sx126x_chip_mode mode; +}; + +static const struct file_operations sx126x_ops = +{ + sx126x_open, + sx126x_close, + sx126x_read, + sx126x_write, + NULL, + sx126x_ioctl, + NULL, + NULL +}; + +/**************************************************************************** + * Globals + ****************************************************************************/ + +FAR struct sx126x_dev_s g_sx126x_devices[SX126X_MAX_DEVICES]; + +/**************************************************************************** + * Private prototypes + ****************************************************************************/ + +/* SPI and control **********************************************************/ + +static void sx126x_command(FAR struct sx126x_dev_s *dev, + uint8_t cmd, + FAR const uint8_t *params, + size_t paramslen, + FAR uint8_t *returns); + +static void sx126x_reset(FAR struct sx126x_dev_s *dev); + +static void sx126x_get_status(FAR struct sx126x_dev_s *dev, + FAR struct sx126x_status_s *status); + +static void sx126x_spi_lock(FAR struct sx126x_dev_s *dev); + +static void sx126x_spi_unlock(FAR struct sx126x_dev_s *dev); + +static void sx126x_write_register(FAR struct sx126x_dev_s *dev, + uint16_t address, + uint8_t *data, + size_t data_length); + +/* Operational modes functions **********************************************/ + +static void sx126x_set_standby(FAR struct sx126x_dev_s *dev, + enum sx126x_standby_mode_e mode); + +static void sx126x_set_tx(FAR struct sx126x_dev_s *dev, + uint32_t timeout); + +static void sx126x_set_rx(FAR struct sx126x_dev_s *dev, uint32_t timeout); + +static void sx126x_set_cad(struct sx126x_dev_s *dev); + +static void sx126x_set_tx_continuous_wave(FAR struct sx126x_dev_s *dev); + +static void sx126x_set_regulator_mode(FAR struct sx126x_dev_s *dev, + enum sx126x_regulator_mode_e mode); + +static void sx126x_set_pa_config(FAR struct sx126x_dev_s *dev, + enum sx126x_device_e model, + uint8_t hpmax, + uint8_t padutycycle); + +static void sx126x_set_tx_infinite_preamble(FAR struct sx126x_dev_s *dev); + +/* DIO and IRQ control functions ********************************************/ + +static void sx126x_set_dio_irq_params(FAR struct sx126x_dev_s *dev, + uint16_t irq_mask, + uint16_t dio1_mask, + uint16_t dio2_mask, + uint16_t dio3_mask); + +static void sx126x_set_dio2_as_rf_switch(FAR struct sx126x_dev_s *dev, + bool enable); + +static void sx126x_set_dio3_as_tcxo(FAR struct sx126x_dev_s *dev, + enum sx126x_tcxo_voltage_e voltage, + uint32_t delay); + +static void sx126x_get_irq_status(FAR struct sx126x_dev_s *dev, + FAR uint16_t *irqstatus); + +static void sx126x_clear_irq_status(FAR struct sx126x_dev_s *dev, + uint16_t clearbits); + +/* RF Modulation and Packet-Related Functions *******************************/ + +static void sx126x_set_packet_params_lora(FAR struct sx126x_dev_s *dev, + FAR struct + sx126x_packetparams_lora_s * + pktparams); + +static void sx126x_set_modulation_params_lora(FAR struct sx126x_dev_s *dev, + FAR struct + sx126x_modparams_lora_s * + modparams); + +static void sx126x_set_buffer_base_address(FAR struct sx126x_dev_s *dev, + uint8_t tx, + uint8_t rx); + +static void sx126x_set_tx_params(FAR struct sx126x_dev_s *dev, uint8_t power, + enum sx126x_ramp_time_e ramp_time); + +static void sx126x_set_packet_type(FAR struct sx126x_dev_s *dev, + enum sx126x_packet_type_e type); + +static void sx126x_set_rf_frequency(FAR struct sx126x_dev_s *dev, + uint32_t frequency_hz); + +/* Communication status information *****************************************/ + +static void sx126x_get_rssi_inst(FAR struct sx126x_dev_s *dev, + FAR int32_t *dbm); + +static void sx126x_get_rx_buffer_status(FAR struct sx126x_dev_s *dev, + uint8_t *status, + uint8_t *payload_len, + uint8_t *rx_buff_offset); + +/* Registers and buffer *****************************************************/ + +static void sx126x_write_register(FAR struct sx126x_dev_s *dev, + uint16_t address, + uint8_t *data, + size_t data_length); + +static void sx126x_write_buffer(FAR struct sx126x_dev_s *dev, + uint8_t offset, + FAR const uint8_t *payload, + uint8_t len); + +static void sx126x_read_buffer(FAR struct sx126x_dev_s *dev, + uint8_t offset, + FAR uint8_t *payload, + uint8_t len); + +/* Register settings ********************************************************/ + +static void sx126x_set_syncword(FAR struct sx126x_dev_s *dev, + uint8_t *syncword, + uint8_t syncword_length); + +/* Driver specific **********************************************************/ + +static int sx126x_init(FAR struct sx126x_dev_s *dev); + +static int sx126x_deinit(FAR struct sx126x_dev_s *dev); + +static int sx126x_setup_radio(FAR struct sx126x_dev_s *dev); + +static void sx126x_set_defaults(FAR struct sx126x_dev_s *dev); + +/* Interrupt handlers *******************************************************/ + +static int sx126x_irq0handler(int irq, FAR void *context, FAR void *arg); + +static inline int sx126x_attachirq0(FAR struct sx126x_dev_s *dev, xcpt_t isr, + FAR void *arg); + +static void sx126x_isr0_process(FAR void *arg); + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/* File operations **********************************************************/ + +static int sx126x_open(FAR struct file *filep) +{ + int ret = 0; + + /* Get device */ + + struct sx126x_dev_s *dev; + dev = filep->f_inode->i_private; + wlinfo("Opening SX126x %d", dev->lower->dev_number); + + /* Lock dev */ + + ret = nxmutex_lock(&dev->lock); + if (ret < 0) + { + return ret; + } + + /* Only one can open this dev at a time */ + + if (dev->times_opened > 0) + { + ret = -EBUSY; + goto exit_err; + } + + /* Initialize */ + + ret = sx126x_init(dev); + if (ret != 0) + { + goto exit_err; + } + + /* Success */ + + dev->times_opened++; + ret = OK; + +exit_err: + nxmutex_unlock(&dev->lock); + return ret; +} + +static int sx126x_close(FAR struct file *filep) +{ + int ret = 0; + + /* Get device */ + + struct sx126x_dev_s *dev; + dev = filep->f_inode->i_private; + wlinfo("Closing SX126x %d", dev->lower->dev_number); + + /* Lock */ + + ret = nxmutex_lock(&dev->lock); + if (ret < 0) + { + goto exit_err; + } + + /* De-init */ + + ret = sx126x_deinit(dev); + if (ret != 0) + { + goto exit_err; + } + + /* Success */ + + if (dev->times_opened > 0) + { + dev->times_opened--; /* Do not let this wrap around. */ + ret = OK; + } + +exit_err: + nxmutex_unlock(&dev->lock); + return ret; +} + +static ssize_t sx126x_read(FAR struct file *filep, + FAR char *buf, + size_t buflen) +{ + int ret = 0; + if (buf == NULL || buflen < 1) + { + return -EINVAL; + } + + /* Get device */ + + struct sx126x_dev_s *dev; + dev = filep->f_inode->i_private; + + nxmutex_lock(&dev->lock); + + printf("Reading\n"); + + /* Get header */ + + struct sx126x_read_header_s *header = (struct sx126x_read_header_s *)buf; + + /* Pre-RX setup */ + + sx126x_spi_lock(dev); + dev->irq_mask = SX126X_IRQ_RXDONE_MASK | SX126X_IRQ_CRCERR_MASK; + ret = sx126x_setup_radio(dev); + if (ret != 0) + { + goto sx126x_rx_abort; + } + + /* RX mode */ + + sx126x_set_rx(dev, SX126X_NO_TIMEOUT); + sx126x_spi_unlock(dev); + + /* Wait for a packet */ + + nxsem_wait(&dev->rx_sem); + + /* Get payload */ + + uint8_t status = 0; + uint8_t offset = 0; + + sx126x_spi_lock(dev); + sx126x_get_rx_buffer_status(dev, &status, + &header->payload_length, + &offset); + sx126x_read_buffer(dev, offset, header->payload, + header->payload_length); + sx126x_spi_unlock(dev); + + /* Get CRC check */ + + header->crc_error = dev->irqbits & SX126X_IRQ_CRCERR_MASK; + + /* Exit */ + + sx126x_rx_abort: + + nxmutex_unlock(&dev->lock); + + return 1; +} + +static ssize_t sx126x_write(FAR struct file *filep, + FAR const char *buf, + size_t buflen) +{ + int ret = 0; + + /* Get device */ + + struct sx126x_dev_s *dev; + dev = filep->f_inode->i_private; + + if (buf == NULL || buflen < 1) + { + return -EINVAL; + } + + nxmutex_lock(&dev->lock); + sx126x_spi_lock(dev); + + /* Data */ + + dev->payload_len = buflen; + sx126x_write_buffer(dev, 0, (uint8_t *)buf, buflen); + + /* Pre-TX setup */ + + dev->irq_mask = SX126X_IRQ_TXDONE_MASK; + ret = sx126x_setup_radio(dev); + if (ret != 0) + { + sx126x_spi_unlock(dev); + goto sx126x_tx_abort; + } + + /* TX */ + + sx126x_set_tx(dev, 0); + + sx126x_spi_unlock(dev); + + /* Wait for transmitting operations to be finished */ + + wlinfo("TXing"); + ret = nxsem_wait(&dev->tx_sem); + + sx126x_tx_abort: + + nxmutex_unlock(&dev->lock); + return ret; +} + +static int sx126x_ioctl(FAR struct file *filep, int cmd, unsigned long arg) +{ + int ret = 0; + + /* Get device */ + + struct sx126x_dev_s *dev; + dev = filep->f_inode->i_private; + wlinfo("IOCTL cmd %d arg %u SX126x dev_number %d", + cmd, + *(FAR uint32_t *)((uintptr_t)arg), + dev->lower->dev_number); + + /* Lock */ + + ret = nxmutex_lock(&dev->lock); + if (ret < 0) + { + goto exit_err; + } + + /* Do thing */ + + switch (cmd) + { + /* Set radio freq. Takes uint32_t *frequency in Hz */ + + case WLIOC_SETRADIOFREQ: + { + FAR uint32_t *freq_ptr = (FAR uint32_t *)((uintptr_t)arg); + DEBUGASSERT(freq_ptr != NULL); + + dev->frequency_hz = *freq_ptr; + break; + } + + /* Get radio freq. Sets uint32_t *frequency in Hz */ + + case WLIOC_GETRADIOFREQ: + { + FAR uint32_t *freq_ptr = (FAR uint32_t *)((uintptr_t)arg); + DEBUGASSERT(freq_ptr != NULL); + + *freq_ptr = dev->frequency_hz; + break; + } + + /* Set TX power. arg: Pointer to int8_t power value */ + + case WLIOC_SETTXPOWER: + { + FAR int8_t *ptr = (FAR int8_t *)((uintptr_t)arg); + DEBUGASSERT(ptr != NULL); + + dev->power = *ptr; + break; + } + + /* Get current TX power. arg: Pointer to int8_t power value */ + + case WLIOC_GETTXPOWER: + { + FAR int8_t *ptr = (FAR int8_t *)((uintptr_t)arg); + DEBUGASSERT(ptr != NULL); + + *ptr = dev->power; + break; + } + + /* TODO: Integration with new common IOCTL API */ + + /* Driver specific IOCTL */ + + /* Lora config */ + + case SX126XIOC_LORACONFIGSET: + { + FAR struct sx126x_lora_config_s *ptr = + (FAR struct sx126x_lora_config_s *)((uintptr_t)arg); + DEBUGASSERT(ptr != NULL); + + /* Modulation params */ + + dev->lora_sf = ptr->modulation.spreading_factor; + dev->lora_bw = ptr->modulation.bandwidth; + dev->lora_cr = ptr->modulation.coding_rate; + dev->low_datarate_optimization = + ptr->modulation.low_datarate_optimization; + + /* Packet params */ + + dev->lora_crc = ptr->packet.crc_enable; + dev->lora_fixed_header = + ptr->packet.fixed_length_header; + dev->payload_len = ptr->packet.payload_length; + dev->invert_iq = ptr->packet.invert_iq; + dev->preambles = ptr->packet.preambles; + + break; + } + } + + /* Success */ + + ret = OK; + +exit_err: + nxmutex_unlock(&dev->lock); + return ret; +} + +uint32_t sx126x_convert_freq_in_hz_to_pll_step(uint32_t freq_in_hz) +{ + uint32_t steps_int; + uint32_t steps_frac; + + steps_int = freq_in_hz / SX126X_PLL_STEP_SCALED; + steps_frac = freq_in_hz - (steps_int * SX126X_PLL_STEP_SCALED); + + return (steps_int << + SX126X_PLL_STEP_SHIFT_AMOUNT) + (((steps_frac << + SX126X_PLL_STEP_SHIFT_AMOUNT) + (SX126X_PLL_STEP_SCALED >> + 1)) / SX126X_PLL_STEP_SCALED); +} + +/* Operational modes functions **********************************************/ + +static void sx126x_set_standby(FAR struct sx126x_dev_s *dev, + enum sx126x_standby_mode_e mode) +{ + sx126x_command(dev, SX126X_SETSTANDBY, (uint8_t *)&mode, + SX126X_SETSTANDBY_PARAMS, NULL); +} + +static void sx126x_set_tx(FAR struct sx126x_dev_s *dev, uint32_t timeout) +{ + /* Convert timeout to BE24 */ + + timeout = htobe32(timeout << 8); + + sx126x_command(dev, SX126X_SETTX, (uint8_t *)&timeout, SX126X_SETTX_PARAMS, + NULL); +} + +static void sx126x_set_rx(FAR struct sx126x_dev_s *dev, uint32_t timeout) +{ + /* Convert timeout to BE24 */ + + timeout = htobe32(timeout << 8); + + sx126x_command(dev, SX126X_SETRX, (uint8_t *)&timeout, SX126X_SETRX_PARAMS, + NULL); +} + +static void sx126x_stop_timer_on_preamble(FAR struct sx126x_dev_s *dev, + bool enable) +{ + sx126x_command(dev, SX126X_STOPTIMERONPREAMBLE, (uint8_t *)&enable, + SX126X_STOPTIMERONPREAMBLE_PARAMS, NULL); +} + +static void sx126x_set_rx_duty_cycle(FAR struct sx126x_dev_s *dev, + uint32_t rx_period, + uint32_t sleep_period) +{ + uint8_t params[SX126X_SETRXDUTYCYCLE_PARAMS]; + + rx_period = htobe32(rx_period << 8); + sleep_period = htobe32(sleep_period << 8); + + memcpy(params + SX126X_SETRXDUTYCYCLE_RXPERIOD_PARAM, + (uint8_t *)&rx_period, + SX126X_SETRXDUTYCYCLE_RXPERIOD_PARAMS); + memcpy(params + SX126X_SETRXDUTYCYCLE_SLEEPPERIOD_PARAM, + (uint8_t *)&sleep_period, + SX126X_SETRXDUTYCYCLE_SLEEPPERIOD_PARAMS); + + sx126x_command(dev, SX126X_SETRXDUTYCYCLE, params, + SX126X_SETRXDUTYCYCLE_PARAMS, NULL); +} + +static void sx126x_set_cad(FAR struct sx126x_dev_s *dev) +{ + sx126x_command(dev, SX126X_SETCAD, NULL, 0, NULL); +} + +static void sx126x_set_tx_continuous_wave(FAR struct sx126x_dev_s *dev) +{ + sx126x_command(dev, SX126X_SETTXCONTINUOUSWAVE, NULL, 0, NULL); +} + +static void sx126x_set_regulator_mode(FAR struct sx126x_dev_s *dev, + enum sx126x_regulator_mode_e mode) +{ + sx126x_command(dev, SX126X_SETREGULATORMODE, (uint8_t *)&mode, + SX126X_SETREGULATORMODE_PARAMS, NULL); +} + +/* Caution! Exceeding the limits listed in DS_SX1261/2 V2.1 + * 13.1.14.1 may cause irreversible damage to the device + */ + +static void sx126x_set_pa_config(FAR struct sx126x_dev_s *dev, + enum sx126x_device_e model, uint8_t hpmax, + uint8_t padutycycle) +{ + uint8_t params[SX126X_SETPACONFIG_PARMS]; + + memset(params, 0, SX126X_SETPACONFIG_PARMS); + + params[SX126X_SETPACONFIG_PADUTYCYCLE_PARAM] = padutycycle; + params[SX126X_SETPACONFIG_HPMAX_PARAM] = hpmax; + params[SX126X_SETPACONFIG_DEVICESEL_PARAM] = model; + params[SX126X_SETPACONFIG_PALUT_PARAM] = 0x01; + + sx126x_command(dev, SX126X_SETPACONFIG, params, SX126X_SETPACONFIG_PARMS, + NULL); +} + +static void sx126x_set_tx_infinite_preamble(FAR struct sx126x_dev_s *dev) +{ + sx126x_command(dev, SX126X_SETTXINFINITEPREAMBLE, NULL, 0, NULL); +} + +static void sx126x_set_rx_tx_fallback_mode(FAR struct sx126x_dev_s *dev, + enum sx126x_fallback_mode_e + fallback) +{ + sx126x_command(dev, SX126X_SETRXTXFALLBACKMODE, (uint8_t *)&fallback, + SX126X_SETRXTXFALLBACKMODE_PARAMS, NULL); +} + +/* DIO and IRQ control functions */ + +static void sx126x_set_dio_irq_params(FAR struct sx126x_dev_s *dev, + uint16_t irq_mask, uint16_t dio1_mask, + uint16_t dio2_mask, uint16_t dio3_mask) +{ + irq_mask = htobe16(irq_mask); + dio1_mask = htobe16(dio1_mask); + dio2_mask = htobe16(dio2_mask); + dio3_mask = htobe16(dio3_mask); + + uint8_t params[SX126X_SETDIOIRQPARAMS_PARAMS]; + + memcpy(params + SX126X_SETDIOIRQPARAMS_IRQMASK_PARAM, &irq_mask, + SX126X_SETDIOIRQPARAMS_IRQMASK_PARAMS); + + memcpy(params + SX126X_SETDIOIRQPARAMS_DIO1MASK_PARAM, &dio1_mask, + SX126X_SETDIOIRQPARAMS_DIO1MASK_PARAMS); + + memcpy(params + SX126X_SETDIOIRQPARAMS_DIO2MASK_PARAM, &dio2_mask, + SX126X_SETDIOIRQPARAMS_DIO2MASK_PARAMS); + + memcpy(params + SX126X_SETDIOIRQPARAMS_DIO3MASK_PARAM, &dio3_mask, + SX126X_SETDIOIRQPARAMS_DIO3MASK_PARAMS); + + sx126x_command(dev, SX126X_SETDIOIRQPARAMS, params, + SX126X_SETDIOIRQPARAMS_PARAMS, NULL); +} + +static void sx126x_set_dio2_as_rf_switch(FAR struct sx126x_dev_s *dev, + bool enable) +{ + sx126x_command(dev, SX126X_SETDIO2RFSWCTRL, (uint8_t *)&enable, + SX126X_SETDIO2RFSWCTRL_PARAMS, NULL); +} + +static void sx126x_set_dio3_as_tcxo(FAR struct sx126x_dev_s *dev, + enum sx126x_tcxo_voltage_e voltage, + uint32_t delay) +{ + uint8_t params[SX126X_SETDIO3TCXOCTRL_PARAMS]; + + params[SX126X_SETDIO3TCXOCTRL_TCXO_V_PARAM] = voltage; + + /* Convert delay to 24 bit and convert to BE */ + + delay = htobe32(delay << 8); + memcpy(params + SX126X_SETDIO3TCXOCTRL_DELAY_PARAM, &delay, + SX126X_SETDIO3TCXOCTRL_DELAY_PARAMS); + + sx126x_command(dev, SX126X_SETDIO3TCXOCTRL, params, + SX126X_SETDIO3TCXOCTRL_PARAMS, NULL); +} + +static void sx126x_get_irq_status(FAR struct sx126x_dev_s *dev, + FAR uint16_t *irqstatus) +{ + uint8_t returns[SX126X_GETIRQSTATUS_RETURNS]; + + sx126x_command(dev, SX126X_GETIRQSTATUS, + NULL, SX126X_GETIRQSTATUS_RETURNS, + returns); + + uint16_t bits; + memcpy(&bits, returns + + SX126X_GETIRQSTATUS_IRQSTATUS_RETURN, + SX126X_GETIRQSTATUS_IRQSTATUS_RETURNS); + + *irqstatus = be16toh(bits); +} + +static void sx126x_clear_irq_status(FAR struct sx126x_dev_s *dev, + uint16_t clearbits) +{ + uint8_t params[SX126X_CLEARIRQSTATUS_PARAMS]; + + clearbits = htobe16(clearbits); + memcpy(params + SX126X_CLEARIRQSTATUS_CLEAR_PARAM, + &clearbits, + SX126X_CLEARIRQSTATUS_CLEAR_PARAMS); + + sx126x_command(dev, SX126X_CLEARIRQSTATUS, params, + SX126X_CLEARIRQSTATUS_PARAMS, + NULL); +} + +/* RF Modulation and Packet-Related Functions *******************************/ + +static void sx126x_set_packet_params_lora(FAR struct sx126x_dev_s *dev, + FAR struct + sx126x_packetparams_lora_s * + pktparams) +{ + uint8_t params[SX126X_SETPACKETPARMS_PARAMS]; + + memset(params, 0, SX126X_SETPACKETPARMS_PARAMS); + + uint16_t preambles = htobe16(pktparams->preambles); + memcpy(params + SX126X_PKTPARAM1_LORA_PREAMBLELEN_PARAM, &preambles, + SX126X_PKTPARAM1_LORA_PREAMBLELEN_PARAMS); + + params[SX126X_PKTPARAM3_LORA_HEADERTYPE_PARAM] = + pktparams->fixed_length_header; + params[SX126X_PKTPARAM4_LORA_PAYLOADLEN_PARAM] = + pktparams->payload_length; + params[SX126X_PKTPARAM5_LORA_CRCTYPE_PARAM] = pktparams->crc_enable; + params[SX126X_PKTPARAM6_LORA_INVERTIQ_PARAM] = pktparams->invert_iq; + + sx126x_command(dev, SX126X_SETPACKETPARMS, params, + SX126X_SETPACKETPARMS_PARAMS, NULL); +} + +static void sx126x_set_modulation_params_lora(FAR struct sx126x_dev_s *dev, + FAR struct + sx126x_modparams_lora_s * + modparams) +{ + uint8_t params[SX126X_SETMODULATIONPARAMS_PARAMS]; + + memset(params, 0, SX126X_SETMODULATIONPARAMS_PARAMS); + + params[SX126X_MODPARAM1_LORA_SF_PARAM] = + modparams->spreading_factor; + params[SX126X_MODPARAM2_LORA_BW_PARAM] = + modparams->bandwidth; + params[SX126X_MODPARAM3_LORA_CR_PARAM] = + modparams->coding_rate; + params[SX126X_MODPARAM4_LORA_LOWDATRATE_OPTI_PARAM] = + modparams->low_datarate_optimization; + + sx126x_command(dev, SX126X_SETMODULATIONPARAMS, params, + SX126X_SETMODULATIONPARAMS_PARAMS, NULL); +} + +static void sx126x_set_buffer_base_address(FAR struct sx126x_dev_s *dev, + uint8_t tx, uint8_t rx) +{ + uint8_t params[SX126X_SETBUFFERBASEADDRESS_PARAMS]; + + memset(params, 0, SX126X_SETBUFFERBASEADDRESS_PARAMS); + + params[SX126X_SETBUFFERBASEADDRESS_TX_PARAM] = tx; + params[SX126X_SETBUFFERBASEADDRESS_RX_PARAM] = rx; + + sx126x_command(dev, SX126X_SETBUFFERBASEADDRESS, params, + SX126X_SETBUFFERBASEADDRESS_PARAMS, NULL); +} + +static void sx126x_set_tx_params(FAR struct sx126x_dev_s *dev, uint8_t power, + enum sx126x_ramp_time_e ramp_time) +{ + uint8_t params[SX126X_SETTXPARMS_PARAMS]; + + memset(params, 0, SX126X_SETTXPARMS_PARAMS); + + params[SX126X_SETTXPARMS_RAMPTIME_PARAM] = ramp_time; + params[SX126X_SETTXPARMS_POWER_PARAM] = power; + + sx126x_command(dev, SX126X_SETTXPARMS, params, SX126X_SETTXPARMS_PARAMS, + NULL); +} + +static void sx126x_set_packet_type(FAR struct sx126x_dev_s *dev, + enum sx126x_packet_type_e type) +{ + sx126x_command(dev, SX126X_SETPACKETTYPE, (uint8_t *)&type, + SX126X_SETPACKETTYPE_PARAMS, NULL); +} + +static void sx126x_set_rf_frequency(FAR struct sx126x_dev_s *dev, + uint32_t frequency_hz) +{ + uint32_t corrected_freq = + sx126x_convert_freq_in_hz_to_pll_step(frequency_hz); + + corrected_freq = htobe32(corrected_freq); + + sx126x_command(dev, SX126X_SETRFFREQUENCY, (uint8_t *)&corrected_freq, + SX126X_SETRFFREQUENCY_PARAMS, NULL); +} + +static void sx126x_set_lora_symb_num_timout(FAR struct sx126x_dev_s *dev, + uint8_t symbnum) +{ + sx126x_command(dev, SX126X_SETLORASYMBNUMTIMEOUT, &symbnum, + SX126X_SETLORASYMBNUMTIMEOUT_PARAMS, NULL); +} + +/* Communication status information *****************************************/ + +static void sx126x_get_status(FAR struct sx126x_dev_s *dev, + FAR struct sx126x_status_s *status) +{ + /* NOP param to shift out result */ + + uint8_t parms[1] = { + 0x00 + }; + + uint8_t rets[1]; + + /* Get, mask and shift result into readable mode numbers */ + + sx126x_command(dev, SX126X_CMD_GETSTATUS, parms, sizeof(parms), rets); + status->mode = (rets[0] & SX126X_STATUS_CHIPMODE_MASK) >> + SX126X_STATUS_CHIPMODE_SHIFT; + status->cmd = (rets[0] & SX126X_STATUS_CMD_MASK) >> + SX126X_STATUS_CMD_SHIFT; +} + +static void sx126x_get_rssi_inst(FAR struct sx126x_dev_s *dev, + FAR int32_t *dbm) +{ + uint8_t rets[SX126X_GETRSSIINST_RETURNS]; + + sx126x_command(dev, SX126X_GETRSSIINST, NULL, SX126X_GETRSSIINST_RETURNS, + rets); + + /* Calculate dBm from returns */ + + int32_t rssi = rets[SX126X_GETRSSIINST_RSSI_RETURN]; + (*dbm) = -rssi / 2.0; +} + +static void sx126x_get_rx_buffer_status(FAR struct sx126x_dev_s *dev, + uint8_t *status, + uint8_t *payload_len, + uint8_t *rx_buff_offset) +{ + uint8_t returns[SX126X_GETRXBUFFERSTATUS_RETURNS]; + + sx126x_command(dev, SX126X_GETRXBUFFERSTATUS, + NULL, + SX126X_GETRXBUFFERSTATUS_RETURNS, + returns); + + *status = returns[SX126X_GETRXBUFFERSTATUS_STATUS_RETURN]; + *payload_len = returns[SX126X_GETRXBUFFERSTATUS_PAYLOAD_LEN_RETURN]; + *rx_buff_offset = returns[SX126X_GETRXBUFFERSTATUS_RX_START_PTR_RETURN]; +} + +/* Lower hardware control ***************************************************/ + +static void sx126x_reset(FAR struct sx126x_dev_s *dev) +{ + dev->lower->reset(); +} + +/* SPI Communication ********************************************************/ + +static void sx126x_select(FAR struct sx126x_dev_s *dev) +{ + SPI_SELECT(dev->spi, SPIDEV_LPWAN(dev->lower->dev_number), true); +} + +static void sx126x_deselect(FAR struct sx126x_dev_s *dev) +{ + SPI_SELECT(dev->spi, SPIDEV_LPWAN(dev->lower->dev_number), false); +} + +static void sx126x_spi_lock(FAR struct sx126x_dev_s *dev) +{ + struct spi_dev_s *spi = dev->spi; + + SPI_LOCK(spi, true); + SPI_SETBITS(spi, 8); + SPI_SETMODE(spi, SPIDEV_MODE0); + SPI_SETFREQUENCY(spi, SX126X_SPI_SPEED); +} + +static void sx126x_spi_unlock(FAR struct sx126x_dev_s *dev) +{ + SPI_LOCK(dev->spi, false); +} + +static void sx126x_command(FAR struct sx126x_dev_s *dev, uint8_t cmd, + const FAR uint8_t *params, size_t paramslen, + FAR uint8_t *returns) +{ + sx126x_select(dev); + + /* First send the command. This does not return anything. + * "RFU" according the manual + */ + + SPI_SEND(dev->spi, cmd); + + /* Send all the params and record the returning bytes */ + + for (size_t i = 0; i < paramslen; i++) + { + uint8_t param = SX126X_NOP; + if (params != NULL) + { + param = params[i]; + } + + uint8_t ret = SPI_SEND(dev->spi, param); + + if (returns != NULL) + { + returns[i] = ret; + } + } + + sx126x_deselect(dev); +} + +/* Registers and buffer *****************************************************/ + +static void sx126x_write_register(FAR struct sx126x_dev_s *dev, + uint16_t address, + uint8_t *data, + size_t data_length) +{ + sx126x_select(dev); + + /* Send the opcode and address */ + + SPI_SEND(dev->spi, SX126X_WRITEREGISTER); + SPI_SEND(dev->spi, (uint8_t)(address >> 8)); + SPI_SEND(dev->spi, (uint8_t)address); + + /* Send data */ + + for (size_t i = 0; i < data_length; i++) + { + SPI_SEND(dev->spi, data[i]); + } + + sx126x_deselect(dev); +} + +static void sx126x_read_register(FAR struct sx126x_dev_s *dev, + uint16_t address, + uint8_t *data, + size_t data_length) +{ + sx126x_select(dev); + + /* Send the opcode and address */ + + SPI_SEND(dev->spi, SX126X_WRITEREGISTER); + SPI_SEND(dev->spi, (uint8_t)(address >> 8)); + SPI_SEND(dev->spi, (uint8_t)address); + + /* Send data */ + + for (size_t i = 0; i < data_length; i++) + { + data[i] = SPI_SEND(dev->spi, SX126X_NOP); + } + + sx126x_deselect(dev); +} + +static void sx126x_write_buffer(FAR struct sx126x_dev_s *dev, + uint8_t offset, + FAR const uint8_t *payload, + uint8_t len) +{ + sx126x_select(dev); + + /* Command */ + + SPI_SEND(dev->spi, SX126X_WRITEBUFFER); + + /* Offset */ + + SPI_SEND(dev->spi, offset); + + /* Data */ + + for (size_t i = 0; i < len; i++) + { + SPI_SEND(dev->spi, payload[i]); + } + + sx126x_deselect(dev); +} + +static void sx126x_read_buffer(FAR struct sx126x_dev_s *dev, + uint8_t offset, + FAR uint8_t *payload, + uint8_t len) +{ + sx126x_select(dev); + + /* Command */ + + SPI_SEND(dev->spi, SX126X_READBUFFER); + + /* Offset */ + + SPI_SEND(dev->spi, offset); + + /* NOP */ + + SPI_SEND(dev->spi, SX126X_NOP); + + /* Data */ + + for (size_t i = 0; i < len; i++) + { + payload[i] = SPI_SEND(dev->spi, SX126X_NOP); + } + + sx126x_deselect(dev); +} + +/* Register settings ********************************************************/ + +static void sx126x_set_syncword(FAR struct sx126x_dev_s *dev, + uint8_t *syncword, + uint8_t syncword_length) +{ + if (syncword_length > SX126X_REG_SYNCWORD_LEN) + { + syncword_length = SX126X_REG_SYNCWORD_LEN; + wlerr("Syncword length was limited to the maximum 8 bytes"); + } + + sx126x_write_register(dev, SX126X_REG_SYNCWORD, syncword, syncword_length); +} + +/* Driver specific **********************************************************/ + +static int sx126x_init(FAR struct sx126x_dev_s *dev) +{ + sx126x_reset(dev); + sx126x_set_defaults(dev); + return 0; +} + +static int sx126x_deinit(FAR struct sx126x_dev_s *dev) +{ + return 0; +} + +static void sx126x_set_defaults(FAR struct sx126x_dev_s *dev) +{ + /* Hardware defaults */ + + dev->invert_iq = SX126X_DEFAULT_INVERT_IQ; + + /* Common defaults */ + + dev->packet_type = SX126X_DEFAULT_PACKET_TYPE; + dev->frequency_hz = SX126X_DEFAULT_FREQ; + dev->power = SX126X_DEFAULT_POWER; + dev->preambles = SX126X_DEFAULT_LORA_PREAMBLES; + + /* LoRa defaults */ + + dev->lora_sf = SX126X_DEFAULT_LORA_SF; + dev->lora_bw = SX126X_DEFAULT_LORA_BW; + dev->lora_cr = SX126X_DEFAULT_LORA_CR; + dev->lora_fixed_header = SX126X_DEFAULT_LORA_FIXED_HEADER; + dev->lora_crc = SX126X_DEFAULT_LORA_CRC_EN; + dev->low_datarate_optimization = SX126X_DEFAULT_LORA_LDO; + + uint8_t newsyncword[] = SX126X_DEFAULT_SYNCWORD; + memcpy(dev->syncword, newsyncword, sizeof(dev->syncword)); + + /* GFSK defaults */ +} + +static int sx126x_setup_radio(FAR struct sx126x_dev_s *dev) +{ + /* Clear IRQ status */ + + sx126x_clear_irq_status(dev, 0xffff); + + /* Set regulator */ + + sx126x_set_regulator_mode(dev, dev->lower->regulator_mode); + + /* Set packet type */ + + sx126x_set_packet_type(dev, dev->packet_type); + + /* Set RF frequency */ + + int illegal_freq = dev->lower->check_frequency(dev->frequency_hz); + + if (illegal_freq) + { + wlerr("Board does not support %dHz", dev->frequency_hz); + return -1; + } + + sx126x_set_rf_frequency(dev, dev->frequency_hz); + + /* Set PA settings from lower */ + + uint8_t hp; + uint8_t dc; + enum sx126x_device_e model; + dev->lower->get_pa_values(&model, &hp, &dc); + sx126x_set_pa_config(dev, model, hp, dc); + + /* Set TX params */ + + dev->lower->limit_tx_power(&dev->power); /* Limited by board */ + sx126x_set_tx_params(dev, dev->power, dev->lower->tx_ramp_time); + + /* Set base */ + + sx126x_set_buffer_base_address(dev, 0, 0); + + /* Set params depending on packet type */ + + switch (dev->packet_type) + { + case (SX126X_PACKETTYPE_LORA): + { + /* Mod params */ + + struct sx126x_modparams_lora_s modparams = { + .spreading_factor = dev->lora_sf, + .bandwidth = dev->lora_bw, + .coding_rate = dev->lora_cr, + .low_datarate_optimization = dev->low_datarate_optimization + }; + + sx126x_set_modulation_params_lora(dev, &modparams); + + /* Packet params */ + + struct sx126x_packetparams_lora_s pktparams = { + .crc_enable = dev->lora_crc, + .fixed_length_header = dev->lora_fixed_header, + .payload_length = dev->payload_len, + .invert_iq = dev->invert_iq, + .preambles = dev->preambles + }; + + sx126x_set_packet_params_lora(dev, &pktparams); + break; + } + + default: + break; + } + + /* Sync word */ + + sx126x_set_syncword(dev, dev->syncword, sizeof(dev->syncword)); + + /* IRQ MASK */ + + sx126x_set_dio_irq_params(dev, dev->irq_mask, + dev->lower->masks.dio1_mask, + dev->lower->masks.dio2_mask, + dev->lower->masks.dio3_mask); + + /* DIO 2 */ + + sx126x_set_dio2_as_rf_switch(dev, dev->lower->use_dio2_as_rf_sw); + + /* DIO 3 */ + + sx126x_set_dio3_as_tcxo(dev, dev->lower->dio3_voltage, + dev->lower->dio3_delay); + return 0; +} + +/* Interrupt handling *******************************************************/ + +static int sx126x_irq0handler(int irq, FAR void *context, FAR void *arg) +{ + FAR struct sx126x_dev_s *dev = (FAR struct sx126x_dev_s *)arg; + + DEBUGASSERT(dev != NULL); + + DEBUGASSERT(work_available(&dev->irq0_work)); + + return work_queue(HPWORK, &dev->irq0_work, sx126x_isr0_process, arg, 0); +} + +static inline int sx126x_attachirq0(FAR struct sx126x_dev_s *dev, xcpt_t isr, + FAR void *arg) +{ + DEBUGASSERT(dev->lower->irq0attach != NULL); + + return dev->lower->irq0attach(isr, arg); +} + +static void sx126x_isr0_process(FAR void *arg) +{ + DEBUGASSERT(arg); + + FAR struct sx126x_dev_s *dev = (FAR struct sx126x_dev_s *)arg; + + wlinfo("SX126x ISR0 process triggered"); + + /* Get and clear IRQ bits */ + + sx126x_spi_lock(dev); + sx126x_get_irq_status(dev, &dev->irqbits); + sx126x_spi_unlock(dev); + + wlinfo("IRQ status 0x%X", dev->irqbits); + + /* On TX done */ + + if (dev->irqbits & SX126X_IRQ_TXDONE_MASK) + { + wlinfo("TX done"); + + /* Release writing threads */ + + nxsem_post(&dev->tx_sem); + } + + /* On RX done */ + + if (dev->irqbits & SX126X_IRQ_RXDONE_MASK) + { + wlinfo("RX done"); + + nxsem_post(&dev->rx_sem); + } + + /* On CAD done */ + + if (dev->irqbits & SX126X_IRQ_CADDONE_MASK) + { + wlinfo("CAD done"); + } + + /* On CAD detect */ + + if (dev->irqbits & SX126X_IRQ_CADDETECTED_MASK) + { + wlinfo("CAD detect"); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +void sx126x_register(FAR struct spi_dev_s *spi, + FAR const struct sx126x_lower_s *lower, + const char *path) +{ + /* Register the dev using an unique dev_number, + * so multiple radios can be registered at once + */ + + if (lower->dev_number >= SX126X_MAX_DEVICES) + { + wlerr("SX126x dev_number %d is greater than \ + allowed amount of SX126x devices", + lower->dev_number); + return; + } + + struct sx126x_dev_s *dev; + dev = &g_sx126x_devices[lower->dev_number]; + dev->lower = lower; + dev->spi = spi; + + /* Initialize locks and semaphores */ + + nxmutex_init(&dev->lock); + nxsem_init(&dev->rx_sem, 0, 0); + nxsem_init(&dev->tx_sem, 0, 0); + + sx126x_attachirq0(dev, sx126x_irq0handler, dev); + + (void)register_driver(path, &sx126x_ops, 0666, + dev); +} diff --git a/drivers/wireless/lpwan/sx126x/sx126x.h b/drivers/wireless/lpwan/sx126x/sx126x.h new file mode 100644 index 0000000000000..7d14c1fd74c49 --- /dev/null +++ b/drivers/wireless/lpwan/sx126x/sx126x.h @@ -0,0 +1,440 @@ +/**************************************************************************** + * drivers/wireless/lpwan/sx126x/sx126x.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* Currently this is an experimental version. + * Breaking changes might happen in the near future. + * All functions and definitions are accurately recreated + * from the official datasheet "DS_SX1261-2_V2_1" + */ + +#ifndef __DRIVERS_WIRELESS_LPWAN_SX126X_SX126X_H +#define __DRIVERS_WIRELESS_LPWAN_SX126X_SX126X_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include + +#include +#include +#include + +/**************************************************************************** + * Settings + ****************************************************************************/ + +/* Driver settings */ + +#define SX126X_MAX_DEVICES 2 +#define SX126X_SPI_SPEED 500000 + +/* LoRa defaults */ + +#define SX126X_DEFAULT_LORA_SF SX126X_LORA_SF10 +#define SX126X_DEFAULT_LORA_BW SX126X_LORA_BW_125 +#define SX126X_DEFAULT_LORA_CR SX126X_LORA_CR_4_8 +#define SX126X_DEFAULT_LORA_CRC_EN true +#define SX126X_DEFAULT_LORA_FIXED_HEADER false +#define SX126X_DEFAULT_LORA_PREAMBLES 12 +#define SX126X_DEFAULT_LORA_LDO false + +/* Common defaults */ + +#define SX126X_DEFAULT_FREQ 869525000 +#define SX126X_DEFAULT_POWER 0x0e +#define SX126X_DEFAULT_PACKET_TYPE SX126X_PACKETTYPE_LORA +#define SX126X_DEFAULT_SYNCWORD {0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + +/* Hardware defaults */ + +#define SX126X_DEFAULT_INVERT_IQ false + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register addresses *******************************************************/ + +#define SX126X_REG_SYNCWORD 0x06C0 /* Start of Byte 0 - Byte 7 */ +#define SX126X_REG_SYNCWORD_LEN 8 /* Bytes */ +#define SX126X_REG_NODEADDR 0x06CD /* Node address to filter. Default 0x00 */ +#define SX126X_REG_BRDCASTADDR 0x06CE /* Broadcast address to filter. Default 0x00 */ +#define SX126X_REG_CRC_INIT_MSB 0x06BC /* Default 0x1D */ +#define SX126X_REG_CRC_INIT_LSB 0x06BD /* Default 0x0F */ +#define SX126X_REG_CRC_POLY_MSB 0x06BE /* Default 0x10 */ +#define SX126X_REG_CRC_POLY_LSB 0x06BF /* Default 0x21 */ +#define SX126X_REG_WHITENING_MSB 0x06B8 /* Default 0x01 */ +#define SX126X_REG_WHITENING_LSB 0x06B9 /* Default 0x00 */ + +/* Enum and constant definitions ********************************************/ + +/* Packet parameters *****************************************************/ + +#define SX126X_PKTPARAM1_GFSK_PREAMBLELEN_PARAM 0 /* Takes 0x0001 to 0xFFFF preamble bits */ +#define SX126X_PKTPARAM1_GFSK_PREAMBLELEN_PARAMS 2 +#define SX126X_PKTPARAM3_GFSK_PREAMBLEDETECTORLEN_PARAM 2 /* Takes SX126X_GFSK_PREABMLE_DETECT_x */ +#define SX126X_PKTPARAM4_GFSK_SYNCWORDLEN_PARAM 3 /* 0x00 to 0x40, 0 to 8 bytes from SX126X_SYNCWORD register */ +#define SX126X_PKTPARAM5_GFSK_ADDRCOMP_PARAM 4 /* Takes SX126X_ADDR_FILT_x */ +#define SX126X_PKTPARAM6_GFSK_PKTTYPE_PARAM 5 /* Packet length unknown? false/true */ +#define SX126X_PKTPARAM7_GFSK_PAYLOADLEN_PARAM 6 /* 0x00 to 0xFF size of tx&rx payload in bytes */ +#define SX126X_PKTPARAM8_GFSK_CRCTYPE_PARAM 7 /* Takes SX126X_GFSK_CRCTYPE_x */ +#define SX126X_PKTPARAM9_GFSK_WHITENING_PARAM 8 /* Enable false/true */ + +#define SX126X_PKTPARAM1_LORA_PREAMBLELEN_PARAM 0 /* 0x0001 to 0xFFFF preamble symbols */ +#define SX126X_PKTPARAM1_LORA_PREAMBLELEN_PARAMS 2 +#define SX126X_PKTPARAM3_LORA_HEADERTYPE_PARAM 2 /* Variable/Fixed length false/true */ +#define SX126X_PKTPARAM4_LORA_PAYLOADLEN_PARAM 3 /* 0x00 to 0xFF number of tx and rx bytes */ +#define SX126X_PKTPARAM5_LORA_CRCTYPE_PARAM 4 /* CRC OFF/ON false/true */ +#define SX126X_PKTPARAM6_LORA_INVERTIQ_PARAM 5 /* Standard/Inverted false/true */ + +/* Modulation parameters ****************************************************/ + +/* GFSK */ + +#define SX126X_MODPARAM1_GFSK_BR_PARAM 0 /* Takes br = 32 * Fxtal / bit_rate */ +#define SX126X_MODPARAM1_GFSK_BR_PARAMS 3 +#define SX126X_MODPARAM4_GFSK_PULSESHAPE_PARAM 3 /* Takes SX126X_GFSK_PULSESHAPE_x */ +#define SX126X_MODPARAM5_GFSK_BANDWIDTH_PARAM 4 /* Takes SX126X_GFSK_BANDWIDTH_xHZ */ +#define SX126X_MODPARAM6_GFSK_FDEV_PARAM 5 /* Takes Fdev = (frequency_deviation * 2^25) / Fxtal */ +#define SX126X_MODPARAM6_GFSK_FDEV_PARAMS 3 + +/* LoRa */ + +#define SX126X_MODPARAM1_LORA_SF_PARAM 0 /* Takes SF between SX126X_LORA_SF_MIN and MAX */ +#define SX126X_MODPARAM2_LORA_BW_PARAM 1 /* Takes SX126X_LORA_BW_x */ +#define SX126X_MODPARAM3_LORA_CR_PARAM 2 /* Takes SX126X_LORA_CR_x */ +#define SX126X_MODPARAM4_LORA_LOWDATRATE_OPTI_PARAM 3 /* Takes true/false*/ + +/* Operational modes functions **********************************************/ + +/* SetSleep */ + +#define SX126X_SETSLEEP 0x84 /* Opcode */ +#define SX126X_SETSLEEP_PARAMS 1 +#define SX126X_SETSLEEP_CONF_PARAM 0 +#define SX126X_SETSLEEP_CONF_RTC_SHIFT 0 +# define SX126X_SETSLEEP_CONF_RTC_DISABLE (0< +#include +#include +#include + +#include +#include + +/**************************************************************************** + * Defintions + ****************************************************************************/ + +#define SX126X_RX_PAYLOAD_SIZE 0xff + +/* IOCTL commands ***********************************************************/ + +/* arg: sx126x_packet_type_e */ + +#define SX126XIOC_PACKETTYPESET _WLCIOC(SX126X_FIRST+0)// + +/* Sets lora parameters. arg: sx126x_lora_config_s *config */ + +#define SX126XIOC_LORACONFIGSET _WLCIOC(SX126X_FIRST+1) + +/* IRQ Register bits ********************************************************/ + +#define SX126X_IRQ_TXDONE_MASK (1<<0) +#define SX126X_IRQ_RXDONE_MASK (1<<1) +#define SX126X_IRQ_PREAMBLEDETECTED_MASK (1<<2) +#define SX126X_IRQ_SYNCWORDVALID_MASK (1<<3) +#define SX126X_IRQ_HEADERVALID_MASK (1<<4) +#define SX126X_IRQ_HEADERERR_MASK (1<<5) +#define SX126X_IRQ_CRCERR_MASK (1<<6) +#define SX126X_IRQ_CADDONE_MASK (1<<7) +#define SX126X_IRQ_CADDETECTED_MASK (1<<8) +#define SX126X_IRQ_TIMEOUT_MASK (1<<9) +#define SX126X_IRQ_LRFHSSHOP_MASK (1<<14) + +/* Others */ + +#define SX126X_NOP 0 +#define SX126X_NO_TIMEOUT 0 +#define SX126X_NO_DELAY 0 + +/* Oscillators and PLLs */ + +#define SX126X_OSC_MAIN_HZ (32000000) +#define SX126X_FXTAL SX126X_OSC_MAIN_HZ +#define SX126X_PLL_STEP_SHIFT_AMOUNT (14) +#define SX126X_PLL_STEP_SCALED (SX126X_FXTAL>>(25-SX126X_PLL_STEP_SHIFT_AMOUNT)) + +/**************************************************************************** + * Public Data Types + ****************************************************************************/ + +/* Standby config */ + +enum sx126x_standby_mode_e +{ + SX126X_STDBY_RC = 0x00, + SX126X_STDBY_XOSC = 0x01 +}; + +/* Packet Types */ + +enum sx126x_packet_type_e +{ + SX126X_PACKETTYPE_GFSK = 0x00, + SX126X_PACKETTYPE_LORA = 0x01, + SX126X_PACKETTYPE_LR_FHSS = 0x13 +}; + +/* Ramp times */ + +enum sx126x_ramp_time_e +{ + SX126X_SET_RAMP_10U = 0x00, + SX126X_SET_RAMP_20U = 0x01, + SX126X_SET_RAMP_40U = 0x02, + SX126X_SET_RAMP_80U = 0x03, + SX126X_SET_RAMP_200U = 0x04, + SX126X_SET_RAMP_800U = 0x05, + SX126X_SET_RAMP_1700U = 0x06, + SX126X_SET_RAMP_3400U = 0x07 +}; + +/* GFSK Pulse shapes */ + +enum sx126x_gfsk_pulseshape_e +{ + SX126X_GFSK_PULSESHAPE_NONE = 0x00, + SX126X_GFSK_PULSESHAPE_GAUSSIAN_BT_0_3 = 0x08, + SX126X_GFSK_PULSESHAPE_GAUSSIAN_BT_0_5 = 0x09, + SX126X_GFSK_PULSESHAPE_GAUSSIAN_BT_0_7 = 0x0a, + SX126X_GFSK_PULSESHAPE_GAUSSIAN_BT_1 = 0x0b +}; + +/* GFSK Bandwidths in Hz */ + +enum sx126x_gfsk_bandwidth_e +{ + SX126X_GFSK_BANDWIDTH_4800HZ = 0x1f, + SX126X_GFSK_BANDWIDTH_5800HZ = 0x17, + SX126X_GFSK_BANDWIDTH_7300HZ = 0x0f, + SX126X_GFSK_BANDWIDTH_9700HZ = 0x1e, + SX126X_GFSK_BANDWIDTH_11700HZ = 0x16, + SX126X_GFSK_BANDWIDTH_14600HZ = 0x0e, + SX126X_GFSK_BANDWIDTH_19500HZ = 0x1d, + SX126X_GFSK_BANDWIDTH_23400HZ = 0x15, + SX126X_GFSK_BANDWIDTH_29300HZ = 0x0d, + SX126X_GFSK_BANDWIDTH_39000HZ = 0x1c, + SX126X_GFSK_BANDWIDTH_46900HZ = 0x14, + SX126X_GFSK_BANDWIDTH_58600HZ = 0x0c, + SX126X_GFSK_BANDWIDTH_78200HZ = 0x1b, + SX126X_GFSK_BANDWIDTH_93800HZ = 0x13, + SX126X_GFSK_BANDWIDTH_117300HZ = 0x0b, + SX126X_GFSK_BANDWIDTH_156200HZ = 0x1a, + SX126X_GFSK_BANDWIDTH_187200HZ = 0x12, + SX126X_GFSK_BANDWIDTH_234300HZ = 0x0a, + SX126X_GFSK_BANDWIDTH_312000HZ = 0x19, + SX126X_GFSK_BANDWIDTH_373600HZ = 0x11, + SX126X_GFSK_BANDWIDTH_467000HZ = 0x09 +}; + +/* LoRa Spreading Factors */ + +enum sx126x_lora_sf_e +{ + SX126X_LORA_SF5 = 0x05, + SX126X_LORA_SF6 = 0x06, + SX126X_LORA_SF7 = 0x07, + SX126X_LORA_SF8 = 0x08, + SX126X_LORA_SF9 = 0x09, + SX126X_LORA_SF10 = 0x0a, + SX126X_LORA_SF11 = 0x0b, + SX126X_LORA_SF12 = 0x0c +}; + +/* LoRa Bandwidths */ + +enum sx126x_lora_bw_e +{ + SX126X_LORA_BW_7 = 0x00, + SX126X_LORA_BW_10 = 0x08, + SX126X_LORA_BW_15 = 0x01, + SX126X_LORA_BW_20 = 0x09, + SX126X_LORA_BW_31 = 0x02, + SX126X_LORA_BW_41 = 0x0a, + SX126X_LORA_BW_62 = 0x03, + SX126X_LORA_BW_125 = 0x04, + SX126X_LORA_BW_250 = 0x05, + SX126X_LORA_BW_500 = 0x06 +}; + +/* LoRa Coding Rates */ + +enum sx126x_lora_cr_e +{ + SX126X_LORA_CR_4_5 = 0x01, + SX126X_LORA_CR_4_6 = 0x02, + SX126X_LORA_CR_4_7 = 0x03, + SX126X_LORA_CR_4_8 = 0x04 +}; + +/* CAD Exit modes */ + +enum sx126x_cad_exit_mode_e +{ + SX126X_CAD_ONLY = 0x00, + SX126X_CAD_RX = 0x01 +}; + +/* TCXO voltages */ + +enum sx126x_tcxo_voltage_e +{ + SX126X_TCXO_1_6V = 0x00, + SX126X_TCXO_1_7V = 0x01, + SX126X_TCXO_1_8V = 0x02, + SX126X_TCXO_2_2V = 0x03, + SX126X_TCXO_2_4V = 0x04, + SX126X_TCXO_2_7V = 0x05, + SX126X_TCXO_3_0V = 0x06, + SX126X_TCXO_3_3V = 0x07 +}; + +/* Fallback modes */ + +enum sx126x_fallback_mode_e +{ + SX126X_FALLBACK_FS = 0x40, + SX126X_FALLBACK_STDBY_XOSC = 0x30, + SX126X_FALLBACK_STDBY_RC = 0x20 +}; + +/* Regulator modes */ + +enum sx126x_regulator_mode_e +{ + SX126X_LDO = 0x00, + SX126X_DC_DC_LDO = 0x01 +}; + +/* Device */ + +enum sx126x_device_e +{ + SX1261 = 0x01, + SX1262 = 0x00 +}; + +enum sx126x_gfsk_preamble_detect_e +{ + SX126X_GFSK_PREAMBLE_DETECT_OFF, + SX126X_GFSK_PREAMBLE_DETECT_8B, + SX126X_GFSK_PREAMBLE_DETECT_16B, + SX126X_GFSK_PREAMBLE_DETECT_24B, + SX126X_GFSK_PREAMBLE_DETECT_32B +}; + +/* Addr comp */ + +enum sx126x_address_filtering_e +{ + SX126X_ADDR_FILT_DISABLED, + SX126X_ADDR_FILT_NODE, + SX126X_ADDR_FILT_NODE_BROADCAST +}; + +/* GFSK CRC types */ + +enum sx126x_gfsk_crc_type_e +{ + SX126X_GFSK_CRCTYPE_OFF = 0x01, + SX126X_GFSK_CRCTYPE_1_BYTE = 0x00, + SX126X_GFSK_CRCTYPE_2_BYTE = 0x02, + SX126X_GFSK_CRCTYPE_1_BYTE_INV = 0x04, + SX126X_GFSK_CRCTYPE_2_BYTE_INV = 0x06 +}; + +/* LoRa mod params */ + +struct sx126x_modparams_lora_s +{ + enum sx126x_lora_sf_e spreading_factor; + enum sx126x_lora_bw_e bandwidth; + enum sx126x_lora_cr_e coding_rate; + bool low_datarate_optimization; +}; + +/* GFSK mod params */ + +struct sx126x_modparams_gfsk_s +{ + uint32_t bitrate; + enum sx126x_gfsk_pulseshape_e pulseshape; + enum sx126x_gfsk_bandwidth_e bandwidth; + uint32_t frequency_deviation; +}; + +/* LoRa packet params */ + +struct sx126x_packetparams_lora_s +{ + uint16_t preambles; + bool fixed_length_header; + uint8_t payload_length; + bool crc_enable; + bool invert_iq; +}; + +/* GFSK packet params */ + +struct sx126x_packetparams_gfsk_s +{ + uint16_t preambles; + enum sx126x_gfsk_preamble_detect_e preamble_detect; + uint8_t syncword_length; + enum sx126x_address_filtering_e address_filtering; + bool include_packet_size; + uint8_t packet_length; + enum sx126x_gfsk_crc_type_e crc_type; + bool whitening_enable; +}; + +/* Config */ + +struct sx126x_lora_config_s +{ + struct sx126x_modparams_lora_s modulation; + struct sx126x_packetparams_lora_s packet; +}; + +/* Lower driver *************************************************************/ + +struct sx126x_irq_masks +{ + uint16_t dio1_mask; + uint16_t dio2_mask; + uint16_t dio3_mask; +}; + +struct sx126x_lower_s +{ + /* Index of radio to register. + * ex: 0 is the primary radio, 1 is the secondary. + * Must be within the maximum configured radios. + */ + + unsigned int dev_number; + CODE void (*reset)(void); + + /* This controls which DIO reacts to interrupts + * Depended on the pinout of the board / module. + * Note that DIO 2 and DIO 3 can be already in use + * by the module and setting them might intefere + * with the operation or even damage them. + */ + + struct sx126x_irq_masks masks; + enum sx126x_tcxo_voltage_e dio3_voltage; + uint32_t dio3_delay; + uint8_t use_dio2_as_rf_sw; + + /* Interrupt attachments. These should be + * connected to one of the DIOx pins + */ + + CODE int (*irq0attach)(xcpt_t handler, FAR void *arg); + + /* The regulator mode is board / module depended */ + + enum sx126x_regulator_mode_e regulator_mode; + + /* Power amplifier control. DO NOT exceeds the + * limits listed in SX1261-2 V2 datasheet. + * 13.1.14 SetPaConfig + * This can cause damage to the device. + */ + + CODE int (*get_pa_values)(enum sx126x_device_e *model, + uint8_t *hpmax, uint8_t *padutycycle); + + /* TX power control. Depending on the local RF regulations, + * power might have to be limited. + * Also depending on board or module, + * power values have different charactersitics. + * More info in sx1261-2 V2 datasheet 13.4.4 SetTxParams. + * uint8_t *power is set and this function may limit it. + */ + + CODE int (*limit_tx_power)(uint8_t *current_power); + + enum sx126x_ramp_time_e tx_ramp_time; + + /* Frequency control + * Typically boards have a limited range of frequencies. + * Exceeding these can damage the radio. + * Also depending on regulations, some frequencies are restricted. + * This must return non zero in case a frequency is denied. + */ + + CODE int (*check_frequency)(uint32_t frequency); +}; + +/* Upper ********************************************************************/ + +struct sx126x_read_header_s +{ + uint8_t payload_length; + int32_t snr; + int16_t rssi_db; + uint8_t payload[SX126X_RX_PAYLOAD_SIZE]; + uint8_t crc_error; +}; + +/**************************************************************************** + * Public Functions Prototypes + ****************************************************************************/ + +void sx126x_register(FAR struct spi_dev_s *spi, + FAR const struct sx126x_lower_s *lower, + const char *path); + +#endif /* __INCLUDE_NUTTX_WIRELESS_LPWAN_SX126X_H */ \ No newline at end of file From 8adb928da77c81ad05274999b0699c567860412e Mon Sep 17 00:00:00 2001 From: "Kevin Witteveen (MartiniMarter)" Date: Tue, 25 Feb 2025 13:36:10 +0100 Subject: [PATCH 2/2] Initial SX126x documentation Signed-off-by: Kevin Witteveen (MartiniMarter) --- .../components/drivers/character/index.rst | 1 + .../drivers/character/wireless/index.rst | 8 +++ .../character/wireless/lpwan/SX1262.jpg | Bin 0 -> 7247 bytes .../character/wireless/lpwan/command_run0.jpg | Bin 0 -> 92610 bytes .../character/wireless/lpwan/index.rst | 9 +++ .../character/wireless/lpwan/sx126x.rst | 67 ++++++++++++++++++ 6 files changed, 85 insertions(+) create mode 100644 Documentation/components/drivers/character/wireless/index.rst create mode 100644 Documentation/components/drivers/character/wireless/lpwan/SX1262.jpg create mode 100644 Documentation/components/drivers/character/wireless/lpwan/command_run0.jpg create mode 100644 Documentation/components/drivers/character/wireless/lpwan/index.rst create mode 100644 Documentation/components/drivers/character/wireless/lpwan/sx126x.rst diff --git a/Documentation/components/drivers/character/index.rst b/Documentation/components/drivers/character/index.rst index 81639bcb90478..ff6d746f2682f 100644 --- a/Documentation/components/drivers/character/index.rst +++ b/Documentation/components/drivers/character/index.rst @@ -77,3 +77,4 @@ Character device drivers have these properties: serial.rst timers/index.rst touchscreen.rst + wireless/index.rst diff --git a/Documentation/components/drivers/character/wireless/index.rst b/Documentation/components/drivers/character/wireless/index.rst new file mode 100644 index 0000000000000..7312e24c03f2b --- /dev/null +++ b/Documentation/components/drivers/character/wireless/index.rst @@ -0,0 +1,8 @@ +========================== +Wireless character drivers +========================== + +.. toctree:: + :maxdepth: 1 + + lpwan/index.rst diff --git a/Documentation/components/drivers/character/wireless/lpwan/SX1262.jpg b/Documentation/components/drivers/character/wireless/lpwan/SX1262.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a29a8b9448eff1b9c8436c3695bf8d893afa4e05 GIT binary patch literal 7247 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 literal 0 HcmV?d00001 diff --git a/Documentation/components/drivers/character/wireless/lpwan/command_run0.jpg b/Documentation/components/drivers/character/wireless/lpwan/command_run0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..113f3f396c404f683280112481824d4441c4498b GIT binary patch literal 92610 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