物理层握手的波形由 USB PHY 和主机控制器硬件完成。软件只负责把 PHY 打开,并在检测到连接后启动一次端口复位,然后读结果。
硬件做什么
设备插入后,D+ 上拉把线拉成 J 态。PHY 检测到这个电平,置CCS和CSC,产生端口变化中断。
软件把PORTSC1.PR置 1 之后,后面整段复位都在控制器内部进行:
驱动 SE0
检测设备的 Chirp K
主机回应 KJ 序列
接上 45 Ω 高速终端
硬件自己把
PR清掉,并写入PE和PSPD
i.MX RT1050 的主机栈就是这样写的。USB_HostEhciPortChange()里只做了置位PR、等待PR变回 0、再读PSPD,中间没有去翻转 D+ / D−。
软件必须做的事
握手不会自己开始。软件要先完成这些准备:
打开 USB PHY 的 480 MHz PLL 和控制器时钟
给 PHY 上电(
PWD=0),写入发送电流校准置
PTW,匹配 16-bit UTMI打开端口电源
PP收到连接中断后去抖,再置
PR
复位结束后,软件根据PE和PSPD决定后面按高速还是全速枚举。PE=0时总线上没有可用链路,描述符请求发不出去。
和这两块板的关系
UG 和 OT 跑的是同一套流程。UG 上硬件把 Chirp 做完,PE=1、PSPD=0x2。OT 上软件同样发起了复位,硬件结束后PE仍是 0、PSPD仍是 0。
所以 OT 的失败点在 PHY 完成握手时的电气结果,不在软件去拼 Chirp 波形。软件能做的是再次置PR,或给摄像头断电再来一次。握手时序本身改不了。