1 BC1.2
1.1 Port Detection for Power Banks
doc no: SLVA770
http://www.ti.com.cn/cn/lit/an/slva770/slva770.pdf

USB充电及其线损补偿
https://zhuanlan.zhihu.com/p/25588452

-Microchip UCS1002
智能USB充电系统设计
https://wenku.baidu.com/view/1d9a9cbc8762caaedd33d449.html

2 Type-C
2.1 Electric Parameters
Rd:5.1kΩ
Ra:1.0kΩ
Rfrswap:5Ω,for PD 3.0 FR_Swap
fBitRate:300Kbps
Rp:Reference to the Table 2-1

Table 2-1 USB Type-C pull-up resistors

BC1.2 and Type-C/PD How-to

2.2 DELL USB PD
DELL笔记本USB PD充电适配器Type-C金属头外壳对地有一只1KΩ的电阻。

3 USB PD
3.1 Four PDOs
Fixed Supply:CV(恒压)
Battery Supply:CP(恒功率)
Variable Supply:CC(恒流)
Augmented Programmale Power Supply:PPS(APDO)

APDO:Reference to 'Table 6-22 Programmable Request Data Object';电压步长20mV,电流步长50mA。
譬如请求6V @ 2A,那么Request消息的B19…9的值为300,而B6…0的值为40。
PPS模式时,需要Sink每隔10secs发送一个Request到Src,重新协商PPS电压电流对。

APDO包格式如Figure 3-1所示:
                                                Figure 3-1 APDO包格式
BC1.2 and Type-C/PD How-to

3.1.1 iPhone 8/8 Plus/X PD相关
Figure 3-2 iPhone 8 USB PD兼容性测试(CYPD2104 & BQ25890)

BC1.2 and Type-C/PD How-to

iPhone X整体PD快充的电源管理策略如下:
1.关机状态下不进行PD沟通,APPLE 2.4A协议生效。非APPLE 2.4A协议开机会慢一点;
2.开机后进行PD协商,依然选取PDO2,前面50%会以较高功率充电(最大不超过15W且视温度及电量自动调控功率);
3.充至50%-55%左右会降至9-11W(视温度及电量自动调控功率);
4.当温度达到一定时,iPhone X会强制降至极低的功率。待手机温度下降后以5W的功率进行后续充电;
5.充电至80%左右,选取PDO1降至5V。请注意此时依然是PD充电,只是选了5V档位减低手机端压降损耗;
6.充电至88%左右,开始进入CV段直到充满。

3.2 USB PD timers and counters
Reference to 'Table 6-53 Time Values' and 'Table 6-54 Timers' of '6.6.19 Time Values and Timers' 。

C Style Definitions:
#define PD_T_NO_RESPONSE    5000    /* 4.5 - 5.5 seconds */
#define PD_T_DB_DETECT      10000   /* 10 - 15 seconds */
#define PD_T_SEND_SOURCE_CAP    150 /* 100 - 200 ms */
#define PD_T_SENDER_RESPONSE    60  /* 24 - 30 ms, relaxed */
#define PD_T_SOURCE_ACTIVITY    45
#define PD_T_SINK_ACTIVITY  135
#define PD_T_SINK_WAIT_CAP  240
#define PD_T_PS_TRANSITION  500
#define PD_T_SRC_TRANSITION 35
#define PD_T_DRP_SNK        40
#define PD_T_DRP_SRC        30
#define PD_T_PS_SOURCE_OFF  920
#define PD_T_PS_SOURCE_ON   480
#define PD_T_PS_HARD_RESET  30
#define PD_T_SRC_RECOVER    760
#define PD_T_SRC_RECOVER_MAX    1000
#define PD_T_SRC_TURN_ON    275
#define PD_T_SAFE_0V        650
#define PD_T_VCONN_SOURCE_ON    100
#define PD_T_SINK_REQUEST   100 /* 100 ms minimum */
#define PD_T_ERROR_RECOVERY 100 /* minimum 25 is insufficient */

#define PD_T_DRP_TRY        100 /* 75 - 150 ms */
#define PD_T_DRP_TRYWAIT    600 /* 400 - 800 ms */

#define PD_T_CC_DEBOUNCE    200 /* 100 - 200 ms */
#define PD_T_PD_DEBOUNCE    20  /* 10 - 20 ms */

