diff options
-rw-r--r-- | board/flapjack/board.c | 13 | ||||
-rw-r--r-- | driver/als_tcs3400.c | 38 | ||||
-rw-r--r-- | driver/als_tcs3400.h | 22 | ||||
-rw-r--r-- | include/accelgyro.h | 10 |
4 files changed, 46 insertions, 37 deletions
diff --git a/board/flapjack/board.c b/board/flapjack/board.c index b80530c41c..dd157680a6 100644 --- a/board/flapjack/board.c +++ b/board/flapjack/board.c @@ -417,7 +417,7 @@ static struct mutex g_lid_mutex; static struct bmi160_drv_data_t g_bmi160_data; -static struct tcs3400_drv_data_t g_tcs3400_data = { +static struct als_drv_data_t g_tcs3400_data = { .als_cal.scale = 1, .als_cal.uscale = 0, .als_cal.offset = 0, @@ -427,15 +427,15 @@ static struct tcs3400_rgb_drv_data_t g_tcs3400_rgb_data = { .device_scale = 1, .device_uscale = 0, .rgb_cal[X] = { - .scale = TCS3400_SCALE(1), + .scale = ALS_CHANNEL_SCALE(1), .offset = 0, }, .rgb_cal[Y] = { - .scale = TCS3400_SCALE(1), + .scale = ALS_CHANNEL_SCALE(1), .offset = 0, }, .rgb_cal[Z] = { - .scale = TCS3400_SCALE(1), + .scale = ALS_CHANNEL_SCALE(1), .offset = 0, }, }; @@ -500,7 +500,7 @@ struct motion_sensor_t motion_sensors[] = { .location = MOTIONSENSE_LOC_LID, .drv = &tcs3400_drv, .drv_data = &g_tcs3400_data, - .port = I2C_PORT_ACCEL, + .port = I2C_PORT_ALS, .addr = TCS3400_I2C_ADDR, .rot_standard_ref = NULL, .default_range = 0x10000, /* scale = 1x, uscale = 0 */ @@ -521,8 +521,7 @@ struct motion_sensor_t motion_sensors[] = { .location = MOTIONSENSE_LOC_LID, .drv = &tcs3400_rgb_drv, .drv_data = &g_tcs3400_rgb_data, - .port = 0, /* set to 0 to generate an error if access by itself */ - .addr = TCS3400_I2C_ADDR, + /*.port=I2C_PORT_ALS,*/ /* Unused. RGB channels read by CLEAR_ALS. */ .rot_standard_ref = NULL, .default_range = 0x10000, /* scale = 1x, uscale = 0 */ .min_frequency = 0, /* 0 indicates we should not use sensor directly */ diff --git a/driver/als_tcs3400.c b/driver/als_tcs3400.c index e821b6bb9c..213e5424fd 100644 --- a/driver/als_tcs3400.c +++ b/driver/als_tcs3400.c @@ -70,7 +70,7 @@ static int tcs3400_post_events(struct motion_sensor_t *s, uint32_t last_ts) * routine will only get called from ALS sensor driver. */ struct motion_sensor_t *rgb_s = s + 1; - struct tcs3400_drv_data_t *drv_data = TCS3400_DRV_DATA(s); + struct als_drv_data_t *drv_data = TCS3400_DRV_DATA(s); struct tcs3400_rgb_drv_data_t *rgb_drv_data = TCS3400_RGB_DRV_DATA(rgb_s); struct ec_response_motion_sensor_data vector; @@ -153,7 +153,7 @@ skip_clear_vector_load: rgb_data[i] = ((light_data[index] << 8) | light_data[index-1]); rgb_data[i] += rgb_drv_data->rgb_cal[i].offset; - rgb_data[i] *= rgb_drv_data->rgb_cal[i].scale / BIT(15); + rgb_data[i] *= rgb_drv_data->rgb_cal[i].scale >> 15; rgb_data[i] = rgb_data[i] * rgb_drv_data->device_scale + rgb_data[i] * rgb_drv_data->device_uscale / 10000; @@ -194,7 +194,6 @@ skip_vector_load: vector.sensor_num = rgb_s - motion_sensors; motion_sense_fifo_add_data(&vector, rgb_s, 3, last_ts); } - return EC_SUCCESS; } @@ -235,7 +234,6 @@ static int tcs3400_irq_handler(struct motion_sensor_t *s, uint32_t *event) if ((status & TCS_I2C_STATUS_RGBC_VALID) || ((status & TCS_I2C_STATUS_ALS_IRQ) && (status & TCS_I2C_STATUS_ALS_VALID))) { - ret = tcs3400_post_events(s, last_interrupt_timestamp); if (ret) return ret; @@ -401,26 +399,28 @@ static int tcs3400_init(const struct motion_sensor_t *s) { /* * These are default power-on register values with two exceptions: - * Set ATIME = 0x4 (700.88ms) + * Set ATIME = 0 (712 ms) * Set AGAIN = 16 (0x10) (AGAIN is in CONTROL register) */ const struct reg_data { uint8_t reg; uint8_t data; - } defaults[] = { { TCS_I2C_ENABLE, 0 }, - { TCS_I2C_ATIME, 0x4 }, - { TCS_I2C_WTIME, 0xFF }, - { TCS_I2C_AILTL, 0 }, - { TCS_I2C_AILTH, 0 }, - { TCS_I2C_AIHTL, 0 }, - { TCS_I2C_AIHTH, 0 }, - { TCS_I2C_PERS, 0 }, - { TCS_I2C_CONFIG, 0x40 }, - { TCS_I2C_CONTROL, 0x10 }, - { TCS_I2C_AUX, 0 }, - { TCS_I2C_IR, 0 }, - { TCS_I2C_CICLEAR, 0 }, - { TCS_I2C_AICLEAR, 0 } }; + } defaults[] = { + { TCS_I2C_ENABLE, 0 }, + { TCS_I2C_ATIME, TCS_DEFAULT_ATIME }, + { TCS_I2C_WTIME, 0xFF }, + { TCS_I2C_AILTL, 0 }, + { TCS_I2C_AILTH, 0 }, + { TCS_I2C_AIHTL, 0 }, + { TCS_I2C_AIHTH, 0 }, + { TCS_I2C_PERS, 0 }, + { TCS_I2C_CONFIG, 0x40 }, + { TCS_I2C_CONTROL, (TCS_DEFAULT_AGAIN & TCS_I2C_CONTROL_MASK)}, + { TCS_I2C_AUX, 0 }, + { TCS_I2C_IR, 0 }, + { TCS_I2C_CICLEAR, 0 }, + { TCS_I2C_AICLEAR, 0 } + }; int data = 0; int ret; diff --git a/driver/als_tcs3400.h b/driver/als_tcs3400.h index f695fdb387..1e53b83954 100644 --- a/driver/als_tcs3400.h +++ b/driver/als_tcs3400.h @@ -63,6 +63,7 @@ enum tcs3400_mode { TCS_I2C_ENABLE_INT_ENABLE), }; +#define TCS_I2C_CONTROL_MASK 0x03 #define TCS_I2C_STATUS_RGBC_VALID BIT(0) #define TCS_I2C_STATUS_ALS_IRQ BIT(4) #define TCS_I2C_STATUS_ALS_VALID BIT(7) @@ -81,21 +82,20 @@ enum tcs3400_mode { #error "EC too slow for light sensor" #endif -/* Individual channel scale value between 0 and 2 to a 32-bit value */ -#define TCS3400_SCALE(x) (x << 15) - -#define TCS3400_DRV_DATA(_s) ((struct tcs3400_drv_data_t *)(_s)->drv_data) +#define TCS3400_DRV_DATA(_s) ((struct als_drv_data_t *)(_s)->drv_data) #define TCS3400_RGB_DRV_DATA(_s) \ ((struct tcs3400_rgb_drv_data_t *)(_s)->drv_data) -/* Private tcs3400 als driver data */ -struct tcs3400_drv_data_t { - int rate; /* holds current sensor rate */ - int last_value; /* holds last als clear channel value */ - struct als_calibration_t als_cal; /* calibration data */ -}; +/* NOTE: The higher the ATIME value in reg, the shorter the accumulation time */ +#define TCS_MIN_ATIME 0x00 /* 712 ms */ +#define TCS_MAX_ATIME 0x70 /* 400 ms */ +#define TCS_DEFAULT_ATIME TCS_MIN_ATIME /* 712 ms */ + +#define TCS_MIN_AGAIN 0x00 /* 1x gain */ +#define TCS_MAX_AGAIN 0x03 /* 64x gain */ +#define TCS_DEFAULT_AGAIN 0x02 /* 16x gain */ -/* Private tcs3400 rgb driver data */ +/* tcs3400 rgb als driver data */ struct tcs3400_rgb_drv_data_t { /* * device_scale and device_uscale are used to adjust raw rgb channel diff --git a/include/accelgyro.h b/include/accelgyro.h index a8724a43ee..8dcc6f5fbb 100644 --- a/include/accelgyro.h +++ b/include/accelgyro.h @@ -177,7 +177,17 @@ struct rgb_calibration_t { int16_t offset; }; +/* als driver data */ +struct als_drv_data_t { + int rate; /* holds current sensor rate */ + int last_value; /* holds last als clear channel value */ + struct als_calibration_t als_cal; /* calibration data */ +}; + #define SENSOR_APPLY_SCALE(_input, _scale) \ (((_input) * (_scale)) / MOTION_SENSE_DEFAULT_SCALE) +/* Individual channel scale value between 0 and 2 represented in 16 bits */ +#define ALS_CHANNEL_SCALE(_x) ((_x) << 15) + #endif /* __CROS_EC_ACCELGYRO_H */ |