Skip to content

Commit 60f48f3

Browse files
committed
fixup! drivers/sx126x: add support for Dio2 and Dio3
1 parent eb21c8f commit 60f48f3

File tree

4 files changed

+30
-140
lines changed

4 files changed

+30
-140
lines changed

drivers/include/sx126x.h

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ typedef enum {
8383
*/
8484
typedef enum {
8585
SX126X_DIO2_UNUSED, /**< Not used */
86-
SX126X_DIO2_IRQ, /**< IRQ pin */
86+
SX126X_DIO2_IRQ, /**< IRQ pin (ToDo) */
8787
SX126X_DIO2_RF_SWITCH, /**< RF switch control pin */
8888
} sx126x_dio2_mode_t;
8989

@@ -92,8 +92,8 @@ typedef enum {
9292
*/
9393
typedef enum {
9494
SX126X_DIO3_UNUSED, /**< Not used */
95-
SX126X_DIO3_IRQ, /**< IRQ pin */
96-
SX126X_DIO3_TCX0, /**< TCXO control pin */
95+
SX126X_DIO3_IRQ, /**< IRQ pin (ToDo) */
96+
SX126X_DIO3_TCXO, /**< TCXO control pin */
9797
} sx126x_dio3_mode_t;
9898

9999
/**
@@ -114,27 +114,16 @@ typedef struct {
114114
gpio_t reset_pin; /**< Reset pin */
115115
gpio_t busy_pin; /**< Busy pin */
116116
gpio_t dio1_pin; /**< Dio1 pin */
117-
uint16_t dio1_irq_mask; /**< IRQ mask for IRQs to route to Dio1 */
118117
#if IS_USED(MODULE_SX126X_DIO2)
119118
sx126x_dio2_mode_t dio2_mode; /**< Dio2 mode */
120-
struct {
121-
gpio_t dio2_pin; /**< Dio2 IRQ pin if mode is SX126X_DIO2_IRQ */
122-
uint16_t dio2_irq_mask; /**< IRQ mask for IRQs to route to Dio2 */
123-
} dio2_arg;
124119
#endif
125120
#if IS_USED(MODULE_SX126X_DIO3)
126121
sx126x_dio3_mode_t dio3_mode; /**< Dio3 mode */
127-
union {
128-
struct {
129-
gpio_t dio3_pin; /**< Dio3 IRQ pin if mode is SX126X_DIO3_IRQ */
130-
uint16_t dio3_irq_mask; /**< IRQ mask for IRQs to route to Dio3 */
131-
};
132-
struct {
133-
unsigned tcxo_volt :8; /**< TCXO voltage (see sx126x_tcxo_ctrl_voltages_t)*/
134-
unsigned tcx0_timeout :24; /**< TCXO timeout to wait for 32MHz coming from TXC0,
135-
Delay duration = Delay(23:0) * 15.625 μs */
136-
};
137-
} u_dio3_arg;
122+
struct {
123+
unsigned tcxo_volt :8; /**< TCXO voltage (see sx126x_tcxo_ctrl_voltages_t)*/
124+
unsigned tcxo_timeout :24; /**< TCXO timeout to wait for 32MHz coming from TXC0,
125+
Delay duration = Delay(23:0) * 15.625 μs */
126+
} dio3_arg;
138127
#endif
139128
sx126x_reg_mod_t regulator; /**< Power regulator mode */
140129
sx126x_type_t type; /**< Variant of sx126x */

drivers/sx126x/include/sx126x_params.h

Lines changed: 18 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,6 @@ extern "C" {
6363
# define SX126X_PARAM_DIO1 GPIO_PIN(1, 4) /* D5 */
6464
#endif
6565

66-
#if !defined(SX126X_PARAM_DIO1_IRQ_MASK) || defined(DOXYGEN)
67-
/**
68-
* @brief Interrupt mask of events that should trigger an interrupt on DIO1
69-
*/
70-
# define SX126X_PARAM_DIO1_IRQ_MASK SX126X_IRQ_MASK_ALL
71-
#endif
72-
7366
#if !defined(SX126X_PARAM_REGULATOR) || defined(DOXYGEN)
7467
/**
7568
* @brief Regulator type which can be
@@ -91,61 +84,41 @@ extern "C" {
9184
* @brief DIO2 pin mode which can be
9285
* SX126X_DIO2_UNUSED, SX126X_DIO2_IRQ or SX126X_DIO2_RF_SWITCH
9386
*/
94-
# define SX126X_PARAM_DIO2_MODE SX126X_DIO2_IRQ
95-
#endif
96-
97-
#if !defined(SX126X_PARAM_DIO2) || defined(DOXYGEN)
98-
/**
99-
* @brief DIO2 pin if mode is SX126X_DIO2_IRQ or SX126X_DIO2_RF_SWITCH
100-
*/
101-
# define SX126X_PARAM_DIO2 GPIO_UNDEF
102-
#endif
103-
104-
#if !defined(SX126X_PARAM_DIO2_IRQ_MASK) || defined(DOXYGEN)
105-
/**
106-
* @brief Interrupt mask of events that should trigger an interrupt on DIO2
107-
* if mode is SX126X_DIO2_IRQ
108-
*/
109-
# define SX126X_PARAM_DIO2_IRQ_MASK 0
110-
#endif
111-
112-
#if !defined(SX126X_PARAM_DIO2_ARG) || defined(DOXYGEN)
113-
/**
114-
* @brief DIO2 argument if mode is SX126X_DIO2_IRQ or SX126X_DIO2_RF_SWITCH
115-
*/
116-
# define SX126X_PARAM_DIO2_ARG { .dio2_pin = SX126X_PARAM_DIO2, \
117-
.dio2_irq_mask = SX126X_PARAM_DIO2_IRQ_MASK }
87+
# define SX126X_PARAM_DIO2_MODE SX126X_DIO2_RF_SWITCH
11888
#endif
11989

12090
#if !defined(SX126X_PARAM_DIO3_MODE) || defined(DOXYGEN)
12191
/**
12292
* @brief DIO3 pin mode which can be
12393
* SX126X_DIO3_UNUSED, SX126X_DIO3_IRQ or SX126X_DIO3_TCXO
12494
*/
125-
# define SX126X_PARAM_DIO3_MODE SX126X_DIO3_IRQ
95+
# define SX126X_PARAM_DIO3_MODE SX126X_DIO3_TCXO
12696
#endif
12797

128-
#if !defined(SX126X_PARAM_DIO3) || defined(DOXYGEN)
98+
#if !defined(SX126X_PARAM_TCXO_VOLTAGE) || defined(DOXYGEN)
12999
/**
130-
* @brief DIO3 pin if mode is SX126X_DIO3_IRQ or SX126X_DIO3_TCXO
100+
* @brief TCXO voltage is configured to be 200 mV below the supply voltage.
101+
*
102+
* This means that even if tcxoVoltage is configured above the supply voltage,
103+
* the supply voltage will be limited by: VDDop > VTCXO + 200 mV
131104
*/
132-
# define SX126X_PARAM_DIO3 GPIO_UNDEF
105+
# define SX126X_PARAM_TCXO_VOLTAGE SX126X_TCXO_CTRL_3_0V
133106
#endif
134107

135-
#if !defined(SX126X_PARAM_DIO3_IRQ_MASK) || defined(DOXYGEN)
108+
#if !defined(SX126X_PARAM_TCXO_TIMEOUT) || defined(DOXYGEN)
136109
/**
137-
* @brief Interrupt mask of events that should trigger an interrupt on DIO3
138-
* if mode is SX126X_DIO3_IRQ
110+
* @brief Timeout for tcxo stabilization in 15.625 µs steps
111+
* The default value is 256 (4ms).
139112
*/
140-
# define SX126X_PARAM_DIO3_IRQ_MASK 0
113+
# define SX126X_PARAM_TCXO_TIMEOUT 256
141114
#endif
142115

143116
#if !defined(SX126X_PARAM_DIO3_ARG) || defined(DOXYGEN)
144117
/**
145-
* @brief DIO3 argument if mode is SX126X_DIO3_IRQ or SX126X_DIO3_TCXO
118+
* @brief DIO3 argument if mode is SX126X_DIO3_TCXO
146119
*/
147-
# define SX126X_PARAM_DIO3_ARG { .dio3_pin = SX126X_PARAM_DIO3, \
148-
.dio3_irq_mask = SX126X_PARAM_DIO3_IRQ_MASK }
120+
# define SX126X_PARAM_DIO3_ARG { .tcxo_volt = SX126X_PARAM_TCXO_VOLTAGE, \
121+
.tcxo_timeout = SX126X_PARAM_TCXO_TIMEOUT }
149122
#endif
150123

