/* 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 "battery.h" #include "battery_smart.h" #include "board.h" #include "charge_manager.h" #include "charge_state.h" #include "chipset.h" #include "common.h" #include "console.h" #include "ec_commands.h" #include "gpio.h" #include "hooks.h" #include "host_command.h" #include "registers.h" #include "system.h" #include "task.h" #include "timer.h" #include "util.h" #include "usb_charge.h" #include "usb_mux.h" #include "usb_pd.h" #include "usb_prl_sm.h" #include "tcpm.h" #include "usb_pe_sm.h" #include "usb_prl_sm.h" #include "usb_sm.h" #include "usb_tc_sm.h" #include "version.h" /* Include USB Type-C State Machine Header File */ #if defined(CONFIG_USB_TYPEC_CTVPD) #include "usb_tc_ctvpd_sm.h" #elif defined(CONFIG_USB_TYPEC_VPD) #include "usb_tc_vpd_sm.h" #else #error "A USB Type-C State Machine must be defined." #endif #ifdef CONFIG_COMMON_RUNTIME #define CPRINTF(format, args...) cprintf(CC_USB, format, ## args) #define CPRINTS(format, args...) cprints(CC_USB, format, ## args) #else /* CONFIG_COMMON_RUNTIME */ #define CPRINTF(format, args...) #define CPRINTS(format, args...) #endif #ifdef CONFIG_COMMON_RUNTIME const char * const tc_state_names[] = { "Disabled", "Unattached.SNK", "AttachWait.SNK", "Attached.SNK", #if !defined(CONFIG_USB_TYPEC_VPD) "ErrorRecovery", "Unattached.SRC", "AttachWait.SRC", "Attached.SRC", #endif #if !defined(CONFIG_USB_TYPEC_CTVPD) && !defined(CONFIG_USB_TYPEC_VPD) "AudioAccessory", "OrientedDebugAccessory.SRC", "UnorientedDebugAccessory.SRC", "DebugAccessory.SNK", "Try.SRC", "TryWait.SNK", "CTUnattached.SNK", "CTAttached.SNK", #endif #if defined(CONFIG_USB_TYPEC_CTVPD) "CTTry.SNK", "CTAttached.Unsupported", "CTAttachWait.Unsupported", "CTUnattached.Unsupported", "CTUnattached.VPD", "CTAttachWait.VPD", "CTAttached.VPD", "CTDisabled.VPD", "Try.SNK", "TryWait.SRC" #endif }; BUILD_ASSERT(ARRAY_SIZE(tc_state_names) == TC_STATE_COUNT); #endif /* Public Functions */ int tc_get_power_role(int port) { return tc[port].power_role; } int tc_get_data_role(int port) { return tc[port].data_role; } void tc_set_timeout(int port, uint64_t timeout) { tc[port].evt_timeout = timeout; } enum typec_state_id get_typec_state_id(int port) { return tc[port].state_id; } /* * CC values for regular sources and Debug sources (aka DTS) * * Source type Mode of Operation CC1 CC2 * --------------------------------------------- * Regular Default USB Power RpUSB Open * Regular USB-C @ 1.5 A Rp1A5 Open * Regular USB-C @ 3 A Rp3A0 Open * DTS Default USB Power Rp3A0 Rp1A5 * DTS USB-C @ 1.5 A Rp1A5 RpUSB * DTS USB-C @ 3 A Rp3A0 RpUSB */ inline enum pd_cc_polarity_type get_snk_polarity(int cc1, int cc2) { /* the following assumes: * TYPEC_CC_VOLT_RP_3_0 > TYPEC_CC_VOLT_RP_1_5 * TYPEC_CC_VOLT_RP_1_5 > TYPEC_CC_VOLT_RP_DEF * TYPEC_CC_VOLT_RP_DEF > TYPEC_CC_VOLT_OPEN */ return (cc2 > cc1) ? POLARITY_CC2 : POLARITY_CC1; } int tc_restart_tcpc(int port) { return tcpm_init(port); } void set_polarity(int port, int polarity) { tcpm_set_polarity(port, polarity); #ifdef CONFIG_USBC_PPC_POLARITY ppc_set_polarity(port, polarity); #endif /* defined(CONFIG_USBC_PPC_POLARITY) */ } void pd_task(void *u) { int port = TASK_ID_TO_PD_PORT(task_get_current()); tc_state_init(port); while (1) { /* wait for next event/packet or timeout expiration */ tc[port].evt = task_wait_event(tc[port].evt_timeout); /* handle events that affect the state machine as a whole */ tc_event_check(port, tc[port].evt); #ifdef CONFIG_USB_PD_TCPC /* * run port controller task to check CC and/or read incoming * messages */ tcpc_run(port, tc[port].evt); #endif #ifdef CONFIG_USB_PE_SM /* run policy engine state machine */ policy_engine(port, tc[port].evt, tc[port].pd_enable); #endif /* CONFIG_USB_PE_SM */ #ifdef CONFIG_USB_PRL_SM /* run protocol state machine */ protocol_layer(port, tc[port].evt, tc[port].pd_enable); #endif /* CONFIG_USB_PRL_SM */ /* run state machine */ exe_state(port, TC_OBJ(port), RUN_SIG); } }