USB TCPM(Type-C Port Manager)的主要作用是管理 USB Type-C 端口的连接和电源传输协议(USB Power Delivery, PD),确保设备正确识别、协商和切换数据传输和电源供应的角色。TCPM 在 USB Type-C 连接中起到关键管理作用,主要职责包括:

  1. 管理 USB Type-C 插拔检测:检测设备的插入和拔出事件,识别连接器的方向(翻转)和线缆类型,并做出相应的配置调整。

  2. 协商电力传输:与 USB PD 控制器(如 TCPC)配合,通过 PD 协议与对端设备协商电力供应,确定电压和电流等级,并动态调整电力配置以匹配设备的需求。

  3. 角色管理:决定设备在 USB 连接中的角色(主机或设备、供电方或受电方),并根据连接情况和协议协商结果,动态切换这些角色。

  4. 配合 PD 控制器(TCPC):TCPM 通常与 TCPC(Type-C Port Controller)协同工作。TCPC 是具体实现 PD 协议硬件通信的控制器,而 TCPM 作为软件部分,负责控制 TCPC 和处理高层的协议逻辑。

  5. 安全和错误处理:监控连接状态,处理异常情况(如过流、短路、异常拔插),确保连接的安全性和稳定性。

通过 TCPM 的管理,可以实现 USB Type-C 设备之间的智能互操作,确保数据传输和电力传输的安全、灵活和高效。

tcpm的工作细节

在我们平时工作中adb使用typec口,来进行调试是常有的事情,那么在typec插上的一瞬间是就是通过tcpm来建立最初的联系,然后通知到dwc3和gadget来进行交互的,后面的工作就完全交给dwc3那边进行处理。

可以从/sys/kernel/debug/usb/tcpm-xxx下,抓取一份tcpm的log,这里抓取了一份RK平台,从开机到adb数据线设备插拔的过程log,来分析整个数据流程:

	1. 一些重要参数的初始化值