#define PD_N_CAPS_COUNT     (PD_T_NO_RESPONSE / PD_T_SEND_SOURCE_CAP)
#define PD_N_HARD_RESET_COUNT   2

3.3 PD SNK RDY状态时,如果SNK需要改变充电电压电流该怎么办?
Reference to USB_PD_R2_0 V1.3 ‘p358, 8.3.2.8.4.1 Sink Gets Source Capabilities’
接着双方重新协商发送消息对,如下所示:
- Get_Source_Cap
- Request(Request对象索引Object Position从1开始,而且该索引位置必定是5V Fixed PDO)
- Accept
- PS_RDY

PR_Swap时,PD双方的Rp和Rd也要交换,其他message不依赖Rp和Rd。

3.4 PD IC介绍
3.4.1 X-CUBE-USB-PD
https://github.com/st-one/X-CUBE-USB-PD

3.4.1.1 STM32软件实施USB PD协议
TX:使用SPI MOSI当作TX,RX悬空不使用,同时将SPI CLK连接到TIMER作为定时用
RX:TIMER输入捕获模式并用DMA接收数据

MISO(DAT0):mi s əu
MOSI(CMD):m əu si

3.4.1.2 URLs
STM32输入捕获模式设置并用DMA接收数据
https://blog.csdn.net/jdh99/article/details/23224041

3.4.2 FUSB30X
Registers.Control.TOGGLE
Registers.Status.I_HARDRST
void autoVdmDiscovery(void)

3.5 SDM630/SDM660 Chgr Type Det Flow
3.5.1 CC线和VBUS中断的先后顺序是什么
USB-C to USB-A:
如果手机采用USB-C,而充电头或者PC采用标准的A口,此时假如PMIC as UFP,那么CC线的中断几乎和VBUS中断是同时的,原因是legacy cable的标准A头的做法是将一根CC线通过一个上拉电阻Rp接到VBUS上的。

USB-C to USB-C:
- 手机采用这种模式,只是在VBUS中断之前首先是CC线的探测,这个是跟BC 1.2最大的不同,传统的micro USB cable插上去后,直接就探测ID和VBUS;当用户插入一根USB-C to USB-C的cable,Type-C控制器处理CC线探测,CC线产生中断后:
- 如果PMIC as UFP,那么紧接着会有VBUS中断,然后就是APSD (BC1.2)、USB PD(包括QC4 PPS)、QC3 & QC2上场了;
- 如果PMIC as DFP,那么一般PMIC会将该状态转换成传统的micro USB ID中断,然后USB OTG驱动代码处理ID中断,或者通过extcon直接通知USB OTG驱动。

3.5.2 SDM630/SDM660的充电器探测流程是什么
- PMIC首先做CC线探测,如果探测到PMIC as UFP,PMIC与此同时再探测CC线是否与VBUS短接,如果VBUS和CC短接,说明插入的是legacy cable(一般指USB-A to USB-C的cable),这个时候直接禁止USB PD和QC(由于CC和VBUS短接,大电流充电会导致电流灌到CC线而可能烧毁PMIC,所以代码默认是禁止QC的);
- 上一步成立的情况下(也就是PMIC as UFP)接着做APSD探测,这里充电器类型探测结果有如下2种状况:
1)如果探测到充电器类型是DCP,接着做USB PD(包括QC4 PPS)探测,假如不支持USB PD,接着rerun_apsd()做QC3 & QC2探测,倘若QC3 & QC2探测失败,说明该电源适配器既不支持USB PD (包括QC4 PPS) 也不支持QC3 & QC2,维持在DCP正常充电状态;
2)如果充电器类型不是DCP,直接做USB PD探测。

3.5.3 驱动软件代码分别在什么地方?
高通Type-C、APSD(BC1.2)和QC的驱动代码在drivers/power下;而USB PD的代码在drivers/usb/pd下面,所以你如果把drivers/usb/pd下的代码通过Makefile屏蔽掉,发现Type-C、APSD(BC1.2)和QC3 & QC2充电器还是可以工作的;而此时用USB线连接手机和PC,会发现USB不枚举,原因是extcon的代码是集成在drivers/usb/pd下的,所以如果你既要禁止USB PD,又要让USB可以枚举,那么需要把drivers/usb/pd下的extcon代码移植到drivers/power下面。

