跳到主要内容

Rockchip Introduction USB SQ Tool

:::info 文档信息

文档标识:RK-SM-YF-195 · 发布版本:V1.0.0 · 发布日期:2022-01-10 · 页数:16 · 语言:英文

原始文档:Rockchip_Introduction_USB_SQ_Tool_CN.pdf

:::

章节大纲​

  • Rockchip Introduction USB SQ Tool(P1)
    • Rockchip USB PHY信号调节说明(P4)
    • Rockchip USB SQ TOOL信号调节工具使用说明(P4)
      • Rockchip USB SQ TOOL信号调节工具介绍(P4)
        • RK3588 USB2.0界面Tuning说明(P5)
        • RK356X USB2.0界面Tuning说明(P7)
        • RK3399 USB2.0界面Tuning说明(P9)
        • RK3588 USB3.1 界面Tuning说明(P11)
    • Rockchip USB PHY信号调节代码生成(P12)
      • RK3588 USB2.0 PHY(P12)
      • RK3588 USB3.0 PHY(P12)
      • RK356X USB2.0 PHY(P13)
      • RK3399 USB2.0 PHY(P13)
      • RK3326S/PX30S/RK3326/PX30/RK3328 USB2.0 PHY(P14)
      • RK3308B_S/RK3308 USB2.0 PHY(P14)
      • RK3228 USB2.0 PHY(P15)
      • RK3288 USB2.0 PHY(P15)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


1. Rockchip USB PHY信号调节说明​

当 USB 模块在实际使用中遇到如下相关问题时,且在硬件环境上已没有优化的可能的情况下可以考虑通过“Rockchip USB SQ Tool.exe” 工具调节 USB PHY 信号相关参数来软件优化。

USB 眼图指标测试失败问题;信号质量问题或者 PHY 供电压差问题引起的 USB 枚举失败;USB 连接外设会自动发生异常断开;USB 连接外设拔掉无法检测到断开事件;

注意:由于 USB 信号相关问题都跟硬件环境关系非常大,比如:USB 线缆质量较差、线缆长度太长、USB 走线或线缆阻抗太大等,所以遇到 USB 信号相关问题时,应该优先考虑优化硬件环境。只有在硬件环境无法优化的情况下,再考虑进行软件信号调节。

2. Rockchip USB SQ TOOL信号调节工具使用说明​

2.1 Rockchip USB SQ TOOL信号调节工具介绍​

目前USB SQ Tool 在USB2.0的Tuning支持的平台有:RK3588、RK3588S、RK3568X、RK3399、PX30S、PX30、RK3308B-S、RK3308、RK3326S、RK3326、RK3228、RK3288、RK3328(RK3328目前只支持USB2.0OTG以及USB2.0HOST口的Tuning,USB3.0的U2PHY暂不支持)。USB3.0的Tuning目前只支持RK3588平台,其他平台待开发验证后会陆续推出。

Rockchip USB SQ Tool工具下载路径为:https://redmine.rockchip.com.cn/documents/109。双击打开Rockchip USB SQ Tool.exe文件,首先可以看到的是平台选择界面,如图1所示。点击平台选择界面中的按键,即可进入对应的平台调节界面。

由于RK3588、RK3588S平台USB2.0使用的PHY相同,接下去会以RK3588为例进行说明,见RK3588 USB2.0界面Tuning说明章节;RK356X、PX30S、RK3326S、RK3308B-S平台USB2.0使用的PHY相同,接下去以RK356X为例进行说明,见RK356X USB2.0界面Tuning说明章节;RK3399、PX30、RK3308、RK3326、RK3228、RK3328平台USB2.0使用的PHY相同,接下去以RK3399为例进行说明,见RK3399 USB2.0界面Tuning说明章节。RK3588 USB3.1的Tuning说明见RK3588 USB3.1 界面Tuning说明章节。图1 USB SQ TOOL Main Window

注意: PHY Tuning 请按照工具页面中调节顺序进行调节,只有在前面的调节步骤没有改善或者无法满足要求的情况下,再开启下一个步骤的调节(有些参数的调节可能对结果影响很小,那么可以忽略跳过这些步骤)。USB信号的调节具有一定的风险,不可盲目的调节,最好能测试眼图时对着眼图去适当的调节,调节到能满足需求即可,而不是调节越大越好。用户需要自己把控调节风险。

2.1.1 RK3588 USB2.0界面Tuning说明​

