summaryrefslogtreecommitdiff
path: root/driver/accel_lis2dw12.h
blob: 8e1c97464c93a7c4cf996e98e6ea1ad641824437 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/* Copyright 2019 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/*
 * LIS2DW12 accelerometer include file for Chrome EC 3D digital accelerometer.
 * For more details on LIS2DW12 device please refer to www.st.com.
 */

#ifndef __CROS_EC_ACCEL_LIS2DW12_H
#define __CROS_EC_ACCEL_LIS2DW12_H

#include "driver/accel_lis2dw12_public.h"
#include "stm_mems_common.h"

/* Who am I. */
#define LIS2DW12_WHO_AM_I_REG		0x0f
#define LIS2DW12_WHO_AM_I		0x44

/* Registers sensor. */
#define LIS2DW12_CTRL1_ADDR		0x20
#define LIS2DW12_CTRL2_ADDR		0x21
#define LIS2DW12_CTRL3_ADDR		0x22

#define LIS2DW12_CTRL4_ADDR		0x23

/* CTRL4 bits. */
#define LIS2DW12_INT1_FTH		0x02
#define LIS2DW12_INT1_D_TAP		0x08
#define LIS2DW12_INT1_S_TAP		0x40

#define LIS2DW12_CTRL5_ADDR		0x24

/* CTRL5 bits. */
#define LIS2DW12_INT2_FTH		0x02

#define LIS2DW12_CTRL6_ADDR		0x25
#define LIS2DW12_STATUS_REG		0x27

/* STATUS bits. */
#define LIS2DW12_STS_DRDY_UP		0x01
#define LIS2DW12_SINGLE_TAP_UP		0x08
#define LIS2DW12_DOUBLE_TAP_UP		0x10
#define LIS2DW12_FIFO_THS_UP		0x80

#define LIS2DW12_OUT_X_L_ADDR		0x28

#define LIS2DW12_FIFO_CTRL_ADDR		0x2e

/* FIFO_CTRL bits. */
#define LIS2DW12_FIFO_MODE_MASK		0xe0

/* List of supported FIFO mode. */
enum lis2dw12_fmode {
	LIS2DW12_FIFO_BYPASS_MODE = 0,
	LIS2DW12_FIFO_MODE,
	LIS2DW12_FIFO_CONT_MODE = 6
};

#define LIS2DW12_FIFO_THRESHOLD_MASK	0x1f

#define LIS2DW12_FIFO_SAMPLES_ADDR	0x2f
#define LIS2DW12_TAP_THS_X_ADDR		0x30
#define LIS2DW12_TAP_THS_Y_ADDR		0x31
#define LIS2DW12_TAP_THS_Z_ADDR		0x32
#define LIS2DW12_INT_DUR_ADDR		0x33

#define LIS2DW12_WAKE_UP_THS_ADDR	0x34

/* TAP bits. */
#define LIS2DW12_SINGLE_DOUBLE_TAP	0x80

/* FIFO_SAMPLES bits. */
#define LIS2DW12_FIFO_DIFF_MASK		0x3f
#define LIS2DW12_FIFO_OVR_MASK		0x40
#define LIS2DW12_FIFO_FTH_MASK		0x80

#define LIS2DW12_ABS_INT_CFG_ADDR	0x3f

/* INT Configuration bits. */
#define LIS2DW12_DRDY_PULSED		0x80
#define LIS2DW12_INT2_ON_INT1		0x40
#define LIS2DW12_INT_ENABLE		0x20

/* Alias Registers/Masks. */
#define LIS2DW12_ACC_ODR_ADDR		LIS2DW12_CTRL1_ADDR
#define LIS2DW12_ACC_ODR_MASK		0xf0

#define LIS2DW12_ACC_MODE_ADDR		LIS2DW12_CTRL1_ADDR
#define LIS2DW12_ACC_MODE_MASK		0x0c

/* Power mode selection. */
enum lis2sw12_mode {
	LIS2DW12_LOW_POWER = 0,
	LIS2DW12_HIGH_PERF,
	LIS2DW12_SINGLE_DC,
	LIS2DW12_LOW_POWER_LIST_NUM
};

#define LIS2DW12_ACC_LPMODE_ADDR	LIS2DW12_CTRL1_ADDR
#define LIS2DW12_ACC_LPMODE_MASK	0x03

/*
 * Low power mode selection.
 * TODO: Support all Low Power Mode. Actually is not supported only
 * LOW_POWER_MODE_1.
 */
enum lis2sw12_lpmode {
	LIS2DW12_LOW_POWER_MODE_1 = 0,
	LIS2DW12_LOW_POWER_MODE_2,
	LIS2DW12_LOW_POWER_MODE_3,
	LIS2DW12_LOW_POWER_MODE_4,
	LIS2DW12_LOW_POWER_MODE_LIST_NUM
};