3.5.4 PD消息收发何时触发中断
中断机制是Interrupt on GoodCRC(IoG),如Figure 3-3所示。
                                                                   Figure 3-3 USB PD中断产生

BC1.2 and Type-C/PD How-to

3.5.5 简要说明充电器类型是DCP时探测流程的代码逻辑
以下是用户外接一个电源适配器到手机后,Type-C、APSD(BC1.2)、USB PD (包括QC4 PPS) 和QC3 & QC2的代码工作流程。

一个投票箱有多个投票client,并且对这些client制定规则。
Table 3-1 Ballot Box Rules

BC1.2 and Type-C/PD How-to

Table 3-2 USB-PD Ballot Box

BC1.2 and Type-C/PD How-to

[1] Disable USB PD negotiation by default when the Type-C cable is removed
@smb-lib.c
static void smblib_handle_typec_removal(struct smb_charger *chg)
{
    vote(chg->pd_disallowed_votable_indirect, CC_DETACHED_VOTER, true, 0);
    vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER, true, 0);
    vote(chg->pd_disallowed_votable_indirect, LEGACY_CABLE_VOTER, true, 0);
    vote(chg->pd_disallowed_votable_indirect, VBUS_CC_SHORT_VOTER, true, 0);
    [...]
}

[2] Enable USB PD (including QC4 PPS) negotiation when the Type-C cable is inserted and charger type is DCP detection timeout
@smb-lib.c
static void smblib_handle_hvdcp_check_timeout(struct smb_charger *chg,
bool rising, bool qc_charger)
{
    /* Hold off PD only until hvdcp 2.0 detection timeout */
    if (rising) {
        vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER, false,
                                                  0);
        [...]
    }
    [...]
}

[3] PD(including QC4 PPS)negotiation works now, the detection falls back to QC3 & QC2 when USB PD detection failed
@smb-lib.c
int smblib_get_prop_pd_allowed(struct smb_charger *chg,
union power_supply_propval *val)
{
    val->intval = get_effective_result(chg->pd_allowed_votable);
    return 0;
}

@smb-lib.c
int smblib_get_pe_start(struct smb_charger *chg,
union power_supply_propval *val)
{
    /*
    * hvdcp timeout voter is the last one to allow pd. Use its vote
    * to indicate start of pe engine
    */
    val->intval
        = !get_client_vote_locked(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER);
    return 0;
}

@policy_engine.c
static int psy_changed(struct notifier_block *nb, unsigned long evt, void *ptr)
{
    [...]
    ret = power_supply_get_property(pd->usb_psy,
                   POWER_SUPPLY_PROP_PE_START, &val);
    [...]
    /* Don't proceed if PE_START=0 as other props may still change */
    if (!val.intval && !pd->pd_connected &&
                   typec_mode != POWER_SUPPLY_TYPEC_NONE)
    return 0;
    [...]
}

3.5.6 USB PD PDO协商流程
Type-C SS MUX切换时间:
- 识别到Rp或者Rd连接的时候
- VDM消息进入特定模式时

Figure 3-4 USB PD Message Sequence

BC1.2 and Type-C/PD How-to

Figure 3-5 QC4+充电器

BC1.2 and Type-C/PD How-to

3.5.7 FR_Swap Message Sequence
1)Source(Hub)shorts Rp to ground for ~100 us to signal Sink that is needs to supply power immediately.
2)Sink(Mobile Device)supplies 5V.
3)Rp/Rd are not changed at this stage as in a normal PR_Swap.
4)Mobile device then sends an FR_Swap message to resynchronize the power system.
5)Mobile device renegotiates the power contract as needed.

3.5.8 Cable Category
USB-C公头 -> 标准A 公头(现在最普遍的一种线缆)
USB-C公头 -> 标准A母口(OTG,插U盘用)
USB-C公头 -> micro USB母口(兼容只有micro USB和标准A接口的移动电源)
micro USB 公头 -> USB-C母口(手机只有micro USB母口,而移动电源只有USB-C和标准A,所以需要转接)

3.6 PD Charging-Through
TODO

4 Alternative Mode
4.1 DisplayPort
拆解报告:华为高清投屏连接线(CP76)
http://www.chongdiantou.com/wp/archives/27141.html

