Term
DFP - Downstream Facing Port
下行端口,可以理解为 Host 的 Type-c 端口或者作为 Host 的 hub ,DFP 提供 VBUS,可以提供数据。在协议规范中 DFP 特指数据的下行传输,笼统意义上指的是数据下行和对外提供电源的设备。典型的 DFP 设备是电源适配器。UFP - Upstream Facing port
上行端口,可以理解为 Device 上的 Type-c 端口或者连接到 Host/DFP of a hub ,UFP 从 VBUS 中取电,并可提供数据。典型设备是 U 盘,移动硬盘。DRP - DUal Role Port (DFP + UFP)
双角色端口,DRP 既可以做 DFP(Host),也可以做 UFP(Device),也可以在 DFP 与 UFP 间动态切换。典型的DRP设备是笔记本电脑。
引用摘录:A DRP port is a port that can operate as either a sink or source.
source - takes the data role of a DFP.
sink - take the data role of a UFP.A current sink is a port or circuit point that accepts negative current, e.g. current into the circuit which it drains to ground.
A current source is a port or circuit point that provides positive current. A good example of a current source is a DC power supply
Description
逻辑:USB 默认为 UFP,不能使用 OTG ;若要使用需要通过 node 将其设为 DRP , 但是在拔出后需要将其设回 UFP。
问题: 当拔掉 OTG 之后,USB 仍然为 DRP ,导致不用设置 node 即可连接 OTG。
Solution
初步解析
通过在 smblib_handle_typec_removal 函数设置 USB 端口模式的地方加日志读取端口状态,发现 DRP 是被成功设置了的,但是短暂时间后又被其他地方修改为 UFP 模式了。
通过寄存器相关关键字等各种方式皆不能找到其余修改的地方。
因为老版本(Android N)上是没有问题的,所以尝试在本问题版本(Android Q) one by one 烧写 N 的镜像,最终发现 pmic.elf 分区会让问题得以解决。
方案一
对比代码发现如下两种修改方法可以解决问题:
1 | -------------------------------------------------------------- |
但是针对这个问题咨询高通得到的回复是:PSI 模块是不允许修改的,会导致难以预料的问题,所以这种方案作罢。因为没有找到相关资料,不清楚这个差异具体是什么,高通也未给出清晰的答案。
方案二
拔掉时延时 5 毫秒才重置 USB 为 UFP 模式,试图在 PSI 之后修改,经过测试此修改方案能解决此问题。如下:
1 | diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c |
方案三
此方案与方案二类似,
1 | diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c |