| /* Copyright 2016 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. |
| */ |
| |
| /* 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)) |
| |
| #ifdef CONFIG_ACCEL_FIFO |
| #define FIFO_BUFFER_NUM_PATTERN 32 |
| /* 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) |
| |
| #endif /* CONFIG_ACCEL_FIFO */ |
| |
| /** |
| * Read single register |
| */ |
| static inline int st_raw_read8(const int port, const int addr, const int reg, |
| int *data_ptr) |
| { |
| /* TODO: Implement SPI interface support */ |
| return i2c_read8(port, addr, reg, data_ptr); |
| } |
| |
| /** |
| * Write single register |
| */ |
| static inline int st_raw_write8(const int port, const int addr, const int reg, |
| int data) |
| { |
| /* TODO: Implement SPI interface support */ |
| return i2c_write8(port, addr, reg, data); |
| } |
| |
| /** |
| * st_raw_read_n - Read n bytes for read |
| */ |
| int st_raw_read_n(const int port, const int addr, 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 int addr, 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); |
| |
| /* Internal data structure for sensors */ |
| struct stprivate_data { |
| struct accelgyro_saved_data_t base; |
| int16_t offset[3]; |
| uint8_t resol; |
| }; |
| |
| #endif /* __CROS_EC_ST_COMMONS_H */ |