summaryrefslogtreecommitdiff
path: root/board/chocodile_vpdmcu/vpd_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/chocodile_vpdmcu/vpd_api.c')
-rw-r--r--board/chocodile_vpdmcu/vpd_api.c531
1 files changed, 0 insertions, 531 deletions
diff --git a/board/chocodile_vpdmcu/vpd_api.c b/board/chocodile_vpdmcu/vpd_api.c
deleted file mode 100644
index cdd2d9776d..0000000000
--- a/board/chocodile_vpdmcu/vpd_api.c
+++ /dev/null
@@ -1,531 +0,0 @@
-/* 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 "gpio.h"
-#include "registers.h"
-#include "vpd_api.h"
-#include "driver/tcpm/tcpm.h"
-
-/*
- * Polarity based on 'DFP Perspective' (see table 4-10 USB Type-C Cable and
- * Connector Specification Release 1.3)
- *
- * CC1 CC2 STATE POSITION
- * ----------------------------------------
- * open open NC N/A
- * Rd open UFP attached 1
- * open Rd UFP attached 2
- * open Ra pwr cable no UFP N/A
- * Ra open pwr cable no UFP N/A
- * Rd Ra pwr cable & UFP 1
- * Ra Rd pwr cable & UFP 2
- * Rd Rd dbg accessory N/A
- * Ra Ra audio accessory N/A
- *
- * Note, V(Rd) > V(Ra)
- */
-#ifndef PD_SRC_RD_THRESHOLD
-#define PD_SRC_RD_THRESHOLD PD_SRC_DEF_RD_THRESH_MV
-#endif
-#ifndef PD_SRC_VNC
-#define PD_SRC_VNC PD_SRC_DEF_VNC_MV
-#endif
-
-#undef CC_RA
-#define CC_RA(cc, sel) (cc < pd_src_rd_threshold[sel])
-#undef CC_RD
-#define CC_RD(cc, sel) ((cc >= pd_src_rd_threshold[sel]) && (cc < PD_SRC_VNC))
-
-/* (15.8K / (100K + 15.8K)) * 1000 = 136.4 */
-#define VBUS_SCALE_FACTOR 136
-/* (118K / (100K + 118K)) * 1000 = 541.3 */
-#define VCONN_SCALE_FACTOR 541
-
-#define VBUS_DETECT_THRESHOLD 2500 /* mV */
-#define VCONN_DETECT_THRESHOLD 2500 /* mV */
-
-#define SCALE(vmeas, sfactor) (((vmeas) * 1000) / (sfactor))
-
-/*
- * Type C power source charge current limits are identified by their cc
- * voltage (set by selecting the proper Rd resistor). Any voltage below
- * TYPE_C_SRC_500_THRESHOLD will not be identified as a type C charger.
- */
-#define TYPE_C_SRC_DEFAULT_THRESHOLD 200 /* mV */
-#define TYPE_C_SRC_1500_THRESHOLD 660 /* mV */
-#define TYPE_C_SRC_3000_THRESHOLD 1230 /* mV */
-
-/* Charge-Through pull up/down enabled */
-static int ct_cc_pull;
-/* Charge-Through pull up value */
-static int ct_cc_rp_value;
-
-/* Charge-Through pull up/down enabled */
-static int host_cc_pull;
-/* Charge-Through pull up value */
-static int host_cc_rp_value;
-
-/* Voltage thresholds for Ra attach in normal SRC mode */
-static int pd_src_rd_threshold[TYPEC_RP_RESERVED] = {
- PD_SRC_DEF_RD_THRESH_MV,
- PD_SRC_1_5_RD_THRESH_MV,
- PD_SRC_3_0_RD_THRESH_MV,
-};
-
-/* Convert CC voltage to CC status */
-static int vpd_cc_voltage_to_status(int cc_volt, int cc_pull)
-{
- /* If we have a pull-up, then we are source, check for Rd. */
- if (cc_pull == TYPEC_CC_RP) {
- if (CC_RD(cc_volt, ct_cc_rp_value))
- return TYPEC_CC_RD;
- else if (CC_RA(cc_volt, ct_cc_rp_value))
- return TYPEC_CC_VOLT_RA;
- else
- return TYPEC_CC_VOLT_OPEN;
- /* If we have a pull-down, then we are sink, check for Rp. */
- } else if (cc_pull == TYPEC_CC_RD || cc_pull == TYPEC_CC_RA_RD) {
- if (cc_volt >= TYPE_C_SRC_3000_THRESHOLD)
- return TYPEC_CC_VOLT_RP_3_0;
- else if (cc_volt >= TYPE_C_SRC_1500_THRESHOLD)
- return TYPEC_CC_VOLT_RP_1_5;
- else if (cc_volt >= TYPE_C_SRC_DEFAULT_THRESHOLD)
- return TYPEC_CC_VOLT_RP_DEF;
- else
- return TYPEC_CC_VOLT_OPEN;
- } else {
- /* If we are open, then always return 0 */
- return 0;
- }
-}
-
-void vpd_ct_set_pull(int pull, int rp_value)
-{
- ct_cc_pull = pull;
-
- switch (pull) {
- case TYPEC_CC_RP:
- ct_cc_rp_value = rp_value;
- vpd_cc1_cc2_db_en_l(GPO_HIGH);
- switch (rp_value) {
- case TYPEC_RP_USB:
- vpd_config_cc1_rp3a0_rd_l(PIN_ADC, 0);
- vpd_config_cc2_rp3a0_rd_l(PIN_ADC, 0);
- vpd_config_cc1_rpusb_odh(PIN_GPO, 1);
- vpd_config_cc2_rpusb_odh(PIN_GPO, 1);
- break;
- case TYPEC_RP_3A0:
- vpd_config_cc1_rpusb_odh(PIN_ADC, 0);
- vpd_config_cc2_rpusb_odh(PIN_ADC, 0);
- vpd_config_cc1_rp3a0_rd_l(PIN_GPO, 1);
- vpd_config_cc2_rp3a0_rd_l(PIN_GPO, 1);
- break;
- }
- break;
- case TYPEC_CC_RD:
- vpd_config_cc1_rpusb_odh(PIN_ADC, 0);
- vpd_config_cc2_rpusb_odh(PIN_ADC, 0);
- vpd_config_cc1_rp3a0_rd_l(PIN_GPO, 0);
- vpd_config_cc2_rp3a0_rd_l(PIN_GPO, 0);
- vpd_cc1_cc2_db_en_l(GPO_HIGH);
- break;
- case TYPEC_CC_OPEN:
- vpd_cc1_cc2_db_en_l(GPO_HIGH);
- vpd_config_cc1_rpusb_odh(PIN_ADC, 0);
- vpd_config_cc2_rpusb_odh(PIN_ADC, 0);
- vpd_config_cc1_rp3a0_rd_l(PIN_ADC, 0);
- vpd_config_cc2_rp3a0_rd_l(PIN_ADC, 0);
- break;
- }
-}
-
-void vpd_ct_get_cc(int *cc1, int *cc2)
-{
- int cc1_v = 0;
- int cc2_v = 0;
-
- switch (ct_cc_pull) {
- case TYPEC_CC_RP:
- switch (ct_cc_rp_value) {
- case TYPEC_RP_USB:
- cc1_v = adc_read_channel(ADC_CC1_RP3A0_RD_L);
- cc2_v = adc_read_channel(ADC_CC2_RP3A0_RD_L);
- break;
- case TYPEC_RP_3A0:
- cc1_v = adc_read_channel(ADC_CC1_RPUSB_ODH);
- cc2_v = adc_read_channel(ADC_CC2_RPUSB_ODH);
- break;
- }
- break;
- case TYPEC_CC_RD:
- cc1_v = adc_read_channel(ADC_CC1_RPUSB_ODH);
- cc2_v = adc_read_channel(ADC_CC2_RPUSB_ODH);
- break;
- case TYPEC_CC_OPEN:
- *cc1 = 0;
- *cc2 = 0;
- return;
- }
-
- *cc1 = vpd_cc_voltage_to_status(cc1_v, ct_cc_pull);
- *cc2 = vpd_cc_voltage_to_status(cc2_v, ct_cc_pull);
-}
-
-void vpd_host_set_pull(int pull, int rp_value)
-{
- host_cc_pull = pull;
-
- switch (pull) {
- case TYPEC_CC_RP:
- vpd_cc_db_en_od(GPO_LOW);
- host_cc_rp_value = rp_value;
- switch (rp_value) {
- case TYPEC_RP_USB:
- vpd_config_cc_rp3a0_rd_l(PIN_CMP, 0);
- vpd_cc_rpusb_odh(GPO_HIGH);
- break;
- case TYPEC_RP_3A0:
- vpd_cc_rpusb_odh(GPO_HZ);
- vpd_config_cc_rp3a0_rd_l(PIN_GPO, 1);
- break;
- }
- break;
- case TYPEC_CC_RD:
- vpd_cc_rpusb_odh(GPO_HZ);
- vpd_cc_db_en_od(GPO_LOW);
- vpd_config_cc_rp3a0_rd_l(PIN_GPO, 0);
- break;
- case TYPEC_CC_RA_RD:
- vpd_cc_rpusb_odh(GPO_HZ);
- vpd_config_cc_rp3a0_rd_l(PIN_CMP, 0);
-
- /*
- * RA is connected to VCONN
- * RD is connected to CC
- */
- vpd_cc_db_en_od(GPO_HIGH);
- break;
- case TYPEC_CC_OPEN:
- vpd_cc_rpusb_odh(GPO_HZ);
- vpd_config_cc_rp3a0_rd_l(PIN_CMP, 0);
- vpd_cc_db_en_od(GPO_LOW);
- break;
- }
-}
-
-void vpd_host_get_cc(int *cc)
-{
- *cc = vpd_cc_voltage_to_status(
- adc_read_channel(ADC_CC_VPDMCU), host_cc_pull);
-}
-
-void vpd_rx_enable(int en)
-{
- tcpm_set_rx_enable(0, en);
-}
-
-/*
- * PA2: Configure as COMP2_INM6 or GPO
- */
-void vpd_config_cc_rp3a0_rd_l(enum vpd_pin cfg, int en)
-{
- if (cfg == PIN_GPO) {
- /* Set output value in register */
- gpio_set_level(GPIO_CC_RP3A0_RD_L, en ? 1 : 0);
-
- /* Disable Analog mode and Enable GPO */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- & ~(3 << (2*2))) /* PA2 disable ADC */
- | (1 << (2*2)); /* Set as GPO */
- } else {
- /* Set PA2 pin to ANALOG function */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- | (3 << (2*2))); /* PA2 in ANALOG mode */
-
- /* Set PA3 pin to ANALOG function */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- | (3 << (2*3))); /* PA3 in ANALOG mode */
-
- /* Disable Window Mode. Select PA3 */
- STM32_COMP_CSR &= ~STM32_COMP_WNDWEN;
-
- /* No output selection. We will use Interrupt */
- STM32_COMP_CSR &= ~STM32_COMP_CMP2OUTSEL_NONE;
-
- /* Not inverting */
- STM32_COMP_CSR &= ~STM32_COMP_CMP2POL;
-
- /* Select COMP2_INM6 (PA2) */
- STM32_COMP_CSR |= STM32_COMP_CMP2INSEL_INM6;
-
- /* COMP Enable */
- STM32_COMP_CSR |= STM32_COMP_CMP2EN;
- }
-}
-
-/*
- * PA4: Configure as ADC, CMP, or GPO
- */
-void vpd_config_cc1_rp3a0_rd_l(enum vpd_pin cfg, int en)
-{
- if (cfg == PIN_GPO) {
- /* Default high. Enable cc1 Rp3A0 pullup */
- gpio_set_level(GPIO_CC1_RP3A0_RD_L, en ? 1 : 0);
-
- /* Disable Analog mode and Enable GPO */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- & ~(3 << (2*4))) /* PA4 disable ADC */
- | (1 << (2*4)); /* Set as GPO */
- }
-
- if (cfg == PIN_ADC || cfg == PIN_CMP) {
- /* Disable COMP2 */
- STM32_COMP_CSR &= ~STM32_COMP_CMP2EN;
-
- /* Set PA4 pin to Analog mode */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- | (3 << (2*4))); /* PA4 in ANALOG mode */
-
- if (cfg == PIN_CMP) {
- /* Set PA3 pin to ANALOG function */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- | (3 << (2*3))); /* PA3 in ANALOG mode */
-
- /* Disable Window Mode. Select PA3*/
- STM32_COMP_CSR &= ~STM32_COMP_WNDWEN;
-
- /* No output selection. We will use Interrupt */
- STM32_COMP_CSR &= ~STM32_COMP_CMP2OUTSEL_NONE;
-
- /* Select COMP2_INM4 (PA4) */
- STM32_COMP_CSR |= STM32_COMP_CMP2INSEL_INM4;
-
- /* COMP2 Enable */
- STM32_COMP_CSR |= STM32_COMP_CMP2EN;
- }
- }
-}
-
-/*
- * PA5: Configure as ADC, COMP, or GPO
- */
-void vpd_config_cc2_rp3a0_rd_l(enum vpd_pin cfg, int en)
-{
- if (cfg == PIN_GPO) {
- /* Set output value in register */
- gpio_set_level(GPIO_CC2_RP3A0_RD_L, en ? 1 : 0);
-
- /* Disable Analog mode and Enable GPO */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- & ~(3 << (2*5))) /* PA5 disable ADC */
- | (1 << (2*5)); /* Set as GPO */
- }
-
- if (cfg == PIN_ADC || cfg == PIN_CMP) {
- /* Disable COMP2 */
- STM32_COMP_CSR &= ~STM32_COMP_CMP2EN;
-
- /* Set PA5 pin to ANALOG function */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- | (3 << (2*5))); /* PA5 in ANALOG mode */
-
- if (cfg == PIN_CMP) {
- /* Set PA3 pin to ANALOG function */
- STM32_GPIO_MODER(GPIO_A) = (STM32_GPIO_MODER(GPIO_A)
- | (3 << (2*3))); /* PA3 in ANALOG mode */
-
- /* Disable Window Mode. */
- STM32_COMP_CSR &= ~STM32_COMP_WNDWEN;
-
- /* No output selection. We will use Interrupt */
- STM32_COMP_CSR &= ~STM32_COMP_CMP2OUTSEL_NONE;
-
- /* Select COMP2_INM5 (PA5) */
- STM32_COMP_CSR |= STM32_COMP_CMP2INSEL_INM5;
-
- /* COMP2 Enable */
- STM32_COMP_CSR |= STM32_COMP_CMP2EN;
- }
- }
-}
-
-/*
- * PB0: Configure as ADC or GPO
- */
-void vpd_config_cc1_rpusb_odh(enum vpd_pin cfg, int en)
-{
- if (cfg == PIN_GPO) {
- /* Set output value in register */
- gpio_set_level(GPIO_CC1_RPUSB_ODH, en ? 1 : 0);
-
- /* Disable Analog mode and Enable GPO */
- STM32_GPIO_MODER(GPIO_B) = (STM32_GPIO_MODER(GPIO_B)
- & ~(3 << (2*0))) /* PB0 disable ADC */
- | (1 << (2*0)); /* Set as GPO */
- } else {
- /* Enable Analog mode */
- STM32_GPIO_MODER(GPIO_B) = (STM32_GPIO_MODER(GPIO_B)
- | (3 << (2*0))); /* PB0 in ANALOG mode */
- }
-}
-
-/*
- * PB1: Configure as ADC or GPO
- */
-void vpd_config_cc2_rpusb_odh(enum vpd_pin cfg, int en)
-{
- if (cfg == PIN_GPO) {
- /* Set output value in register */
- gpio_set_level(GPIO_CC2_RPUSB_ODH, en ? 1 : 0);
-
- /* Disable Analog mode and Enable GPO */
- STM32_GPIO_MODER(GPIO_B) = (STM32_GPIO_MODER(GPIO_B)
- & ~(3 << (2*1))) /* PB1 disable ADC */
- | (1 << (2*1)); /* Set as GPO */
- } else {
- /* Enable Analog mode */
- STM32_GPIO_MODER(GPIO_B) = (STM32_GPIO_MODER(GPIO_B)
- | (3 << (2*1))); /* PB1 in ANALOG mode */
- }
-}
-
-inline int vpd_read_cc_vpdmcu(void)
-{
- return adc_read_channel(ADC_CC_VPDMCU);
-}
-
-inline int vpd_read_host_vbus(void)
-{
- return SCALE(adc_read_channel(ADC_HOST_VBUS_VSENSE), VBUS_SCALE_FACTOR);
-}
-
-inline int vpd_read_ct_vbus(void)
-{
- return SCALE(adc_read_channel(ADC_CHARGE_VBUS_VSENSE),
- VBUS_SCALE_FACTOR);
-}
-
-inline int vpd_read_vconn(void)
-{
- return SCALE(adc_read_channel(ADC_VCONN_VSENSE), VCONN_SCALE_FACTOR);
-}
-
-inline int vpd_is_host_vbus_present(void)
-{
- return (vpd_read_host_vbus() >= VBUS_DETECT_THRESHOLD);
-}
-
-inline int vpd_is_ct_vbus_present(void)
-{
- return (vpd_read_ct_vbus() >= VBUS_DETECT_THRESHOLD);
-}
-
-inline int vpd_is_vconn_present(void)
-{
- return (vpd_read_vconn() >= VCONN_DETECT_THRESHOLD);
-}
-
-inline int vpd_read_rdconnect_ref(void)
-{
- return adc_read_channel(ADC_RDCONNECT_REF);
-}
-
-void vpd_red_led(int on)
-{
- gpio_set_level(GPIO_DEBUG_LED_R_L, (on) ? 0 : 1);
-}
-
-void vpd_green_led(int on)
-{
- gpio_set_level(GPIO_DEBUG_LED_G_L, (on) ? 0 : 1);
-}
-
-void vpd_vbus_pass_en(int en)
-{
- gpio_set_level(GPIO_VBUS_PASS_EN, (en) ? 1 : 0);
-}
-
-void vpd_present_billboard(enum vpd_billboard bb)
-{
- switch (bb) {
- case BB_NONE:
- gpio_set_level(GPIO_PRESENT_BILLBOARD, 0);
- gpio_set_flags(GPIO_PRESENT_BILLBOARD, GPIO_OUTPUT);
- break;
- case BB_SRC:
- gpio_set_flags(GPIO_PRESENT_BILLBOARD, GPIO_INPUT);
- /* Enable Pull-up on PA8 */
- STM32_GPIO_PUPDR(GPIO_A) |= (1 << (2 * 8));
- break;
- case BB_SNK:
- gpio_set_level(GPIO_PRESENT_BILLBOARD, 1);
- gpio_set_flags(GPIO_PRESENT_BILLBOARD, GPIO_OUTPUT);
- break;
- }
-}
-
-void vpd_mcu_cc_en(int en)
-{
- gpio_set_level(GPIO_VPDMCU_CC_EN, (en) ? 1 : 0);
-}
-
-void vpd_ct_cc_sel(enum vpd_cc sel)
-{
- switch (sel) {
- case CT_OPEN:
- gpio_set_level(GPIO_CC1_SEL, 0);
- gpio_set_level(GPIO_CC2_SEL, 0);
- break;
- case CT_CC1:
- gpio_set_level(GPIO_CC2_SEL, 0);
- gpio_set_level(GPIO_CC1_SEL, 1);
- break;
- case CT_CC2:
- gpio_set_level(GPIO_CC1_SEL, 0);
- gpio_set_level(GPIO_CC2_SEL, 1);
- break;
- }
-}
-
-/* Set as GPO High, GPO Low, or High-Z */
-void vpd_cc_db_en_od(enum vpd_gpo val)
-{
- if (val == GPO_HZ) {
- gpio_set_flags(GPIO_CC_DB_EN_OD, GPIO_INPUT);
- } else {
- if (val == GPO_HIGH)
- gpio_set_level(GPIO_CC_DB_EN_OD, 1);
- else
- gpio_set_level(GPIO_CC_DB_EN_OD, 0);
-
- gpio_set_flags(GPIO_CC_DB_EN_OD, GPIO_OUTPUT);
- }
-}
-
-void vpd_cc_rpusb_odh(enum vpd_gpo val)
-{
- if (val == GPO_HZ) {
- gpio_set_flags(GPIO_CC_RPUSB_ODH, GPIO_INPUT);
- } else {
- gpio_set_level(GPIO_CC_RPUSB_ODH, (val == GPO_HIGH) ? 1 : 0);
- gpio_set_flags(GPIO_CC_RPUSB_ODH, GPIO_OUTPUT);
- }
-}
-
-void vpd_cc1_cc2_db_en_l(enum vpd_gpo val)
-{
- if (val == GPO_HZ) {
- gpio_set_flags(GPIO_CC1_CC2_DB_EN_L, GPIO_INPUT);
- } else {
- gpio_set_level(GPIO_CC1_CC2_DB_EN_L, (val == GPO_HIGH) ? 1 : 0);
- gpio_set_flags(GPIO_CC1_CC2_DB_EN_L, GPIO_OUTPUT);
- }
-}
-
-void vpd_vconn_pwr_sel_odl(enum vpd_pwr en)
-{
- gpio_set_level(GPIO_VCONN_PWR_SEL_ODL, (en == PWR_VBUS) ? 1 : 0);
-}