/* 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 "hooks.h" #include "registers.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; } static void baseboard_spi_init(void) { /* Set SPI PA15,PB3/4/5/13/14/15 pins to high speed */ STM32_GPIO_OSPEEDR(GPIO_A) |= 0xc0000000; STM32_GPIO_OSPEEDR(GPIO_B) |= 0xfc000fc0; } DECLARE_HOOK(HOOK_INIT, baseboard_spi_init, HOOK_PRIO_INIT_SPI + 1); int board_allow_i2c_passthru(int port) { return (port == I2C_PORT_VIRTUAL_BATTERY); }