summaryrefslogtreecommitdiff
path: root/chip/stm32/charger_detect.c
blob: b32b9f3ac0ab19c50950a62c5045561fe9cce51d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* 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;
}