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

/* Commons acc/gyro function for ST sensors oin Chrome EC */

#ifndef __CROS_EC_ST_COMMONS_H
#define __CROS_EC_ST_COMMONS_H

#include "common.h"
#include "util.h"
#include "accelgyro.h"
#include "console.h"
#include "i2c.h"

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

#define ST_NORMALIZE_RATE(_fs) (1 << __fls(_fs))

#define FIFO_BUFFER_NUM_PATTERN 8
/* Define number of data to be read from FIFO each time
 * It must be a multiple of OUT_XYZ_SIZE.
 * In case of LSM6DSM FIFO contains pattern depending ODR
 * of Acc/gyro, be sure that FIFO can contains almost
 * FIFO_BUFFER_NUM_PATTERNpattern
 */
#define FIFO_READ_LEN (FIFO_BUFFER_NUM_PATTERN * OUT_XYZ_SIZE)

/**
 * Read single register
 */
static inline int st_raw_read8(const int port,
			       const uint16_t i2c_spi_addr_flags, const int reg,
			       int *data_ptr)
{
	/* TODO: Implement SPI interface support */
	return i2c_read8(port, i2c_spi_addr_flags, reg, data_ptr);
}

/**
 * Write single register
 */
static inline int st_raw_write8(const int port,
				const uint16_t i2c_spi_addr_flags,
				const int reg, int data)
{
	/* TODO: Implement SPI interface support */
	return i2c_write8(port, i2c_spi_addr_flags, reg, data);
}

/**
 * st_raw_read_n - Read n bytes for read
 */
int st_raw_read_n(const int port, const uint16_t i2c_spi_addr_flags,
		  const uint8_t reg, uint8_t *data_ptr, const int len);

/**
 * st_raw_read_n_noinc - Read n bytes for read (no auto inc address)
 */
int st_raw_read_n_noinc(const int port, const uint16_t i2c_spi_addr_flags,
			const uint8_t reg, uint8_t *data_ptr, const int len);

/**
 * st_write_data_with_mask - Write register with mask
 * @s: Motion sensor pointer
 * @reg: Device register
 * @mask: The mask to search
 * @data: Data pointer
 */
int st_write_data_with_mask(const struct motion_sensor_t *s, int reg,
			    uint8_t mask, uint8_t data);

/**
 * st_get_resolution - Get bit resolution
 * @s: Motion sensor pointer
 */
int st_get_resolution(const struct motion_sensor_t *s);

/**
 * st_set_offset - Set data offset
 * @s: Motion sensor pointer
 * @offset: offset vector
 * @temp: Temp
 */
int st_set_offset(const struct motion_sensor_t *s, const int16_t *offset,
		  int16_t temp);

/**
 * st_get_offset - Get data offset
 * @s: Motion sensor pointer
 * @offset: offset vector
 * @temp: Temp
 */
int st_get_offset(const struct motion_sensor_t *s, int16_t *offset,
		  int16_t *temp);

/**
 * st_get_data_rate - Get data rate (ODR)
 * @s: Motion sensor pointer
 */
int st_get_data_rate(const struct motion_sensor_t *s);

/**
 * st_normalize - Apply to LSB data sensitivity and rotation
 * @s: Motion sensor pointer
 * @v: vector
 * @data: LSB raw data
 */
void st_normalize(const struct motion_sensor_t *s, intv3_t v, uint8_t *data);

/**
 * st_list_activities - Apply to LSB data sensitivity and rotation
 * @s: Motion sensor pointer
 * @enabled: Activities that are enabled (bitmap)
 * @disabled: Activities that are disabled (bitmap)
 */
int st_list_activities(const struct motion_sensor_t *s, uint32_t *enabled,
		       uint32_t *disabled);

/* Internal data structure for sensors */
struct stprivate_data {
	struct accelgyro_saved_data_t base;
#ifdef CONFIG_GESTURE_HOST_DETECTION
	uint8_t enabled_activities;
	uint8_t disabled_activities;
#endif /* CONFIG_GESTURE_HOST_DETECTION */
	int16_t offset[3];
	uint8_t resol;
};

#endif /* __CROS_EC_ST_COMMONS_H */