port->port_type = TYPEC_PORT_DRP
port->prefer_role = TYPEC_SINK
port->data_role = TYPEC_DEVICE;
port->pwr_role = TYPEC_SINK;
port->try_role = TYPEC_SINK; port->state = SNK_UNATTACHED
port->vbus_never_low = false
port->pd_capable = false
tcpm_rp_cc(port) = TYPEC_CC_RP_3_0 2. 一些重要参数的变动
port->vbus_present = false -> _tcpm_pd_vbus_on() -> ture
port->vbus_vsafe0v = true -> _tcpm_pd_vbus_on() -> false 3. 状态机转变state的整个调用流程
tcpm_set_state -> kthread_queue_work(port->wq, &port->state_machine)
--> tcpm_state_machine_work -> run_state_machine 4. 抓取到的整个数据流程包含tcpm初始化,插入/拔出adb数据线
rk3568_s:/sys/kernel/debug/usb/tcpm-0-004e # cat log
// 开机时启动后,初始阶段的log
[ 3.169614] init extcon finished
[ 3.173249] Setting usb_comm capable false
[ 3.174716] Setting voltage/current limit 0 mV 0 mA
[ 3.174728] polarity 0
[ 3.176800] Requesting mux state 0, usb-role 0, orientation 0
[ 3.178567] state change INVALID_STATE -> SNK_UNATTACHED [rev1 NONE_AMS]
[ 3.179503] CC1: 0 -> 0, CC2: 0 -> 0 [state SNK_UNATTACHED, polarity 0, disconnected]
[ 3.179510] state change SNK_UNATTACHED -> PORT_RESET [rev1 NONE_AMS]
[ 3.179520] 0-004e: registered
[ 3.179530] Setting usb_comm capable false
[ 3.181007] Setting voltage/current limit 0 mV 0 mA
[ 3.181023] polarity 0
[ 3.183097] Requesting mux state 0, usb-role 0, orientation 0
[ 3.184351] cc:=0
[ 3.185144] pending state change PORT_RESET -> PORT_RESET_WAIT_OFF @ 100 ms [rev1 NONE_AMS]
[ 3.185154] state change PORT_RESET -> PORT_RESET_WAIT_OFF [delayed 100 ms]
[ 3.185159] state change PORT_RESET_WAIT_OFF -> SNK_UNATTACHED [rev1 NONE_AMS]
[ 3.185163] Start toggling
[ 3.185831] state change SNK_UNATTACHED -> TOGGLING [rev1 NONE_AMS] //插入typec后,tcpm的log,其中"======>" 这种箭头的打印是我本人加的
[ 53.680304][ T152] =================> tcpci_irq -> status[0x02]
[ 53.681360] VBUS on
[ 53.705497][ T152] =================> tcpci_irq -> status[0x01]
[ 53.706613] CC1: 0 -> 3, CC2: 0 -> 0 [state TOGGLING, polarity 0, connected]
[ 53.706627] state change TOGGLING -> SNK_ATTACH_WAIT [rev1 NONE_AMS]
[ 53.706644] pending state change SNK_ATTACH_WAIT -> SNK_DEBOUNCED @ 200 ms [rev1 NONE_AMS]
[ 53.906677] state change SNK_ATTACH_WAIT -> SNK_DEBOUNCED [delayed 200 ms]
[ 53.906691] state change SNK_DEBOUNCED -> SNK_ATTACHED [rev1 NONE_AMS]
[ 53.906695] polarity 0
[ 53.908791][ T151] emdoor: tcpm_set_polarity typec positive
[ 53.908862] Requesting mux state 1, usb-role 2, orientation 1
[ 53.909477][ T151] husb311 0-004e: CC connected in CC1 as UFP
[ 53.909744] state change SNK_ATTACHED -> SNK_STARTUP [rev1 NONE_AMS]
[ 53.909755] state change SNK_STARTUP -> SNK_DISCOVERY [rev3 NONE_AMS]
[ 53.909759] Setting voltage/current limit 5000 mV 0 mA
[ 53.909775] vbus=0 charge:=1
[ 53.910560] state change SNK_DISCOVERY -> SNK_WAIT_CAPABILITIES [rev3 NONE_AMS]
[ 53.910951] pending state change SNK_WAIT_CAPABILITIES -> HARD_RESET_SEND @ 310 ms [rev3 NONE_AMS]
[ 54.221059] state change SNK_WAIT_CAPABILITIES -> HARD_RESET_SEND [delayed 310 ms]
[ 54.221080] AMS HARD_RESET start
[ 54.221083] PD TX, type: 0x5
[ 54.223648][ T152] =================> tcpci_irq -> status[0x50]
[ 54.223737] PD TX complete, status: 0
[ 54.223819] state change HARD_RESET_SEND -> HARD_RESET_START [rev3 HARD_RESET]
[ 54.225211] state change HARD_RESET_START -> SNK_HARD_RESET_SINK_OFF [rev3 HARD_RESET]
[ 54.225235] vconn:=0
[ 54.225747] Requesting mux state 1, usb-role 2, orientation 1
[ 54.226346] pending state change SNK_HARD_RESET_SINK_OFF -> SNK_HARD_RESET_SINK_ON @ 650 ms [rev3 HARD_RESET]
[ 54.876427] state change SNK_HARD_RESET_SINK_OFF -> SNK_HARD_RESET_SINK_ON [delayed 650 ms]
[ 54.876447] AMS HARD_RESET finished
[ 54.876850] state change SNK_HARD_RESET_SINK_ON -> SNK_STARTUP [rev3 NONE_AMS]
[ 54.876871] state change SNK_STARTUP -> SNK_DISCOVERY [rev3 NONE_AMS]
[ 54.876875] Setting voltage/current limit 5000 mV 0 mA
[ 54.876896] state change SNK_DISCOVERY -> SNK_WAIT_CAPABILITIES [rev3 NONE_AMS]
[ 54.877264] pending state change SNK_WAIT_CAPABILITIES -> HARD_RESET_SEND @ 310 ms [rev3 NONE_AMS]
[ 55.187319] state change SNK_WAIT_CAPABILITIES -> HARD_RESET_SEND [delayed 310 ms]
[ 55.187339] AMS HARD_RESET start
[ 55.187343] PD TX, type: 0x5
[ 55.189910][ T152] =================> tcpci_irq -> status[0x50]
[ 55.189982] PD TX complete, status: 0
[ 55.190020] state change HARD_RESET_SEND -> HARD_RESET_START [rev3 HARD_RESET]
[ 55.191474] state change HARD_RESET_START -> SNK_HARD_RESET_SINK_OFF [rev3 HARD_RESET]
[ 55.191494] vconn:=0
[ 55.192023] Requesting mux state 1, usb-role 2, orientation 1
[ 55.192727] pending state change SNK_HARD_RESET_SINK_OFF -> SNK_HARD_RESET_SINK_ON @ 650 ms [rev3 HARD_RESET]
[ 55.842808] state change SNK_HARD_RESET_SINK_OFF -> SNK_HARD_RESET_SINK_ON [delayed 650 ms]
[ 55.842828] AMS HARD_RESET finished
[ 55.843201] state change SNK_HARD_RESET_SINK_ON -> SNK_STARTUP [rev3 NONE_AMS]
[ 55.843214] state change SNK_STARTUP -> SNK_DISCOVERY [rev3 NONE_AMS]
[ 55.843217] Setting voltage/current limit 5000 mV 0 mA
[ 55.843238] state change SNK_DISCOVERY -> SNK_WAIT_CAPABILITIES [rev3 NONE_AMS]
[ 55.843604] pending state change SNK_WAIT_CAPABILITIES -> SNK_READY @ 310 ms [rev3 NONE_AMS]
[ 56.153719] state change SNK_WAIT_CAPABILITIES -> SNK_READY [delayed 310 ms] // 拔出typec时,tcpm的打印
[ 2087.027300][ T152] =================> tcpci_irq -> status[0x01]
[ 2087.028556] CC1: 3 -> 0, CC2: 0 -> 0 [state SNK_READY, polarity 0, disconnected]
[ 2087.028574] state change SNK_READY -> SNK_UNATTACHED [rev3 NONE_AMS]
[ 2087.028585] disable BIST MODE TESTDATA
[ 2087.029540] Setting usb_comm capable false
[ 2087.031079] Setting voltage/current limit 0 mV 0 mA
[ 2087.031116] polarity 0
[ 2087.033294][ T151] emdoor: tcpm_set_polarity typec positive
[ 2087.033323] Requesting mux state 0, usb-role 0, orientation 0
[ 2087.034933] Start toggling
[ 2087.035701] state change SNK_UNATTACHED -> TOGGLING [rev3 NONE_AMS]
[ 2087.046906][ T152] =================> tcpci_irq -> status[0x02]
[ 2087.048083] VBUS off
[ 2087.048095] VBUS VSAFE0V

