summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorChing-Kang Yen <chingkang@chromium.org>2020-01-16 16:11:40 +0800
committerCommit Bot <commit-bot@chromium.org>2020-06-23 23:03:37 +0000
commite6dde3dfd93b326fa1eef39031a49e267a1c23cc (patch)
treeaa4969aa5392f9950353240415dd8117e5d181c0 /common
parent5dba972ba39d75bfcb20f2dd473be55c0a76d33e (diff)
downloadchrome-ec-e6dde3dfd93b326fa1eef39031a49e267a1c23cc.tar.gz
driver: bmi160: Fix rounding error in set_offset() and get_offset()
The original set_offset() and get_offset() codes in the driver/accelgyro_bmi160 use simple divisions to write the data. The more times the set_offset() and get_offset() is used, the data will get closer to 0. Fixing it by replacing simple division to round_divide(), division that round to nearest, in the common/math_util.c. BRANCH=octopus BUG=b:146823505 TEST=Testing on octopus:ampton on branch [firmware-octopus-11297.B]. Checking the data did not rounding to 0. Change-Id: Ide9df9e32fc501e63d6f952cb8254df7662afd23 Signed-off-by: Ching-Kang Yen <chingkang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2002998 Reviewed-by: Gwendal Grignou <gwendal@chromium.org> Commit-Queue: Gwendal Grignou <gwendal@chromium.org> (cherry picked from commit 036e9f7b214b763524497550aae0ee94df8fd536) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2249638 Reviewed-by: Inno.Park <ih.yoo.park@samsung.corp-partner.google.com> Tested-by: Inno.Park <ih.yoo.park@samsung.corp-partner.google.com> Commit-Queue: Bob Moragues <moragues@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/math_util.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/common/math_util.c b/common/math_util.c
index 6a49dc31c3..93207d7ecf 100644
--- a/common/math_util.c
+++ b/common/math_util.c
@@ -253,3 +253,11 @@ void rotate_inv(const vector_3_t v, const matrix_3x3_t R, vector_3_t res)
res[1] = FP_TO_INT(fp_div(t[1], deter));
res[2] = FP_TO_INT(fp_div(t[2], deter));
}
+
+/* division that round to the nearest integer */
+int round_divide(int64_t dividend, int divisor)
+{
+ return (dividend > 0) ^ (divisor > 0) ?
+ (dividend - divisor / 2) / divisor :
+ (dividend + divisor / 2) / divisor;
+}