/* Copyright 2016 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. */ /* Detect what adapter is connected */ #include "charge_manager.h" #include "hooks.h" #include "registers.h" #include "timer.h" static void enable_usb(void) { /* Enable USB device clock. */ STM32_RCC_APB1ENR |= STM32_RCC_PB1_USB; } DECLARE_HOOK(HOOK_INIT, enable_usb, HOOK_PRIO_DEFAULT); static void disable_usb(void) { /* Disable USB device clock. */ STM32_RCC_APB1ENR &= ~STM32_RCC_PB1_USB; } DECLARE_HOOK(HOOK_SYSJUMP, disable_usb, HOOK_PRIO_DEFAULT); static uint16_t detect_type(uint16_t det_type) { STM32_USB_BCDR &= 0; usleep(1); STM32_USB_BCDR |= (STM32_USB_BCDR_BCDEN | det_type); usleep(1); STM32_USB_BCDR &= ~(STM32_USB_BCDR_BCDEN | det_type); return STM32_USB_BCDR; } int charger_detect_get_device_type(void) { uint16_t pdet_result; if (!(detect_type(STM32_USB_BCDR_DCDEN) & STM32_USB_BCDR_DCDET)) return CHARGE_SUPPLIER_PD; pdet_result = detect_type(STM32_USB_BCDR_PDEN); /* TODO: add support for detecting proprietary chargers. */ if (pdet_result & STM32_USB_BCDR_PDET) { if (detect_type(STM32_USB_BCDR_SDEN) & STM32_USB_BCDR_SDET) return CHARGE_SUPPLIER_BC12_DCP; else return CHARGE_SUPPLIER_BC12_CDP; } else if (pdet_result & STM32_USB_BCDR_PS2DET) return CHARGE_SUPPLIER_PROPRIETARY; else return CHARGE_SUPPLIER_BC12_SDP; }