1 /*
2  * Copyright (c) 2024 Florian Weber <Florian.Weber@live.de>
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #ifndef ZEPHYR_DRIVERS_SENSOR_MLX90394_MLX90394_REG_H
7 #define ZEPHYR_DRIVERS_SENSOR_MLX90394_MLX90394_REG_H
8 
9 #include <zephyr/sys/util_macro.h>
10 /* REGISTERS */
11 /* Status and measurent output */
12 #define MLX90394_REG_STAT1 0x00
13 #define MLX90394_REG_BXL   0x01
14 #define MLX90394_REG_BXH   0x02
15 #define MLX90394_REG_BYL   0x03
16 #define MLX90394_REG_BYH   0x04
17 #define MLX90394_REG_BZL   0x05
18 #define MLX90394_REG_BZH   0x06
19 #define MLX90394_REG_STAT2 0x07
20 #define MLX90394_REG_TL    0x08
21 #define MLX90394_REG_TH    0x09
22 
23 /* Who Am I registers */
24 #define MLX90394_REG_CID 0x0A
25 #define MLX90394_REG_DID 0x0B
26 
27 /* Control registers */
28 #define MLX90394_REG_CTRL1 0x0E
29 #define MLX90394_REG_CTRL2 0x0F
30 #define MLX90394_REG_CTRL3 0x14
31 #define MLX90394_REG_CTRL4 0x15
32 
33 /* Reset register */
34 #define MLX90394_REG_RST 0x11
35 
36 /* Wake On Change registers  */
37 #define MLX90394_REG_WOC_XL 0x58
38 #define MLX90394_REG_WOC_XH 0x59
39 #define MLX90394_REG_WOC_YL 0x5A
40 #define MLX90394_REG_WOC_YH 0x5B
41 #define MLX90394_REG_WOC_ZL 0x5C
42 #define MLX90394_REG_WOC_ZH 0x5D
43 
44 /* VALUES */
45 /* STAT1 values RO */
46 #define MLX90394_STAT1_DRDY    BIT(0)
47 #define MLX90394_STAT1_DOR     BIT(3)
48 #define MLX90394_STAT1_RT      BIT(3)
49 #define MLX90394_STAT1_INT     BIT(4)
50 #define MLX90394_STAT1_DEFAULT (MLX90394_STAT1_RT)
51 
52 /* STAT2 values RO */
53 #define MLX90394_STAT2_HOVF_X  BIT(0)
54 #define MLX90394_STAT2_HOVF_Y  BIT(1)
55 #define MLX90394_STAT2_HOVF_Z  BIT(2)
56 #define MLX90394_STAT2_DOR     BIT(3)
57 #define MLX90394_STAT2_DEFAULT 0
58 
59 /* Who-I-Am register values RO */
60 #define MLX90394_CID 0x94
61 #define MLX90394_DID 0xaa
62 
63 /* Write this value to reset Register soft resets the chip RW */
64 #define MLX90394_RST 0x06
65 
66 /* CTRL1 values RW */
67 #define MLX90394_CTRL1_X_EN_BIT    4
68 #define MLX90394_CTRL1_Y_EN_BIT    5
69 #define MLX90394_CTRL1_Z_EN_BIT    6
70 #define MLX90394_CTRL1_MODE        GENMASK(3, 0)
71 #define MLX90394_CTRL1_MODE_SINGLE 1
72 #define MLX90394_CTRL1_X_EN        BIT(MLX90394_CTRL1_X_EN_BIT)
73 #define MLX90394_CTRL1_Y_EN        BIT(MLX90394_CTRL1_Y_EN_BIT)
74 #define MLX90394_CTRL1_Z_EN        BIT(MLX90394_CTRL1_Z_EN_BIT)
75 #define MLX90394_CTRL1_SWOK        BIT(7)
76 #define MLX90394_CTRL1_PREP(MODE, X_EN, Y_EN, Z_EN, SWOK)                                          \
77 	(FIELD_PREP(MLX90394_CTRL1_MODE, MODE) | FIELD_PREP(MLX90394_CTRL1_X_EN, X_EN) |           \
78 	 FIELD_PREP(MLX90394_CTRL1_Y_EN, Y_EN) | FIELD_PREP(MLX90394_CTRL1_Z_EN, Z_EN) |           \
79 	 FIELD_PREP(MLX90394_CTRL1_SWOK, SWOK))
80 #define MLX90394_CTRL1_DEFAULT MLX90394_CTRL1_PREP(0, 1, 1, 1, 0)
81 
82 /* CTRL2 values RW */
83 enum mlx90394_reg_config_val {
84 	MLX90394_CTRL2_CONFIG_HIGH_RANGE_LOW_CURRENT = 0,
85 	MLX90394_CTRL2_CONFIG_HIGH_RANGE_LOW_NOISE,
86 	MLX90394_CTRL2_CONFIG_HIGH_SENSITIVITY_LOW_NOISE
87 };
88 #define MLX90394_CTRL2_WOC_MODE   GENMASK(1, 0)
89 #define MLX90394_CTRL2_INTREPB    BIT(2)
90 #define MLX90394_CTRL2_INTB_SCL_B BIT(3)
91 #define MLX90394_CTRL2_INTDUR     GENMASK(5, 4)
92 #define MLX90394_CTRL2_CONFIG     GENMASK(7, 6)
93 #define MLX90394_CTRL2_PREP(WOC_MODE, INTREPB, INTB_SCL_B, INTDUR, CONFIG)                         \
94 	(FIELD_PREP(MLX90394_CTRL2_WOC_MODE, WOC_MODE) |                                           \
95 	 FIELD_PREP(MLX90394_CTRL2_INTREPB, INTREPB) |                                             \
96 	 FIELD_PREP(MLX90394_CTRL2_INTB_SCL_B, INTB_SCL_B) |                                       \
97 	 FIELD_PREP(MLX90394_CTRL2_INTDUR, INTDUR) | FIELD_PREP(MLX90394_CTRL2_CONFIG, CONFIG))
98 #define MLX90394_CTRL2_DEFAULT                                                                     \
99 	MLX90394_CTRL2_PREP(0, 0, 1, 0, MLX90394_CTRL2_CONFIG_HIGH_RANGE_LOW_NOISE)
100 
101 /* CTRL3 values RW */
102 #define MLX90394_CTRL3_DIG_FILT_TEMP    GENMASK(2, 0)
103 #define MLX90394_CTRL3_DIG_FILT_HALL_XY GENMASK(5, 3)
104 #define MLX90394_CTRL3_OSR_TEMP         BIT(6)
105 #define MLX90394_CTRL3_OSR_HALL         BIT(7)
106 #define MLX90394_CTRL3_PREP(DIG_FILT_TEMP, DIG_FILT_HALL_XY, OSR_TEMP, OSR_HALL)                   \
107 	(FIELD_PREP(MLX90394_CTRL3_DIG_FILT_TEMP, DIG_FILT_TEMP) |                                 \
108 	 FIELD_PREP(MLX90394_CTRL3_DIG_FILT_HALL_XY, DIG_FILT_HALL_XY) |                           \
109 	 FIELD_PREP(MLX90394_CTRL3_OSR_TEMP, OSR_TEMP) |                                           \
110 	 FIELD_PREP(MLX90394_CTRL3_OSR_HALL, OSR_HALL))
111 #define MLX90394_CTRL3_DEFAULT MLX90394_CTRL3_PREP(1, 4, 1, 1)
112 
113 /* CTRL4 values RW BIT(6) has to be always 0 so it is not included here */
114 #define MLX90394_CTRL4_T_EN_BIT        5
115 #define MLX90394_CTRL4_DIG_FILT_HALL_Z GENMASK(2, 0)
116 #define MLX90394_CTRL4_DRDY_EN         BIT(3)
117 #define MLX90394_CTRL4_T_EN            BIT(MLX90394_CTRL4_T_EN_BIT)
118 #define MLX90394_CTRL4_PREP(DIG_FILT_HALL_Z, DRDY_EN, T_EN)                                        \
119 	(FIELD_PREP(MLX90394_CTRL4_DIG_FILT_HALL_Z, DIG_FILT_HALL_Z) |                             \
120 	 FIELD_PREP(MLX90394_CTRL4_DRDY_EN, DRDY_EN) | FIELD_PREP(MLX90394_CTRL4_T_EN, T_EN) |     \
121 	 BIT(4) | BIT(7))
122 #define MLX90394_CTRL4_DEFAULT MLX90394_CTRL4_PREP(5, 0, 0)
123 
124 /* helper function to modify only one field */
125 #define MLX90394_FIELD_MOD(mask, new_field_val, val)                                               \
126 	((val & ~mask) | FIELD_PREP(mask, new_field_val))
127 
128 #endif /* ZEPHYR_DRIVERS_SENSOR_MLX90394_MLX90394_REG_H */
129