summaryrefslogtreecommitdiff
path: root/driver/accel_bma2x2.c
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2018-03-12 10:44:00 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-03-15 17:58:01 -0700
commit7ce651d4ca47eb5547c296d032d23f4f838fbecd (patch)
tree9cc59c3ea4d35669938178ff830881f3ec100844 /driver/accel_bma2x2.c
parent0778c50859ff6cb35822b9176f101aab23aece99 (diff)
downloadchrome-ec-7ce651d4ca47eb5547c296d032d23f4f838fbecd.tar.gz
driver: bma2x2: Remove tables for range/frequency
To save space, instead of using tables, use macros to convert range/frequencies into register values. BUG=b:73205042 BRANCH=none TEST=Check we save space on Kevin. (184 bytes looking at __image_size in kevin.RO.map). Check on nami that range/bandwidth are set properly. Change-Id: I193768be1f2e7325b986e8ccff25a7809bfb4096 Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/959388 Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
Diffstat (limited to 'driver/accel_bma2x2.c')
-rw-r--r--driver/accel_bma2x2.c100
1 files changed, 21 insertions, 79 deletions
diff --git a/driver/accel_bma2x2.c b/driver/accel_bma2x2.c
index b7af8c91df..8511cbfec5 100644
--- a/driver/accel_bma2x2.c
+++ b/driver/accel_bma2x2.c
@@ -25,67 +25,11 @@
/* Number of times to attempt to enable sensor before giving up. */
#define SENSOR_ENABLE_ATTEMPTS 5
-/*
- * Struct for pairing an engineering value with the register value for a
- * parameter.
- */
-struct accel_param_pair {
- int val; /* Value in engineering units. */
- int reg; /* Corresponding register value. */
-};
-
-/* List of range values in +/-G's and their associated register values. */
-static const struct accel_param_pair ranges[] = {
- {2, BMA2x2_RANGE_2G},
- {4, BMA2x2_RANGE_4G},
- {8, BMA2x2_RANGE_8G},
- {16, BMA2x2_RANGE_16G},
-};
-
-/* List of ODR values in mHz and their associated register values. */
-static const struct accel_param_pair datarates[] = {
- {781, BMA2x2_BW_7_81HZ},
- {1563, BMA2x2_BW_15_63HZ},
- {3125, BMA2x2_BW_31_25HZ},
- {6250, BMA2x2_BW_62_50HZ},
- {12500, BMA2x2_BW_125HZ},
- {25000, BMA2x2_BW_250HZ},
- {50000, BMA2x2_BW_500HZ},
- {100000, BMA2x2_BW_1000HZ},
-};
-
-/**
- * Find index into a accel_param_pair that matches the given engineering value
- * passed in. The round_up flag is used to specify whether to round up or down.
- * Note, this function always returns a valid index. If the request is
- * outside the range of values, it returns the closest valid index.
- */
-static int find_param_index(const int eng_val, const int round_up,
- const struct accel_param_pair *pairs,
- const int size)
-{
- int i = 0;
-
- /* match first index */
- if (eng_val <= pairs[i].val)
- return i;
-
- /* Linear search for index to match. */
- while (++i < size) {
- if (eng_val < pairs[i].val)
- return round_up ? i : i - 1;
- else if (eng_val == pairs[i].val)
- return i;
- }
-
- return i - 1;
-}
-
/**
* Read register from accelerometer.
*/
-static int raw_read8(const int port, const int addr, const int reg,
- int *data_ptr)
+static inline int raw_read8(const int port, const int addr, const int reg,
+ int *data_ptr)
{
return i2c_read8(port, addr, reg, data_ptr);
}
@@ -93,7 +37,8 @@ static int raw_read8(const int port, const int addr, const int reg,
/**
* Write register from accelerometer.
*/
-static int raw_write8(const int port, const int addr, const int reg, int data)
+static inline int raw_write8(const int port, const int addr, const int reg,
+ int data)
{
return i2c_write8(port, addr, reg, data);
}
@@ -113,29 +58,28 @@ static int raw_read_multi(const int port, int addr, uint8_t reg,
static int set_range(const struct motion_sensor_t *s, int range, int rnd)
{
- int ret, index, reg, range_val, reg_val, range_reg_val;
+ int ret, range_val, reg_val, range_reg_val;
struct bma2x2_accel_data *data = s->drv_data;
- /* Find index for interface pair matching the specified range. */
- index = find_param_index(range, rnd, ranges, ARRAY_SIZE(ranges));
-
- reg = BMA2x2_RANGE_SELECT_ADDR;
- range_val = ranges[index].reg;
+ range_val = BMA2x2_RANGE_TO_REG(range);
+ if ((BMA2x2_RANGE_TO_REG(range_val) < range) && rnd)
+ range_val = BMA2x2_RANGE_TO_REG(range * 2);
mutex_lock(s->mutex);
/* Determine the new value of control reg and attempt to write it. */
- ret = raw_read8(s->port, s->addr, reg, &range_reg_val);
+ ret = raw_read8(s->port, s->addr, BMA2x2_RANGE_SELECT_ADDR,
+ &range_reg_val);
if (ret != EC_SUCCESS) {
mutex_unlock(s->mutex);
return ret;
}
reg_val = (range_reg_val & ~BMA2x2_RANGE_SELECT_MSK) | range_val;
- ret = raw_write8(s->port, s->addr, reg, reg_val);
+ ret = raw_write8(s->port, s->addr, BMA2x2_RANGE_SELECT_ADDR, reg_val);
/* If successfully written, then save the range. */
if (ret == EC_SUCCESS)
- data->sensor_range = index;
+ data->sensor_range = BMA2x2_REG_TO_RANGE(range_val);
mutex_unlock(s->mutex);
@@ -146,7 +90,7 @@ static int get_range(const struct motion_sensor_t *s)
{
struct bma2x2_accel_data *data = s->drv_data;
- return ranges[data->sensor_range].val;
+ return data->sensor_range;
}
static int set_resolution(const struct motion_sensor_t *s, int res, int rnd)
@@ -162,30 +106,28 @@ static int get_resolution(const struct motion_sensor_t *s)
static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd)
{
- int ret, index, odr_val, odr_reg_val, reg_val, reg;
+ int ret, odr_val, odr_reg_val, reg_val;
struct bma2x2_accel_data *data = s->drv_data;
- /* Find index for interface pair matching the specified rate. */
- index = find_param_index(rate, rnd, datarates, ARRAY_SIZE(datarates));
-
- odr_val = datarates[index].reg;
- reg = BMA2x2_BW_SELECT_ADDR;
+ odr_val = BMA2x2_BW_TO_REG(rate);
+ if ((BMA2x2_REG_TO_BW(odr_val) < rate) && rnd)
+ odr_val = BMA2x2_BW_TO_REG(rate * 2);
mutex_lock(s->mutex);
/* Determine the new value of control reg and attempt to write it. */
- ret = raw_read8(s->port, s->addr, reg, &odr_reg_val);
+ ret = raw_read8(s->port, s->addr, BMA2x2_BW_SELECT_ADDR, &odr_reg_val);
if (ret != EC_SUCCESS) {
mutex_unlock(s->mutex);
return ret;
}
reg_val = (odr_reg_val & ~BMA2x2_BW_MSK) | odr_val;
/* Set output data rate. */
- ret = raw_write8(s->port, s->addr, reg, reg_val);
+ ret = raw_write8(s->port, s->addr, BMA2x2_BW_SELECT_ADDR, reg_val);
/* If successfully written, then save the new data rate. */
if (ret == EC_SUCCESS)
- data->sensor_datarate = index;
+ data->sensor_datarate = BMA2x2_REG_TO_BW(odr_val);
mutex_unlock(s->mutex);
return ret;
@@ -195,7 +137,7 @@ static int get_data_rate(const struct motion_sensor_t *s)
{
struct bma2x2_accel_data *data = s->drv_data;
- return datarates[data->sensor_datarate].val;
+ return data->sensor_datarate;
}
static int set_offset(const struct motion_sensor_t *s, const int16_t *offset,