• Android Qcom USB Driver学习(六)


    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零)

    眼图基础知识与详解
    10分钟教会你看眼图
    USB2.0 HUB眼图调试经验总结
    一篇文章教你如何全面了解眼图测试!
    预加重与去加重对眼图的影响
    关于 USB 通信阻抗匹配的问题
    硬件调试——眼图几个经典案例
    眼图常见问题分析包含双眼皮的情况

    PHY Tunning

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    Eye diagram

    在这里插入图片描述在这里插入图片描述

        信号不可能每次高低电平的电压值都保持完全一致,也不能保证每次高低电平的上升沿、下降沿都在同一时刻。如图,由于多次信号的叠加,眼图的信号线变粗,出现模糊(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模式下
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

        眼图测试还分近端和远端,一般近端的要求会比远端的苛刻,并不说是只跟数据线的距离有关
        以上是我的个人理解的基础知识,不同平台用的寄存器含义是不同的,所以基础原理我觉得差不多,具体问题具体平台需要具体分析,后续如果有遇到高通平台上眼图测试不过的话或者需要tune眼图质量的,对usb phy tunning后在讲一下心得。

  • 相关阅读:
    java毕业设计奥利给共享自习室系统mybatis+源码+调试部署+系统+数据库+lw
    C# GetMethod 方法应用实例
    大数据(十):数据可视化(二)
    pytorch梯度累积
    手机便签怎么设置每月18号提醒
    msvcp140.dll丢失怎样修复?常用的5个修复方法总结
    C++单例模式
    Java21 LTS版本
    Matlab|基于生物地理学的优化 (BBO)
    Android修行手册 - ScrollView示例和监听
  • 原文地址:https://blog.csdn.net/qq_40405527/article/details/125485167