mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-07 16:11:43 +00:00
motion: Add bh1730 as a motion sensor
- Add ROHM ambient light sensor driver
- Add als sensor to motion sensors
BRANCH=glados
BUG=b:67022366
TEST=This driver is tested in caroline
Signed-off-by: yb.ha <ybha@samsung.com>
Change-Id: Ic73c50e17b412975f7850b7348ce310180f7a6eb
Reviewed-on: https://chromium-review.googlesource.com/784659
Commit-Ready: YongBeum Ha <ybha@samsung.com>
Tested-by: YongBeum Ha <ybha@samsung.com>
Reviewed-by: Gwendal Grignou <gwendal@google.com>
This commit is contained in:
175
driver/als_bh1730.c
Normal file
175
driver/als_bh1730.c
Normal file
@@ -0,0 +1,175 @@
|
||||
/* Copyright 2017 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.
|
||||
*
|
||||
* Rohm BH1730 Ambient light sensor driver
|
||||
*/
|
||||
|
||||
#include "accelgyro.h"
|
||||
#include "config.h"
|
||||
#include "console.h"
|
||||
#include "driver/als_bh1730.h"
|
||||
#include "i2c.h"
|
||||
|
||||
#define CPRINTS(format, args...) cprints(CC_MOTION_SENSE, format, ## args)
|
||||
#define CPRINTF(format, args...) cprintf(CC_MOTION_SENSE, format, ## args)
|
||||
|
||||
/**
|
||||
* Convert BH1730 data0, data1 to lux
|
||||
*/
|
||||
static int bh1730_convert_to_lux(uint32_t data0_1)
|
||||
{
|
||||
int lux;
|
||||
uint16_t data0 = 0x0000ffff & data0_1;
|
||||
uint16_t data1 = data0_1 >> 16;
|
||||
uint32_t d0_1k = data0 * 1000;
|
||||
uint32_t d1_1k = data1 * 1000;
|
||||
uint32_t d_temp = d1_1k / d0_1k;
|
||||
uint32_t d_lux;
|
||||
|
||||
if (data0 == 0)
|
||||
return 0;
|
||||
|
||||
if(d_temp < BH1730_LUXTH1_1K) {
|
||||
d0_1k = BH1730_LUXTH1_D0_1K * data0;
|
||||
d1_1k = BH1730_LUXTH1_D1_1K * data1;
|
||||
} else if(d_temp < BH1730_LUXTH2_1K) {
|
||||
d0_1k = BH1730_LUXTH2_D0_1K * data0;
|
||||
d1_1k = BH1730_LUXTH2_D1_1K * data1;
|
||||
} else if(d_temp < BH1730_LUXTH3_1K) {
|
||||
d0_1k = BH1730_LUXTH3_D0_1K * data0;
|
||||
d1_1k = BH1730_LUXTH3_D1_1K * data1;
|
||||
} else if(d_temp < BH1730_LUXTH4_1K) {
|
||||
d0_1k = BH1730_LUXTH4_D0_1K * data0;
|
||||
d1_1k = BH1730_LUXTH4_D1_1K * data1;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
d_lux = (d0_1k - d1_1k) / BH1730_GAIN_DIV;
|
||||
d_lux *= 100;
|
||||
lux = d_lux / ITIME_MS_X_1K;
|
||||
|
||||
return lux;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read BH1730 light sensor data.
|
||||
*/
|
||||
static int bh1730_read_lux(const struct motion_sensor_t *s, vector_3_t v)
|
||||
{
|
||||
struct bh1730_drv_data_t *drv_data = BH1730_GET_DATA(s);
|
||||
int ret;
|
||||
int data0_1;
|
||||
|
||||
/* read data0 and data1 from sensor */
|
||||
ret = i2c_read32(s->port, s->addr, BH1730_DATA0LOW, &data0_1);
|
||||
if (ret != EC_SUCCESS) {
|
||||
CPRINTF("bh1730_read_lux - fail %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* convert sensor data0 and data1 to lux */
|
||||
v[0] = bh1730_convert_to_lux(data0_1);
|
||||
v[1] = 0;
|
||||
v[2] = 0;
|
||||
|
||||
/*
|
||||
* Return an error when nothing change to prevent filling the
|
||||
* fifo with useless data.
|
||||
*/
|
||||
if (v[0] == drv_data->last_value)
|
||||
return EC_ERROR_UNCHANGED;
|
||||
else
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
static int bh1730_set_range(const struct motion_sensor_t *s, int range,
|
||||
int rnd)
|
||||
{
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
static int bh1730_get_range(const struct motion_sensor_t *s)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int bh1730_set_data_rate(const struct motion_sensor_t *s,
|
||||
int rate, int roundup)
|
||||
{
|
||||
struct bh1730_drv_data_t *drv_data = BH1730_GET_DATA(s);
|
||||
|
||||
/* now only one rate supported */
|
||||
drv_data->rate = BH1730_10000_MHZ;
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
static int bh1730_get_data_rate(const struct motion_sensor_t *s)
|
||||
{
|
||||
struct bh1730_drv_data_t *drv_data = BH1730_GET_DATA(s);
|
||||
|
||||
return drv_data->rate;
|
||||
}
|
||||
|
||||
static int bh1730_set_offset(const struct motion_sensor_t *s,
|
||||
const int16_t *offset,
|
||||
int16_t temp)
|
||||
{
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
static int bh1730_get_offset(const struct motion_sensor_t *s,
|
||||
int16_t *offset,
|
||||
int16_t *temp)
|
||||
{
|
||||
*offset = 0;
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialise BH1730 Ambient light sensor.
|
||||
*/
|
||||
static int bh1730_init(const struct motion_sensor_t *s)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* power and measurement bit high */
|
||||
ret = i2c_write8(s->port, s->addr,
|
||||
BH1730_CONTROL,
|
||||
BH1730_CONTROL_POWER_ENABLE|BH1730_CONTROL_ADC_EN_ENABLE);
|
||||
|
||||
if (ret != EC_SUCCESS) {
|
||||
CPRINTF("bh1730_init_sensor - enable fail %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* set timing */
|
||||
ret = i2c_write8(s->port, s->addr, BH1730_TIMING, BH1730_CONF_ITIME);
|
||||
if (ret != EC_SUCCESS) {
|
||||
CPRINTF("bh1730_init_sensor - time fail %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
/* set ADC gain */
|
||||
ret = i2c_write8(s->port, s->addr, BH1730_GAIN, BH1730_CONF_GAIN);
|
||||
|
||||
if (ret != EC_SUCCESS) {
|
||||
CPRINTF("bh1730_init_sensor - gain fail %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return sensor_init_done(s);
|
||||
}
|
||||
|
||||
const struct accelgyro_drv bh1730_drv = {
|
||||
.init = bh1730_init,
|
||||
.read = bh1730_read_lux,
|
||||
.set_range = bh1730_set_range,
|
||||
.get_range = bh1730_get_range,
|
||||
.set_offset = bh1730_set_offset,
|
||||
.get_offset = bh1730_get_offset,
|
||||
.set_data_rate = bh1730_set_data_rate,
|
||||
.get_data_rate = bh1730_get_data_rate,
|
||||
};
|
||||
|
||||
91
driver/als_bh1730.h
Normal file
91
driver/als_bh1730.h
Normal file
@@ -0,0 +1,91 @@
|
||||
/* Copyright 2017 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.
|
||||
*
|
||||
* Rohm BH1730 Ambient light sensor driver
|
||||
*/
|
||||
|
||||
#ifndef __CROS_EC_ALS_BH1730_H
|
||||
#define __CROS_EC_ALS_BH1730_H
|
||||
|
||||
/* I2C interface */
|
||||
#define BH1730_I2C_ADDR (0x29 << 1)
|
||||
|
||||
/* BH1730 registers */
|
||||
#define BH1730_CONTROL 0x80
|
||||
#define BH1730_TIMING 0x81
|
||||
#define BH1730_INTERRUPT 0x82
|
||||
#define BH1730_THLLOW 0x83
|
||||
#define BH1730_THLHIGH 0x84
|
||||
#define BH1730_THHLOW 0x85
|
||||
#define BH1730_THHHIGH 0x86
|
||||
#define BH1730_GAIN 0x87
|
||||
#define BH1730_OPART_ID 0x92
|
||||
#define BH1730_DATA0LOW 0x94
|
||||
#define BH1730_DATA0HIGH 0x95
|
||||
#define BH1730_DATA1LOW 0x96
|
||||
#define BH1730_DATA1HIGH 0x97
|
||||
/* Software reset */
|
||||
#define BH1730_RESET 0xE4
|
||||
|
||||
/* Registers bits */
|
||||
#define BH1730_CONTROL_ADC_INTR_INACTIVE (0x00 << 5)
|
||||
#define BH1730_CONTROL_ADC_INTR_ACTIVE (0x01 << 5)
|
||||
#define BH1730_CONTROL_ADC_VALID (0x01 << 4)
|
||||
#define BH1730_CONTROL_ONE_TIME_CONTINOUS (0x00 << 3)
|
||||
#define BH1730_CONTROL_ONE_TIME_ONETIME (0x01 << 3)
|
||||
#define BH1730_CONTROL_DATA_SEL_TYPE0_AND_1 (0x00 << 2)
|
||||
#define BH1730_CONTROL_DATA_SEL_TYPE0 (0x01 << 2)
|
||||
#define BH1730_CONTROL_ADC_EN_DISABLE (0x00 << 1)
|
||||
#define BH1730_CONTROL_ADC_EN_ENABLE (0x01 << 1)
|
||||
#define BH1730_CONTROL_POWER_DISABLE (0x00 << 0)
|
||||
#define BH1730_CONTROL_POWER_ENABLE (0x01 << 0)
|
||||
|
||||
#define BH1730_GAIN_GAIN_X1_GAIN (0x00 << 0)
|
||||
#define BH1730_GAIN_GAIN_X2_GAIN (0x01 << 0)
|
||||
#define BH1730_GAIN_GAIN_X64_GAIN (0x02 << 0)
|
||||
#define BH1730_GAIN_GAIN_X128_GAIN (0x03 << 0)
|
||||
|
||||
/* Sensor configuration */
|
||||
/* Select Gain */
|
||||
#define BH1730_CONF_GAIN BH1730_GAIN_GAIN_X64_GAIN
|
||||
#define BH1730_GAIN_DIV 64
|
||||
|
||||
/* Select Itime, 0xDA is 102.6ms = 38*2.7ms */
|
||||
#define BH1730_CONF_ITIME 0xDA
|
||||
#define ITIME_MS_X_10 ((256 - BH1730_CONF_ITIME) * 27)
|
||||
#define ITIME_MS_X_1K (ITIME_MS_X_10*100)
|
||||
|
||||
/* default Itime is about 10Hz */
|
||||
#define BH1730_10000_MHZ (10*1000)
|
||||
|
||||
/*
|
||||
* Use default lux calculation formula parameters if board specific
|
||||
* parameters are not defined.
|
||||
*/
|
||||
#ifndef CONFIG_ALS_BH1730_LUXTH_PARAMS
|
||||
#define BH1730_LUXTH1_1K 260
|
||||
#define BH1730_LUXTH1_D0_1K 1290
|
||||
#define BH1730_LUXTH1_D1_1K 2733
|
||||
#define BH1730_LUXTH2_1K 550
|
||||
#define BH1730_LUXTH2_D0_1K 797
|
||||
#define BH1730_LUXTH2_D1_1K 859
|
||||
#define BH1730_LUXTH3_1K 1090
|
||||
#define BH1730_LUXTH3_D0_1K 510
|
||||
#define BH1730_LUXTH3_D1_1K 345
|
||||
#define BH1730_LUXTH4_1K 2130
|
||||
#define BH1730_LUXTH4_D0_1K 276
|
||||
#define BH1730_LUXTH4_D1_1K 130
|
||||
#endif
|
||||
|
||||
#define BH1730_GET_DATA(_s) ((struct bh1730_drv_data_t *)(_s)->drv_data)
|
||||
|
||||
struct bh1730_drv_data_t {
|
||||
int rate;
|
||||
int last_value;
|
||||
};
|
||||
|
||||
extern const struct accelgyro_drv bh1730_drv;
|
||||
|
||||
#endif /* __CROS_EC_ALS_BH1730_H */
|
||||
|
||||
@@ -28,6 +28,7 @@ driver-$(CONFIG_ALS_AL3010)+=als_al3010.o
|
||||
driver-$(CONFIG_ALS_ISL29035)+=als_isl29035.o
|
||||
driver-$(CONFIG_ALS_OPT3001)+=als_opt3001.o
|
||||
driver-$(CONFIG_ALS_SI114X)+=als_si114x.o
|
||||
driver-$(CONFIG_ALS_BH1730)+=als_bh1730.o
|
||||
|
||||
# Barometers
|
||||
driver-$(CONFIG_BARO_BMP280)+=baro_bmp280.o
|
||||
|
||||
@@ -152,6 +152,12 @@
|
||||
#undef CONFIG_ALS
|
||||
#endif
|
||||
#undef CONFIG_ALS_AL3010
|
||||
#undef CONFIG_ALS_BH1730
|
||||
/*
|
||||
* If defined, BH1730 uses board specific lux calculation formula parameters.
|
||||
* If not defined, BH1730 uses default parameters to calculate lux.
|
||||
*/
|
||||
#undef CONFIG_ALS_BH1730_LUXTH_PARAMS
|
||||
#undef CONFIG_ALS_ISL29035
|
||||
#undef CONFIG_ALS_OPT3001
|
||||
/* Define the exact model ID present on the board: SI1141 = 41, SI1142 = 42, */
|
||||
|
||||
@@ -2259,6 +2259,7 @@ enum motionsensor_chip {
|
||||
MOTIONSENSE_CHIP_BMA255 = 8,
|
||||
MOTIONSENSE_CHIP_BMP280 = 9,
|
||||
MOTIONSENSE_CHIP_OPT3001 = 10,
|
||||
MOTIONSENSE_CHIP_BH1730 = 11,
|
||||
};
|
||||
|
||||
/* List of orientation positions */
|
||||
|
||||
@@ -3822,6 +3822,9 @@ static int cmd_motionsense(int argc, char **argv)
|
||||
case MOTIONSENSE_CHIP_OPT3001:
|
||||
printf("opt3001\n");
|
||||
break;
|
||||
case MOTIONSENSE_CHIP_BH1730:
|
||||
printf("bh1730\n");
|
||||
break;
|
||||
default:
|
||||
printf("unknown\n");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user