blob: b32b9f3ac0ab19c50950a62c5045561fe9cce51d [file] [log] [blame]
/* 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;
}