diff options
author | Vijay Hiremath <vijay.p.hiremath@intel.com> | 2016-12-21 16:27:09 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-01-02 16:16:59 -0800 |
commit | 66ea614158975f7db9c0eeb141bb54c935a4ed61 (patch) | |
tree | 28e70e57d7ab806b0a6f17fbe040eb3482eca449 | |
parent | 18bb7c7971f4cb7c8d705f34ecd2797ce4e51023 (diff) | |
download | chrome-ec-66ea614158975f7db9c0eeb141bb54c935a4ed61.tar.gz |
smart_battery: Cleanup smart battery & SB users code
BUG=chrome-os-partner:61173
BRANCH=none
TEST=Manually tested on Reef. Battery info works.
Change-Id: I6e867eee38885186f8e63a934f52e826f0cf72fd
Signed-off-by: Vijay Hiremath <vijay.p.hiremath@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/422998
Commit-Ready: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Tested-by: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r-- | board/eve/battery.c | 20 | ||||
-rw-r--r-- | board/kevin/battery.c | 20 | ||||
-rw-r--r-- | board/pyro/battery.c | 21 | ||||
-rw-r--r-- | board/reef/battery.c | 21 | ||||
-rw-r--r-- | board/samus/battery.c | 20 | ||||
-rw-r--r-- | board/snappy/battery.c | 21 | ||||
-rw-r--r-- | driver/battery/smart.c | 68 | ||||
-rw-r--r-- | include/battery_smart.h | 6 |
8 files changed, 81 insertions, 116 deletions
diff --git a/board/eve/battery.c b/board/eve/battery.c index 1f953fe568..c9dca4abb0 100644 --- a/board/eve/battery.c +++ b/board/eve/battery.c @@ -66,16 +66,13 @@ enum battery_disconnect_state battery_get_disconnect_state(void) if (extpower_is_present()) { /* Check if battery charging + discharging is disabled. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, - PARAM_OPERATION_STATUS); + rv = sb_read_mfgacc(PARAM_OPERATION_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv) return BATTERY_DISCONNECT_ERROR; - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - - if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED | - BATTERY_CHARGING_DISABLED))) { + if (~data[3] & (BATTERY_DISCHARGING_DISABLED | + BATTERY_CHARGING_DISABLED)) { not_disconnected = 1; return BATTERY_NOT_DISCONNECTED; } @@ -84,13 +81,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) * Battery is neither charging nor discharging. Verify that * we didn't enter this state due to a safety fault. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS); - if (rv) - return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - + rv = sb_read_mfgacc(PARAM_SAFETY_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv || data[2] || data[3] || data[4] || data[5]) return BATTERY_DISCONNECT_ERROR; diff --git a/board/kevin/battery.c b/board/kevin/battery.c index c1b2e09c67..50df1d0258 100644 --- a/board/kevin/battery.c +++ b/board/kevin/battery.c @@ -80,15 +80,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void) if (extpower_is_present()) { /* Check if battery charging + discharging is disabled. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_OPERATION_STATUS); + rv = sb_read_mfgacc(PARAM_OPERATION_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv) return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - - if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED | - BATTERY_CHARGING_DISABLED))) { + if (~data[3] & (BATTERY_DISCHARGING_DISABLED | + BATTERY_CHARGING_DISABLED)) { not_disconnected = 1; return BATTERY_NOT_DISCONNECTED; } @@ -97,13 +94,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) * Battery is neither charging nor discharging. Verify that * we didn't enter this state due to a safety fault. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS); - if (rv) - return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - + rv = sb_read_mfgacc(PARAM_SAFETY_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv || data[2] || data[3] || data[4] || data[5]) return BATTERY_DISCONNECT_ERROR; diff --git a/board/pyro/battery.c b/board/pyro/battery.c index da5868af8a..a0c9244514 100644 --- a/board/pyro/battery.c +++ b/board/pyro/battery.c @@ -159,16 +159,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void) if (extpower_is_present()) { /* Check if battery charging + discharging is disabled. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, - PARAM_OPERATION_STATUS); + rv = sb_read_mfgacc(PARAM_OPERATION_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv) return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - - if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED | - BATTERY_CHARGING_DISABLED))) { + if (~data[3] & (BATTERY_DISCHARGING_DISABLED | + BATTERY_CHARGING_DISABLED)) { not_disconnected = 1; return BATTERY_NOT_DISCONNECTED; } @@ -177,13 +173,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) * Battery is neither charging nor discharging. Verify that * we didn't enter this state due to a safety fault. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS); - if (rv) - return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - + rv = sb_read_mfgacc(PARAM_SAFETY_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv || data[2] || data[3] || data[4] || data[5]) return BATTERY_DISCONNECT_ERROR; diff --git a/board/reef/battery.c b/board/reef/battery.c index 689d8cc147..8be335133a 100644 --- a/board/reef/battery.c +++ b/board/reef/battery.c @@ -371,16 +371,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void) if (extpower_is_present()) { /* Check if battery charging + discharging is disabled. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, - PARAM_OPERATION_STATUS); + rv = sb_read_mfgacc(PARAM_OPERATION_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv) return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - - if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED | - BATTERY_CHARGING_DISABLED))) { + if (~data[3] & (BATTERY_DISCHARGING_DISABLED | + BATTERY_CHARGING_DISABLED)) { not_disconnected = 1; return BATTERY_NOT_DISCONNECTED; } @@ -389,13 +385,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) * Battery is neither charging nor discharging. Verify that * we didn't enter this state due to a safety fault. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS); - if (rv) - return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - + rv = sb_read_mfgacc(PARAM_SAFETY_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv || data[2] || data[3] || data[4] || data[5]) return BATTERY_DISCONNECT_ERROR; diff --git a/board/samus/battery.c b/board/samus/battery.c index ad2c2723ea..64cf417ecc 100644 --- a/board/samus/battery.c +++ b/board/samus/battery.c @@ -250,15 +250,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void) if (extpower_is_present()) { /* Check if battery charging + discharging is disabled. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_OPERATION_STATUS); + rv = sb_read_mfgacc(PARAM_OPERATION_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv) return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - - if (rv || !(data[3] & BATTERY_DISCHARGING_DISABLED) || - !(data[3] & BATTERY_CHARGING_DISABLED)) { + if (~data[3] & (BATTERY_DISCHARGING_DISABLED | + BATTERY_CHARGING_DISABLED)) { not_disconnected = 1; return BATTERY_NOT_DISCONNECTED; } @@ -267,13 +264,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) * Battery is neither charging nor discharging. Verify that * we didn't enter this state due to a safety fault. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS); - if (rv) - return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - + rv = sb_read_mfgacc(PARAM_SAFETY_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv || data[2] || data[3] || data[4] || data[5]) return BATTERY_DISCONNECT_ERROR; else diff --git a/board/snappy/battery.c b/board/snappy/battery.c index 9884400264..4991c9cfeb 100644 --- a/board/snappy/battery.c +++ b/board/snappy/battery.c @@ -87,16 +87,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void) if (extpower_is_present()) { /* Check if battery charging + discharging is disabled. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, - PARAM_OPERATION_STATUS); + rv = sb_read_mfgacc(PARAM_OPERATION_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv) return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - - if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED | - BATTERY_CHARGING_DISABLED))) { + if (~data[3] & (BATTERY_DISCHARGING_DISABLED | + BATTERY_CHARGING_DISABLED)) { not_disconnected = 1; return BATTERY_NOT_DISCONNECTED; } @@ -105,13 +101,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) * Battery is neither charging nor discharging. Verify that * we didn't enter this state due to a safety fault. */ - rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS); - if (rv) - return BATTERY_DISCONNECT_ERROR; - - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_ALT_MANUFACTURER_ACCESS, data, 6); - + rv = sb_read_mfgacc(PARAM_SAFETY_STATUS, + SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); if (rv || data[2] || data[3] || data[4] || data[5]) return BATTERY_DISCONNECT_ERROR; diff --git a/driver/battery/smart.c b/driver/battery/smart.c index 81a74917a9..48177fd375 100644 --- a/driver/battery/smart.c +++ b/driver/battery/smart.c @@ -60,8 +60,7 @@ test_mockable int sb_write(int cmd, int param) #endif } -int sb_read_string(int port, int slave_addr, int offset, uint8_t *data, - int len) +int sb_read_string(int offset, uint8_t *data, int len) { #ifdef CONFIG_BATTERY_CUT_OFF /* @@ -71,12 +70,44 @@ int sb_read_string(int port, int slave_addr, int offset, uint8_t *data, return EC_RES_ACCESS_DENIED; #endif #ifdef CONFIG_SMBUS - return smbus_read_string(port, slave_addr, offset, data, len); + return smbus_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, + offset, data, len); #else - return i2c_read_string(port, slave_addr, offset, data, len); + return i2c_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, + offset, data, len); #endif } +int sb_read_mfgacc(int cmd, int block, uint8_t *data, int len) +{ + int rv; + + /* + * First two bytes returned from read are command sent hence read + * doesn't yield anything if the length is less than 3 bytes. + */ + if (len < 3) + return EC_ERROR_INVAL; + + /* Send manufacturer access command */ + rv = sb_write(SB_MANUFACTURER_ACCESS, cmd); + if (rv) + return rv; + + /* + * Read data on the register block. + * First two bytes returned are command sent, + * rest are actual data LSB to MSB. + */ + rv = sb_read_string(block, data, len); + if (rv) + return rv; + if ((data[0] | data[1] << 8) != cmd) + return EC_ERROR_UNKNOWN; + + return EC_SUCCESS; +} + int battery_get_mode(int *mode) { return sb_read(SB_BATTERY_MODE, mode); @@ -237,22 +268,19 @@ test_mockable int battery_manufacture_date(int *year, int *month, int *day) /* Read manufacturer name */ test_mockable int battery_manufacturer_name(char *dest, int size) { - return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_MANUFACTURER_NAME, dest, size); + return sb_read_string(SB_MANUFACTURER_NAME, dest, size); } /* Read device name */ test_mockable int battery_device_name(char *dest, int size) { - return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_DEVICE_NAME, dest, size); + return sb_read_string(SB_DEVICE_NAME, dest, size); } /* Read battery type/chemistry */ test_mockable int battery_device_chemistry(char *dest, int size) { - return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - SB_DEVICE_CHEMISTRY, dest, size); + return sb_read_string(SB_DEVICE_CHEMISTRY, dest, size); } void battery_get_params(struct batt_params *batt) @@ -411,27 +439,14 @@ static int command_batt_mfg_access_read(int argc, char **argv) if (argc > 3) { len = strtoi(argv[3], &e, 0); len += 2; - if (*e || len < 1 || len > sizeof(data)) + if (*e || len < 3 || len > sizeof(data)) return EC_ERROR_PARAM3; } - /* Send manufacturer access command */ - rv = sb_write(SB_MANUFACTURER_ACCESS, cmd); + rv = sb_read_mfgacc(cmd, block, data, len); if (rv) return rv; - /* - * Read data on the register block. - * First two bytes returned are command sent, - * rest are actual data LSB to MSB. - */ - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, - block, data, len); - if (rv) - return rv; - if (data[0] != (cmd & 0xff) || data[1] != (cmd >> 8 & 0xff)) - return EC_ERROR_UNKNOWN; - ccprintf("data[MSB->LSB]=0x"); do { len--; @@ -500,8 +515,7 @@ static int host_command_sb_read_block(struct host_cmd_handler_args *args) (p->reg != SB_DEVICE_CHEMISTRY) && (p->reg != SB_MANUFACTURER_DATA)) return EC_RES_INVALID_PARAM; - rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, p->reg, - r->data, 32); + rv = sb_read_string(p->reg, r->data, 32); if (rv) return EC_RES_ERROR; diff --git a/include/battery_smart.h b/include/battery_smart.h index 94b291b4d9..3f3ee869fd 100644 --- a/include/battery_smart.h +++ b/include/battery_smart.h @@ -141,11 +141,13 @@ int sb_read(int cmd, int *param); /* Read sequence from battery */ -int sb_read_string(int port, int slave_addr, int offset, uint8_t *data, - int len); +int sb_read_string(int offset, uint8_t *data, int len); /* Write to battery */ int sb_write(int cmd, int param); +/* Read manufactures access data from the battery */ +int sb_read_mfgacc(int cmd, int block, uint8_t *data, int len); + #endif /* __CROS_EC_BATTERY_SMART_H */ |