4.2 VirtualLink
Figure 4-1 VirtualLink Pin Description

BC1.2 and Type-C/PD How-to

TODO

5 SMPS
5.1 术语
DSCG:Discharge,VBUS下拉放电电阻
flyback:反激
forward:正激
LISN:Line Impedance Stabilization Network
SMPS:Switching Mode Power Supplies,开关电源的变压器在整流桥之后,其它电源的变压器是在整流桥之前。220V交流电全桥整流输出的是脉动直流电,电压是0.9倍输入电压也就是200V左右,如果输出加上大电容滤波蓄能,输出电压是1.41倍输入电压,差不多就是310V。整流之后送到开关电源的PWM调整管,再通过变压器变压
TDI:TransDimension Inc.
Y电容:安规电容,成对出现,连接Line-GND和NULL-GND端
电子镇流器:镇住日光灯的电流;电感镇流器是依靠“电感中的电流不能突变”的特性,“镇”住灯管中气体击穿时的大电流,使电流稳定在规定值

5.2 普通稳压电源和开关电源的区别
普通稳压电源 - 利用变压器降压再整流的串联型稳压,由采样电路去控制电源调整管的导通电流来改变电源内阻,从而使输出电压稳定。串联型稳压电源的效率小于50%。

开关电源 - 直接整流,获得高压直流,由高频震荡器控制开关管的通断的时间比例来调整输出电压。开关型电源电路有串联型和并联型两种,开关型稳压电源的优点是效率高,因为开关状态下的晶体管自身消耗的功率很小,可以达到70-80%甚至更高的效率,而且不用降压变压器,其输出变压器由于是工作在高频,其体积远小于50赫的工频变压器。所以开关型电源的电路小巧轻便。开关型电源可以在较大的电压范围正常工作。

开关电源工作流程:
整流桥 - 开关管(次级侧USB PD芯片控制初级侧PWM芯片,初级侧PWM芯片输出PWM脉冲控制开关管)- 脉冲变压器 - 同步整流管 - DC输出

5.3 整流桥用二极管
1N4007是一种常用的整流二极管,常用于桥式整流电路。因为二极管是一个PN结组成,所以开头是1N也就是一个PN结,1N开头的都是二极管,2N开头的就是三极管。4007就是管子的型号。

参数如下:
较强的正向浪涌承受能力:30A
最大正向平均整流电流:1.0A
极限参数为VRM ≥ 50V
最高反向耐压:1000V

5.4 变压器初次级线圈匝数比和开关管占空比计算

6 URLs
https://www.chromium.org/chromium-os/ec-development

LDR6022 USB Type-C PD Controller
http://www.legendary.net.cn/html/downloads/LDR6022_Spec_EN_V1.4.pdf

[PATCH v3 4/5] typec: tcpm: Move out of staging
https://lists.gt.net/linux/kernel/2784206?search_string=usb%20pd;#2784206

新冰雹USB-C to lightning iPhonex/8/8 plus快充数据线拆解
http://www.chongdiantou.com/wp/archives/22042.html

7 Abbreviations
ARC:Argonant RISC Core
CCG2:Type-C Controller Generation 2
CCGP:USB Common Class Generic Parent,Linux内核类似的驱动就是usb_generic_driver
DWC2:Design Ware Controller 2,Apple的嵌入式设备,包括iPad和iPhone都是使用的DWC2
giveback:归还 - ehci_urb_done() -> usb_hcd_giveback_urb()。USB PD中的giveback(= 1)指sink会响应source的GotoMin请求,返还部分电力给source。
GRL:Granite River Labs ,美国工程测试认证实验室
halt:停车或者站住,来自于德语;USB endpoint停止运行,返回stall handshake。recovery方法:control ep接收下一次SETUP PID时,自动清除halt标志;其它ep使用clear_feature复位ep halt。
HX3C:USB Type-C Hub with PD
MPS:Monolithic Power Systems,美国公司
PTN5100:Part Number
RS507L:ASEMI整流桥RS507L,4pin接口;用途有LED,手机充电器整流
TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci)
USB PD:USB 电源交付
USB PDT:USB PD Test Instrument

state和status的区别:state所指的状态,一般都是有限的、可列举的,status则是不可确定的
比如:
readyState-- 就那么四五种值
statusText-- 描述性的文字,可以任意

相关文章: