Files
zephyr_llcc68_driver/include/llcc68_raw.h
T
crosstyan 1c3626d58b feat(llcc68): add configurable RF switch modes
Add an explicit rf-switch-mode devicetree property for LLCC68 instances, covering no switch handling, TXEN/RXEN complementary GPIO control, and DIO2 single-pin control for PE4259-style RF switches. Preserve the existing default behavior with an auto Kconfig default that only enables complementary GPIO handling when both TXEN and RXEN GPIOs are present.

Resolve the RF switch mode into llcc68_config at build time and validate incompatible devicetree combinations with BUILD_ASSERT checks. Configure optional RXEN GPIO handling for DIO2 single-pin mode and keep DIO2 RF switch control disabled unless that mode is selected.

Replace the old fire-and-forget TX/RX GPIO helper with a result-returning mode-aware RF switch state helper, and apply it across standby, sleep, CAD, TX, RX, continuous wave, infinite preamble, and modem init paths.

Add SetRxDutyCycle support with explicit raw 24-bit LLCC68 period units, plus helpers and a millisecond wrapper for callers that work in time units. Select the RX RF path before issuing the duty-cycle command so RXEN stays valid for duty-cycle listen windows.
2026-06-01 18:05:31 +08:00

50 lines
1.2 KiB
C

#ifndef BD6F9621_EF52_430C_86CB_3BC688233342
#define BD6F9621_EF52_430C_86CB_3BC688233342
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/types.h>
#include <stddef.h>
#define LLCC68_MAX_BUFFER_PAYLOAD CONFIG_LLCC68_MAX_PAYLOAD_LENGTH
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*llcc68_user_dio1_handler_t)(const struct device *dev, void *user_data);
enum llcc68_rf_switch_mode {
LLCC68_RF_SWITCH_NONE = 0,
LLCC68_RF_SWITCH_GPIO_COMPLEMENTARY = 1,
LLCC68_RF_SWITCH_DIO2_SINGLE = 2,
};
struct llcc68_config {
struct spi_dt_spec spi;
struct gpio_dt_spec reset_gpio;
struct gpio_dt_spec busy_gpio;
struct gpio_dt_spec dio1_gpio;
struct gpio_dt_spec tx_enable_gpio;
struct gpio_dt_spec rx_enable_gpio;
enum llcc68_rf_switch_mode rf_switch_mode;
};
struct llcc68_data {
struct gpio_callback dio1_irq_callback;
const struct device *self;
uint8_t tx_buffer[LLCC68_MAX_BUFFER_PAYLOAD + 4];
uint8_t rx_buffer[LLCC68_MAX_BUFFER_PAYLOAD + 4];
size_t tx_xfer_size;
llcc68_user_dio1_handler_t dio1_user_handler;
void *dio1_user_data;
};
int llcc68_init(const struct device *dev);
#ifdef __cplusplus
}
#endif
#endif /* BD6F9621_EF52_430C_86CB_3BC688233342 */