121 lines
3.2 KiB
C
121 lines
3.2 KiB
C
|
/* Copyright 2019 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.
|
||
|
*/
|
||
|
|
||
|
#include "adc.h"
|
||
|
#include "adc_chip.h"
|
||
|
#include "gpio.h"
|
||
|
#include "timer.h"
|
||
|
|
||
|
#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args)
|
||
|
#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args)
|
||
|
|
||
|
void board_reset_pd_mcu(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void board_config_pre_init(void)
|
||
|
{
|
||
|
STM32_RCC_AHBENR |= STM32_RCC_HB_DMA1;
|
||
|
/*
|
||
|
* Remap USART1 and SPI2 DMA:
|
||
|
*
|
||
|
* Ch4: USART1_TX / Ch5: USART1_RX (1000)
|
||
|
* Ch6: SPI2_RX / Ch7: SPI2_TX (0011)
|
||
|
*/
|
||
|
STM32_DMA_CSELR(STM32_DMAC_CH4) = (8 << 12) | (8 << 16) |
|
||
|
(3 << 20) | (3 << 24);
|
||
|
}
|
||
|
|
||
|
enum kukui_board_version {
|
||
|
BOARD_VERSION_UNKNOWN = -1,
|
||
|
BOARD_VERSION_REV0 = 0,
|
||
|
BOARD_VERSION_REV1 = 1,
|
||
|
BOARD_VERSION_REV2 = 2,
|
||
|
BOARD_VERSION_REV3 = 3,
|
||
|
BOARD_VERSION_REV4 = 4,
|
||
|
BOARD_VERSION_REV5 = 5,
|
||
|
BOARD_VERSION_REV6 = 6,
|
||
|
BOARD_VERSION_REV7 = 7,
|
||
|
BOARD_VERSION_REV8 = 8,
|
||
|
BOARD_VERSION_REV9 = 9,
|
||
|
BOARD_VERSION_REV10 = 10,
|
||
|
BOARD_VERSION_REV11 = 11,
|
||
|
BOARD_VERSION_REV12 = 12,
|
||
|
BOARD_VERSION_REV13 = 13,
|
||
|
BOARD_VERSION_REV14 = 14,
|
||
|
BOARD_VERSION_REV15 = 15,
|
||
|
BOARD_VERSION_COUNT,
|
||
|
};
|
||
|
|
||
|
struct {
|
||
|
enum kukui_board_version version;
|
||
|
int expect_mv;
|
||
|
} const kukui_boards[] = {
|
||
|
{ BOARD_VERSION_REV0, 109 }, /* 51.1K , 2.2K(gru 3.3K) ohm */
|
||
|
{ BOARD_VERSION_REV1, 211 }, /* 51.1k , 6.8K ohm */
|
||
|
{ BOARD_VERSION_REV2, 319 }, /* 51.1K , 11K ohm */
|
||
|
{ BOARD_VERSION_REV3, 427 }, /* 56K , 17.4K ohm */
|
||
|
{ BOARD_VERSION_REV4, 542 }, /* 51.1K , 22K ohm */
|
||
|
{ BOARD_VERSION_REV5, 666 }, /* 51.1K , 30K ohm */
|
||
|
{ BOARD_VERSION_REV6, 781 }, /* 51.1K , 39.2K ohm */
|
||
|
{ BOARD_VERSION_REV7, 900 }, /* 56K , 56K ohm */
|
||
|
{ BOARD_VERSION_REV8, 1023 }, /* 47K , 61.9K ohm */
|
||
|
{ BOARD_VERSION_REV9, 1137 }, /* 47K , 80.6K ohm */
|
||
|
{ BOARD_VERSION_REV10, 1240 }, /* 56K , 124K ohm */
|
||
|
{ BOARD_VERSION_REV11, 1343 }, /* 51.1K , 150K ohm */
|
||
|
{ BOARD_VERSION_REV12, 1457 }, /* 47K , 200K ohm */
|
||
|
{ BOARD_VERSION_REV13, 1576 }, /* 47K , 330K ohm */
|
||
|
{ BOARD_VERSION_REV14, 1684 }, /* 47K , 680K ohm */
|
||
|
{ BOARD_VERSION_REV15, 1800 }, /* 56K , NC */
|
||
|
};
|
||
|
BUILD_ASSERT(ARRAY_SIZE(kukui_boards) == BOARD_VERSION_COUNT);
|
||
|
|
||
|
#define THRESHOLD_MV 56 /* Simply assume 1800/16/2 */
|
||
|
|
||
|
int board_get_version(void)
|
||
|
{
|
||
|
static int version = BOARD_VERSION_UNKNOWN;
|
||
|
int mv;
|
||
|
int i;
|
||
|
|
||
|
if (version != BOARD_VERSION_UNKNOWN)
|
||
|
return version;
|
||
|
|
||
|
gpio_set_level(GPIO_EC_BOARD_ID_EN_L, 0);
|
||
|
/* Wait to allow cap charge */
|
||
|
msleep(10);
|
||
|
mv = adc_read_channel(ADC_BOARD_ID);
|
||
|
|
||
|
if (mv == ADC_READ_ERROR)
|
||
|
mv = adc_read_channel(ADC_BOARD_ID);
|
||
|
|
||
|
gpio_set_level(GPIO_EC_BOARD_ID_EN_L, 1);
|
||
|
|
||
|
for (i = 0; i < BOARD_VERSION_COUNT; ++i) {
|
||
|
if (mv < kukui_boards[i].expect_mv + THRESHOLD_MV) {
|
||
|
version = kukui_boards[i].version;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* For devices without pogo, Disable ADC module after we detect the
|
||
|
* board version, since this is the only thing ADC module needs to do
|
||
|
* for this board.
|
||
|
*/
|
||
|
if (CONFIG_DEDICATED_CHARGE_PORT_COUNT == 0 &&
|
||
|
version != BOARD_VERSION_UNKNOWN)
|
||
|
adc_disable();
|
||
|
|
||
|
return version;
|
||
|
}
|
||
|
|
||
|
#ifndef VARIANT_KUKUI_BATTERY_SMART
|
||
|
int board_allow_i2c_passthru(int port)
|
||
|
{
|
||
|
return (port == I2C_PORT_VIRTUAL_BATTERY);
|
||
|
}
|
||
|
#endif
|