summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorVijay Hiremath <vijay.p.hiremath@intel.com>2015-08-03 23:37:54 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-09-23 15:10:08 -0700
commitf9272713da615e51ea14f70872fec46fbd88e938 (patch)
tree7b12c57a3435a615718c9d3325dfc0671fc297b6 /driver
parent806aae81f6bed5ab1a26e860eaa2b5b1349a1444 (diff)
downloadchrome-ec-f9272713da615e51ea14f70872fec46fbd88e938.tar.gz
i2c: Add i2ctest console command
Added i2ctest console command to test the reliability of the I2C. By reading/writing to the known registers this tests provides the number of successful read and writes. BUG=chrome-os-partner:57487 TEST=Enabled the i2ctest config on Reef and tested the i2c read/writes. BRANCH=none Change-Id: I9e27ff96f2b85422933bc590d112a083990e2dfb Signed-off-by: Vijay Hiremath <vijay.p.hiremath@intel.com> Reviewed-on: https://chromium-review.googlesource.com/290427 Commit-Ready: Vijay P Hiremath <vijay.p.hiremath@intel.com> Tested-by: Vijay P Hiremath <vijay.p.hiremath@intel.com> Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r--driver/accel_kionix.c12
-rw-r--r--driver/accel_kionix.h10
-rw-r--r--driver/accel_kx022.h1
-rw-r--r--driver/accel_kxcj9.h1
-rw-r--r--driver/accelgyro_bmi160.c16
-rw-r--r--driver/accelgyro_bmi160.h3
-rw-r--r--driver/als_opt3001.c12
-rw-r--r--driver/als_opt3001.h4
-rw-r--r--driver/baro_bmp280.c16
-rw-r--r--driver/baro_bmp280.h5
-rw-r--r--driver/battery/smart.c33
-rw-r--r--driver/charger/bd9995x.c22
-rw-r--r--driver/charger/bd9995x.h4
-rw-r--r--driver/tcpm/anx74xx.c12
-rw-r--r--driver/tcpm/anx74xx.h8
-rw-r--r--driver/tcpm/ps8751.c12
-rw-r--r--driver/tcpm/ps8751.h7
-rw-r--r--driver/tcpm/tcpm.h14
18 files changed, 188 insertions, 4 deletions
diff --git a/driver/accel_kionix.c b/driver/accel_kionix.c
index 7600f452ee..2a9149d9a7 100644
--- a/driver/accel_kionix.c
+++ b/driver/accel_kionix.c
@@ -529,3 +529,15 @@ const struct accelgyro_drv kionix_accel_drv = {
.set_offset = set_offset,
.get_offset = get_offset,
};
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ACCEL
+struct i2c_stress_test_dev kionix_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = KX022_WHOAMI,
+ .read_val = KIONIX_WHO_AM_I_VAL,
+ .write_reg = KIONIX_ODR_REG(V(s)),
+ },
+ .i2c_read = &raw_read8,
+ .i2c_write = &raw_write8,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_ACCEL */
diff --git a/driver/accel_kionix.h b/driver/accel_kionix.h
index 6c71cb7918..04df63066f 100644
--- a/driver/accel_kionix.h
+++ b/driver/accel_kionix.h
@@ -69,4 +69,14 @@ extern const struct accelgyro_drv kionix_accel_drv;
#define KIONIX_XOUT_L(v) (KX022_XOUT_L + \
(v) * (KXCJ9_XOUT_L - KX022_XOUT_L))
+#ifdef CONFIG_ACCEL_KX022
+#define KIONIX_WHO_AM_I_VAL KX022_WHO_AM_I_VAL
+#elif defined(CONFIG_ACCEL_KXCJ9)
+#define KIONIX_WHO_AM_I_VAL KXCJ9_WHO_AM_I_VAL
+#endif
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ACCEL
+extern struct i2c_stress_test_dev kionix_i2c_stress_test_dev;
+#endif
+
#endif /* __CROS_EC_ACCEL_KIONIX_H */
diff --git a/driver/accel_kx022.h b/driver/accel_kx022.h
index 3ed95a30a8..d25d68b380 100644
--- a/driver/accel_kx022.h
+++ b/driver/accel_kx022.h
@@ -14,6 +14,7 @@
*/
#define KX022_ADDR0 0x3c
#define KX022_ADDR1 0x3e
+#define KX022_WHO_AM_I_VAL 0x14
/* Chip-specific registers */
#define KX022_XHP_L 0x00
diff --git a/driver/accel_kxcj9.h b/driver/accel_kxcj9.h
index 4436f38e8b..b3702ea541 100644
--- a/driver/accel_kxcj9.h
+++ b/driver/accel_kxcj9.h
@@ -16,6 +16,7 @@
*/
#define KXCJ9_ADDR0 0x1c
#define KXCJ9_ADDR1 0x1e
+#define KXCJ9_WHO_AM_I_VAL 0x0A
/* Chip-specific registers */
#define KXCJ9_XOUT_L 0x06
diff --git a/driver/accelgyro_bmi160.c b/driver/accelgyro_bmi160.c
index c8a6d18bdf..2ecc27fe4c 100644
--- a/driver/accelgyro_bmi160.c
+++ b/driver/accelgyro_bmi160.c
@@ -139,7 +139,7 @@ static inline int spi_raw_read(const int addr, const uint8_t reg,
/**
* Read 8bit register from accelerometer.
*/
-static int raw_read8(const int port, const int addr, const uint8_t reg,
+static int raw_read8(const int port, const int addr, const int reg,
int *data_ptr)
{
int rv = -EC_ERROR_PARAM1;
@@ -163,7 +163,7 @@ static int raw_read8(const int port, const int addr, const uint8_t reg,
/**
* Write 8bit register from accelerometer.
*/
-static int raw_write8(const int port, const int addr, const uint8_t reg,
+static int raw_write8(const int port, const int addr, const int reg,
int data)
{
int rv = -EC_ERROR_PARAM1;
@@ -1248,3 +1248,15 @@ const struct accelgyro_drv bmi160_drv = {
struct bmi160_drv_data_t g_bmi160_data = {
.flags = 0,
};
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ACCEL
+struct i2c_stress_test_dev bmi160_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = BMI160_CHIP_ID,
+ .read_val = BMI160_CHIP_ID_MAJOR,
+ .write_reg = BMI160_PMU_TRIGGER,
+ },
+ .i2c_read = &raw_read8,
+ .i2c_write = &raw_write8,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_ACCEL */
diff --git a/driver/accelgyro_bmi160.h b/driver/accelgyro_bmi160.h
index e6e8e19e54..ec43fb4a9d 100644
--- a/driver/accelgyro_bmi160.h
+++ b/driver/accelgyro_bmi160.h
@@ -459,5 +459,8 @@ int raw_mag_read8(const int port, const int addr, const uint8_t reg,
int raw_mag_write8(const int port, const int addr, const uint8_t reg, int data);
#endif
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ACCEL
+extern struct i2c_stress_test_dev bmi160_i2c_stress_test_dev;
+#endif
#endif /* __CROS_EC_ACCELGYRO_BMI160_H */
diff --git a/driver/als_opt3001.c b/driver/als_opt3001.c
index 993803bd28..bbf61a1064 100644
--- a/driver/als_opt3001.c
+++ b/driver/als_opt3001.c
@@ -87,3 +87,15 @@ int opt3001_read_lux(int *lux, int af)
return EC_SUCCESS;
}
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ALS
+struct i2c_stress_test_dev opt3001_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = OPT3001_REG_DEV_ID,
+ .read_val = OPT3001_DEVICE_ID,
+ .write_reg = OPT3001_REG_INT_LIMIT_LSB,
+ },
+ .i2c_read_dev = &opt3001_i2c_read,
+ .i2c_write_dev = &opt3001_i2c_write,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_ALS */
diff --git a/driver/als_opt3001.h b/driver/als_opt3001.h
index 3e21ba7db8..366e957995 100644
--- a/driver/als_opt3001.h
+++ b/driver/als_opt3001.h
@@ -29,4 +29,8 @@
int opt3001_init(void);
int opt3001_read_lux(int *lux, int af);
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ALS
+extern struct i2c_stress_test_dev opt3001_i2c_stress_test_dev;
+#endif
+
#endif /* __CROS_EC_ALS_OPT3001_H */
diff --git a/driver/baro_bmp280.c b/driver/baro_bmp280.c
index 6e394dbf72..3a3f3e3b6d 100644
--- a/driver/baro_bmp280.c
+++ b/driver/baro_bmp280.c
@@ -68,7 +68,7 @@
static const uint16_t standby_durn[] = {1, 63, 125, 250, 500, 1000, 2000, 4000};
-static inline int raw_read8(const int port, const int addr, const uint8_t reg,
+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);
@@ -92,7 +92,7 @@ static inline int raw_read_n(const int port, const int addr, const uint8_t reg,
/*
* Write 8bit register from accelerometer.
*/
-static inline int raw_write8(const int port, const int addr, const uint8_t reg,
+static inline int raw_write8(const int port, const int addr, const int reg,
int data)
{
return i2c_write8(port, addr, reg, data);
@@ -405,3 +405,15 @@ const struct accelgyro_drv bmp280_drv = {
.set_data_rate = bmp280_set_data_rate,
.get_data_rate = bmp280_get_data_rate,
};
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ACCEL
+struct i2c_stress_test_dev bmp280_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = BMP280_CHIP_ID_REG,
+ .read_val = BMP280_CHIP_ID,
+ .write_reg = BMP280_CONFIG_REG,
+ },
+ .i2c_read = &raw_read8,
+ .i2c_write = &raw_write8,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_ACCEL */
diff --git a/driver/baro_bmp280.h b/driver/baro_bmp280.h
index 1af1aa2125..cd4605ed1a 100644
--- a/driver/baro_bmp280.h
+++ b/driver/baro_bmp280.h
@@ -205,4 +205,9 @@ struct bmp280_drv_data_t {
extern const struct accelgyro_drv bmp280_drv;
extern struct bmp280_drv_data_t bmp280_drv_data;
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_ACCEL
+extern struct i2c_stress_test_dev bmp280_i2c_stress_test_dev;
+#endif
+
#endif
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index ff2da13863..9e7e9f3ec6 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -475,3 +475,36 @@ DECLARE_HOST_COMMAND(EC_CMD_SB_WRITE_BLOCK,
host_command_sb_write_block,
EC_VER_MASK(0));
#endif
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_BATTERY
+test_mockable int sb_i2c_test_read(int cmd, int *param)
+{
+ char chemistry[sizeof(CONFIG_BATTERY_DEVICE_CHEMISTRY) + 1];
+ int rv;
+
+ if (cmd == SB_DEVICE_CHEMISTRY) {
+ rv = battery_device_chemistry(chemistry,
+ sizeof(CONFIG_BATTERY_DEVICE_CHEMISTRY));
+ if (rv)
+ return rv;
+ if (strcasecmp(chemistry, CONFIG_BATTERY_DEVICE_CHEMISTRY))
+ return EC_ERROR_UNKNOWN;
+
+ *param = EC_SUCCESS;
+ return EC_SUCCESS;
+ }
+
+
+ return sb_read(cmd, param);
+}
+
+struct i2c_stress_test_dev battery_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = SB_DEVICE_CHEMISTRY,
+ .read_val = EC_SUCCESS,
+ .write_reg = SB_AT_RATE,
+ },
+ .i2c_read_dev = &sb_i2c_test_read,
+ .i2c_write_dev = &sb_write,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_BATTERY */
diff --git a/driver/charger/bd9995x.c b/driver/charger/bd9995x.c
index cbc8d04132..0dd5da99de 100644
--- a/driver/charger/bd9995x.c
+++ b/driver/charger/bd9995x.c
@@ -1231,3 +1231,25 @@ DECLARE_CONSOLE_COMMAND(amonbmon, console_command_amon_bmon,
"amonbmon [a|b]",
"Get charger AMON/BMON voltage diff, current");
#endif /* CONFIG_CMD_CHARGER_ADC_AMON_BMON */
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_CHARGER
+static int bd9995x_i2c_read(const int reg, int *data)
+{
+ return ch_raw_read16(reg, data, BD9995X_EXTENDED_COMMAND);
+}
+
+static int bd9995x_i2c_write(const int reg, int data)
+{
+ return ch_raw_write16(reg, data, BD9995X_EXTENDED_COMMAND);
+}
+
+struct i2c_stress_test_dev bd9995x_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = BD9995X_CMD_CHIP_ID,
+ .read_val = BD9995X_CHIP_ID,
+ .write_reg = BD9995X_CMD_ITRICH_SET,
+ },
+ .i2c_read_dev = &bd9995x_i2c_read,
+ .i2c_write_dev = &bd9995x_i2c_write,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_CHARGER */
diff --git a/driver/charger/bd9995x.h b/driver/charger/bd9995x.h
index 91a0ac1bbd..baef184d09 100644
--- a/driver/charger/bd9995x.h
+++ b/driver/charger/bd9995x.h
@@ -359,4 +359,8 @@ void bd9995x_vbus_interrupt(enum gpio_signal signal);
/* Read temperature measurement value (in Celsius) */
int bd9995x_get_battery_temp(int *temp_ptr);
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_CHARGER
+extern struct i2c_stress_test_dev bd9995x_i2c_stress_test_dev;
+#endif
+
#endif /* __CROS_EC_BD9995X_H */
diff --git a/driver/tcpm/anx74xx.c b/driver/tcpm/anx74xx.c
index 302be88030..689d6d1799 100644
--- a/driver/tcpm/anx74xx.c
+++ b/driver/tcpm/anx74xx.c
@@ -882,3 +882,15 @@ const struct tcpm_drv anx74xx_tcpm_drv = {
.tcpc_discharge_vbus = &anx74xx_tcpc_discharge_vbus,
#endif
};
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_TCPC
+struct i2c_stress_test_dev anx74xx_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = ANX74XX_REG_VENDOR_ID_L,
+ .read_val = ANX74XX_VENDOR_ID & 0xFF,
+ .write_reg = ANX74XX_REG_CC_SOFTWARE_CTRL,
+ },
+ .i2c_read = &tcpc_i2c_read,
+ .i2c_write = &tcpc_i2c_write,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_TCPC */
diff --git a/driver/tcpm/anx74xx.h b/driver/tcpm/anx74xx.h
index de8d2b7fab..76bb44067e 100644
--- a/driver/tcpm/anx74xx.h
+++ b/driver/tcpm/anx74xx.h
@@ -13,6 +13,10 @@
#define ANX74XX_REG_IRQ_POL_LOW 0x00
#define ANX74XX_REG_IRQ_POL_HIGH 0x02
+#define ANX74XX_REG_VENDOR_ID_L 0x00
+#define ANX74XX_REG_VENDOR_ID_H 0x01
+#define ANX74XX_VENDOR_ID 0xAAAA
+
/* ANX F/W version:0x50:0x44 which contains otp firmware version */
#define ANX74XX_REG_FW_VERSION 0x44
@@ -162,4 +166,8 @@ void anx74xx_tcpc_update_hpd_status(int port, int hpd_lvl, int hpd_irq);
void anx74xx_tcpc_clear_hpd_status(int port);
int anx74xx_tcpc_get_fw_version(int port, int *version);
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_TCPC
+extern struct i2c_stress_test_dev anx74xx_i2c_stress_test_dev;
+#endif
+
#endif /* __CROS_EC_USB_PD_TCPM_ANX74XX_H */
diff --git a/driver/tcpm/ps8751.c b/driver/tcpm/ps8751.c
index b9419a4696..f889f17134 100644
--- a/driver/tcpm/ps8751.c
+++ b/driver/tcpm/ps8751.c
@@ -67,3 +67,15 @@ int ps8751_tcpc_get_fw_version(int port, int *version)
return tcpc_read(port, PS8751_REG_VERSION, version);
}
#endif
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_TCPC
+struct i2c_stress_test_dev ps8751_i2c_stress_test_dev = {
+ .reg_info = {
+ .read_reg = PS8751_REG_VENDOR_ID_L,
+ .read_val = PS8751_VENDOR_ID & 0xFF,
+ .write_reg = PS8751_REG_CTRL_1,
+ },
+ .i2c_read = &tcpc_i2c_read,
+ .i2c_write = &tcpc_i2c_write,
+};
+#endif /* CONFIG_CMD_I2C_STRESS_TEST_TCPC */
diff --git a/driver/tcpm/ps8751.h b/driver/tcpm/ps8751.h
index e0abb491ba..71325a7d4b 100644
--- a/driver/tcpm/ps8751.h
+++ b/driver/tcpm/ps8751.h
@@ -13,11 +13,18 @@
#define PS8751_PRODUCT_ID 0x8751
#define PS8751_REG_VERSION 0x90
+#define PS8751_REG_VENDOR_ID_L 0x00
+#define PS8751_REG_VENDOR_ID_H 0x01
#define PS8751_REG_CTRL_1 0xD0
#define PS8751_REG_CTRL_1_HPD (1 << 0)
#define PS8751_REG_CTRL_1_IRQ (1 << 1)
void ps8751_tcpc_update_hpd_status(int port, int hpd_lvl, int hpd_irq);
int ps8751_tcpc_get_fw_version(int port, int *version);
+
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_TCPC
+extern struct i2c_stress_test_dev ps8751_i2c_stress_test_dev;
+#endif
+
#endif /* __CROS_EC_USB_PD_TCPM_PS8751_H */
diff --git a/driver/tcpm/tcpm.h b/driver/tcpm/tcpm.h
index 2e24049246..7903cccffd 100644
--- a/driver/tcpm/tcpm.h
+++ b/driver/tcpm/tcpm.h
@@ -130,6 +130,20 @@ static inline void tcpc_discharge_vbus(int port, int enable)
tcpc_config[port].drv->tcpc_discharge_vbus(port, enable);
}
+#ifdef CONFIG_CMD_I2C_STRESS_TEST_TCPC
+static inline int tcpc_i2c_read(const int port, const int addr,
+ const int reg, int *data)
+{
+ return tcpc_read(port, reg, data);
+}
+
+static inline int tcpc_i2c_write(const int port, const int addr,
+ const int reg, int data)
+{
+ return tcpc_write(port, reg, data);
+}
+#endif
+
#else
/**