从log内,进一步分析整个tcpm的运行流程,总结了出如下流程图:

同样关于插入的过程也总结了如下流程图:

USB TCPM的更多相关文章

  1. Linux自动共享USB设备:udev+Samba

    一.概述 公司最近要我实现USB设备插入Ubuntu后,自动共享到网络上,能像Windows共享一样(如\\192.168.1.10)访问里面的内容,不需要写入权限.当时听完这需求,我这新人表示惊呆了 ...

  2. OpenWrt中开启usb存储和samba服务

    在从官网安装的WNDR3800 15.05.1版本OpenWrt中, 不带usb存储支持以及samba, 需要另外安装 1. 启用usb支持 USB Basic Support https://wik ...

  3. USB设备(移动硬盘、鼠标)掉电掉驱动的两种解决方案

    症状: 当你发现"移动硬盘图标"经常无故消失,又自己出现时. 你可以把这个现象称之为"掉电" or "掉驱动". 遇到这种情况,相当不爽. ...

  4. 【.NET MF】.NET Micro Framework USB移植

    1.开发环境 windows 7  32位 MDK 4.54 .Net Micro Framework Porting Kit 4.2(RTM QFE2) .Net Micro Framework   ...

  5. USB Host的上拉下拉电阻

      关于USB的上下拉电阻,不是随便接个任意阻值的电阻就ok了. 当你的USB为主设备的时候,D+.D-上分别接一个15K的下拉电阻,这样可以使得在没有设备插入的时候,D+.D-上始终保持低电平:当为 ...

  6. stm32 usb error : identifier "bool" is undefined

    .\usb\USB\usb_pwr.h(54): error:  #20: identifier "bool" is undefinedusb\USB\usb_pwr.h(54): ...

  7. 如果mac电脑的usb转接器连接wlan时不显示,也就是不识别usb此时的网络连接没有,解决办法就是如下

    1.接上电源   关机 先按下shift +ctrl + opt + 开机键    ,等待10秒,这10秒是没有反应的,屏幕不会亮,系统不会跑起来,  10秒之后松开所有键,再按下opt + cmd ...

  8. UP Board USB无线网卡一贴通

    前言 原创文章,转载引用务必注明链接,水平有限,欢迎指正. 本文环境:ubilinux 3.0 kernel 4.4.0 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我 ...

  9. AD域控制器通过组策略禁止USB设备

    问题:域环境下如何禁用USB口设备? 第一种:用传统的办法,在Bios中禁用USB. 第二种: 微软技术支持回答:根据您的需求, Windows识别USB设备主要通过两个文件,一个是Usbstor.p ...

  10. 安卓手机USB网络共享,电脑卡顿、反应慢

    1.首先需要把手机连接到电脑,在手机上打开USB网络共享. 2.打开设备管理器 3.在网络适配器中,找到Remote NDIS based Internet Sharing Device,右键更新驱动 ...

