mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-30 18:41:11 +00:00
Merge "Initial bq24725 charger driver import"
This commit is contained in:
@@ -1,8 +1,13 @@
|
||||
# Copyright (c) 2012 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.
|
||||
#
|
||||
# Board specific files build
|
||||
#
|
||||
|
||||
# the IC is TI Stellaris LM4
|
||||
CHIP:=lm4
|
||||
|
||||
board-y=board.o
|
||||
board-$(CONFIG_CHARGER)+=dummy_charger.o
|
||||
board-$(CONFIG_TEMP_SENSOR)+=board_temp_sensor.o
|
||||
|
||||
@@ -3,16 +3,10 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
/* Charger/battery debug command module for Chrome EC */
|
||||
|
||||
/* TODO: remove this or merge into charger/battery modules
|
||||
* once charger and battery modules are ready.
|
||||
*/
|
||||
|
||||
#include "charger.h"
|
||||
#include "board.h"
|
||||
#include "i2c.h"
|
||||
#include "charger.h"
|
||||
#include "console.h"
|
||||
#include "i2c.h"
|
||||
#include "uart.h"
|
||||
#include "util.h"
|
||||
|
||||
@@ -22,6 +16,11 @@
|
||||
/* Address of battery */
|
||||
#define BATTERY_ADDR 0x16
|
||||
|
||||
int charger_init(void)
|
||||
{
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Console commands */
|
||||
|
||||
@@ -87,10 +86,3 @@ static int command_battery(int argc, char **argv)
|
||||
}
|
||||
DECLARE_CONSOLE_COMMAND(battery, command_battery);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Initialization */
|
||||
|
||||
int charger_init(void)
|
||||
{
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
@@ -58,6 +58,8 @@ enum adc_channel
|
||||
|
||||
/* Charger module */
|
||||
#define CONFIG_CHARGER_BQ24725
|
||||
#define CONFIG_BQ24725_R_SNS 10 /* 10 mOhm charge sense resistor */
|
||||
#define CONFIG_BQ24725_R_AC 20 /* 20 mOhm input current sense resistor */
|
||||
|
||||
/* I2C ports */
|
||||
#define I2C_PORT_BATTERY 0
|
||||
|
||||
@@ -16,4 +16,3 @@ chip-$(CONFIG_LPC)+=lpc.o
|
||||
chip-$(CONFIG_PWM)+=pwm.o
|
||||
chip-$(CONFIG_TEMP_SENSOR)+=chip_temp_sensor.o
|
||||
chip-$(CONFIG_TASK_KEYSCAN)+=keyboard_scan.o
|
||||
chip-$(CONFIG_CHARGER)+=charger.o
|
||||
|
||||
@@ -15,3 +15,6 @@ common-$(CONFIG_TASK_X86POWER)+=x86_power.o
|
||||
common-$(CONFIG_FLASH)+=flash_commands.o
|
||||
common-$(CONFIG_PWM)+=pwm_commands.o
|
||||
common-$(CONFIG_TEMP_SENSOR)+=temp_sensor.o temp_sensor_commands.o
|
||||
|
||||
# Board driver modules
|
||||
common-$(CONFIG_CHARGER_BQ24725)+=charger_bq24725.o
|
||||
|
||||
226
common/charger_bq24725.c
Normal file
226
common/charger_bq24725.c
Normal file
@@ -0,0 +1,226 @@
|
||||
/* Copyright (c) 2012 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.
|
||||
*
|
||||
* TI bq24725 battery charger driver.
|
||||
*/
|
||||
|
||||
#include "board.h"
|
||||
#include "charger.h"
|
||||
#include "charger_bq24725.h"
|
||||
#include "console.h"
|
||||
#include "common.h"
|
||||
#include "i2c.h"
|
||||
#include "smart_battery.h"
|
||||
#include "uart.h"
|
||||
#include "util.h"
|
||||
|
||||
/* Sense resistor configurations and macros */
|
||||
#define DEFAULT_SENSE_RESISTOR 10
|
||||
#define R_SNS CONFIG_BQ24725_R_SNS
|
||||
#define R_AC CONFIG_BQ24725_R_AC
|
||||
#define REG_TO_CURRENT(REG, RS) ((REG) * (RS) / DEFAULT_SENSE_RESISTOR)
|
||||
#define CURRENT_TO_REG(CUR, RS) ((CUR) * DEFAULT_SENSE_RESISTOR / (RS))
|
||||
|
||||
/* Charger infomation
|
||||
* charge voltage bitmask: 0111 1111 1111 0000
|
||||
* charge current bitmask: 0001 1111 1000 0000
|
||||
* input current bitmask : 0000 0000 1000 0000
|
||||
*/
|
||||
static const struct charger_info bq24725_charger_info = {
|
||||
.name = "bq24725",
|
||||
.voltage_max = 19200,
|
||||
.voltage_min = 1024,
|
||||
.voltage_step = 16,
|
||||
.current_max = REG_TO_CURRENT(8128, R_SNS),
|
||||
.current_min = REG_TO_CURRENT(128, R_SNS),
|
||||
.current_step = REG_TO_CURRENT(128, R_SNS),
|
||||
.input_current_max = REG_TO_CURRENT(8064, R_AC),
|
||||
.input_current_min = REG_TO_CURRENT(128, R_AC),
|
||||
.input_current_step = REG_TO_CURRENT(128, R_AC),
|
||||
};
|
||||
|
||||
/* bq24725 specific interfaces */
|
||||
|
||||
static int charger_set_input_current(int input_current)
|
||||
{
|
||||
return i2c_write16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
BQ24725_INPUT_CURRENT, CURRENT_TO_REG(input_current, R_AC));
|
||||
}
|
||||
|
||||
static int charger_get_input_current(int *input_current)
|
||||
{
|
||||
int rv;
|
||||
int reg;
|
||||
|
||||
rv = i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
BQ24725_INPUT_CURRENT, ®);
|
||||
if (rv)
|
||||
return rv;
|
||||
|
||||
*input_current = REG_TO_CURRENT(reg, R_AC);
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
static int charger_manufacturer_id(int *id)
|
||||
{
|
||||
return i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
BQ24725_MANUFACTURE_ID, id);
|
||||
}
|
||||
|
||||
static int charger_device_id(int *id)
|
||||
{
|
||||
return i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
BQ24725_DEVICE_ID, id);
|
||||
}
|
||||
|
||||
static int charger_get_option(int *option)
|
||||
{
|
||||
return i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
BQ24725_CHARGE_OPTION, option);
|
||||
}
|
||||
|
||||
static int charger_set_option(int option)
|
||||
{
|
||||
return i2c_write16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
BQ24725_CHARGE_OPTION, option);
|
||||
}
|
||||
|
||||
/* charger interfaces */
|
||||
const struct charger_info *charger_get_info(void)
|
||||
{
|
||||
return &bq24725_charger_info;
|
||||
}
|
||||
|
||||
int charger_get_status(int *status)
|
||||
{
|
||||
int rv;
|
||||
int option;
|
||||
|
||||
rv = charger_get_option(&option);
|
||||
if (rv)
|
||||
return rv;
|
||||
|
||||
/* Default status */
|
||||
*status = CHARGER_LEVEL_2;
|
||||
|
||||
if (option & OPTION_CHARGE_INHIBIT)
|
||||
*status |= CHARGER_CHARGE_INHIBITED;
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
int charger_set_mode(int mode)
|
||||
{
|
||||
int rv;
|
||||
int option;
|
||||
|
||||
rv = charger_get_option(&option);
|
||||
if (rv)
|
||||
return rv;
|
||||
|
||||
if (mode & CHARGE_FLAG_INHIBIT_CHARGE)
|
||||
option |= OPTION_CHARGE_INHIBIT;
|
||||
else
|
||||
option &= ~OPTION_CHARGE_INHIBIT;
|
||||
return charger_set_option(option);
|
||||
}
|
||||
|
||||
int charger_get_current(int *current)
|
||||
{
|
||||
int rv;
|
||||
int reg;
|
||||
|
||||
rv = i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
SB_CHARGING_CURRENT, ®);
|
||||
if (rv)
|
||||
return rv;
|
||||
|
||||
*current = REG_TO_CURRENT(reg, R_SNS);
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
int charger_set_current(int current)
|
||||
{
|
||||
return i2c_write16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
SB_CHARGING_CURRENT, CURRENT_TO_REG(current, R_SNS));
|
||||
}
|
||||
|
||||
int charger_get_voltage(int *voltage)
|
||||
{
|
||||
return i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
SB_CHARGING_VOLTAGE, voltage);
|
||||
}
|
||||
|
||||
int charger_set_voltage(int voltage)
|
||||
{
|
||||
return i2c_write16(I2C_PORT_CHARGER, CHARGER_ADDR,
|
||||
SB_CHARGING_VOLTAGE, voltage);
|
||||
}
|
||||
|
||||
/* Initialization */
|
||||
int charger_init(void)
|
||||
{
|
||||
/* bq24725 power on reset state:
|
||||
* charger watch dog timer = 175sec
|
||||
* charger input current limit = 4096 * 10 / RS_AC
|
||||
*/
|
||||
|
||||
return charger_set_input_current(4096);
|
||||
}
|
||||
|
||||
|
||||
/* Console commands */
|
||||
|
||||
static int command_charger(int argc, char **argv)
|
||||
{
|
||||
int rv;
|
||||
int d;
|
||||
const struct charger_info *info;
|
||||
|
||||
uart_puts("Reading battery properties : now (max, min, step)\n");
|
||||
|
||||
/* info */
|
||||
info = charger_get_info();
|
||||
uart_printf(" chip name : %s\n", info->name);
|
||||
|
||||
/* manufacturer id */
|
||||
rv = charger_manufacturer_id(&d);
|
||||
if (rv)
|
||||
return rv;
|
||||
uart_printf(" manufacturer id: 0x%04X\n");
|
||||
|
||||
/* device id */
|
||||
rv = charger_device_id(&d);
|
||||
if (rv)
|
||||
return rv;
|
||||
uart_printf(" device id : 0x%04X\n");
|
||||
|
||||
/* charge voltage limit */
|
||||
rv = charger_get_voltage(&d);
|
||||
if (rv)
|
||||
return rv;
|
||||
uart_printf(" voltage : %d (%d, %d, %d)\n", d,
|
||||
info->voltage_max, info->voltage_min, info->voltage_step);
|
||||
|
||||
/* charge current limit */
|
||||
rv = charger_get_current(&d);
|
||||
if (rv)
|
||||
return rv;
|
||||
uart_printf(" current : %d (%d, %d, %d)\n", d,
|
||||
info->current_max, info->current_min, info->current_step);
|
||||
|
||||
/* input current limit */
|
||||
rv = charger_get_input_current(&d);
|
||||
if (rv)
|
||||
return rv;
|
||||
|
||||
uart_printf(" input : %d (%d, %d, %d)\n", d,
|
||||
info->input_current_max, info->input_current_min,
|
||||
info->input_current_step);
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
DECLARE_CONSOLE_COMMAND(charger, command_charger);
|
||||
|
||||
53
common/charger_bq24725.h
Normal file
53
common/charger_bq24725.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/* Copyright (c) 2012 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.
|
||||
*
|
||||
* TI bq24725 battery charger driver.
|
||||
*/
|
||||
|
||||
#ifndef __CROS_EC_CHARGER_BQ24725_H
|
||||
#define __CROS_EC_CHARGER_BQ24725_H
|
||||
|
||||
/* I2C address */
|
||||
#define CHARGER_ADDR 0x12
|
||||
|
||||
/* Chip specific commands */
|
||||
#define BQ24725_CHARGE_OPTION 0x12
|
||||
#define BQ24725_INPUT_CURRENT 0x3f
|
||||
#define BQ24725_MANUFACTURE_ID 0xfe
|
||||
#define BQ24725_DEVICE_ID 0xff
|
||||
|
||||
/* ChargeOption 0x12 */
|
||||
#define OPTION_CHARGE_INHIBIT (1 << 0)
|
||||
#define OPTION_ACOC_THRESHOLD (3 << 1)
|
||||
#define OPTION_IOUT_SELECTION (1 << 5)
|
||||
#define OPTION_LEARN_ENABLE (1 << 6)
|
||||
#define OPTION_IFAULT_HI_THRESHOLD (3 << 7)
|
||||
#define OPTION_EMI_FREQ_ENABLE (1 << 9)
|
||||
#define OPTION_EMI_FREQ_ADJ (1 << 10)
|
||||
#define OPTION_BAT_DEPLETION_THRESHOLD (3 << 11)
|
||||
#define OPTION_WATCHDOG_TIMER (3 << 13)
|
||||
#define OPTION_AOC_DELITCH_TIME (1 << 15)
|
||||
/* OPTION_ACOC_THRESHOLD */
|
||||
#define ACOC_THRESHOLD_DISABLE (0 << 1)
|
||||
#define ACOC_THRESHOLD_133X (1 << 1)
|
||||
#define ACOC_THRESHOLD_166X_DEFAULT (2 << 1)
|
||||
#define ACOC_THRESHOLD_222X (3 << 1)
|
||||
/* OPTION_IFAULT_HI_THRESHOLD */
|
||||
#define IFAULT_THRESHOLD_300MV (0 << 7)
|
||||
#define IFAULT_THRESHOLD_500MV (1 << 7)
|
||||
#define IFAULT_THRESHOLD_700MV_DEFAULT (2 << 7)
|
||||
#define IFAULT_THRESHOLD_900MV (3 << 7)
|
||||
/* OPTION_BAT_DEPLETION_THRESHOLD */
|
||||
#define FALLING_THRESHOLD_5919 (0 << 11)
|
||||
#define FALLING_THRESHOLD_6265 (1 << 11)
|
||||
#define FALLING_THRESHOLD_6655 (2 << 11)
|
||||
#define FALLING_THRESHOLD_7097_DEFAULT (3 << 11)
|
||||
/* OPTION_WATCHDOG_TIMER */
|
||||
#define CHARGE_WATCHDOG_DISABLE (0 << 13)
|
||||
#define CHARGE_WATCHDOG_44SEC (1 << 13)
|
||||
#define CHARGE_WATCHDOG_88SEC (2 << 13)
|
||||
#define CHARGE_WATCHDOG_175SEC_DEFAULT (3 << 13)
|
||||
|
||||
#endif /* __CROS_EC_CHARGER_BQ24725_H */
|
||||
|
||||
58
common/smart_battery.h
Normal file
58
common/smart_battery.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/* Copyright (c) 2012 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.
|
||||
*
|
||||
* Smart battery charger 1.1
|
||||
*/
|
||||
#ifndef __CROS_EC_SMART_BATTERY_H
|
||||
#define __CROS_EC_SMART_BATTERY_H
|
||||
|
||||
/* Smart battery charger functions */
|
||||
#define SB_CHARGER_SPEC_INFO 0x11
|
||||
#define SB_CHARGE_MODE 0x12
|
||||
#define SB_CHARGER_STATUS 0x13
|
||||
#define SB_CHARGING_CURRENT 0x14
|
||||
#define SB_CHARGING_VOLTAGE 0x15
|
||||
#define SB_ALARM_WARNING 0x16
|
||||
|
||||
/* SB_ALARM_WARNING */
|
||||
#define ALARM_OVER_CHARGE 0x8000
|
||||
#define ALARM_TERMINATE_CHARG 0x4000
|
||||
#define ALARM_RESERVED_2000 0x2000
|
||||
#define ALARM_OVER_TEMP 0x1000
|
||||
#define ALARM_TERMINATE_DISCHARGE 0x0800
|
||||
#define ALARM_RESERVED_0400 0x0400
|
||||
#define ALARM_REMAINING_CAPACITY 0x0200
|
||||
#define ALARM_REMAINING_TIME 0x0100
|
||||
#define ALARM_STATUS_INITIALIZE 0x0080
|
||||
#define ALARM_STATUS_DISCHARGING 0x0040
|
||||
#define ALARM_STATUS_FULLY_CHARGED 0x0020
|
||||
#define ALARM_STATUS_FULLY_DISCHARG 0x0010
|
||||
/* SB_CHARGE_MODE */
|
||||
#define CHARGE_FLAG_INHIBIT_CHARGE (1 << 0)
|
||||
#define CHARGE_FLAG_ENABLE_POLLING (1 << 1)
|
||||
#define CHARGE_FLAG_POR_RESET (1 << 2)
|
||||
#define CHARGE_FLAG_RESET_TO_ZERO (1 << 3)
|
||||
/* SB_CHARGER_STATUS */
|
||||
#define CHARGER_CHARGE_INHIBITED (1 << 0)
|
||||
#define CHARGER_POLLING_ENABLED (1 << 1)
|
||||
#define CHARGER_VOLTAGE_NOTREG (1 << 2)
|
||||
#define CHARGER_CURRENT_NOTREG (1 << 3)
|
||||
#define CHARGER_LEVEL_2 (1 << 4)
|
||||
#define CHARGER_LEVEL_3 (1 << 5)
|
||||
#define CHARGER_CURRENT_OR (1 << 6)
|
||||
#define CHARGER_VOLTAGE_OR (1 << 7)
|
||||
#define CHARGER_RES_OR (1 << 8)
|
||||
#define CHARGER_RES_COLD (1 << 9)
|
||||
#define CHARGER_RES_HOT (1 << 10)
|
||||
#define CHARGER_RES_UR (1 << 11)
|
||||
#define CHARGER_ALARM_INHIBITED (1 << 12)
|
||||
#define CHARGER_POWER_FAIL (1 << 13)
|
||||
#define CHARGER_BATTERY_PRESENT (1 << 14)
|
||||
#define CHARGER_AC_PRESENT (1 << 15)
|
||||
/* SB_CHARGER_SPEC_INFO */
|
||||
#define INFO_CHARGER_SPEC(INFO) ((INFO) & 0xf)
|
||||
#define INFO_SELECTOR_SUPPORT(INFO) (((INFO) >> 4) & 1)
|
||||
|
||||
#endif /* __CROS_EC_SMART_BATTERY_H */
|
||||
|
||||
@@ -8,6 +8,50 @@
|
||||
#ifndef __CROS_EC_CHARGER_H
|
||||
#define __CROS_EC_CHARGER_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/* Charger infomation
|
||||
* voltage unit: mV
|
||||
* current unit: mA
|
||||
*/
|
||||
struct charger_info {
|
||||
const char *name;
|
||||
uint16_t voltage_max;
|
||||
uint16_t voltage_min;
|
||||
uint16_t voltage_step;
|
||||
uint16_t current_max;
|
||||
uint16_t current_min;
|
||||
uint16_t current_step;
|
||||
uint16_t input_current_max;
|
||||
uint16_t input_current_min;
|
||||
uint16_t input_current_step;
|
||||
};
|
||||
|
||||
/* Initializes the charger, with AC input on and battery
|
||||
* charging off. */
|
||||
int charger_init(void);
|
||||
|
||||
/* Get charger information. */
|
||||
const struct charger_info *charger_get_info(void);
|
||||
|
||||
/* Get smart battery charger status. Supported flags:
|
||||
* CHARGER_CHARGE_INHIBITED
|
||||
* CHARGER_LEVEL_2
|
||||
*/
|
||||
int charger_get_status(int *status);
|
||||
|
||||
/* Set smart battery charger mode. Supported mode(s):
|
||||
* CHARGER_FLAG_INHIBIT_CHARGE
|
||||
*/
|
||||
int charger_set_mode(int mode);
|
||||
|
||||
/* Get/set charge current limit in mA */
|
||||
int charger_get_current(int *current);
|
||||
int charger_set_current(int current);
|
||||
|
||||
/* Get/set charge voltage limit in mV */
|
||||
int charger_get_voltage(int *voltage);
|
||||
int charger_set_voltage(int voltage);
|
||||
|
||||
#endif /* __CROS_EC_CHARGER_H */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user