涉硬参数调整指南¶
REVISION HISTORY¶
| Revison No. | Description |
Date |
|---|---|---|
| 1.0 | 11/21/2023 | |
| 1.1 | 1/24/2024 | |
| 1.2 | 12/25/2024 | |
| 1.3 | 01/03/2025 | |
| 1.4 | 01/08/2025 | |
| 1.5 | 01/08/2025 | |
| 1.6 | 01/09/2025 | |
| 1.7 | 05/18/2026 |
1. 模拟 IP 涉硬参数调试¶
1.1. USB 2.0¶
目前一共提供五个参数可供调整,分别是:pre-emphasis、slew rate、swing trim、disconnect detector reference voltage以及RX squelch calibration reference voltage(其中swing trim在OTP中可能已经有trim过,调整时需要注意)。
1.1.1. pre_emphasis¶
位于UTMI bank offset 0x43[9:8] ,调整值范围:0~3,值越大pre-emphasis越强。
1) 查看当前值: cat /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/pre_emphasis
2) 设置: echo value > /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/pre_emphasis
1.1.2. slew_rate¶
位于UTMI bank offset 0x44[2:1] ,调整值范围:0~3。
1) 查看当前值: cat /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/slew_rate
2) 设置: echo value > /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/slew_rate
1.1.3. swing trim(此参数OTP有trim过,修改时需要找HWRD确认)¶
位于UTMI bank offset 0x44[9:4] ,调整值范围:0~63。
1) 查看当前值: cat /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/swing_trim
2) 设置: echo value > /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/swing_trim
1.1.4. disconnect detector reference voltage¶
位于UTMI bank offset 0x41[4:0] ,调整值范围:0~31。
1) 查看当前值: cat /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/disconnect_refer_voltage
2) 设置: echo value > /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/disconnect_refer_voltage
1.1.5. RX squelch calibration reference voltage¶
位于UTMI bank offset 0x4b[4:0] ,调整值范围:0~31。
1) 查看当前值: cat /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/squelch_refer_voltage
2) 设置: echo value > /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/squelch_refer_voltage
1.1.6. 眼图测试¶
1)开机进入kernel,执行下列命令之后可以接示波器查看眼图
2)眼图测试波形不符合要求时,可以调整上述5个参数,直到波形完美为止
测试highspeed眼图,执行:echo “hs” > /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/eye_diagram_switch
测试fullspeed眼图,执行:echo “fs” > /sys/kernel/debug/usb/phy-soc\:u2phy0@0x1f284200.0/eye_diagram_switch
1.2. USB 3.0¶
mHera USB3.0 Port 3使用PIPE PHY,Port 2使用SUPPHY,各自的驱动能力参数不同。
1.2.1. Port 3 - PIPE PHY¶
PIPE PHY驱动能力可调整的值有三项:idrv(驱动电流)、idem(去加重)和 biasi(偏置电流)。
1.2.1.1. idrv(TX驱动电流)¶
位于PHYD Offset 0x41[7:2],调整范围:0~63,档位越高驱动电流越大。
查看当前idrv档位: cat /sys/kernel/debug/usb/phy-1f2a5200.pipe.6/tx-idrv
修改idrv档位: echo level > /sys/kernel/debug/usb/phy-1f2a5200.pipe.6/tx-idrv
1.2.1.2. idem(TX去加重)¶
位于PHYD Offset 0x41[13:8],调整范围:0~63,档位越高去加重越强。
查看当前idem档位: cat /sys/kernel/debug/usb/phy-1f2a5200.pipe.6/tx-idem
修改idem档位: echo level > /sys/kernel/debug/usb/phy-1f2a5200.pipe.6/tx-idem
1.2.1.3. biasi(TX偏置电流)¶
位于PHYD Offset 0x26[3:1],调整范围:0~7,档位越高偏置电流越大。
查看当前biasi档位: cat /sys/kernel/debug/usb/phy-1f2a5200.pipe.6/tx-biasi
修改biasi档位: echo level > /sys/kernel/debug/usb/phy-1f2a5200.pipe.6/tx-biasi
1.2.2. Port 2 - SUPPHY¶
SUPPHY驱动能力可调整的值有三项:swing-mode(摆幅模式选择)、swing-amplitude(低摆幅幅值)和tx-deemphasis(发送去加重)。
1.2.2.1. swing-mode(摆幅模式选择)¶
位于PHYD Offset 0x02[1:0],用于切换Full-Swing和Low-Swing模式。
| 值 | 模式 |
|---|---|
| 2 | Full-Swing(全摆幅) |
| 3 | Low-Swing(低摆幅) |
查看当前模式: cat /sys/kernel/debug/usb/phy-1f2b2600.pipe.7/swing-mode
切换为Low-Swing模式: echo 3 > /sys/kernel/debug/usb/phy-1f2b2600.pipe.7/swing-mode
切换为Full-Swing模式: echo 2 > /sys/kernel/debug/usb/phy-1f2b2600.pipe.7/swing-mode
1.2.2.2. swing-amplitude(低摆幅幅值)¶
配置SUPPHY低摆幅模式的幅值档位,仅在 Low-Swing 模式下可配置和显示。位于PHYD Offset 0x10[7:0],通过档位值0~5控制。
| 档位 | 寄存器值 | 描述 |
|---|---|---|
| 0 | 0x6C | -1.5dB (84%) |
| 1 | 0x60 | -2.5dB (75%) |
| 2 | 0x56 | -3.5dB (67%) |
| 3 | 0x4D | -4.5dB (60%) |
| 4 | 0x40 | -6dB (50%) |
| 5 | 0x36 | -7.6dB (42%) |
查看当前档位: cat /sys/kernel/debug/usb/phy-1f2b2600.pipe.7/swing-amplitude
设置档位: echo 3 > /sys/kernel/debug/usb/phy-1f2b2600.pipe.7/swing-amplitude
1.2.2.3. tx-deemphasis(TX去加重幅值)¶
位于PHYD Offset 0x02[7:6](幅值)和PHYD Offset 0x03[8](使能),调整范围:0~2。写入任意值时会自动使能去加重(PHYD 0x03[8]=1)。
| 值 | 去加重幅度 |
|---|---|
| 0 | -6dB |
| 1 | -3.5dB |
| 2 | 0dB |
查看当前tx-deemphasis值: cat /sys/kernel/debug/usb/phy-1f2b2600.pipe.7/tx-deemphasis
修改tx-deemphasis值: echo value > /sys/kernel/debug/usb/phy-1f2b2600.pipe.7/tx-deemphasis
1.3. SDMMC 驱动能力配置¶
1.3.1. 通过sysfs配置驱动能力¶
SDMMC driver有提供sysfs控pin脚driving能力,使用方法是:
1. cd /sys/devices/soc0/soc/<reg>:sgs_sdmmc[i]
2. # <reg> -根据dtsi实际配置信息生成reg值
3. # [i] -根据dtsi实际配置信息生成index值
4. echo [slotNo] <signal> [level] > set_sdmmc_driving_control
5. # 设置[slotNo]的<signal>信号线的驱动能力为[level]。
6. # [slotNo] -选择操作的slot。
7. # <signal> -可以选择设置clk、cmd、data、all或空值(等同all)。
8. # [level] -driving能力挡位,取值范围0~7。
将sd的所有信号脚的driving能力设置为2
将emmc的四根data脚的driving能力设置为1:
1.3.2. 通过dts配置驱动能力¶
SDMMC driver支持从dts中配置clk,cmd和data信号线的driving能力,配置方法如下:
1. sgs_sdmmc0: sgs_sdmmc0 {
2. compatible = "sgs,sdmmc";
3. bus-width = <4>;
4. no-sdio;
5. no-sd;
6. …
7. clk-driving = <2>,<0>,<0>;
8. cmd-driving = <2>,<0>,<0>;
9. data-driving = <2>,<0>,<0>;
10. …
11. }
1. sgs_sdmmc1: sgs_sdmmc1 {
2. compatible = "sgs,sdmmc";
3. bus-width = <4>;
4. no-mmc;
5. …
6. clk-driving = <2>,<0>,<0>;
7. cmd-driving = <2>,<0>,<0>;
8. data-driving = <2>,<0>,<0>;
9. …
10. }
如上图,这三项属性参数分别是配置clk线,cmd线和四根data线的driving能力。可以看到每项参数都有三个值,这三个值分别代表每个slot的驱动能力,驱动档位由实际选择的PAD 决定,具体可参考相关的GPIO PAD配置文档。
1.4. DISP¶
1.4.1. 驱动能力调整¶
DISP driver支持从屏参中配置panel pin脚的driving能力,配置方法如下:
1、配置padmux
padmux文件路径:
#arm32
kernel/arch/arm/boot/dts/$(boardname)-padmux.dtsi
#arm64
kernel/arch/arm64/boot/dts/sgs/$(boardname)-padmux.dtsi
根据当前所需的interface,将pandmux #if 0 更改为 #if 1。
2、屏参配置m_wPadDrvngLvl
屏参路径:
在屏参中增加并配置m_wPadDrvngLvl,重新跑disp出图,便可统一调整Pin脚的driving档位。
不同pin脚可配置的driving档位可能有所差异,具体可参考相关的GPIO PAD配置文档
3、VGA驱动能力配置/查看
配置驱动能力:
查看驱动能力:
其中 RTrim/GTrim/BTrim 取值范围为 0x00 ~ 0x7F,取值越大 driving 越大。
1.4.2. clk正反向配置¶
屏参路径:
在屏参中配置m_bPanelInvDCLK,重新跑disp出图,便可调整clk正反向。
1.5. SATA¶
1.5.1. HW CTS 设定¶
通过 Sysfs 接口进行 SATA PHY 层信号质量调优,确认后的参数须更新到 dts 中,SATA driver 才会使用调整好的 CTS 参数。
Sysfs 路径:/sys/devices/virtual/sgs/sata 或 sata1
注意:必须先设定传输速率(test_gen),再设定测试模式(cts_pattern),因为 PHY 驱动在进入 CTS pattern 时需要先获知速率信息。
a. 设定传输速率(test_gen)
| test_gen | 传输速率 | 说明 |
|---|---|---|
| 0 | 1.5 Gbps | SATA GEN1 |
| 1 | 3.0 Gbps | SATA GEN2 |
| 2 | 6.0 Gbps | SATA GEN3 |
b. 设定测试模式(cts_pattern)
| cts_pattern | 模式名称 | 说明 |
|---|---|---|
| 0 | HFTP | High Frequency Test Pattern |
| 1 | MFTP | Mid Frequency Test Pattern |
| 2 | LFTP | Low Frequency Test Pattern |
| 3 | LBP | Low Bit Pattern |
| 4 | SSOP | Spread Spectrum Oscillation Pattern |
c. 设定 TX 参数(de_emphasis)
TX 参数包括去加重(De-emphasis)和电压摆幅(Vpp),用于优化信号质量:
| 参数 | 说明 | 可选值 |
|---|---|---|
enable |
GEN3 去加重使能 | 0=仅使用Vpp, 1=启用去加重 |
db |
去加重档位(仅 enable=1 有效) | 0=-1.5dB, 1=-2.5dB, 2=-3.5dB, 3=-6.0dB |
level |
电压摆幅档位 | 0~8,详见下表 |
电压摆幅(Vpp)各档位及 GEN 支持:
| level | 电压摆幅 | GEN1 | GEN2 | GEN3 |
|---|---|---|---|---|
| 0 | 0.4 Vpp | 支持 | 支持 | 支持 |
| 1 | 0.5 Vpp | 支持 | 支持 | 支持 |
| 2 | 0.6 Vpp | 支持 | 支持 | 支持 |
| 3 | 0.7 Vpp | 支持 | 支持 | 支持 |
| 4 | 0.8 Vpp | 支持 | 支持 | 支持 |
| 5 | 0.9 Vpp | - | 支持 | 支持 |
| 6 | 1.0 Vpp | - | - | 支持 |
| 7 | 1.1 Vpp | - | - | 支持 |
| 8 | 1.2 Vpp | - | - | 支持 |
GEN1/GEN2 仅支持 Vpp 调整,去加重功能仅在 GEN3 模式下可用。
配置示例:
# GEN3:不使用去加重,0.7Vpp
echo 0 0 3 > de_emphasis
# GEN3:-2.5dB 去加重 + 0.8Vpp(中距离传输)
echo 1 1 4 > de_emphasis
# GEN3:-6.0dB 去加重 + 1.0Vpp(长距离传输)
echo 1 3 6 > de_emphasis
1.5.2. 通过 dts 配置涉硬参数¶
CTS 测试确认的最佳参数需更新到 dts 中,Sysfs 命令 echo [enable] [db] [level] > de_emphasis 与 DTS 参数 tx_gen3_de_emphasis = <enable>, <db>, <level> 一一对应。0xFF 表示使用默认值。
sgs_sataphy: sgs-sata-phy {
compatible = "sgs,sataphy";
…
phy_mode = <2>; /* PHY速率模式:0=GEN1, 1=GEN2, 2=GEN3 */
tx_ssc_mode = <0>; /* 扩频时钟:0=关闭, 1=开启 */
tx_gen1_gen2_Vpp = <0xFF>,<0xFF>; /* GEN1/GEN2 发送电压摆幅, 0xFF=默认 */
tx_gen3_de_emphasis = <0xFF>,<0xFF>,<0xFF>; /* GEN3: <enable>,<db>,<level>, 0xFF=默认 */
rx_eq_rs1 = <0xFF>,<0xFF>,<0xFF>; /* 接收均衡参数 RS1, 0xFF=默认 */
rx_eq_rs2 = <0xFF>,<0xFF>,<0xFF>; /* 接收均衡参数 RS2, 0xFF=默认 */
rx_eq_ctle = <0xFF>; /* 接收均衡参数 CTLE, 0xFF=默认 */
…
};
DTS 配置示例:
/* 示例1:GEN3 使用 -2.5dB 去加重 + 0.8Vpp */
tx_gen3_de_emphasis = <1>, <1>, <4>;
/* 示例2:GEN3 仅使用 Vpp(不启用去加重),0.7Vpp */
tx_gen3_de_emphasis = <0>, <0xFF>, <3>;
/* 示例3:GEN1/GEN2 的 Vpp,两个值分别对应 GEN1 和 GEN2 */
tx_gen1_gen2_Vpp = <3>, <3>; /* GEN1=0.7Vpp, GEN2=0.7Vpp */
1.6. HDMITX¶
1.6.1. 驱动能力调整¶
HDMITX driver支持echo 命令的方式配置driving能力,配置方法如下:
echo Tap1Ch0 Tap1Ch1 Tap1Ch2 Tap1Ch3 Tap2Ch0 Tap2Ch1 Tap2Ch2 Tap2Ch3 RetrmCh PreDrvCh MuCh > /proc/mi_modules/mi_hdmi/debug_hal/turndrv
获取配置方法:
1.6.2. SSC¶
展频设置支持 auto/manual 调整。
auto 调整方式如下:
manual 调整方式如下:
获取调整参数方式:
1.7. IIC¶
1.7.1. IIC 驱动能力配置¶
IIC驱动能力同时受其使用GPIO的推动能力和IIC IP设置影响,前者配置方法可参考GPIO调试方法,后者调整方法如下;
IIC IP 关于驱动能力有四个配置可调,如下表:
| Mode Num | Mode Name | description |
|---|---|---|
| Mode 1 | Pure Open drain | 纯开漏输出无偷推,此时上升速度最慢 |
| Mode 2 | PUSH EN | 偷推1T, 上升速度较mode 1更快 |
| Mode 3 | PUSH EN M+ | 偷推16T,上升速度较mode 2更快 |
| Mode 4 | PUSH PULL | 推挽输出模式,上升速度较快 |
IIC IP 驱动能力需要在dtsi文件的iic节点中配置,文件路径:
#arm32
kernel/arch/arm/boot/dts/$(boardname).dtsi
#arm64
kernel/arch/arm64/boot/dts/sgs/$(boardname).dtsi
节点属性如下,修改output-mode为目标mode再编译即能改变iic ip输出模式配置:
i2c0: i2c@1f223000 {
compatible = "sgs,i2c";
reg = <0x1F223000 0x200>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <GIC_SPI INT_IRQ_MIIC_0 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&CLK_miic0>;
dma-enable;
group = <0>;
speed = <200000>;
//if u want set tSU/tHD, it should be set to a non-zero value, with units in ns
t-su-sta = <0>;
t-hd-sta = <0>;
t-su-sto = <0>;
t-hd-sto = <0>;
//1->open drain; 2->open drain + one push; 3->open drain + mult push; 4->push-pull
output-mode = <2>;
status = "okay";
};
1.8. PWM¶
1.8.1. PWM驱动能力调整¶
PWM的驱动能力受其使用的GPIO驱动能力影响,后者配置方法可参考GPIO调试方法。
1.9. MSPI¶
1.9.1. MSPI驱动能力调整¶
MSPI的驱动能力受其使用的GPIO驱动能力影响,后者配置方法可参考GPIO调试方法。
1.10. UART¶
1.10.1. UART驱动能力调整¶
UART的驱动能力受其使用的GPIO驱动能力影响,后者配置方法可参考GPIO调试方法。
1.11. PCIe¶
通过debugfs接口可以在运行时调整PCIe PHY的信号参数,用于信号质量调试。前提条件:内核需要开启 CONFIG_DEBUG_FS 配置。
debugfs节点路径为 /sys/kernel/debug/pcie\<port>/,其中 \<port> 为PCIe端口号(0或1)。
1.11.1. swing_mode(摆幅模式)¶
配置PCIe发送端的摆幅模式。
| 值 | 描述 |
|---|---|
| 0 | Full-swing(全摆幅) |
| 1 | Low-swing(低摆幅) |
-
查看当前值:cat /sys/kernel/debug/pcie0/swing_mode
-
设置:echo 1 > /sys/kernel/debug/pcie0/swing_mode
1.11.2. swing_amplitude(摆幅幅值)¶
配置PCIe发送端的摆幅幅值档位,仅在 Low-swing 模式下可配置和显示。PCIe有两个lane,配置时同时作用于两个lane。
| 档位 | 寄存器值 | 描述 |
|---|---|---|
| 0 | 0x6C | -1.5dB (84%) |
| 1 | 0x60 | -2.5dB (75%) |
| 2 | 0x56 | -3.5dB (67%) |
| 3 | 0x4D | -4.5dB (60%) |
| 4 | 0x40 | -6dB (50%) |
| 5 | 0x36 | -7.6dB (42%) |
-
查看当前值:cat /sys/kernel/debug/pcie0/swing_amplitude
-
设置:echo 3 > /sys/kernel/debug/pcie0/swing_amplitude
1.11.3. de_emphasis_us(去加重 - 上游端口)¶
配置PCIe上游端口(EP模式)的去加重参数,仅在 Full-swing 模式下可配置和显示,且仅在EP模式下可见。
| 值 | 描述 |
|---|---|
| 0 | -6dB |
| 1 | -3.5dB |
-
查看当前值:cat /sys/kernel/debug/pcie0/de_emphasis_us
-
设置:echo 1 > /sys/kernel/debug/pcie0/de_emphasis_us
1.11.4. de_emphasis_ds(去加重 - 下游端口)¶
配置PCIe下游端口(RC模式)的去加重参数,仅在 Full-swing 模式下可配置和显示,且仅在RC模式下可见。
| 值 | 描述 |
|---|---|
| 0 | -6dB |
| 1 | -3.5dB |
-
查看当前值:cat /sys/kernel/debug/pcie0/de_emphasis_ds
-
设置:echo 1 > /sys/kernel/debug/pcie0/de_emphasis_ds
1.11.5. status(状态总览)¶
以只读方式显示当前所有PHY参数的配置。
2. 数字接口驱动能力调整¶
2.1. 使用背景¶
由于GPIO lib 不支持 GPIO 上下拉及驱动能力的接口,导致我司的 GPIO Hal 层驱动缺少对 GPIO 上下拉和驱动能力设置的支持。然而在日常使用中,GPIO 的上下拉及驱动能力经常需要动态调整,所以增加上下拉及驱动能力设置 API 和用户层接口变得十分必要。
2.2. 内核接口¶
2.2.1. sgs_gpio_pull_up¶
-
目的
开启指定的 GPIO 上拉功能
-
语法
U8 sgs_gpio_pull_up(U8 gpio_index) -
参数
Parameter Commemt gpio index gpio num -
返回值
Return Value Commemt 0 设置成功 Other 引脚不支持上下拉设置或者输入参数错误
2.2.2. sgs_gpio_pull_down¶
-
目的
开启指定的 GPIO 下拉功能
-
语法
U8 sgs_gpio_pull_down(U8 gpio_index) -
参数
Parameter Commemt gpio index gpio num -
返回值
Return Value Commemt 0 设置成功 Other 引脚不支持上下拉设置或者输入参数错误
2.2.3. sgs_gpio_pull_off¶
-
目的
关闭指定的 GPIO 上/下拉功能,该 GPIO 切换至悬空态
-
语法
U8 sgs_gpio_pull_off(U8 gpio_index) -
参数
Parameter Commemt gpio index gpio num -
返回值
Return Value Commemt 0 设置成功 Other 引脚不支持上下拉设置或者输入参数错误
2.2.4. sgs_gpio_drv_set¶
-
目的
设置指定的 GPIO 的驱动能力
-
语法
U8 sgs_gpio_drv_set(U8 gpio_index, U8 level) -
参数
Parameter Commemt gpio index gpio num level 所能支持的驱动能力等级:0、1、2、3... -
返回值
Return Value Commemt 0 设置成功 Other 引脚不支持上下拉设置或者输入参数错误
2.3. 用户层调试方法¶
2.3.1. 开启功能¶
要使用用户层接口需要打开 CONFIG_MSYS_GPIO,该配置位于menuconfig中:
2.3.2. 使用功能¶
设置上/下拉之前需要将 GPIO 设置为输入状态,输出状态下上下拉是没办法测量的:
设置上拉、下拉或者悬空:
查看当前状态:
以PAD_PM_GPIO0为例,设置为输入:
设置为上拉:
1. # cd sys/class/sgs/msys
2. # echo 71 up > gpio_pull
3. # echo PAD_PM_GPIO0 up > gpio_pull //the same to above
设置为悬空:
1. # cd sys/class/sgs/msys
2. # echo 71 off > gpio_pull
3. # echo PAD_PM_GPIO0 off > gpio_pull //the same to above
查看当前状态:
设置驱动能力之前需要将 GPIO 设置为输出高电平状态方便测量:
调节驱动能力:
以PAD_PM_GPIO0设置为8mA为例
1. # cd /sys/class/gpio
2. # echo 71 > export
3. # echo high > gpio71 /direction
4. # cd sys/class/sgs/msys
5. # echo 71 1 > gpio_drive
6. # echo PAD_PM_GPIO0 1 > gpio_drive //the same to above
每次执行echo指令后,可以通过cat同一个文件确定上一条echo命令的状态。