RK3588 USB2.0支持TYPE-C0、TYPE-C1、USB2.0 HOST0、USB2.0 HOST1共四种类型接口,RK3588 USB2.0界面的Tuning可以分为以下几个步骤:

  1. 在红色方框1左侧选择所需要测试的接口,红色方框1右侧的测试命令框会自动生成对应的SQ 测试命令。2. 在红色方框2中选择对应的参数,通过手动输入或者点击上下按键均可改变参数值,参数输入范围以及参数的描述在每个Tuning项中均有提供。3. 点击红色方框2中的” 确认“按键,按键右侧的框中会生成对应的io命令,并且红色方框3中的Code Output 部分会生成对应的参考代码。图2 RK3588 U2 PHY Tuning Interface

RK3588 USB2.0 信号调节参数介绍

表1 RK3588 USB2.0信号调节参数

调节参数描述
TXRISE调整 HS slew rate, 可改变上升下降时间
TXPREEMPAMP调整 HS 预加重电流
TXPREEMPPLUSE调整 HS 预加重电流占空比 ,此项必须在开启TXPREEMPAMP TUNE后才生效
TXHSXV调整 HS DP/DM 交叉点电压,此项调节无明显变化
TXVREF调整 HS DC 电压,可以明显改变眼图幅值
TXRES调整 HS 阻抗,可改变眼图幅值/上升下降时间
TXFSLS调整 FS/LS 阻抗,可改变眼图幅值/上升下降时间/交叉点电压/占空 比
HOST DISCONNECT DETECTION调整断开检测阈值

2.1.2 RK356X USB2.0界面Tuning说明​

RK3568 USB2.0支持OTG、HOST1、HOST2、HOST3共四种类型接口,RK356X界面的Tuning可以分为以下几个步骤:

  1. 在红色方框1左侧选择所需要测试的接口,红色方框1右侧的测试命令框会自动生成对应的SQ 测试命令。2. 由于 RK356x 平台的 USB PHY 寄存器没有高16位的 “write_enable bit”,所以为了防止被调节的寄存器中其他不相关或未调节的某些bit值被修改,需要用户使用红色方框2中提供的读取寄存器命令获取对应寄存器的初始值,填入方框2右侧的“输入寄存器初始值”框中。3. 在红色方框3中选择对应的参数,Pre-emphasize参数选择与其他Tuning项不同,通过打钩的方式选择预加重的参数,其他的Tuning项是通过类似红色方框5中的控件获取参数,手动输入或者点击上下按键均可改变参数值,参数输入范围以及参数的描述在每个Tuning项中均有提供。4. 点击红色方框4中的” 确认“按键,按键右侧的框中会生成对应的io命令,并且红色方框6中的Code Output 部分会生成对应的参考代码。

注意:寄存器初始值的框中已经有预设的默认值,如果没有手动输入寄存器值,将会使用默认值,可能会影响最终Tuning结果,故测试前务必手动读取当前寄存器值后填入寄存器初始值的框中。

图3 RK356X U2 PHY Tuning Interface

RK356X USB2.0信号调节参数介绍

RK356X界面共提供了四类参数调节,包括 USB2.0 SQ 调节、USB2.0 噪声阈值调节、USB2.0 断开检测阈值调节、USB2.0 B_Sessionvalid调节。

USB2.0 SQ调节USB2.0 SQ 调节主要调节 USB2.0 信号的预加重、眼图高度、Slew Rate、驱动强度等。

表2 RK356X USB2.0 SQ信号调节参数

调节参数描述
Pre-emphasize调节预加重
HS Eye Height调节HS眼图幅值, 默认值 400mV
HS ODT Value调节ODT 45Ω电阻值,输入值越大,电阻越小,眼图就越大
Slew Rate调节 High-speed 眼图的 slew rate ,这个调节一般作用比较小,目前比 较少使用
Bypass ODT & Driver Strengthbypass ODT后调节眼图的驱动强度

USB2.0噪声阈值调节

当使用长度较长、质量较差、阻抗较大的USB线缆连接High-speed外设,无法被正常枚举。此时可以尝试调节USB 噪声阈值。USB PHY 的噪声阈值一般默认为150 mV,当使用阻抗较大的 USB 线缆时,USB 正常信号的幅值会衰减得很厉害,甚至低于 150 mV 的,因此可能正常信号会被当作噪声处理了。此时可以适当的降低USB2.0 PHY 的噪声阈值,一般可以调节为125 mV 或者 112.5mV,此项可以通过Squelch Tuning改善。

USB2.0断开检测阈值调节

断开检测阈值调节可以通过Host Disconnect Detection Tuning改善,Rockchip 平台 USB Host 端口识别USB 外设日志如下:

