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 SQ TOOL信号调节工具介绍(P4)
- 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右侧的测试命令框会自动生成对应的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右侧的测试命令框会自动生成对应的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 Strength | bypass 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
- 无法检测USB2.0外设断开
当 USB Host 拔掉 USB2.0 外设无法被检测到(拔掉USB外设时不会打印以上的断开连接的日志),此时可以尝试如下步骤优化:
-
开启 EOP 的预加重(SDK默认都是关闭EOP的预加重),开启EOP预加重位置如图4所示。图4 开启EOP预加重
-
减小USB Host的断开检测阈值;
注意:
有些 Rockchip 平台主控芯片没有调节EOP预加重的操作,可忽略 Step 1步骤,具体以工具页面为准。只有 Step1 操作无明显改善效果的情况下,才需要在Step1的基础上再做 Step2 的操作。Step2 减小断开检测阈值存在一定的风险,如果调节过度会导致USB外设在正常使用中发生自动断开情况,所以用户需要自己把控风险。
- 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右侧的测试命令框会自动生成对应的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 Strength | Bypass 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右侧的测试命令框会自动生成对应的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 函数末尾。