summaryrefslogtreecommitdiff
path: root/driver/accelgyro_icm_common.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /driver/accelgyro_icm_common.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-voshyr-14637.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'driver/accelgyro_icm_common.c')
-rw-r--r--driver/accelgyro_icm_common.c366
1 files changed, 0 insertions, 366 deletions
diff --git a/driver/accelgyro_icm_common.c b/driver/accelgyro_icm_common.c
deleted file mode 100644
index 94db99407d..0000000000
--- a/driver/accelgyro_icm_common.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/* 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 module for Chrome EC
- * 3D digital accelerometer & 3D digital gyroscope
- */
-
-#include "accelgyro.h"
-#include "console.h"
-#include "i2c.h"
-#include "spi.h"
-#include "driver/accelgyro_icm_common.h"
-#include "driver/accelgyro_icm426xx.h"
-
-#define CPUTS(outstr) cputs(CC_ACCEL, outstr)
-#define CPRINTF(format, args...) cprintf(CC_ACCEL, format, ## args)
-#define CPRINTS(format, args...) cprints(CC_ACCEL, format, ## args)
-
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
-static int icm_spi_raw_read(const int addr, const uint8_t reg,
- uint8_t *data, const int len)
-{
- uint8_t cmd = 0x80 | reg;
-
- return spi_transaction(&spi_devices[addr], &cmd, 1, data, len);
-}
-
-static int icm_spi_raw_write(const int addr, const uint8_t reg,
- const uint8_t *data, const int len)
-{
- uint8_t cmd[3];
- int i;
-
- if (len > 2)
- return EC_ERROR_UNIMPLEMENTED;
-
- cmd[0] = reg;
- for (i = 0; i < len; ++i)
- cmd[i + 1] = data[i];
-
- return spi_transaction(&spi_devices[addr], cmd, len + 1, NULL, 0);
-}
-#endif
-
-static int icm_bank_sel(const struct motion_sensor_t *s, const int reg)
-{
- struct icm_drv_data_t *st = ICM_GET_DATA(s);
- uint8_t bank = ICM426XX_REG_GET_BANK(reg);
- int ret;
-
- if (bank == st->bank)
- return EC_SUCCESS;
-
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
- ret = icm_spi_raw_write(ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- ICM426XX_REG_BANK_SEL, &bank, 1);
-#else
- ret = i2c_write8(s->port, s->i2c_spi_addr_flags, ICM426XX_REG_BANK_SEL,
- bank);
-#endif
-
- if (ret == EC_SUCCESS)
- st->bank = bank;
-
- return ret;
-}
-
-/**
- * Read 8 bits register
- */
-int icm_read8(const struct motion_sensor_t *s, const int reg, int *data_ptr)
-{
- const uint8_t addr = ICM426XX_REG_GET_ADDR(reg);
- int ret;
-
- ret = icm_bank_sel(s, reg);
- if (ret != EC_SUCCESS)
- return ret;
-
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
- {
- uint8_t val;
-
- ret = icm_spi_raw_read(
- ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
- sizeof(val));
- if (ret == EC_SUCCESS)
- *data_ptr = val;
- }
-#else
- ret = i2c_read8(s->port, s->i2c_spi_addr_flags, addr, data_ptr);
-#endif
-
- return ret;
-}
-
-/**
- * Write 8 bits register
- */
-int icm_write8(const struct motion_sensor_t *s, const int reg, int data)
-{
- const uint8_t addr = ICM426XX_REG_GET_ADDR(reg);
- int ret;
-
- ret = icm_bank_sel(s, reg);
- if (ret != EC_SUCCESS)
- return ret;
-
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
- {
- uint8_t val = data;
-
- ret = icm_spi_raw_write(
- ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
- sizeof(val));
- }
-#else
- ret = i2c_write8(s->port, s->i2c_spi_addr_flags, addr, data);
-#endif
-
- return ret;
-}
-
-/**
- * Read 16 bits register
- */
-int icm_read16(const struct motion_sensor_t *s, const int reg, int *data_ptr)
-{
- const uint8_t addr = ICM426XX_REG_GET_ADDR(reg);
- int ret;
-
- ret = icm_bank_sel(s, reg);
- if (ret != EC_SUCCESS)
- return ret;
-
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
- {
- uint8_t val[2];
-
- ret = icm_spi_raw_read(
- ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, val,
- sizeof(val));
- if (ret == EC_SUCCESS) {
- if (I2C_IS_BIG_ENDIAN(s->i2c_spi_addr_flags))
- *data_ptr = ((int)val[0] << 8) | val[1];
- else
- *data_ptr = ((int)val[1] << 8) | val[0];
- }
- }
-#else
- ret = i2c_read16(s->port, s->i2c_spi_addr_flags,
- addr, data_ptr);
-#endif
-
- return ret;
-}
-
-/**
- * Write 16 bits register
- */
-int icm_write16(const struct motion_sensor_t *s, const int reg, int data)
-{
- const uint8_t addr = ICM426XX_REG_GET_ADDR(reg);
- int ret;
-
- ret = icm_bank_sel(s, reg);
- if (ret != EC_SUCCESS)
- return ret;
-
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
- {
- uint8_t val[2];
-
- if (I2C_IS_BIG_ENDIAN(s->i2c_spi_addr_flags)) {
- val[0] = (data >> 8) & 0xFF;
- val[1] = data & 0xFF;
- } else {
- val[0] = data & 0xFF;
- val[1] = (data >> 8) & 0xFF;
- }
- ret = icm_spi_raw_write(
- ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, val,
- sizeof(val));
- }
-#else
- ret = i2c_write16(s->port, s->i2c_spi_addr_flags, addr, data);
-#endif
-
- return ret;
-}
-
-/**
- * Read n bytes
- */
-int icm_read_n(const struct motion_sensor_t *s, const int reg,
- uint8_t *data_ptr, const int len)
-{
- const uint8_t addr = ICM426XX_REG_GET_ADDR(reg);
- int ret;
-
- ret = icm_bank_sel(s, reg);
- if (ret != EC_SUCCESS)
- return ret;
-
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
- ret = icm_spi_raw_read(ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr,
- data_ptr, len);
-#else
- ret = i2c_read_block(s->port, s->i2c_spi_addr_flags, addr, data_ptr,
- len);
-#endif
-
- return ret;
-}
-
-int icm_field_update8(const struct motion_sensor_t *s, const int reg,
- const uint8_t field_mask, const uint8_t set_value)
-{
- const uint8_t addr = ICM426XX_REG_GET_ADDR(reg);
- int ret;
-
- ret = icm_bank_sel(s, reg);
- if (ret != EC_SUCCESS)
- return ret;
-
- ret = EC_ERROR_UNIMPLEMENTED;
-#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
- {
- uint8_t val;
-
- ret = icm_spi_raw_read(
- ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
- sizeof(val));
- if (ret != EC_SUCCESS)
- return ret;
-
- val = (val & (~field_mask)) | set_value;
-
- ret = icm_spi_raw_write(
- ACCEL_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
- sizeof(val));
- }
-#else
- ret = i2c_field_update8(s->port, s->i2c_spi_addr_flags, addr,
- field_mask, set_value);
-#endif
-
- return ret;
-}
-
-int icm_get_resolution(const struct motion_sensor_t *s)
-{
- return ICM_RESOLUTION;
-}
-
-int icm_get_data_rate(const struct motion_sensor_t *s)
-{
- struct accelgyro_saved_data_t *data = ICM_GET_SAVED_DATA(s);
-
- return data->odr;
-}
-
-int icm_set_scale(const struct motion_sensor_t *s, const uint16_t *scale,
- int16_t temp)
-{
- struct accelgyro_saved_data_t *data = ICM_GET_SAVED_DATA(s);
-
- data->scale[X] = scale[X];
- data->scale[Y] = scale[Y];
- data->scale[Z] = scale[Z];
- return EC_SUCCESS;
-}
-
-int icm_get_scale(const struct motion_sensor_t *s, uint16_t *scale,
- int16_t *temp)
-{
- struct accelgyro_saved_data_t *data = ICM_GET_SAVED_DATA(s);
-
- scale[X] = data->scale[X];
- scale[Y] = data->scale[Y];
- scale[Z] = data->scale[Z];
- *temp = EC_MOTION_SENSE_INVALID_CALIB_TEMP;
- return EC_SUCCESS;
-}
-
-/* FIFO header: 1 byte */
-#define ICM_FIFO_HEADER_MSG BIT(7)
-#define ICM_FIFO_HEADER_ACCEL BIT(6)
-#define ICM_FIFO_HEADER_GYRO BIT(5)
-#define ICM_FIFO_HEADER_TMST_FSYNC GENMASK(3, 2)
-#define ICM_FIFO_HEADER_ODR_ACCEL BIT(1)
-#define ICM_FIFO_HEADER_ODR_GYRO BIT(0)
-
-/* FIFO data packet */
-struct icm_fifo_sensor_data {
- int16_t x;
- int16_t y;
- int16_t z;
-} __packed;
-
-struct icm_fifo_1sensor_packet {
- uint8_t header;
- struct icm_fifo_sensor_data data;
- int8_t temp;
-} __packed;
-#define ICM_FIFO_1SENSOR_PACKET_SIZE 8
-
-struct icm_fifo_2sensors_packet {
- uint8_t header;
- struct icm_fifo_sensor_data accel;
- struct icm_fifo_sensor_data gyro;
- int8_t temp;
- uint16_t timestamp;
-} __packed;
-#define ICM_FIFO_2SENSORS_PACKET_SIZE 16
-
-ssize_t icm_fifo_decode_packet(const void *packet, const uint8_t **accel,
- const uint8_t **gyro)
-{
- const struct icm_fifo_1sensor_packet *pack1 = packet;
- const struct icm_fifo_2sensors_packet *pack2 = packet;
- uint8_t header = *((const uint8_t *)packet);
-
- /* FIFO empty */
- if (header & ICM_FIFO_HEADER_MSG) {
- if (accel != NULL)
- *accel = NULL;
- if (gyro != NULL)
- *gyro = NULL;
- return 0;
- }
-
- /* accel + gyro */
- if ((header & ICM_FIFO_HEADER_ACCEL) &&
- (header & ICM_FIFO_HEADER_GYRO)) {
- if (accel != NULL)
- *accel = (uint8_t *)&pack2->accel;
- if (gyro != NULL)
- *gyro = (uint8_t *)&pack2->gyro;
- return ICM_FIFO_2SENSORS_PACKET_SIZE;
- }
-
- /* accel only */
- if (header & ICM_FIFO_HEADER_ACCEL) {
- if (accel != NULL)
- *accel = (uint8_t *)&pack1->data;
- if (gyro != NULL)
- *gyro = NULL;
- return ICM_FIFO_1SENSOR_PACKET_SIZE;
- }
-
- /* gyro only */
- if (header & ICM_FIFO_HEADER_GYRO) {
- if (accel != NULL)
- *accel = NULL;
- if (gyro != NULL)
- *gyro = (uint8_t *)&pack1->data;
- return ICM_FIFO_1SENSOR_PACKET_SIZE;
- }
-
- /* invalid packet if here */
- return -EC_ERROR_INVAL;
-}