summaryrefslogtreecommitdiff
path: root/driver/accel_lis2ds.h
blob: 3f821b35148500f683d8404b728ff723a0d4cfd7 (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
/* Copyright 2019 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/* LIS2DS accelerometer module for Chrome EC */

#ifndef __CROS_EC_ACCEL_LIS2DS_H
#define __CROS_EC_ACCEL_LIS2DS_H

#include "driver/stm_mems_common.h"

/*
 * 7-bit address is 110101Xb. Where 'X' is determined
 * by the voltage on the ADDR pin.
 */
#define LIS2DS_ADDR0_FLAGS 0x1a
#define LIS2DS_ADDR1_FLAGS 0x1e

/* who am I  */
#define LIS2DS_WHO_AM_I_REG 0x0f
#define LIS2DS_WHO_AM_I 0x43

/* X, Y, Z axis data len */
#define LIS2DS_OUT_XYZ_SIZE 6

/* COMMON DEFINE FOR ACCEL SENSOR */
#define LIS2DS_EN_BIT 0x01
#define LIS2DS_DIS_BIT 0x00

#define LIS2DS_CTRL1_ADDR 0x20
#define LIS2DS_CTRL2_ADDR 0x21
#define LIS2DS_CTRL3_ADDR 0x22
#define LIS2DS_TAP_X_EN 0x20
#define LIS2DS_TAP_Y_EN 0x10
#define LIS2DS_TAP_Z_EN 0x08
#define LIS2DS_TAP_EN_MASK (LIS2DS_TAP_X_EN | LIS2DS_TAP_Y_EN | LIS2DS_TAP_Z_EN)
#define LIS2DS_TAP_EN_ALL 0x07

#define LIS2DS_CTRL4_ADDR 0x23
#define LIS2DS_INT1_FTH 0x02
#define LIS2DS_INT1_D_TAP 0x08
#define LIS2DS_INT1_S_TAP 0x40

#define LIS2DS_CTRL5_ADDR 0x24
#define LIS2DS_FIFO_CTRL_ADDR 0x25
#define LIS2DS_FIFO_MODE_MASK 0xe0
#define LIS2DS_FIFO_BYPASS_MODE 0
#define LIS2DS_FIFO_MODE 1
#define LIS2DS_FIFO_CONT_MODE 6

#define LIS2DS_STATUS_REG 0x27
#define LIS2DS_STS_XLDA_UP 0x01
#define LIS2DS_SINGLE_TAP_UP 0x08
#define LIS2DS_DOUBLE_TAP_UP 0x10
#define LIS2DS_FIFO_THS_UP 0x80

#define LIS2DS_OUT_X_L_ADDR 0x28
#define LIS2DS_FIFO_THS_ADDR 0x2e

#define LIS2DS_FIFO_SRC_ADDR 0x2f
#define LIS2DS_FIFO_DIFF_MASK 0xff
#define LIS2DS_FIFO_DIFF8_MASK 0x20
#define LIS2DS_FIFO_OVR_MASK 0x40
#define LIS2DS_FIFO_FTH_MASK 0x80

/*
 * Concatenated with DIFF8 bit in FIFO_SRC (2Fh) register, it represents the
 * number of unread samples stored in FIFO. (000000000 = FIFO empty;
 * 100000000 = FIFO full, 256 unread samples).
 */
#define LIS2DS_FIFO_SAMPLES_ADDR 0x30
#define LIS2DS_TAP_6D_THS_ADDR 0x31
#define LIS2DS_INT_DUR_ADDR 0x32
#define LIS2DS_WAKE_UP_THS_ADDR 0x33

#define LIS2DS_TAP_SRC_ADDR 0x38
#define LIS2DS_TAP_EVENT_DETECT 0x40

/* Alias Register/Mask */
#define LIS2DS_ACC_ODR_ADDR LIS2DS_CTRL1_ADDR
#define LIS2DS_ACC_ODR_MASK 0xf0

#define LIS2DS_BDU_ADDR LIS2DS_CTRL1_ADDR
#define LIS2DS_BDU_MASK 0x01

#define LIS2DS_SOFT_RESET_ADDR LIS2DS_CTRL2_ADDR
#define LIS2DS_SOFT_RESET_MASK 0x40

#define LIS2DS_LIR_ADDR LIS2DS_CTRL3_ADDR
#define LIS2DS_LIR_MASK 0x04

#define LIS2DS_H_ACTIVE_ADDR LIS2DS_CTRL3_ADDR
#define LIS2DS_H_ACTIVE_MASK 0x02

#define LIS2DS_INT1_FTH_ADDR LIS2DS_CTRL4_ADDR
#define LIS2DS_INT1_FTH_MASK 0x02

#define LIS2DS_INT2_ON_INT1_ADDR LIS2DS_CTRL5_ADDR
#define LIS2DS_INT2_ON_INT1_MASK 0x20

#define LIS2DS_DRDY_PULSED_ADDR LIS2DS_CTRL5_ADDR
#define LIS2DS_DRDY_PULSED_MASK 0x80

/* Acc data rate for HR mode */
enum lis2ds_odr {
	LIS2DS_ODR_POWER_OFF_VAL = 0x00,
	LIS2DS_ODR_12HZ_VAL,
	LIS2DS_ODR_25HZ_VAL,
	LIS2DS_ODR_50HZ_VAL,
	LIS2DS_ODR_100HZ_VAL,
	LIS2DS_ODR_200HZ_VAL,
	LIS2DS_ODR_400HZ_VAL,
	LIS2DS_ODR_800HZ_VAL,
	LIS2DS_ODR_LIST_NUM
};

/* Absolute Acc rate */
#define LIS2DS_ODR_MIN_VAL 12500
#define LIS2DS_ODR_MAX_VAL \
	MOTION_MAX_SENSOR_FREQUENCY(800000, LIS2DS_ODR_MIN_VAL)

/* ODR reg value from selected data rate in mHz */
#define LIS2DS_ODR_TO_REG(_odr) (__fls(_odr / LIS2DS_ODR_MIN_VAL) + 1)

/* Normalized ODR value from selected ODR register value */
#define LIS2DS_REG_TO_ODR(_reg) \
	(LIS2DS_ODR_MIN_VAL << (_reg - LIS2DS_ODR_12HZ_VAL))

/* Full scale range registers */
#define LIS2DS_FS_ADDR LIS2DS_CTRL1_ADDR
#define LIS2DS_FS_MASK 0x0c

/* Acc FS value */
enum lis2ds_fs {
	LIS2DS_FS_2G_VAL = 0x00,
	LIS2DS_FS_16G_VAL,
	LIS2DS_FS_4G_VAL,
	LIS2DS_FS_8G_VAL,
	LIS2DS_FS_LIST_NUM
};

#define LIS2DS_ACCEL_FS_MAX_VAL 16
#define LIS2DS_ACCEL_FS_MIN_VAL 2

/* Reg value from Full Scale */
#define LIS2DS_FS_REG(_fs)               \
	(_fs == 2  ? LIS2DS_FS_2G_VAL :  \
	 _fs == 16 ? LIS2DS_FS_16G_VAL : \
		     __fls(_fs))

/*
 * Sensor resolution in number of bits. Sensor has two resolution:
 * 10 and 14 bit for LP and HR mode resp.
 */
#define LIS2DS_RESOLUTION 16

extern const struct accelgyro_drv lis2ds_drv;

void lis2ds_interrupt(enum gpio_signal signal);

#endif /* __CROS_EC_ACCEL_LIS2DS_H */