summaryrefslogtreecommitdiff
path: root/driver/als_tcs3400.c
diff options
context:
space:
mode:
authorNick Vaccaro <nvaccaro@google.com>2019-10-23 20:22:28 -0700
committerCommit Bot <commit-bot@chromium.org>2019-12-12 11:27:45 +0000
commitc7bf2e272c4a2176217198b2afd9d5f9afdfc5c2 (patch)
tree3c92991beddfbe8116070aa725bb54dcb3abc07c /driver/als_tcs3400.c
parenta56cdc5ff965e9f2f35cfab232022cb367820634 (diff)
downloadchrome-ec-c7bf2e272c4a2176217198b2afd9d5f9afdfc5c2.tar.gz
drivers/tcs3400: add IR scaling factor
This change adds a new scaling factor used in IR separation that further improves sensor CCT accuracy. The following restructure of calibration structure was required : - renamed rgb_calibration_t struct to rgb_channel_calibration_t - added new rgb_calibration_t structure definition to include new irt scaling factor to the rgb calibration structure BUG=b:143246741 BRANCH=master TEST=none Cq-Depend: chromium:1879189 Change-Id: Idb3325be828e8ed15747144670230963c369a461 Signed-off-by: Nick Vaccaro <nvaccaro@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1879188 Tested-by: Mengqi Guo <mqg@chromium.org> Reviewed-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-by: Mengqi Guo <mqg@chromium.org> Reviewed-by: Scott Collyer <scollyer@chromium.org>
Diffstat (limited to 'driver/als_tcs3400.c')
-rw-r--r--driver/als_tcs3400.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/driver/als_tcs3400.c b/driver/als_tcs3400.c
index 80bf837ad7..651f319589 100644
--- a/driver/als_tcs3400.c
+++ b/driver/als_tcs3400.c
@@ -273,7 +273,10 @@ static void tcs3400_translate_to_xyz(struct motion_sensor_t *s,
int i;
/* IR removal */
- ir = (crgb_data[1] + crgb_data[2] + crgb_data[3] - crgb_data[0]) / 2;
+ ir = FP_TO_INT(fp_mul(INT_TO_FP(crgb_data[1] + crgb_data[2] +
+ crgb_data[3] - crgb_data[0]),
+ rgb_drv_data->calibration.irt) / 2);
+
for (i = 0; i < ARRAY_SIZE(crgb_prime); i++) {
if (crgb_data[i] < ir)
crgb_prime[i] = 0;
@@ -287,7 +290,8 @@ static void tcs3400_translate_to_xyz(struct motion_sensor_t *s,
/* regression fit to XYZ space */
for (i = 0; i < 3; i++) {
- const struct rgb_calibration_t *p = &rgb_drv_data->rgb_cal[i];
+ const struct rgb_channel_calibration_t *p =
+ &rgb_drv_data->calibration.rgb_cal[i];
xyz_data[i] = p->offset + FP_TO_INT(
(fp_inter_t)p->coeff[RED_CRGB_IDX] *
@@ -332,7 +336,7 @@ static void tcs3400_process_raw_data(struct motion_sensor_t *s,
/* rgb data at index 1, 2, and 3 owned by rgb driver, not ALS */
if (i > 0) {
struct als_channel_scale_t *csp =
- &rgb_drv_data->rgb_cal[i-1].scale;
+ &rgb_drv_data->calibration.rgb_cal[i-1].scale;
k_channel_scale = csp->k_channel_scale;
cover_scale = csp->cover_scale;
}
@@ -531,7 +535,8 @@ static int tcs3400_rgb_get_scale(const struct motion_sensor_t *s,
uint16_t *scale,
int16_t *temp)
{
- struct rgb_calibration_t *rgb_cal = TCS3400_RGB_DRV_DATA(s)->rgb_cal;
+ struct rgb_channel_calibration_t *rgb_cal =
+ TCS3400_RGB_DRV_DATA(s)->calibration.rgb_cal;
scale[X] = rgb_cal[RED_RGB_IDX].scale.k_channel_scale;
scale[Y] = rgb_cal[GREEN_RGB_IDX].scale.k_channel_scale;
@@ -544,7 +549,8 @@ static int tcs3400_rgb_set_scale(const struct motion_sensor_t *s,
const uint16_t *scale,
int16_t temp)
{
- struct rgb_calibration_t *rgb_cal = TCS3400_RGB_DRV_DATA(s)->rgb_cal;
+ struct rgb_channel_calibration_t *rgb_cal =
+ TCS3400_RGB_DRV_DATA(s)->calibration.rgb_cal;
rgb_cal[RED_RGB_IDX].scale.k_channel_scale = scale[X];
rgb_cal[GREEN_RGB_IDX].scale.k_channel_scale = scale[Y];
@@ -556,9 +562,9 @@ static int tcs3400_rgb_get_offset(const struct motion_sensor_t *s,
int16_t *offset,
int16_t *temp)
{
- offset[X] = TCS3400_RGB_DRV_DATA(s)->rgb_cal[X].offset;
- offset[Y] = TCS3400_RGB_DRV_DATA(s)->rgb_cal[Y].offset;
- offset[Z] = TCS3400_RGB_DRV_DATA(s)->rgb_cal[Z].offset;
+ offset[X] = TCS3400_RGB_DRV_DATA(s)->calibration.rgb_cal[X].offset;
+ offset[Y] = TCS3400_RGB_DRV_DATA(s)->calibration.rgb_cal[Y].offset;
+ offset[Z] = TCS3400_RGB_DRV_DATA(s)->calibration.rgb_cal[Z].offset;
*temp = EC_MOTION_SENSE_INVALID_CALIB_TEMP;
return EC_SUCCESS;
}