Files
loramodem/drivers/lora/lr11xx/lr11xx.h
2026-03-25 18:14:45 +01:00

108 lines
3.7 KiB
C

/*
* SPDX-License-Identifier: Apache-2.0
*
* Semtech LR11xx private driver header.
* Defines SPI opcodes, register constants, and internal types.
*/
#ifndef LR11XX_H
#define LR11XX_H
#include <stdint.h>
#include <stddef.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/kernel.h>
/* ── SPI opcode definitions ──────────────────────────────────────────────── */
/* System commands */
#define LR11XX_CMD_RESET_STATS 0x0200u
#define LR11XX_CMD_GET_STATUS 0x0100u
#define LR11XX_CMD_SET_STANDBY 0x011Bu /* Note: opcode varies by fw */
#define LR11XX_CMD_SET_PACKET_TYPE 0x010Au
#define LR11XX_CMD_SET_RF_FREQUENCY 0x010Eu
#define LR11XX_CMD_SET_MODULATION_PARAMS 0x0115u
#define LR11XX_CMD_SET_PACKET_PARAMS 0x0116u
#define LR11XX_CMD_SET_TX_PARAMS 0x0110u
#define LR11XX_CMD_SET_DIO_IRQ_PARAMS 0x0113u
#define LR11XX_CMD_CLEAR_IRQ_STATUS 0x0114u
#define LR11XX_CMD_GET_IRQ_STATUS 0x0112u
#define LR11XX_CMD_SET_RX 0x0107u
#define LR11XX_CMD_SET_TX 0x0108u
#define LR11XX_CMD_GET_RX_BUFFER_STATUS 0x011Cu
#define LR11XX_CMD_READ_BUFFER 0x011Eu
#define LR11XX_CMD_GET_PACKET_STATUS 0x011Du
#define LR11XX_CMD_SET_BUFFER_BASE_ADDR 0x010Fu
/* Packet type: LoRa = 0x01 */
#define LR11XX_PKT_TYPE_LORA 0x01u
/* Standby mode: RC oscillator = 0x00, XOSC = 0x01 */
#define LR11XX_STANDBY_RC 0x00u
#define LR11XX_STANDBY_XOSC 0x01u
/* IRQ bitmasks */
#define LR11XX_IRQ_TX_DONE BIT(2)
#define LR11XX_IRQ_RX_DONE BIT(3)
#define LR11XX_IRQ_TIMEOUT BIT(8)
#define LR11XX_IRQ_CRC_ERROR BIT(10)
#define LR11XX_IRQ_ALL 0xFFFFFFFFu
/* DIO mask for routing IRQs to EVENT/DIO9 */
#define LR11XX_DIO9_MASK (LR11XX_IRQ_TX_DONE | LR11XX_IRQ_RX_DONE | \
LR11XX_IRQ_TIMEOUT | LR11XX_IRQ_CRC_ERROR)
/* LoRa spreading factor codes */
#define LR11XX_LORA_SF5 0x05u
#define LR11XX_LORA_SF6 0x06u
#define LR11XX_LORA_SF7 0x07u
#define LR11XX_LORA_SF8 0x08u
#define LR11XX_LORA_SF9 0x09u
#define LR11XX_LORA_SF10 0x0Au
#define LR11XX_LORA_SF11 0x0Bu
#define LR11XX_LORA_SF12 0x0Cu
/* LoRa bandwidth codes */
#define LR11XX_LORA_BW_125 0x04u
#define LR11XX_LORA_BW_250 0x05u
#define LR11XX_LORA_BW_500 0x06u
/* LoRa coding rate codes */
#define LR11XX_LORA_CR_4_5 0x01u
#define LR11XX_LORA_CR_4_6 0x02u
#define LR11XX_LORA_CR_4_7 0x03u
#define LR11XX_LORA_CR_4_8 0x04u
/* RX timeout: 0 = continuous, 0xFFFFFF = single (timeout on preamble) */
#define LR11XX_RX_CONTINUOUS 0x000000u
/* ── Driver config/data structures ───────────────────────────────────────── */
struct lr11xx_config {
struct spi_dt_spec spi;
struct gpio_dt_spec reset;
struct gpio_dt_spec busy;
struct gpio_dt_spec event;
};
struct lr11xx_data {
struct gpio_callback event_cb;
struct k_sem event_sem;
uint32_t last_irq;
};
/* ── HAL function prototypes (implemented in lr11xx_hal.c) ───────────────── */
int lr11xx_hal_reset(const struct device *dev);
int lr11xx_hal_wait_busy(const struct device *dev, k_timeout_t timeout);
int lr11xx_hal_write_cmd(const struct device *dev,
uint16_t opcode,
const uint8_t *params, size_t params_len);
int lr11xx_hal_read_resp(const struct device *dev,
uint8_t *buf, size_t len);
void lr11xx_hal_event_handler(const struct device *port,
struct gpio_callback *cb, uint32_t pins);
#endif /* LR11XX_H */