drivers: lora: sx1276: support antenna power enable
RF SPDT switches used for RX/TX selection have often power enable pin connected to MCU's GPIO, so it is possible to disable it to save power when not doing any data transfers. Add 'antenna-enable-gpios' property to support such designs. Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
This commit is contained in:
parent
35328cc537
commit
af67b297a3
2 changed files with 40 additions and 0 deletions
|
@ -24,6 +24,11 @@ LOG_MODULE_REGISTER(sx1276);
|
|||
#define GPIO_RESET_FLAGS DT_INST_GPIO_FLAGS(0, reset_gpios)
|
||||
#define GPIO_CS_PIN DT_INST_SPI_DEV_CS_GPIOS_PIN(0)
|
||||
|
||||
#define GPIO_ANTENNA_ENABLE_PIN \
|
||||
DT_INST_GPIO_PIN(0, antenna_enable_gpios)
|
||||
#define GPIO_ANTENNA_ENABLE_FLAGS \
|
||||
DT_INST_GPIO_FLAGS(0, antenna_enable_gpios)
|
||||
|
||||
#define GPIO_RFI_ENABLE_PIN \
|
||||
DT_INST_GPIO_PIN(0, rfi_enable_gpios)
|
||||
#define GPIO_RFI_ENABLE_FLAGS \
|
||||
|
@ -103,6 +108,9 @@ static const struct sx1276_dio sx1276_dios[] = { SX1276_DIO_GPIO_INIT(0) };
|
|||
|
||||
static struct sx1276_data {
|
||||
struct device *reset;
|
||||
#if DT_INST_NODE_HAS_PROP(0, antenna_enable_gpios)
|
||||
struct device *antenna_enable;
|
||||
#endif
|
||||
#if DT_INST_NODE_HAS_PROP(0, rfi_enable_gpios)
|
||||
struct device *rfi_enable;
|
||||
#endif
|
||||
|
@ -143,6 +151,13 @@ bool SX1276CheckRfFrequency(uint32_t frequency)
|
|||
return true;
|
||||
}
|
||||
|
||||
static inline void sx1276_antenna_enable(int val)
|
||||
{
|
||||
#if DT_INST_NODE_HAS_PROP(0, antenna_enable_gpios)
|
||||
gpio_pin_set(dev_data.antenna_enable, GPIO_ANTENNA_ENABLE_PIN, val);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void sx1276_rfi_enable(int val)
|
||||
{
|
||||
#if DT_INST_NODE_HAS_PROP(0, rfi_enable_gpios)
|
||||
|
@ -172,7 +187,11 @@ void SX1276SetAntSwLowPower(bool low_power)
|
|||
sx1276_rfi_enable(0);
|
||||
sx1276_rfo_enable(0);
|
||||
sx1276_pa_boost_enable(0);
|
||||
|
||||
sx1276_antenna_enable(0);
|
||||
} else {
|
||||
sx1276_antenna_enable(1);
|
||||
|
||||
/* rely on SX1276SetAntSw() to configure proper antenna path */
|
||||
}
|
||||
}
|
||||
|
@ -443,6 +462,21 @@ static int sx1276_antenna_configure(void)
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
#if DT_INST_NODE_HAS_PROP(0, antenna_enable_gpios)
|
||||
dev_data.antenna_enable = device_get_binding(
|
||||
DT_INST_GPIO_LABEL(0, antenna_enable_gpios));
|
||||
if (!dev_data.antenna_enable) {
|
||||
LOG_ERR("Cannot get pointer to %s device",
|
||||
DT_INST_GPIO_LABEL(0, antenna_enable_gpios));
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ret = gpio_pin_configure(dev_data.antenna_enable,
|
||||
GPIO_ANTENNA_ENABLE_PIN,
|
||||
GPIO_OUTPUT_INACTIVE |
|
||||
GPIO_ANTENNA_ENABLE_FLAGS);
|
||||
#endif
|
||||
|
||||
#if DT_INST_NODE_HAS_PROP(0, rfi_enable_gpios)
|
||||
dev_data.rfi_enable = device_get_binding(
|
||||
DT_INST_GPIO_LABEL(0, rfi_enable_gpios));
|
||||
|
|
|
@ -37,6 +37,12 @@ properties:
|
|||
- "rfo"
|
||||
- "pa-boost"
|
||||
|
||||
antenna-enable-gpios:
|
||||
type: phandle-array
|
||||
required: false
|
||||
description: |
|
||||
Antenna power enable pin.
|
||||
|
||||
rfi-enable-gpios:
|
||||
type: phandle-array
|
||||
required: false
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue