Linux内核USB3.0驱动框架分析--USB Hub实现眼图信号输出方案
1,高速USB信号的眼图
眼图就是由多个周期的数字信号波形叠加而形成的图形,形状与眼睛类似,因此被称为眼图。数字信号的眼图能清楚反映互连设计是否导致不能容忍的误码率。在高速串行应用中,通行的做法是采用眼图验证串行链路是否满足系统的性能要求的。
对于高速USB信号的发送和接收,USB使用眼图来描述其各个位在传输时所需的电压幅值和时间安排。图1展示了高速USB系统的几个眼图测试点。其中,TP1和TP4对应USB接口芯片的相应管脚(D+和D-),它们分别被焊接在集线器和USB设备的电路板上;TP2对应A型连接器的D+和D-管脚;TP3对应B型连接器的D+和D-管脚(对于束缚电缆,其也可能是直接连接在电路板上)。

图1 眼图测试点
USB定义了6种眼图模板,其中定义在集线器TP2点或在USB设备(使用非束缚电缆)TP3点处的眼图模板,表示接收高速USB信号时所需的电压分辨力,如图2所示。

图2 眼图模板
眼图的各项数据可以体现信号分析的性能指标。最主要的是通过眼的宽度、眼的高度、平均上升时间、下降时间、平均上升速率和下降速率(即斜率)这些指标能够体现信号的优劣程度。

图3 仿真眼图结果
2,眼图(Eye-Diagram)测试
眼图是非周期信号所特有的性质,周期信号是不能叠加出眼图的。由于High-Speed模式下一个USB数据包开始是同步的周期信号,故需要对示波器进行适当的设置才能正确捕获到眼图。
2.1 捕捉眼图
设置好后,出现一个完整的数据帧波形,如下图所示。

放大该图形的数据部分,即可得到眼图,如下图所示。
2.2 检查是否符合模版要求
在USB2.0标准中,不同的USB Cable及不同测试点,所满足的模版要求是不一致的。本例测试的测试点选在下图TP1。

单端信号高电平范围为360mV~440mV,单端信号低电平范围为-10mv~10mV,故理论的差分信号高电平范围为350mV~450mV, 理论差分信号低电平范围为-450mV~-350mV。但实际上眼图所给出的高低电平范围比理论范围要宽(分别为-575mV~-300mV和300mV~-575mV),这可能是考虑到信号在传输过程中的衰减及可能引入的噪声等原因。

按照规范,测试眼图结果应满足模板5(Template 5)。该模版如下标描述所示,通过Point1~Point6 6个点的坐标确定眼图的位置。

3,分析眼图信号
眼图的测量参数不同于波形的测量参数,更多情况下是一种统计意义的测量,主要关注的测量参数有眼高,眼宽,眼抖动等。
3.1 眼高的测量
眼高反映的是眼图在垂直方向张开的程度。其测量方法是先在眼图的中心位置对眼图的电平分布进行统计,根据直方图分布出现概率最大的位置得到高电平(One Level)和低电平(Zero Level)的位置;然后再根据高低电平上的噪声分布情况各向内推3个西格玛(噪声的RMS值),从而得到眼高的测量结果。

3.2 眼图的抖动(Eye Jitter)测量
眼图的抖动反映的是信号的时间不确定性,抖动过大会减小信号的眼宽。眼图的抖动是指眼图交叉点附近的信号的水平抖动,可以用RMS或者Peak-Peak值来衡量。

3.3 在进行眼图测试时,直接把眼图套在这个模板上,如果长时间的累计测量没有压在模板上,就说明信号质量基本满足了要求。
如果被测信号压在了测试模板上,说明被测信号质量存在明显的问题。