#define LIS2DW12_BDU_ADDR		LIS2DW12_CTRL2_ADDR
#define LIS2DW12_BDU_MASK		0x08

#define LIS2DW12_SOFT_RESET_ADDR	LIS2DW12_CTRL2_ADDR
#define LIS2DW12_SOFT_RESET_MASK	0x40

#define LIS2DW12_BOOT_ADDR		LIS2DW12_CTRL2_ADDR
#define LIS2DW12_BOOT_MASK		0x80

#define LIS2DW12_LIR_ADDR		LIS2DW12_CTRL3_ADDR
#define LIS2DW12_LIR_MASK		0x10

#define LIS2DW12_H_ACTIVE_ADDR		LIS2DW12_CTRL3_ADDR
#define LIS2DW12_H_ACTIVE_MASK		0x08

#define LIS2DW12_INT1_FTH_ADDR		LIS2DW12_CTRL4_ADDR
#define LIS2DW12_INT1_FTH_MASK		LIS2DW12_INT1_FTH

#define LIS2DW12_INT1_TAP_ADDR		LIS2DW12_CTRL4_ADDR
#define LIS2DW12_INT1_DTAP_MASK		0x08
#define LIS2DW12_INT1_STAP_MASK		0x40

#define LIS2DW12_INT1_D_TAP_EN		LIS2DW12_INT1_DTAP_MASK

#define LIS2DW12_STATUS_TAP		LIS2DW12_STS_DRDY_UP
#define LIS2DW12_SINGLE_TAP		LIS2DW12_SINGLE_TAP_UP
#define LIS2DW12_DOUBLE_TAP		LIS2DW12_DOUBLE_TAP_UP

#define LIS2DW12_INT2_ON_INT1_ADDR	LIS2DW12_ABS_INT_CFG_ADDR
#define LIS2DW12_INT2_ON_INT1_MASK	LIS2DW12_INT2_ON_INT1

#define LIS2DW12_DRDY_PULSED_ADDR	LIS2DW12_ABS_INT_CFG_ADDR
#define LIS2DW12_DRDY_PULSED_MASK	LIS2DW12_DRDY_PULSED

/* Acc data rate for HR mode. */
enum lis2dw12_odr {
	LIS2DW12_ODR_POWER_OFF_VAL = 0x00,
	LIS2DW12_ODR_12HZ_VAL = 0x02,
	LIS2DW12_ODR_25HZ_VAL,
	LIS2DW12_ODR_50HZ_VAL,
	LIS2DW12_ODR_100HZ_VAL,
	LIS2DW12_ODR_200HZ_VAL,
	LIS2DW12_ODR_400HZ_VAL,
	LIS2DW12_ODR_800HZ_VAL,
	LIS2DW12_ODR_1_6kHZ_VAL,
	LIS2DW12_ODR_LIST_NUM
};

/* Full scale range registers. */
#define LIS2DW12_FS_ADDR		LIS2DW12_CTRL6_ADDR
#define LIS2DW12_FS_MASK		0x30

/* Acc FS value. */
enum lis2dw12_fs {
	LIS2DW12_FS_2G_VAL = 0x00,
	LIS2DW12_FS_4G_VAL,
	LIS2DW12_FS_8G_VAL,
	LIS2DW12_FS_16G_VAL,
	LIS2DW12_FS_LIST_NUM
};

#define LIS2DW12_ACCEL_FS_MAX_VAL	16

/* Acc Gain value. */
#define LIS2DW12_FS_2G_GAIN		3904
#define LIS2DW12_FS_4G_GAIN		(LIS2DW12_FS_2G_GAIN << 1)
#define LIS2DW12_FS_8G_GAIN		(LIS2DW12_FS_2G_GAIN << 2)
#define LIS2DW12_FS_16G_GAIN		(LIS2DW12_FS_2G_GAIN << 3)

/* FS Full Scale value from Gain. */
#define LIS2DW12_GAIN_FS(_gain) \
	(2 << (31 - __builtin_clz(_gain / LIS2DW12_FS_2G_GAIN)))

/* Gain value from selected Full Scale. */
#define LIS2DW12_FS_GAIN(_fs) \
	(LIS2DW12_FS_2G_GAIN << (30 - __builtin_clz(_fs)))

/* Reg value from Full Scale. */
#define LIS2DW12_FS_REG(_fs) \
	(30 - __builtin_clz(_fs))

/* Normalized FS value from Full Scale. */
#define LIS2DW12_NORMALIZE_FS(_fs) \
	(1 << (30 - __builtin_clz(_fs)))

/*
 * Sensor resolution in number of bits.
 * Sensor driver support 14 bits resolution.
 * TODO: Support all "LP Power Mode" (res. 12/14 bits).
 */
#define LIS2DW12_RESOLUTION		14

#endif /* __CROS_EC_ACCEL_LIS2DW12_H */