151124
#ifndef SX126X_PARAM_TYPE
@@ -177,13 +150,8 @@ extern "C" {
177150
* @brief DIO2 pin mode
178151
*/
179152
# define SX126X_DIO2_MODE .dio2_mode = SX126X_PARAM_DIO2_MODE,
180-
/**
181-
* @brief DIO2 pin argument
182-
*/
183-
# define SX126X_DIO2_PIN .dio2_arg = SX126X_PARAM_DIO2_ARG,
184153
#else
185154
# define SX126X_DIO2_MODE
186-
# define SX126X_DIO2_PIN
187155
#endif
188156

189157
#if IS_USED(MODULE_SX126X_DIO3) || defined(DOXYGEN)
@@ -194,10 +162,10 @@ extern "C" {
194162
/**
195163
* @brief DIO3 pin argument
196164
*/
197-
# define SX126X_DIO3_PIN .u_dio3_arg = SX126X_PARAM_DIO3_ARG,
165+
# define SX126X_DIO3_ARG .dio3_arg = SX126X_PARAM_DIO3_ARG,
198166
#else
199167
# define SX126X_DIO3_MODE
200-
# define SX126X_DIO3_PIN
168+
# define SX126X_DIO3_ARG
201169
#endif
202170

203171
#ifndef SX126X_PARAMS
@@ -206,15 +174,13 @@ extern "C" {
206174
.reset_pin = SX126X_PARAM_RESET, \
207175
.busy_pin = SX126X_PARAM_BUSY, \
208176
.dio1_pin = SX126X_PARAM_DIO1, \
209-
.dio1_irq_mask = SX126X_PARAM_DIO1_IRQ_MASK, \
210177
.type = SX126X_PARAM_TYPE, \
211178
.regulator = SX126X_PARAM_REGULATOR, \
212179
SX126X_SET_RF_MODE \
213180
SX126X_TX_PA_MODE \
214181
SX126X_DIO2_MODE \
215-
SX126X_DIO2_PIN \
216182
SX126X_DIO3_MODE \
217-
SX126X_DIO3_PIN \
183+
SX126X_DIO3_ARG \
218184
}
219185
#endif
220186

drivers/sx126x/sx126x.c

Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -149,41 +149,6 @@ static void _dio1_isr(void *arg)
149149
netdev_trigger_event_isr(arg);
150150
}
151151
#endif
152-
#if IS_USED(MODULE_SX126X_DIO2)
153-
__attribute__((weak))
154-
void sx126x_dio2_isr(void *dev, sx126x_irq_mask_t irq_mask)
155-
{
156-
(void)dev;
157-
(void)irq_mask;
158-
}
159-
static void _dio2_isr(void *dev)
160-
{
161-
(void)dev;
162-
sx126x_t *sx126x = (sx126x_t *)dev;
163-
sx126x_irq_mask_t irq_mask;
164-
sx126x_get_irq_status(sx126x, &irq_mask);
165-
irq_mask &= sx126x->params->dio2_arg.dio2_irq_mask; /* only process events from DIO2 */
166-
sx126x_clear_irq_status(sx126x, irq_mask);
167-
sx126x_dio2_isr(sx126x, irq_mask);
168-
}
169-
#endif
170-
#if IS_USED(MODULE_SX126X_DIO3)
171-
__attribute__((weak))
172-
void sx126x_dio3_isr(void *dev, sx126x_irq_mask_t irq_mask)
173-
{
174-
(void)dev;
175-
(void)irq_mask;
176-
}
177-
static void _dio3_isr(void *dev)
178-
{
179-
sx126x_t *sx126x = (sx126x_t *)dev;
180-
sx126x_irq_mask_t irq_mask;
181-
sx126x_get_irq_status(sx126x, &irq_mask);
182-
irq_mask &= sx126x->params->u_dio3_arg.dio3_irq_mask; /* only process events from DIO3 */
183-
sx126x_clear_irq_status(sx126x, irq_mask);
184-
sx126x_dio3_isr(sx126x, irq_mask);
185-
}
186-
#endif
187152

188153
int sx126x_init(sx126x_t *dev)
189154
{
@@ -225,40 +190,13 @@ int sx126x_init(sx126x_t *dev)
225190
/* Initialize radio with the default parameters */
226191
sx126x_init_default_config(dev);
227192

228-
/* Configure available IRQs */
229-
uint16_t irq_mask_dio1 = dev->params->dio1_irq_mask;
230-
uint16_t irq_mask_dio2 = 0;
231-
uint16_t irq_mask_dio3 = 0;
232-
233193
#if IS_USED(MODULE_SX126X_DIO2)
234-
if (dev->params->dio2_mode == SX126X_DIO2_IRQ) {
235-
if (gpio_is_valid(dev->params->dio2_arg.dio2_pin)) {
236-
res = gpio_init_int(dev->params->dio2_arg.dio2_pin, GPIO_IN, GPIO_RISING,
237-
_dio2_isr, dev);
238-
if (res < 0) {
239-
DEBUG("[sx126x] error: failed to initialize DIO2 pin\n");
240-
return res;
241-
}
242-
irq_mask_dio2 = dev->params->dio2_arg.dio2_irq_mask;
243-
}
244-
}
245-
else if (dev->params->dio2_mode == SX126X_DIO2_RF_SWITCH) {
194+
if (dev->params->dio2_mode == SX126X_DIO2_RF_SWITCH) {
246195
sx126x_set_dio2_as_rf_sw_ctrl(dev, true);
247196
}
248197
#endif
249198
#if IS_USED(MODULE_SX126X_DIO3)
250-
if (dev->params->dio3_mode == SX126X_DIO3_IRQ) {
251-
if (gpio_is_valid(dev->params->u_dio3_arg.dio3_pin)) {
252-
res = gpio_init_int(dev->params->u_dio3_arg.dio3_pin, GPIO_IN, GPIO_RISING,
253-
_dio3_isr, dev);
254-
if (res < 0) {
255-
DEBUG("[sx126x] error: failed to initialize DIO3 pin\n");
256-
return res;
257-
}
258-
irq_mask_dio3 = dev->params->u_dio3_arg.dio3_irq_mask;
259-
}
260-
}
261-
else if (dev->params->dio3_mode == SX126X_DIO3_TCX0) {
199+
if (dev->params->dio3_mode == SX126X_DIO3_TCXO) {
262200
sx126x_set_dio3_as_tcxo_ctrl(dev, dev->params->u_dio3_arg.tcxo_volt,
263201
dev->params->u_dio3_arg.tcx0_timeout);
264202

@@ -295,8 +233,7 @@ int sx126x_init(sx126x_t *dev)
295233

296234
sx126x_set_standby(dev, SX126X_STANDBY_CFG_XOSC);
297235

298-
sx126x_set_dio_irq_params(dev, SX126X_IRQ_MASK_ALL,
299-
irq_mask_dio1, irq_mask_dio2, irq_mask_dio3);
236+
sx126x_set_dio_irq_params(dev, SX126X_IRQ_MASK_ALL, SX126X_IRQ_MASK_ALL, 0, 0);
300237

301238
if (IS_ACTIVE(ENABLE_DEBUG)) {
302239
sx126x_pkt_type_t pkt_type;

drivers/sx126x/sx126x_netdev.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,7 @@ static void _isr(netdev_t *netdev)
155155

156156
sx126x_irq_mask_t irq_mask;
157157

158-
sx126x_get_irq_status(dev, &irq_mask);
159-
irq_mask &= dev->params->dio1_irq_mask; /* only process events from DIO1 */
160-
sx126x_clear_irq_status(dev, irq_mask);
158+
sx126x_get_and_clear_irq_status(dev, &irq_mask);
161159

162160
if (sx126x_is_stm32wl(dev)) {
163161
#if IS_USED(MODULE_SX126X_STM32WL)

0 commit comments

Comments
 (0)