[ 1204.092638] usb 1‐1: new high‐speed USB device number 3 using ehci‐platform
[ 1204.280373] usb 1‐1: New USB device found, idVendor=058f, idProduct=6387,
bcdDevice= 1.04
[ 1204.280449] usb 1‐1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1204.280476] usb 1‐1: Product: Mass Storage
[ 1204.280498] usb 1‐1: SerialNumber: FA45A19C

Rockchip 平台 USB Host 端口断开USB外设连接日志如下:

[ 985.341233] usb 1‐1: USB disconnect, device number 2
  1. 无法检测USB2.0外设断开

当 USB Host 拔掉 USB2.0 外设无法被检测到(拔掉USB外设时不会打印以上的断开连接的日志),此时可以尝试如下步骤优化:

  1. 开启 EOP 的预加重(SDK默认都是关闭EOP的预加重),开启EOP预加重位置如图4所示。图4 开启EOP预加重

  2. 减小USB Host的断开检测阈值;

注意:

有些 Rockchip 平台主控芯片没有调节EOP预加重的操作,可忽略 Step 1步骤,具体以工具页面为准。只有 Step1 操作无明显改善效果的情况下,才需要在Step1的基础上再做 Step2 的操作。Step2 减小断开检测阈值存在一定的风险,如果调节过度会导致USB外设在正常使用中发生自动断开情况,所以用户需要自己把控风险。

  1. USB2.0外设异常断开

当 USB Host 连接 USB2.0 外设在正常工作中发生异常断开,我们可以尝试增大 USB Host 的断开检测阈值。注意:

并不是所有的异常断开都是因为断开检测阈值的原因,往往更多的情况是 USB 外设自身问题或者硬件环境问题等因素导致的,所以不应该一出现此类问题就盲目的去调节断开检测阈值。Rockchip 的SDK默认都是关闭EOP的预加重的,所以此时不需要配置寄存器再去关闭该操作;增大断开检测阈值同样存在一定的风险,如果调节过度会导致 Host 无法检测到 USB 外设断开连接的情况,所以用户需要自己把控风险。

USB2.0 B_Sessionvalid调节

B_Sessionvalid调节主要用于PC无法识别ADB或者识别到ADB后又断开的现象。此时可以尝试调节此项,降低电压判决阈值。默认值为 3'b000,建议改为 3'b111 (参数选择7)或 3'b101(参数选择5)。导致ADB连接失败的硬件问题主要有3种:

Vbus 电压太低 (一般低于 4.7V 容易出现问题) 。USB_AVDD1V0 纹波太高,或者 USB_AVDD1V0 被抬高到 1.2V,导致 PHY 检测不到 Bvalid 有效信号。Logic 电压纹波太高,导致 USB 控制器工作异常。

2.1.3 RK3399 USB2.0界面Tuning说明​

RK3399 USB2.0支持TYPE-C0、TYPE-C1、HOST0、HOST1共四种类型接口,RK3399界面的Tuning可以分为以下几个步骤:

  1. 在红色方框1左侧选择所需要测试的接口,红色方框1右侧的测试命令框会自动生成对应的SQ 测试命令。2. 在红色方框2中选择对应的参数,Pre-emphasize参数选择与其他Tuning项不同,通过打钩的方式选择预加重的参数,其他的Tuning项是通过类似红色方框4中的控件获取参数,手动输入或者点击上下按键均可改变参数值,参数输入范围以及参数的描述在每个Tuning项中均有提供。3. 点击红色方框3中的” 确认“按键,按键右侧的框中会生成对应的io命令,并且红色方框5中的Code Output 部分会生成对应的参考代码。

图5 RK3399 U2 PHY Tuning Interface

RK3399 USB2.0信号调节参数介绍

表3 RK3399 USB2.0信号调节参数

调节参数描述
Pre-emphasize调节预加重
Slew Rate调节High-speed 眼图的 slew rate
Compensation Voltage调节电压校准点,调高校准点可以提高USB眼图的幅度
Compensation Current调节电流校准点,调高校准点可以提高USB眼图的幅度
Pre-emphasize Strength调节预加重强度
Bypass ODT & Driver StrengthBypass comp 电路中的电阻自动调节电路,可以调整眼图幅度
Squelch调节噪声阈值
Host Disconnect Detection调整 Host mode 的断开检测阈值

2.1.4 RK3588 USB3.1 界面Tuning说明​