3.4 Usb信号线的设计
在USB高速信号方面,我们往往喜欢在D+ D-端串电阻,电感或者并TVS管用以静电或者浪涌防护。由于属于高速信号(速率480Mbps,频率240MHZ),因此对TVS管的选取也要慎重。TVS管具有结电容,结电容的容值要格外注意,在小白所做过的项目里,TVS管结电容容值往往选取1pf以下的容值。容值过大因RC延时的影响会使得眼图的睁开程度变小,进而可能压倒中间的模板。同时串阻的选取也要适当,因为其影响到眼高。
USB眼图,实际上就是调试USB通路的阻抗特性,将阻抗收敛到45Ω,眼图肯定好;所以眼图的调试方法和射频匹配的调试一模一样,都是将阻抗收敛到一个值
4,USB Hub 测试命令
USB 2.0 SQ 的测试原理是,设置 USB 控制器的 Test Control 寄存器,使 USB 控制器进入 Test Packet Mode, USB 控制器就会持续产生并发送周期性的 Test Pattern。 USB 示波器通过检测 Test Pattern的波形来分析 USB 的信号完整性。
4.1 将对应路径下的libusb1.0.so库分别push到system/lib路径下:
adb push libusb1.0.so system/lib
adb push libusb1.0.so system/lib64
4.2 将可执行程序,即usb host进入测试发包请求的执行程序,push到system/bin下:
adb push USB_Linux_HSET system/bin
4.3 连接设备,进入adb shell。
4.4 lsusb查看枚举到的usb设备,包括总线,设备地址,vid,pid等信息。
4.5 执行./USB_Linux_HSET 进入测试模式。
4.6 输入hub的pid信息,来指定测试对应的hub设备。这里的pid就是lsusb查看出来的pid信息,例如我的hub pid是0x2514
4.7 输入hub的设备地址信息,用来指定对应的hub设备,当存在多个hub情况下需要指定hub 设备号来指定。例如lsusb 查看到对应hub的device addr。
4.8 输入数值来指定进入那一种测试模式,输入4,来指定进入test packet模式,将hub请求进入周期发包测试模式。
4.9 输入端口号,当hub存在多个端口时,输入端口号来指定测试对应的端口,我的hub存在4个端口,那么就从1~4来指定对应端口。
4.10 执行成功后,对应hub端口会输出固定波形,使用示波器即可测量到输出波形信号。
C:\Users\iMin>adb root
adbd is already running as root
C:\Users\iMin>adb remount
remount succeeded
C:\Users\iMin>adb push Z:\jiangchaobing\ds2\userdebug\ds2_sublcd_15.6\a527_a13_imin_project\alps\aw\out\target\product\a527-pro2\system\lib\libusb1.0.so system/lib
Z:\jiangchaobing\ds2\userdebug\ds2_sublcd_15.6\a527_a13_im...1 file pushed, 0 skipped. 5.2 MB/s (62804 bytes in 0.012s)
C:\Users\iMin>adb push Z:\jiangchaobing\ds2\userdebug\ds2_sublcd_15.6\a527_a13_imin_project\alps\aw\out\target\product\a527-pro2\system\lib64\libusb1.0.so system/lib64
Z:\jiangchaobing\ds2\userdebug\ds2_sublcd_15.6\a527_a13_im...1 file pushed, 0 skipped. 6.0 MB/s (95512 bytes in 0.015s)
C:\Users\iMin>adb push Z:\jiangchaobing\ds2\userdebug\ds2_sublcd_15.6\a527_a13_imin_project\alps\aw\out\target\product\a527-pro2\system\bin\USB_Linux_HSET system/bin
Z:\jiangchaobing\ds2\userdebug\ds2_sublcd_15.6\a527_a13_im...1 file pushed, 0 skipped. 1.2 MB/s (11120 bytes in 0.009s)
C:\Users\iMin>adb shell sync
C:\Users\iMin>adb shell
Falcon2:/ # lsusb
Bus 002 Device 007: ID 0424:2514
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 010: ID 0519:2013
Bus 002 Device 008: ID 0424:2514
Bus 002 Device 001: ID 1d6b:0002
Bus 002 Device 009: ID 0bda:8152
Falcon2:/ # USB_Linux_HSET
Please enter the product ID of the hub under test
0x2514
PRODUCT_ID1=[2514]
PRODUCT_ID1=[2514], hexset=[0123456789ABCDEFabcdef]
count=[4]
Please enter the device address
0x8
device_addr=[8]
This demo will iniate a test mode on a port.
Press '1' for Test_J
Press '2' for Test_K
Press '3' for Test_SE0_NAK
Press '4' for Test_Packet
Press '5' for Test_Force_Enable
Press 'q' or 'Q' or CTL+C to quit
4
Which port will Test_Packet be sent to?
1
Port 1 selected
0519:2013 (bus 2, device 10)
path: 1.1.4
0424:2514 (bus 2, device 8)
path: 1.1
1d6b:0002 (bus 1, device 1)
0424:2514 (bus 2, device 7)
path: 1
1d6b:0002 (bus 2, device 1)
Opening device ID 0424:2514...ok
Device2 has kernel driver attached.
Kernel Driver2 Detached!
Port2 now in test mode!
Falcon2:/ #
如上的完整开发方案和源代码可在此路径下载。
可以直接push文件中libusb_1_0.so库到/system/lib/和/system/lib64,并且push文件中可执行程序到system/bin/中即可直接运行,并输出测试信号。无需合入代码编译。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)