Skip to content

Commit 1c759f9

Browse files
committed
sensor: afbr_s50: Add DTS configuration bindings
The following parameters are exposed through DTS bindings: - ODR. - Dual Frequency Mode. - Measurement Mode. Signed-off-by: Luis Ubieda <[email protected]>
1 parent 14e926b commit 1c759f9

File tree

3 files changed

+124
-17
lines changed

3 files changed

+124
-17
lines changed

drivers/sensor/broadcom/afbr_s50/afbr_s50.c

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,20 @@ struct afbr_s50_data {
4141
struct afbr_s50_platform_data platform;
4242
};
4343

44-
/* Only used to get DTS bindings, otherwise passed onto platform struct */
4544
struct afbr_s50_config {
46-
struct gpio_dt_spec cs;
47-
struct gpio_dt_spec clk;
48-
struct gpio_dt_spec mosi;
49-
struct gpio_dt_spec miso;
50-
struct gpio_dt_spec irq;
45+
/* GPIOs only used to get DTS bindings, otherwise passed onto platform struct */
46+
struct {
47+
struct gpio_dt_spec cs;
48+
struct gpio_dt_spec clk;
49+
struct gpio_dt_spec mosi;
50+
struct gpio_dt_spec miso;
51+
struct gpio_dt_spec irq;
52+
} gpio;
53+
struct {
54+
uint32_t odr;
55+
uint8_t dual_freq_mode;
56+
uint8_t measurement_mode;
57+
} settings;
5158
};
5259

5360
static void data_ready_work_handler(struct rtio_iodev_sqe *iodev_sqe)
@@ -265,6 +272,7 @@ int afbr_s50_platform_init(struct afbr_s50_platform_data *platform_data)
265272
static int afbr_s50_init(const struct device *dev)
266273
{
267274
struct afbr_s50_data *data = dev->data;
275+
const struct afbr_s50_config *cfg = dev->config;
268276
status_t status;
269277
int err;
270278

@@ -280,16 +288,28 @@ static int afbr_s50_init(const struct device *dev)
280288
return -ENOMEM;
281289
}
282290

283-
status = Argus_Init(data->platform.argus.handle, data->platform.argus.id);
291+
/** InitMode */
292+
status = Argus_InitMode(data->platform.argus.handle,
293+
data->platform.argus.id,
294+
cfg->settings.measurement_mode);
284295
if (status != STATUS_OK) {
285296
LOG_ERR("Failed to initialize device");
286297
return -EIO;
287298
}
288299

300+
status = Argus_SetConfigurationDFMMode(data->platform.argus.handle,
301+
cfg->settings.dual_freq_mode);
302+
if (status != STATUS_OK) {
303+
LOG_ERR("Failed to set DFM mode: %d", status);
304+
return -EIO;
305+
}
306+
307+
uint32_t period_us = USEC_PER_SEC / cfg->settings.odr;
308+
289309
status = Argus_SetConfigurationFrameTime(data->platform.argus.handle,
290-
100000);
310+
period_us);
291311
if (status != STATUS_OK) {
292-
LOG_ERR("Failed to set frame time");
312+
LOG_ERR("Failed to set frame time: %d", status);
293313
return -EIO;
294314
}
295315

@@ -340,6 +360,16 @@ BUILD_ASSERT(CONFIG_MAIN_STACK_SIZE >= 4096,
340360

341361
#define AFBR_S50_INIT(inst) \
342362
\
363+
BUILD_ASSERT(DT_INST_PROP(inst, odr) > 0, "Please set valid ODR"); \
364+
BUILD_ASSERT((DT_INST_PROP(inst, dual_freq_mode) != 0) ^ \
365+
((DT_INST_PROP(inst, measurement_mode) & ARGUS_MODE_FLAG_HIGH_SPEED) != 0), \
366+
"High Speed mode is not compatible with Dual-Frequency mode enabled. " \
367+
"Please disable it on device-tree or change measurement modes"); \
368+
BUILD_ASSERT((DT_INST_PROP(inst, dual_freq_mode) != 0) ^ \
369+
(DT_INST_PROP(inst, odr) > 100), \
370+
"ODR is too high for Dual-Frequency mode. Please reduce it to " \
371+
"100Hz or less"); \
372+
\
343373
RTIO_DEFINE(afbr_s50_rtio_ctx_##inst, 8, 8); \
344374
SPI_DT_IODEV_DEFINE(afbr_s50_bus_##inst, \
345375
DT_DRV_INST(inst), \
@@ -348,10 +378,17 @@ BUILD_ASSERT(CONFIG_MAIN_STACK_SIZE >= 4096,
348378
0U); \
349379
\
350380
static const struct afbr_s50_config afbr_s50_cfg_##inst = { \
351-
.irq = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0}), \
352-
.clk = GPIO_DT_SPEC_INST_GET_OR(inst, spi_sck_gpios, {0}), \
353-
.miso = GPIO_DT_SPEC_INST_GET_OR(inst, spi_miso_gpios, {0}), \
354-
.mosi = GPIO_DT_SPEC_INST_GET_OR(inst, spi_mosi_gpios, {0}), \
381+
.gpio = { \
382+
.irq = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0}), \
383+
.clk = GPIO_DT_SPEC_INST_GET_OR(inst, spi_sck_gpios, {0}), \
384+
.miso = GPIO_DT_SPEC_INST_GET_OR(inst, spi_miso_gpios, {0}), \
385+
.mosi = GPIO_DT_SPEC_INST_GET_OR(inst, spi_mosi_gpios, {0}), \
386+
}, \
387+
.settings = { \
388+
.odr = DT_INST_PROP(inst, odr), \
389+
.dual_freq_mode = DT_INST_PROP(inst, dual_freq_mode), \
390+
.measurement_mode = DT_INST_PROP(inst, measurement_mode), \
391+
}, \
355392
}; \
356393
\
357394
PINCTRL_DT_DEV_CONFIG_DECLARE(DT_INST_PARENT(inst)); \
@@ -369,11 +406,11 @@ BUILD_ASSERT(CONFIG_MAIN_STACK_SIZE >= 4096,
369406
.spi = { \
370407
.cs = \
371408
&_spi_dt_spec_##afbr_s50_bus_##inst.config.cs.gpio,\
372-
.clk = &afbr_s50_cfg_##inst.clk, \
373-
.mosi = &afbr_s50_cfg_##inst.mosi, \
374-
.miso = &afbr_s50_cfg_##inst.miso, \
409+
.clk = &afbr_s50_cfg_##inst.gpio.clk, \
410+
.mosi = &afbr_s50_cfg_##inst.gpio.mosi, \
411+
.miso = &afbr_s50_cfg_##inst.gpio.miso, \
375412
}, \
376-
.irq = &afbr_s50_cfg_##inst.irq, \
413+
.irq = &afbr_s50_cfg_##inst.gpio.irq, \
377414
}, \
378415
}, \
379416
}, \