RK3588的USB3.1支持USB3-OTG0(USB3&Dp CombPhy0)、USB3-OTG1(USB3&Dp CombPhy1)、USB3-HOST2(USB3&PCIE&SATA CombPhy)共三种类型接口的Tuning,RK3588 USB3.1界面的Tuning可以分为以下几个步骤:

  1. 在红色方框1左侧选择所需要测试的接口,红色方框1右侧的测试命令框会自动生成对应的SQ 测试命令。2. 如果是测试USB3-OTG,需按照红色方框2中的读取寄存器命令获取该寄存器值并填入“输入寄存器值”窗口中,该寄存器的值必须是Cx或者3x,否则窗口会提示异常。测试HOST口直接点击红色方框3中的start按键即可。3. 点击start按键后,如果是测试USB3-OTG口,则界面左侧的USB3-OTG相关Tuning项的“确认”按键会生效,如红色方框5所示,而右侧USB3-HOST相关Tuning项的“确认”按键会失效,如红色方框6所示,反之亦然。4. 由于 RK3588 平台的 USB 3.1 PHY 寄存器没有高16位的 “write_enable bit”,所以为了防止被调节的寄存器中其他不相关或未调节的某些bit值被修改,需要用户使用红色方框4中提供的读取寄存器命令获取对应寄存器的初始值,填入方框4右侧的“输入寄存器初始值”框中。5. 在红色方框5中选择对应的参数,点击“确认”按键,按键右侧的框中会生成对应的io命令,并且红色方框7中的Code Output 部分会生成对应的参考代码。

图6 RK3588 U3 PHY Tuning Interface

RK3588 USB3.1信号调节参数介绍

表4 RK3588 USB3.1信号调节参数

调节参数描述
TX Driver main-tap level(USB3-OTG)调节电压
TX Pmos current control(USB3-OTG)调节电流,建议在调压不满足时再设置
TX De-emphasis(USB3- OTG)调节去加重
TX Slew Rate(USB3- OTG)调节Slew Rate
Full Txswing and TXmargin(USB3-HOST)Full swing and Txmargin Tuning. TX SWING and TX MARGIN[2:0] are _ _ combined together to control TX output amplitude.
Low swing and Txmargin(USB3-HOST)Low swing and Txmargin Tuning
TX De-emphasis(USB3- HOST)Transmitter de-emphasis level configuration.

3. Rockchip USB PHY信号调节代码生成​

3.1 RK3588 USB2.0 PHY​

RK3588平台USB2.0 PHY Tuning的代码添加在kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c文件的rk3588_usb2phy_tuning函数中。由于RK3588有TYPE-C0、TYPE-C1、HOST0、HOST1共4个USB端口,4个端口的区分根据rphy->phy_cfg->reg的值来判断,代码添加位置如下:

if (rphy->phy_cfg->reg == 0x0000) {
.../* TYPE-C0 PHY Tuning Code */
} else if (rphy->phy_cfg->reg == 0x4000) {
.../* TYPE-C1 PHY Tuning Code */
} else if (rphy->phy_cfg->reg == 0x8000) {
.../* HOST0 PHY Tuning Code */
} else if (rphy->phy_cfg->reg == 0xc000) {
.../* HOST1 PHY Tuning Code */
}

3.2 RK3588 USB3.0 PHY​

RK3588 USB3-OTG与USB3-HSOT代码添加位置不同,如下所示。

USB3-OTG 代码放置位置

USB3-OTG的PHY Tuning目前还没有类似USB2.0专门用于Tuning的接口,因此代码可以添加于kernel/drivers/phy/rockchip/phy-rockchip-usbdp.c文件中的rk3588_udphy_init函数末尾。

ret = rk3588_udphy_status_check(udphy);
if (ret)
goto assert_phy;
.../* USB3-OTG PHY Tuning Code */
return 0;

USB3-HOST代码放置位置

USB3-HOST的PHY Tuning代码添加在kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c文件的rk3588_combphy_cfg函数中。

case PHY_TYPE_USB3:
/* Set SSC downward spread spectrum */
val = readl(priv->mmio + (0x1f << 2));
val &= ~GENMASK(5, 4);
val |= 0x01 << 4;
...
.../* USB3-HOST PHY Tuning Code */
...
param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
param_write(priv->phy_grf, &cfg->usb_mode_set, true);
break;

3.3 RK356X USB2.0 PHY​