随机推荐

  1. ByteHouse高性能向量检索实践——“以图搜图”

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   随着 LLM 技术的发展,向量检索与向量数据库也受到业界持续关注,它们能够为LLM提供外置记忆单元,通过提供与 ...

  2. 失温急救处理方法——1.快速复温;2.心肺复苏;3.口服或静脉注射生理盐水(40 ~ 42 ℃ ,小剂量250 mL);4.口服或静脉注射抗血栓药物,如布洛芬

    相关: https://haokan.baidu.com/v?pd=wisenatural&vid=14530104659934311010 参考: https://m.bjnews.com. ...

  3. 外形最漂亮的人形机器人——通用机器人Apollo,设计为可以在任何任务和环境中与人类进行协作

    视频地址: https://www.bilibili.com/video/BV11F4m1M7ph/

  4. pytorch不像TensorFlow那样有专用的文件存储格式真的是不足吗?pytorch该如何处理大量小文件的读取呢?

    偶然发现前文: [转载] PyTorch下训练数据小文件转大文件读写(附有各种存储格式对比) 在谈论pytorch的文件读取问题,因为以前是搞TensorFlow的,后来由于编写效率和生态环境问题转为 ...

  5. vue(element)中使用monaco实现代码高亮

    vue(element)中使用monaco实现代码高亮 使用的是vue语言,用element的组件,要做一个在线编辑代码,要求输入代码内容,可以进行高亮展示,可以切换各不同语言,而且支持关键字补全,还 ...

  6. Codeforces Round 964 (Div. 4)

    Codeforces Round 964 (Div. 4) A送分 B 大意:两个人两张牌 随机翻 求a翻出来的牌比b大的可能 #include <cstdio> #include < ...

  7. Java中如何以文本方式输出"\"

    1. 转义符使用 "\"在 java中是一个转义符,只要有它的出现往往有他独特的意义,如下图: 那么,在输出文本时,需要输出"\"怎么办呢,其实很简单,只要多加 ...

  8. 十五张图带你快速入门 shardingsphere-proxy

    Apache ShardingSphere 是一款分布式的数据库生态系统,它包含两大产品: ShardingSphere-Proxy ShardingSphere-JDBC 很多同学对于 Shardi ...

  9. AI驱动的PlantUML:快速生成专业级UML类图和用例图

    承接前文关于如何运用 AI 工具生成时序图的内容[1],今天我们继续探讨 AI 驱动的 PlantUML:高效创建专业的 UML 类图与用例图. [1]: https://juejin.cn/post ...

  10. 全网最适合入门的面向对象编程教程:43 Python 常用复合数据类型-扩展内置数据类型

    全网最适合入门的面向对象编程教程:43 Python 常用复合数据类型-扩展内置数据类型 摘要: 在 Python 中,内置数据类型(如列表.字典.集合等)非常强大,但在某些情况下,可能需要扩展这些数 ...