1 /*
2  * Copyright (c) 2024 MASSDRIVER EI (massdriver.space)
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_DRIVERS_SENSOR_XBR818_XBR818_H_
8 #define ZEPHYR_DRIVERS_SENSOR_XBR818_XBR818_H_
9 
10 #include <stdint.h>
11 #include <zephyr/drivers/gpio.h>
12 #include <zephyr/drivers/sensor.h>
13 #include <zephyr/kernel.h>
14 
15 /* 32Khz clockrate, most time values are multiple of this */
16 #define SENSOR_XBR818_CLOCKRATE 32000
17 
18 struct xbr818_config {
19 	struct i2c_dt_spec i2c;
20 	struct gpio_dt_spec i2c_en;
21 	struct gpio_dt_spec io_val;
22 };
23 
24 struct xbr818_data {
25 	bool value;
26 	uint32_t trigger_type;
27 	sensor_trigger_handler_t handler;
28 	struct gpio_callback gpio_cb;
29 	const struct sensor_trigger *trigger;
30 	const struct device *dev;
31 	struct k_work work;
32 };
33 
34 /* reference rd-04 module manual for more information */
35 /* [0-2]: power of PA
36  * [4-6]: mixer trim
37  */
38 #define XBR818_RF_POWER            0x03
39 #define XBR818_RF_EN_SEL           0x04
40 /* minimum value of 2 */
41 #define XBR818_SAMPLE_RATE_DIVIDER 0x10
42 /* [0]: enable detection
43  * [1-2]: readable data. 0: det_dc_sum 1: det_ac_sum 2: det_dc_used 3: det_noise
44  * [3]: enable read on 0x28-0x29
45  * [4]: signal detection threshold. 0: auto by pin 1: register
46  * [7]: enable read on 0x26-0x29
47  */
48 #define XBR818_I2C_OUT             0x13
49 /* Threshold for detection
50  * [0-7]
51  */
52 #define XBR818_THRESHOLD_1         0x18
53 /* [8-15] */
54 #define XBR818_THRESHOLD_2         0x19
55 /* Threshold for noise
56  * [0-7]
57  */
58 #define XBR818_THRESHOLD_NOISE_1   0x1A
59 /* [8-15] */
60 #define XBR818_THRESHOLD_NOISE_2   0x1B
61 /* Delay Time (in 1/32000 seconds)
62  * [0-7]
63  */
64 #define XBR818_DELAY_TIME_1        0x1D
65 /* [8-15] */
66 #define XBR818_DELAY_TIME_2        0x1E
67 /* [16-23] */
68 #define XBR818_DELAY_TIME_3        0x1F
69 /* [0]: enable
70  * [1-2]: light sensor timer. 0: disabled 1: 4 sec 2: 1 minute 3: 1 hour
71  * [3-4]: output timer. 0: 1 sec 1: 1 minute 2: 1 hour 3: 1 day
72  * [5]: delay time. 0: 'configure by pin' 1: configure by register
73  */
74 #define XBR818_TIMER_CTRL          0x1C
75 /* Lock Time (in 1/32000 seconds)
76  * [0-7]
77  */
78 #define XBR818_LOCK_TIME_1         0x20
79 /* [8-15] */
80 #define XBR818_LOCK_TIME_2         0x21
81 /* [16-23] */
82 #define XBR818_LOCK_TIME_3         0x22
83 /* Pin settings
84  * [0-3]: IO_VAL pin
85  * 0xc: io_value_out, 0xd: io_value_out inverted, 0xf: GPIO
86  * [4-7]: INT_IRQ pin
87  * 0x0: t3_int_irq, 0x9: io_value_out, 0xa: io_value_out inverted, 0xf: GPIO
88  */
89 #define XBR818_PIN_SETTINGS        0x23
90 /* [0]: ADC1 is configured for VCO trimming. 0: enable, 1: disable
91  * [1]: Low power mode is pin or register. 0: pin 1: register
92  * [2]: If IO_VAL pin is GPIO, output. 0: no 1: yes
93  * [3]: if INT_IRQ pin is GPIO, output. 0:no 1:yes
94  */
95 #define XBR818_IO_ACTIVE_VALUE_REG 0x24
96 
97 #endif /* ZEPHYR_DRIVERS_SENSOR_XBR818_XBR818_H_ */
98