RK356X平台的代码添加在 kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c 中rk3568_usb2phy_tuning函数末尾。由于 RK356x 有4个USB端口,其中OTG口和HOST1属于一组PHY(基地址 0xfe8a0000),HOST2和HOST3属于一组PHY(基地址 0xfe8b0000)。所以生成的代码段前面需要加上寄存器基地址进行判断区分不同的 USB 端口。OTG 口和HOST1 口代码添加如下:

if (rphy‐>phy_cfg‐>reg == 0xfe8a0000) {
... /* OTG/Host1 PHY Tuning Code */
}

HOST2 口和 HOST3 口代码添加如下:

if (rphy‐>phy_cfg‐>reg == 0xfe8b0000) {
... /* Host2/Host3 PHY Tuning Code */
}

3.4 RK3399 USB2.0 PHY​

RK3399平台的代码添加在 kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c 的 rk3399_usb2phy_tuning函数中的 “if (!of_property_read_bool(node, "rockchip,u2phy-tuning"))” 之前。由于 RK3399 有4个USB端口,其中 TYPE-C0 口和 HOST0 属于一组 PHY (区分地址:0xe450),TYPE-C1 和HOST1属于一组 PHY(区分地址:0xe460)。所以代码段前面需要需要加上寄存器的地址判断来区分不同的USB端口。

if (rphy->phy_cfg->reg == 0xe450) {
.../* TYPE‐C0/HOST0 PHY Tuning Code */
} else {
... /* TYPE‐C1/HOST1 PHY Tuning Code */
}
if (!of_property_read_bool(node, "rockchip,u2phy-tuning"))
return ret;

3.5 RK3326S/PX30S/RK3326/PX30/RK3328 USB2.0 PHY​

RK3326S/PX30S平台的代码添加在kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c 的rk3328_usb2phy_tuning函数中,在soc_is_px30s()判断条件的末尾。

if (soc_is_px30s()) {
.../* OTG/HOST PHY Tuning Code */
}

RK3326/PX30/RK3328 平台的代码添加在 kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c 的rk3328_usb2phy_tuning 函数中的else判断条件末尾。

if (soc_is_px30s()) {
...
} else {
.../* OTG/HOST PHY Tuning Code */
}

3.6 RK3308B_S/RK3308 USB2.0 PHY​

RK3308B_S平台的代码添加在 kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c的rk3308_usb2phy_tuning函数中,在soc_is_rk3308bs() 判断条件末尾。

if (soc_is_rk3308bs()) {
... /* OTG/HOST PHY Tuning Code */
}

RK3308平台的代码添加在kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c的rk3308_usb2phy_tuning函数中的else判断条件末尾。

if (soc_is_rk3308bs()) {
...
} else {
.../* OTG/HOST PHY Tuning Code */
}

3.7 RK3228 USB2.0 PHY​

RK3228平台的代码添加在kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c的rk3228_usb2phy_tuning函数中。

static int rk3228_usb2phy_tuning(struct rockchip_usb2phy *rphy)
{
.../*OTG/Host PHY Tuning Code */
}

3.8 RK3288 USB2.0 PHY​

由于 RK3288 的 USB PHY 驱动代码具有两个不同的版本,对应的 USB PHY 修改的代码也不相同,所以在RK3288页面中生成代码的时候需要先选择下kernel版本(使用kernel-4.4 及以下kernel版本Kernel Version都选择4.4,kernel-4.19及以上kernel版本Kernel Version都选择4.19,选择不同的kernel版本仅仅只是生成的代码格式不一样而已,对生成的IO命令等不会有影响)。

RK3288 kernel-4.19 版本

代码添加在 kernel/drivers/phy/rockchip/phy-rockchip-usb.c 的 rk3288_usb_phy_probe_init 函数的末尾。由于RK3288有3个USB端口,所以IO命令转化后的代码段前面需要加上USB端口判断来区分不同的USB端口。OTG 口代码添加如下:

if (rk_phy‐>reg_offset == 0x320) {
... /* OTG PHY Tuning Code */
}

HOST1 口代码添加如下:

if (rk_phy‐>reg_offset == 0x334) {
... /* HOST1 PHY Tuning Code */
}

HOST2 口代码添加如下:

if (rk_phy‐>reg_offset == 0x348) {
... /* HOST2 PHY Tuning Code */
}

RK3288 kernel-4.4 版本

驱动代码路径:kernel/drivers/usb/dwc_otg_310/usbdev_rk32.c

RK3288有3个USB端口,其中OTG口代码添加在 usb20otg_hw_init 函数末尾,HOST1口代码添加在rk_ehci_hw_init 函数末尾,HOST2口代码添加在 usb20host_hw_init 函数末尾。