Files
OpenCellular/include/accelerometer.h
Alec Berg 529548208c accel: add host command to modify accel params and add ectool command
Created a host command to set/get various motion sensor parameters and
added an ectool command to use that host command.

The host command is created such that the first argument is a
sub-command. Sub-commands created include:
dump: dumps all current motion sensor data
info: returns general information about each motion sensor
ec_rate: set/get the EC sampling rate of sensors
sensor_range: set/get the sensor range (ie +/- 2G,4G,8G)
sensor_odr: set/get the sensor output data rate (ie 50Hz, 100Hz, ...)

For sensor_range and sensor_odr parameters, since the host doesn't know
what are valid values for the parameter, the host can specify to round
up or down to the nearest valid value. For example, the host can specify
to set the output data rate to at least 100Hz, and the EC will return
the closest valid output data rate that is at least 100Hz.

BUG=chrome-os-partner:27321
BRANCH=rambi
TEST=Test on a glimmer using ectool from vt-2 prompt:

> ectool motionsense help
Usage:
  motionsense                            - dump all motion data
  motionsense info NUM                   - print sensor info
  motionsense ec_rate [RATE_MS]          - set/get sample rate
  motionsense odr NUM [ODR [ROUNDUP]]    - set/get sensor ODR
  motionsense range NUM [RANGE [ROUNDUP]]- set/get sensor range
>
> ectool motionsense
Sensor 0: 0, 0, 1024
Sensor 1: 1024, 0, 0
Sensor 2: None
> ectool motionsense info 0
Type:     accel
Location: base
Chip:     kxcj9
> ectool motionsense ec_rate
10
> ectool motionsense ec_rate 1000
1000
> ectool motionsense odr 0
100000
> ectool motionsense odr 0 40000 1
50000
> ectool motionsense range 0 8
8

After running this I verified on the EC console that all the parameters
were set appropriately. I tested the EC sampling rate was 1000ms by
running lidangle on and making sure samples were displayed roughly every
second. I verified the sensor odr and range by defining
CONFIG_CMD_ACCELS and typing:

> accelrange 0
8
> accelrate 0
50000

Change-Id: I444e2f0eafabd607f1c7aa78b5c4e91f6cb06387
Signed-off-by: Alec Berg <alecaberg@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/192064
Reviewed-on: https://chromium-review.googlesource.com/193307
Reviewed-by: Randall Spangler <rspangler@chromium.org>
2014-04-05 03:25:47 +00:00

88 lines
2.9 KiB
C

/* Copyright (c) 2014 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.
*/
#ifndef __CROS_EC_ACCELEROMETER_H
#define __CROS_EC_ACCELEROMETER_H
/* Header file for accelerometer drivers. */
/* This array must be defined in board.c. */
extern const int accel_addr[];
/* This enum must be defined in board.h. */
enum accel_id;
/* Number of counts from accelerometer that represents 1G acceleration. */
#define ACCEL_G 1024
/**
* Read all three accelerations of an accelerometer. Note that all three
* accelerations come back in counts, where ACCEL_G can be used to convert
* counts to engineering units.
*
* @param id Target accelerometer
* @param x_acc Pointer to store X-axis acceleration (in counts).
* @param y_acc Pointer to store Y-axis acceleration (in counts).
* @param z_acc Pointer to store Z-axis acceleration (in counts).
*
* @return EC_SUCCESS if successful, non-zero if error.
*/
int accel_read(const enum accel_id id, int * const x_acc, int * const y_acc,
int * const z_acc);
/**
* Initialize accelerometers.
*
* @param id Target accelerometer
*
* @return EC_SUCCESS if successful, non-zero if error.
*/
int accel_init(const enum accel_id id);
/**
* Setter and getter methods for the sensor range. The sensor range defines
* the maximum value that can be returned from accel_read(). As the range
* increases, the resolution gets worse.
*
* @param id Target accelerometer
* @param range Range (Units are +/- G's for accel, +/- deg/s for gyro)
* @param rnd Rounding flag. If true, it rounds up to nearest valid value.
* Otherwise, it rounds down.
*
* @return EC_SUCCESS if successful, non-zero if error.
*/
int accel_set_range(const enum accel_id id, const int range, const int rnd);
int accel_get_range(const enum accel_id id, int * const range);
/**
* Setter and getter methods for the sensor resolution.
*
* @param id Target accelerometer
* @param range Resolution (Units are number of bits)
* param rnd Rounding flag. If true, it rounds up to nearest valid value.
* Otherwise, it rounds down.
*
* @return EC_SUCCESS if successful, non-zero if error.
*/
int accel_set_resolution(const enum accel_id id, const int res, const int rnd);
int accel_get_resolution(const enum accel_id id, int * const res);
/**
* Setter and getter methods for the sensor output data range. As the ODR
* increases, the LPF roll-off frequency also increases.
*
* @param id Target accelerometer
* @param rate Output data rate (units are mHz)
* @param rnd Rounding flag. If true, it rounds up to nearest valid value.
* Otherwise, it rounds down.
*
* @return EC_SUCCESS if successful, non-zero if error.
*/
int accel_set_datarate(const enum accel_id id, const int rate, const int rnd);
int accel_get_datarate(const enum accel_id id, int * const rate);
#endif /* __CROS_EC_ACCELEROMETER_H */