Skip to content

Commit 5cd3a7e

Browse files
ubiedakartben
authored andcommitted
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 <luisf@croxel.com>
1 parent 820975a commit 5cd3a7e

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
@@ -42,13 +42,20 @@ struct afbr_s50_data {
4242
struct afbr_s50_platform_data platform;
4343
};
4444

45-
/* Only used to get DTS bindings, otherwise passed onto platform struct */
4645
struct afbr_s50_config {
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;
46+
/* GPIOs only used to get DTS bindings, otherwise passed onto platform struct */
47+
struct {
48+
struct gpio_dt_spec cs;
49+
struct gpio_dt_spec clk;
50+
struct gpio_dt_spec mosi;
51+
struct gpio_dt_spec miso;
52+
struct gpio_dt_spec irq;
53+
} gpio;
54+
struct {
55+
uint32_t odr;
56+
uint8_t dual_freq_mode;
57+
uint8_t measurement_mode;
58+
} settings;
5259
};
5360

5461
static void data_ready_work_handler(struct rtio_iodev_sqe *iodev_sqe)
@@ -266,6 +273,7 @@ int afbr_s50_platform_init(struct afbr_s50_platform_data *platform_data)
266273
static int afbr_s50_init(const struct device *dev)
267274
{
268275
struct afbr_s50_data *data = dev->data;
276+
const struct afbr_s50_config *cfg = dev->config;
269277
status_t status;
270278
int err;
271279

@@ -281,16 +289,28 @@ static int afbr_s50_init(const struct device *dev)
281289
return -ENOMEM;
282290
}
283291

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

301+
status = Argus_SetConfigurationDFMMode(data->platform.argus.handle,
302+
cfg->settings.dual_freq_mode);
303+
if (status != STATUS_OK) {
304+
LOG_ERR("Failed to set DFM mode: %d", status);
305+
return -EIO;
306+
}
307+
308+
uint32_t period_us = USEC_PER_SEC / cfg->settings.odr;
309+
290310
status = Argus_SetConfigurationFrameTime(data->platform.argus.handle,
291-
100000);
311+
period_us);
292312
if (status != STATUS_OK) {
293-
LOG_ERR("Failed to set frame time");
313+
LOG_ERR("Failed to set frame time: %d", status);
294314
return -EIO;
295315
}
296316

@@ -341,6 +361,16 @@ BUILD_ASSERT(CONFIG_MAIN_STACK_SIZE >= 4096,
341361

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

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)