1 USB2 PHY AFE
1.1 USB 2.0 FS PHY
github ultraembedded / core_usb_fs_phy
NOP USB transceiver for all USB transceiver which are either built-in into USB IP or which are mostly autonomous.
1.2 电阻参数
USB host端:D+和D-各接一个15kΩ的下拉电阻;
USB slave端:高速和全速D+接一个1.5kΩ电阻上拉到3.3V;低速在D-上接一个1.5kΩ电阻上拉到3.3V。高速chirp KJ握手(Chirp KJ的频率大概是10KHz)成功后,自动断开D+上的1.5kΩ上拉;当高速设备进入suspend时,使能D+上的1.5kΩ上拉到3.3V,退出suspend时,断开D+上的1.5k上拉。
集线器的全速驱动器和设备的全速驱动器在功能上等效成每个都是45Ω电阻,合成90Ω的差分电阻产生一个0系数的反射。这样才产生了cable的特征阻抗是90Ω的需求。
HS模式DP/DM对地单端阻抗为45Ω(由全速驱动器形成的一个阻抗为45Ω的终端电阻),串联的匹配电阻必须是0,否则眼图有问题;LS/FS的DP/DM上必须有大于0的匹配电阻。 HS模式DP/DM的DC-level是17.78mA x (45Ω//45Ω) = 17.78mA x 22.5Ω = 400mV,其中17.78mA是电流源(一般需要PHY外接参考电阻), 所以差模电压是800mV。DC-level of LS/FS is 3.3V。
HS PHY DP/DM上串联10Ω电阻带来的信号完整性问题如下计算所示。
Udevice = 17.78mA*(45//(10+45)) = 440.1mV, Uhost = (45/(45+10))*440.1 = 360.1mV
1.3 Capture the USB2.0 Reset Signals
Capture the USB signals Dm and Dp with a scope (preferably 1 GHz or better) during the reset.
Set timebase to 20 ms/div, trigger on falling edge of Dp with trigger level set to 1.5V. Trigger position at the left of the screen.
1.4 Chirp握手
1)Chirp K信号
Chirp K的电压幅值为800 mV = (host 45 Ohm // device 1.5 K Ohm) x 17.78 mA,持续时间约1到7 ms。
2)Chirp KJ信号
设备检测到Hub发送的3对KJ序列后,切换到高速收发器,此后Hub发送的KJ序列电压幅值降为400 mV = (host 45 Ohm // device 45 Ohm) x 17.78 mA,Chirp KJ的频率大概是10KHz。
1.5 Tx和Rx Tuning
1.5.1 far end and near end
far end: more than 10cm cable, iPhone connected to HU via cable
near end: less than 10cm cable, USB flash drive connected to HU
bad cable: Remove ESD
1.5.2 4个放大器
发送放大器,接收放大器,静噪检查放大器(检测地板电压),断开检测放大器(检测天花板电压)。
1.5.3 Tx
USB2 Pre-emphasis:预加重,可以放大发送信号的高频部分。
rise/fall time:You can raise these values for quick slew rate.
1.5.4 Rx
USB2 squelch:接收探测包络(静噪检测)。例如,设成100mV, 就是说DP/DM的DC-level在100mV 以下的信号USB2 XCEIV 认为都是噪音,因为USB2 的DP/DM的DC-level大概是400mV。
detail:squelch level = envelop, 静噪(包络)检测电压,在PHY parameters里面这个电压可以设置的,假如设置了这个值是100mV,意思就是当PHY Rx 从DP/DM上接收到的电压绝对值小于100mV的信号,PHY认为是噪音,直接丢弃。
Host disconnect threshold adjustment:
USB断开时,由于2个并联的45 Ohm电阻只剩一个,瞬时反射电压是45 Ohm * 17.78 mA = 800 mV,所以一般取一个折中的数据625 mV,大于该阈值就表示USB连接已经断开。
1.6 PHY Retention
一种低功耗Power Gating技术。
1.7 QCOM Chipidea USB2 PHY tuning
HSETT:HS Electrical Test Tool,USB-IF官方测试device眼图的PC软件,运行时,会将Windows默认的EHCI驱动替换成USB-IF官方写的驱动,百佳泰提供USB-IF认证测试。
Device眼图:单眼皮形状。
Host眼图:双眼皮形状。如果眼图是双眼皮,可判断出信号可能有串扰或预(去)加重。
0x82:PARAMETER_OVERRIDE_C
bit 6:0 -- for decreasing rise/fall time(slew-rate) and raising pre-emphysis
// /sys/module/phy_msm_usb/parameters/override_phy_init
// format
// <val addr [...] val addr 0xffffffff>;
&usb_otg {
[...]
qcom,hsusb-otg-phy-init-seq =
<0x44 0x80 0x68 0x81 0xXX 0x82 0x13 0x83 0xffffffff>;
};
2 APL xHCI HS眼图调试
2.1 EHCI眼图调试寄存器设置流程
第一步:把寄存器USBCMD的bit4和bit5设成0
第二步:把寄存器USBCMD的bit0和bit6设成0
第三步:
- 对应的USB port的PORTSC,port suspend(bit7)设置成0
- 然后把测试模式selector(取值范围:>0,<5,这个数字对应眼图夹具上的那个开关的拨弄的编号)写到PORTSC中(selector << 16)
2.2 xHCI每个port的4个寄存器
- EHCI每个port都有一个寄存器PORTSC
- APL (Gen9, A39X0) xHCI中每个2.0和3.0 port entry的寄存器个数(包括PORTSC)都是4,并且每个port entry占了16个字节
2.3 xHCI HS眼图调试寄存器设置流程
第一步:把寄存器USBCMD的bit0设成0
第二步:
- 对应的USB port的PORTSC,port power(bit9)设置成0
- 然后把测试模式selector(取值范围:>0,<5,这个数字对应眼图夹具上的那个开关的拨弄的编号)写到PORTPMSC中(selector << 28)
验证方法:
- 把selector的值设成1,这时候你用万用表去量D+的电压为高(0.4V),而D-的电压为0,就说明寄存器设置对了
- 要测试眼图,只要把selector设成4就行了
注意点:
1)测试Host眼图时Golden Device参考板使用Cypress Ref Board
2)Intel xHCI HS不支持修改DC level(400mV)
2.4 xHCI HS Roothub眼图测试patch
in xhci-hub.c
int xhci_hub_control(struct usb_hcd *hcd,
u16 typeReq, u16 wValue,
u16 wIndex, char *buf, u16 wLength)
{
[...]
unsigned selector;
[...]
case SetPortFeature:
if (IS_ENABLED(
CONFIG_USB_EHSET_TEST_FIXTURE))
selector = wIndex >> 8;
[...]
/* p320, s4.19.6 Port Test Modes
* in xhci spec
*/
case USB_PORT_FEAT_TEST:
if (!IS_ENABLED(
CONFIG_USB_EHSET_TEST_FIXTURE))
{
(void)selector;
goto error;
}
if (hcd->speed >= HCD_USB3)
goto error;
if (!selector || selector > 5)
goto error;
spin_unlock_irqrestore(&xhci->lock,
flags);
xhci_quiesce(xhci);
spin_lock_irqsave(&xhci->lock,
flags);
/*
* Put all enabled ports into
* Disabled state, Port Power = 0
* FIXME: only can set
* port_array[#wIndex] to PP = 0
*/
temp = readl(port_array[wIndex]);
temp &= ~(1 << 9);
writel(temp, port_array[wIndex]);
temp = readl(port_array[wIndex]);
spin_unlock_irqrestore(&xhci->lock,
flags);
retval = xhci_halt(xhci);
spin_lock_irqsave(&xhci->lock,
flags);
temp = readl(port_array[wIndex] +
PORTPMSC);
temp &= ~(0xf << 28);
temp |= selector << 28;
writel(temp, port_array[wIndex] +
PORTPMSC);
break;
[...]
}
3 EMC测试
3.1 出问题的RF频点
步长20MHz,380MHz和440Mhz容易出问题。
3.2 EMC干扰后,USB设备断开走的代码路径
- U盘,走hub.c的usb_reset_device();USB设备使用过程中复位与设备第一次连接复位的区别是udev->config非空;获得syspath路径函数kobject_get_path(kobj, GFP_KERNEL)
- USB转以太网,走hub.c的EM interference
- 表现与手工插入、移除一样
3.3 寄存器判断 - xHCI
宏中有大写C(change)的表示描述的是wPortChange。
每次insertion有多次portsc寄存器打印,是因为:
- USB reset前,调用hub_port_debounce()多次轮训portsc寄存器,确认设备连接
- USB reset时,调用hub_port_wait_reset()多次轮训portsc寄存器确认复位是否成功(检查portsc.bit1是否为1,1表示成功,否则失败)
wPortStatus(对应到xHCI portsc.bit0 - portsc.bit15):
bit0 - 有无设备连接,portsc.bit0
bit1 - 端口是否使能,portsc.bit1
bit4 - 端口是否有复位信号,portsc.bit4
bit8 - 端口电源,portsc.bit9,for USB2
bit8...bit5 - PORT_LINK_STATE,portsc.bit8...portsc.bit5,for USB3
wPortChange(对应到xHCI portsc.bit17 - portsc.bit31):
bit0 - 端口连接改变位,portsc.bit17
bit1- 端口使能/禁止改变位,portsc.bit18
4 TDR
- 时域反射计:又称为电缆雷达,测量传输线、FPC、USB线缆等的阻抗是否均匀
- TDR测试设备:USB VNA(Vector Network Analyzer),矢量网络分析仪
- TDR测试时的激励脉冲(TDR阶跃脉冲发生器)的周期需要与真实波形的周期一样,譬如480MHz的USB HS数据
- iAP2或者U盘数据传输的过程中出现usb_reset_device(),可以在这个函数中对cable dpdm进行放电处理,这样可以消除由于cable的TDR测试不合格并且长时间运行导致容抗或者阻抗变化(USB眼图中,容抗越大,上升沿和下降沿越慢)而致使的USB设备断开后无法重新re-enumerate
- 差分信号为什么在高速传输中电压往往会很低呢?原因就是为了获得更短的上升沿时间,这样数据传输速率就上去了
5 URLs
daisho USB
http://www.greatscottgadgets.com/daisho/
6 Abbreviations
AFE:USB PHY Analog Front-end
ARC:Argonant RISC Core
BYOD:bring-your-own-device,CarPlay和Android Auto就属于BYOD
CCGP:Windows USB Common Class Generic Parent,Linux内核类似的驱动就是usb_generic_driver(generic.c)
CCGP MI_:Common Class Generic Parent Multi Interface
Cross-talk:测试串扰使用的字节一般是0x55和0xAA
CYPRESS TD_Poll:Task Dispatch
Daisho:大小
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。
halt:停车或者站住,来自于德语;USB endpoint停止运行,返回stall handshake。recovery方法:control ep接收下一次SETUP PID时,自动清除halt标志;其它ep使用clear_feature复位ep halt。
HSSQ:USB PHY High-speed Squelch
HX3C:USB Type-C Hub with PD
IAAD:EHCI Interrupt on Async Advance
ISP1161:Philips' Integrated host Solution Pairs 1161,“Firms introduce USB host controllers”,https://www.eetimes.com/document.asp?doc_id=1290054
nds:Nintendo Dual Screen,ULPI NXT、DIR、STP
PIPE:PHY Interface for PCI Express
SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上与ISP1161(Integrated host Solution Pairs 1161)相当
SSUSB-QMP:QCOM Multiple Protocol Phy
suspendM:UTMI suspend Macrocell
TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci);产品UHC124表示USB Host Controller;收购了ARC USB技术;现已被chipidea收购,chipidea又被mips收购
TDR: Time Domain Reflectrometer
TT:Transaction Translator(事务转换器,将USB2.0的包转换成USB1.1的包)
TVS:Transient Voltage Suppressor,特殊二极管,连到VBUS、DP/DM、GND,防止浪涌电流(Surge)
USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.
USB3 BULK Stream ID:对应到SCSI Tag或者SATA Tag
USB Host枚举时-71错误码可能原因:DP和DM走线太长导致眼图差;DP和DM接反了
USB PET:USB Protocol and Electric Test Instrument
VNA:Vector Network Analyzer,矢量网络分析仪
共模电感:会导致USB眼图变差,所以要选择好一点的共模电感