dts/bindings/sensor/brcm,afbr-s50.yaml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,41 @@ properties:
4545
property value should ensure the flags properly describe the
4646
signal that is presented to the driver.
4747
48+
measurement-mode:
49+
type: int
50+
required: true
51+
description: |
52+
Specify Measurement Mode setting.
53+
enum:
54+
- 1 # AFBR_S50_DT_MODE_SHORT_RANGE
55+
- 2 # AFBR_S50_DT_MODE_LONG_RANGE
56+
- 5 # AFBR_S50_DT_MODE_HIGH_SPEED_SHORT_RANGE
57+
- 6 # AFBR_S50_DT_MODE_HIGH_SPEED_LONG_RANGE
58+
- 9 # AFBR_S50_DT_MODE_HIGH_PRECISION_SHORT_RANGE
59+
- 129 # AFBR_S50_DT_MODE_SHORT_RANGE_LASER_CLASS_2
60+
- 130 # AFBR_S50_DT_MODE_LONG_RANGE_LASER_CLASS_2
61+
- 133 # AFBR_S50_DT_MODE_HIGH_SPEED_SHORT_RANGE_LASER_CLASS_2
62+
- 134 # AFBR_S50_DT_MODE_HIGH_SPEED_LONG_RANGE_LASER_CLASS_2
63+
- 137 # AFBR_S50_DT_MODE_HIGH_PRECISION_SHORT_RANGE_LASER_CLASS_2
64+
65+
dual-freq-mode:
66+
type: int
67+
required: true
68+
description: |
69+
Specify Dual Frequency Mode setting.
70+
enum:
71+
- 0 # AFBR_S50_DT_DFM_MODE_OFF
72+
- 1 # AFBR_S50_DT_DFM_MODE_4X
73+
- 2 # AFBR_S50_DT_DFM_MODE_8X
74+
75+
odr:
76+
type: int
77+
default: 10
78+
description: |
79+
Specify the default output data rate expressed in samples per second (Hz).
80+
Default configuration used from all sample-codes provided by vendor.
81+
Please note the range is limited with Dual Frequency Mode enabled (up to 100 Hz).
82+
4883
spi-mosi-gpios:
4984
type: phandle-array
5085
required: true
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2025 Croxel Inc.
3+
* Copyright (c) 2025 CogniPilot Foundation
4+
*
5+
* SPDX-License-Identifier: Apache-2.0
6+
*/
7+
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_BRCM_AFBR_S50_H_
8+
#define ZEPHYR_INCLUDE_DT_BINDINGS_BRCM_AFBR_S50_H_
9+
10+
/**
11+
* @name afbr_s50 Dual Frequency Mode Settings
12+
* @{
13+
*/
14+
#define AFBR_S50_DT_DFM_MODE_OFF 0
15+
#define AFBR_S50_DT_DFM_MODE_4X 1
16+
#define AFBR_S50_DT_DFM_MODE_8X 2
17+
/** @} */
18+
19+
/**
20+
* @name afbr_s50 Measurement Modes
21+
* @{
22+
*/
23+
#define AFBR_S50_DT_MODE_SHORT_RANGE 1
24+
#define AFBR_S50_DT_MODE_LONG_RANGE 2
25+
#define AFBR_S50_DT_MODE_HIGH_SPEED_SHORT_RANGE 5
26+
#define AFBR_S50_DT_MODE_HIGH_SPEED_LONG_RANGE 6
27+
#define AFBR_S50_DT_MODE_HIGH_PRECISION_SHORT_RANGE 9
28+
#define AFBR_S50_DT_MODE_SHORT_RANGE_LASER_CLASS_2 129
29+
#define AFBR_S50_DT_MODE_LONG_RANGE_LASER_CLASS_2 130
30+
#define AFBR_S50_DT_MODE_HIGH_SPEED_SHORT_RANGE_LASER_CLASS_2 133
31+
#define AFBR_S50_DT_MODE_HIGH_SPEED_LONG_RANGE_LASER_CLASS_2 134
32+
#define AFBR_S50_DT_MODE_HIGH_PRECISION_SHORT_RANGE_LASER_CLASS_2 137
33+
/** @} */
34+
35+
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_BRCM_AFBR_S50_H_ */

0 commit comments

Comments
 (0)