| /* Copyright 2020 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. |
| */ |
| |
| /* ICM accelerometer and gyroscope common definitions for Chrome EC */ |
| |
| #ifndef __CROS_EC_ACCELGYRO_ICM_COMMON_H |
| #define __CROS_EC_ACCELGYRO_ICM_COMMON_H |
| |
| #include "accelgyro.h" |
| |
| #ifdef CONFIG_ACCEL_FIFO |
| /* reserve maximum 4 samples of 16 bytes */ |
| #define ICM_FIFO_BUFFER 64 |
| #else |
| #define ICM_FIFO_BUFFER 0 |
| #endif |
| |
| struct icm_drv_data_t { |
| struct accelgyro_saved_data_t saved_data[2]; |
| struct motion_sensor_t *accel; |
| struct motion_sensor_t *gyro; |
| uint8_t bank; |
| uint8_t fifo_en; |
| uint8_t fifo_buffer[ICM_FIFO_BUFFER] __aligned(sizeof(long)); |
| }; |
| |
| #define ICM_GET_DATA(_s) \ |
| ((struct icm_drv_data_t *)(_s)->drv_data) |
| #define ICM_GET_SAVED_DATA(_s) \ |
| (&ICM_GET_DATA(_s)->saved_data[(_s)->type]) |
| |
| /* |
| * Virtual register address is 16 bits: |
| * - 8 bits MSB coding bank number |
| * - 8 bits LSB coding physical address |
| */ |
| #define ICM426XX_REG_GET_BANK(_r) (((_r) & 0xFF00) >> 8) |
| #define ICM426XX_REG_GET_ADDR(_r) ((_r) & 0x00FF) |
| |
| /* Sensor resolution in number of bits */ |
| #define ICM_RESOLUTION 16 |
| |
| /** |
| * sign_extend - sign extend a standard int value using the given sign-bit |
| * @value: value to sign extend |
| * @index: 0 based bit index to sign bit |
| */ |
| static inline int sign_extend(int value, int index) |
| { |
| int shift = (sizeof(int) * 8) - index - 1; |
| |
| return (int)(value << shift) >> shift; |
| } |
| |
| /** |
| * Read 8 bits register |
| */ |
| int icm_read8(const struct motion_sensor_t *s, const int reg, int *data_ptr); |
| |
| /** |
| * Write 8 bits register |
| */ |
| int icm_write8(const struct motion_sensor_t *s, const int reg, int data); |
| |
| /** |
| * Read 16 bits register |
| */ |
| int icm_read16(const struct motion_sensor_t *s, const int reg, int *data_ptr); |
| |
| /** |
| * Write 16 bits register |
| */ |
| int icm_write16(const struct motion_sensor_t *s, const int reg, int data); |
| |
| /** |
| * Read n bytes |
| */ |
| int icm_read_n(const struct motion_sensor_t *s, const int reg, |
| uint8_t *data_ptr, const int len); |
| |
| int icm_field_update8(const struct motion_sensor_t *s, const int reg, |
| const uint8_t field_mask, const uint8_t set_value); |
| |
| int icm_get_resolution(const struct motion_sensor_t *s); |
| |
| int icm_get_range(const struct motion_sensor_t *s); |
| |
| int icm_get_data_rate(const struct motion_sensor_t *s); |
| |
| int icm_set_scale(const struct motion_sensor_t *s, const uint16_t *scale, |
| int16_t temp); |
| |
| int icm_get_scale(const struct motion_sensor_t *s, uint16_t *scale, |
| int16_t *temp); |
| |
| ssize_t icm_fifo_decode_packet(const void *packet, const uint8_t **accel, |
| const uint8_t **gyro); |
| |
| #endif /* __CROS_EC_ACCELGYRO_ICM_COMMON_H */ |