该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零)
眼图基础知识与详解
10分钟教会你看眼图
USB2.0 HUB眼图调试经验总结
一篇文章教你如何全面了解眼图测试!
预加重与去加重对眼图的影响
关于 USB 通信阻抗匹配的问题
硬件调试——眼图几个经典案例
眼图常见问题分析包含双眼皮的情况
devicetree:
qusb_phy0: qusb@1613000 {
compatible = "qcom,qusb2phy";
reg = <0x01613000 0x180>,
<0x003cb250 0x4>,
<0x01b40258 0x4>,
<0x01612000 0x4>;
qcom,qusb-phy-init-seq = <0xF8 0x80 QUSB_TUNE1 0x01613000+0x80 = 0x01613080
0xB3 0x84 QUSB_TUNE2
0x83 0x88 QUSB_TUNE3
0xC0 0x8C QUSB_TUNE4 (0x90 TUNE5)
0x30 0x08
0x79 0x0C
0x21 0x10
0x14 0x9C
0x9F 0x1C
0x00 0x18>;
...
kernel:
kernel/msm-4.19/drivers/usb/phy/phy-msm-qusb.c
qusb_phy_probe
qusb_phy_create_debugfs
qphy->root = debugfs_create_dir(dev_name(qphy->phy.dev), NULL);
debugfs_create_x8("tune1", 0644, qphy->root, &qphy->tune1);
debugfs_create_x8("tune2", 0644, qphy->root, &qphy->tune2);
qusb_phy_init
if (qphy->qusb_phy_init_seq)
qusb_phy_write_seq(qphy->base, qphy->qusb_phy_init_seq,
qphy->init_seq_len, 0);
/* If tune modparam set, override tune value */
if (qphy->tune1) {
writel_relaxed(qphy->tune1,
qphy->base + QUSB2PHY_PORT_TUNE1);
}
if (qphy->tune2) {
writel_relaxed(qphy->tune2,
qphy->base + QUSB2PHY_PORT_TUNE2);
}
...
override:
cd /sys/kernel/debug/1613000.qusb
tune1 tune2 tune3 tune4 tune5
echo 0xxF8 > tune1
信号不可能每次高低电平的电压值都保持完全一致,也不能保证每次高低电平的上升沿、下降沿都在同一时刻。如图,由于多次信号的叠加,眼图的信号线变粗,出现模糊(Blur)的现象。所以眼图也反映了信号的噪声和抖动:
在纵轴电压轴上,体现为电压的噪声(Voltage Noise = 眼幅高与眼高之间的差值);
在横轴时间轴上,体现为时域的抖动(Jitter = 眼交叉比),太大会造成误码率增加,越小信号质量越好,发生误码的机率越低。
由于噪声和抖动,眼图上的空白区域变小。在除去抖动和噪声的基础上,眼图上空白的区域在横轴上的距离称为眼宽(Eye Width),在眼图上叠加的数据足够多时,眼宽很好的反映了传输线上信号的稳定时间;同理,眼图上空白的区域在纵轴上的距离称为眼高(Eye Height),在眼图上叠加的数据足够多时,眼高很好的反映了传输线上信号的噪声容限,同时,眼图中眼高最大的地方,即为最佳判决时刻。
套住模板只是眼图的最基本的要求,如果有覆盖到红色区域的,一般眼图的质量是最差的,可能更多的需要硬件去rework;如果出现双眼皮的情况,在上面转载的最后的两篇博客中写道,有可能是阻抗不匹配,也有可能有串扰需要加重处理。
tune1 HS output impedance from 45 Ω Nominal in FSLS mode
Tx swing等于输出电流乘以并联QCM/QCS USB 2.0 PHY 输出阻抗和接收器终端电阻的电阻,
在低速ls和全速模式fs下是电压驱动的,但在高速hs模式下是电流驱动的,所以仅能调整fsls的输出阻抗,
一般DP DM上有45Ω接地,USB线的特性阻抗为90Ω,想源端与USB线匹配就需要串电阻,具体阻值是要根据驱动器的输出阻抗来决定
tune2 HS output current to increase Vlogic_high level + HSTX slew-rate
slew-rate应该是影响眼图的斜率,tune1 + tune2 + tune4 结合可以调整眼图的质量,增加usb的驱动能力
tune3 Receiver sensitivity, adjust the squelch threshold to compensate for a USB bus series loss
接受灵敏度作用时PCB上传输线的长度的增加,信道的损耗会变大,眼图的高度会变小,但不是说所有走线越短越好。
tune4 add pre-emphasis to amplitude or no pre-emphasis
在高速信号传输中,信号链路对高频信号的衰减大于对低频信号的衰减,这就会导致高速信号中高频和低频之间巨大的幅度差,
反应在眼图上就是减小了眼高,并增大了Jitter(眼皮的厚度),预加重目的就是为了提升信号中的高频部分,尽量平衡高频和低频的分量
tune5 Disconnection voltage,the software does not override this register
这个就字面意思上,应该时不需要去tunning的吧
qcom,tune2-efuse-correction: The value to be adjusted from fused value for improved rise/fall times.
高通的有些平台可能会将生产时的fuse校准值写入 TUNE1 或 TUNE2 寄存器,所以还需要dtsi中做特殊处理
如果是qusb v2 driver的版本,支持一组单独的参数qusb-phy-host-init-seq在host模式下
眼图测试还分近端和远端,一般近端的要求会比远端的苛刻,并不说是只跟数据线的距离有关
以上是我的个人理解的基础知识,不同平台用的寄存器含义是不同的,所以基础原理我觉得差不多,具体问题具体平台需要具体分析,后续如果有遇到高通平台上眼图测试不过的话或者需要tune眼图质量的,对usb phy tunning后在讲一下心得。