跳转至

SATA Host 使用说明


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 01/06/2026
    1.1
  • 修改 CTS 设定流程顺序:先设定传输速率(test_gen),再设定测试模式(cts_pattern)
  • 05/11/2026

    1. 概述

    本文档介绍 Mhera 平台 SATA Host 控制器的使用方法,包括 U-Boot 和 Kernel 两个阶段的配置说明。

    SATA 控制器包含以下两个主要模块:

    • AHCI Controller:高级主机控制器接口,负责 SATA 协议处理

    • SATA PHY:物理层接口,负责信号传输和电气特性控制

    💡 提示:Mhera 平台支持两路独立的 SATA Port,可同时连接两个 SATA 设备。

    2. 关键词说明

    术语 全称 说明
    AHCI Advanced Host Controller Interface 进阶主机控制器接口,定义了主机控制器与 SATA 设备之间的通信规范
    ATA Advanced Technology Attachment 连接 HDD 等存储设备的接口标准
    SATA Serial ATA 串行 ATA,采用串行方式传输数据的总线接口
    PHY Physical Layer 物理层,负责信号的编码、解码和传输
    PMP Port Multiplier 端口倍增器,用于扩展 SATA 接口数量
    FBS FIS-Based Switching 基于 FIS 的切换机制,提高 PMP 性能

    3. 功能特性

    设备支持

    • 支持 HDD(机械硬盘)、SSD(固态硬盘)、CD-ROM 等标准 SATA 设备
    • 支持端口倍增器(PMP),可扩展单个 SATA 接口连接多个设备

    传输速率

    • 支持 SATA GEN1(1.5 Gbps)
    • 支持 SATA GEN2(3.0 Gbps)
    • 支持 SATA GEN3(6.0 Gbps)

    硬件规格

    • Mhera 平台提供 2 路 独立的 SATA Port
    • 每路 Port 配备独立的 PHY 和 AHCI 控制器
    • 支持 DMA 一致性(dma-coherent)优化

    4. U-Boot 用法介绍

    本节介绍 U-Boot 阶段的 SATA Host 驱动配置和使用方法。

    4.1 驱动配置

    4.1.1 menuconfig 配置

    在 U-Boot 源码目录下执行 make menuconfig,按照以下路径启用 SATA 驱动:

    Device Drivers
    └── [*] Sgs drivers  --->
        ├── [*]   Sgs ACP Bridge driver
        └── [*]   Sgs SATA HOST
            ├── [*]     Sgs sata apply hd link
            └── [*]     Sgs sata apply hd link vote
    

    ⚠️ 注意:必须选中所有上述选项才能完整启用 SATA Host 功能。

    4.1.2 DTS 节点配置

    在 U-Boot 设备树文件中添加以下节点配置。注意:U-Boot 和 Kernel 的 DTS 配置略有不同。

    4.1.2.1 SATA Port0 配置
    /* SATA Port0 PHY 配置 */
    sgs_sataphy: sgs-sata-phy {
        compatible = "sgs,sataphy";
        reg-names = "phyd", "phya", "ahci_misc", "phya2";
        reg = <0x1F287600 0x200>, <0x1F287800 0x200>, <0x1F287400 0x200>, <0x1F287a00 0x200>;
        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 去加重参数 */
        rx_eq_rs1 = <0xFF>,<0xFF>,<0xFF>;    /* 接收均衡参数 RS1 */
        rx_eq_rs2 = <0xFF>,<0xFF>,<0xFF>;    /* 接收均衡参数 RS2 */
        rx_eq_ctle = <0xFF>;                 /* 接收均衡参数 CTLE */
    
        port_id = <0>;                       /* Port 编号:0 表示第一路 SATA */
        #phy-cells = <0>;
        status = "okay";
    };
    
    /* SATA Port0 AHCI 控制器配置 */
    sata {
        compatible = "sgs,sata";
        reg-names = "ahci", "ahci_port0";
        reg = <0x1F346800 0x100>, <0x1F346900 0x100>;
        phy-names = "sataphy";
        phys = <&sgs_sataphy>;               /* 引用对应的 PHY 节点 */
        fbs_mode;                            /* 启用 FIS-Based Switching 模式 */
        sata_acp;                            /* 启用 ACP 模式 */
        dma-coherent;                        /* 启用 DMA 一致性优化 */
        status = "okay";
    };
    
    4.1.2.2 SATA Port1 配置
    /* SATA Port1 PHY 配置 */
    sgs_sata1phy: sgs-sata1-phy {
        compatible = "sgs,sataphy";
        reg-names = "phyd", "phya", "ahci_misc", "phya2";
        reg = <0x1F288400 0x200>, <0x1F288600 0x200>, <0x1F288200 0x200>, <0x1F288800 0x200>;
        phy_mode = <2>;
        tx_ssc_mode = <0>;
        tx_gen1_gen2_Vpp = <0xFF>,<0xFF>;
        tx_gen3_de_emphasis = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_rs1 = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_rs2 = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_ctle = <0xFF>;
        port_id = <1>;                       /* Port 编号:1 表示第二路 SATA */
        #phy-cells = <0>;
        status = "okay";
    };
    
    /* SATA Port1 AHCI 控制器配置 */
    sata1 {
        compatible = "sgs,sata";
        reg-names = "ahci", "ahci_port0";
        reg = <0x1F346A00 0x100>, <0x1F346B00 0x100>;
        phy-names = "sataphy";
        phys = <&sgs_sata1phy>;              /* 引用对应的 PHY 节点 */
        fbs_mode;
        sata_acp;
        dma-coherent;
        status = "okay";
    };
    

    4.1.3 DTS 参数说明

    4.1.3.1 AHCI 控制器参数
    属性 说明 是否需要修改
    compatible 用于驱动匹配,标识设备类型 ❌ 禁止修改
    reg-names 寄存器区域名称列表 ❌ 不需要修改
    reg 寄存器地址和大小 ❌ 不需要修改
    phy-names PHY 名称列表 ❌ 不需要修改
    phys 引用的 PHY 节点 ❌ 不需要修改
    fbs_mode 启用 FIS-Based Switching 模式 ❌ 不需要修改
    sata_acp 启用 ACP 模式 ❌ 不需要修改
    dma-coherent 启用 DMA 一致性优化 ❌ 不需要修改
    status 设备状态("okay"/"disabled") ✅ 可选修改
    4.1.3.2 PHY 参数
    属性 说明 可配置值 是否需要修改
    compatible 用于驱动匹配 "sgs,sataphy" ❌ 禁止修改
    reg 寄存器地址和大小 固定地址 ❌ 不需要修改
    reg-names 寄存器区域名称列表 "phyd","phya","ahci_misc","phya2" ❌ 不需要修改
    phy_mode PHY 速率模式 0=GEN1, 1=GEN2, 2=GEN3 ✅ 根据需求修改
    tx_ssc_mode 扩频时钟模式 0=关闭, 1=开启 ✅ 根据需求修改
    tx_gen1_gen2_Vpp GEN1/GEN2 发送电压摆幅 0xFF=默认值 ✅ 根据信号质量调整
    tx_gen3_de_emphasis GEN3 去加重参数 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    rx_eq_rs1 接收均衡参数 RS1 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    rx_eq_rs2 接收均衡参数 RS2 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    rx_eq_ctle 接收均衡参数 CTLE 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    port_id Port 编号 0=Port0, 1=Port1 ❌ 不需要修改
    status PHY 使能状态 "okay" / "disabled" ✅ 可选修改

    💡 提示:PHY 参数中的 0xFF 值表示使用默认配置。如需优化信号质量,请参考第 6 节 HW CTS 设定流程。

    4.1.4 命令行使用实例

    U-Boot 提供了 scsi 命令集来操作 SATA 设备(SATA 设备在 U-Boot 中被识别为 SCSI 设备)。

    4.1.4.1 设备扫描与信息查询
    # 重置并扫描 SCSI 总线,检测新设备或变化的设备
    scsi reset
    scsi scan
    
    # 显示所有可用的 SCSI 设备信息
    scsi info
    
    # 选择或显示当前 SCSI 设备([dev] 为设备编号)
    scsi device [dev]
    
    # 显示指定设备的分区表(不指定 dev 则显示所有设备)
    scsi part [dev]
    
    4.1.4.2 数据读写操作
    # 从 SCSI 设备读取数据到内存
    # 用法:scsi read <内存地址> <起始块号> <块数量>
    scsi read addr blk# cnt
    
    # 从内存写入数据到 SCSI 设备
    # 用法:scsi write <内存地址> <起始块号> <块数量>
    scsi write addr blk# cnt
    
    4.1.4.3 FAT 文件系统操作
    # 列出 SCSI 设备根目录文件(设备编号 0)
    fatls scsi 0
    
    # 从 FAT 文件系统加载文件到内存
    # 用法:fatload scsi <设备号> <内存地址> <文件名> <字节数> <位置>
    fatload scsi 0 addr filename bytes pos
    
    # 写入文件到 FAT 文件系统
    # 用法:fatwrite scsi <设备号> <内存地址> <文件名> <字节数> <偏移量>
    fatwrite scsi 0 addr filename bytes offset
    
    4.1.4.4 使用示例
    # 完整的 U-Boot SATA 启动流程示例
    => scsi reset
    => scsi scan
    => scsi info
    => scsi part 0
    => fatls scsi 0:1
    => fatload scsi 0:1 0x23000000 kernel.bin
    => bootm 0x23000000
    

    ⚠️ 注意

    • SATA 设备在 U-Boot 中通过 SCSI 子系统访问
    • 使用前必须先执行 scsi resetscsi scan
    • 设备编号通常从 0 开始

    5. Kernel 用法介绍

    本节介绍 Linux Kernel 阶段的 SATA Host 驱动配置和使用方法。

    5.1 驱动配置

    5.1.1 menuconfig 配置

    在 Linux Kernel 源码目录下执行 make menuconfig,按照以下路径启用 SATA 驱动:

    Device Drivers
    ├── SCSI device support --->
    │   ├── [*] SCSI device support
    │   ├── [*] legacy /proc/scsi/support
    │   └── [*] SCSI disk support
    ├── [*] Serial ATA and Parallel ATA drivers (libata)
    │   ├── [*] SATA Port Multiplier support
    │   └── [*] Platform AHCI SATA support
    └── [*] SGS SoC platform drivers --->
        ├── [*]   Sgs ACP Bridge driver
        └── [*]   Sgs SATA HOST
            ├── [*]     Sgs sata apply hd link
            └── [*]     Sgs sata apply hd link vote
    

    💡 提示

    • 选择上述选项后,SATA 驱动将被编译进内核(Built-in)
    • 如果选择编译为模块(M),将生成 drv-sata-host.kodrv-sata-phy.ko 两个模块文件

    5.1.2 DTS 节点配置

    在 Kernel 设备树文件中添加以下节点配置。注意:与 U-Boot DTS 相比,Kernel DTS 需要额外的中断和时钟配置。

    5.1.2.1 SATA Port0 配置
    /* SATA Port0 PHY 配置 */
    sgs_sataphy: sgs-sata-phy {
        compatible = "sgs,sataphy";
        reg-names = "phyd", "phya", "phya2", "ahci_misc";  /* 注意顺序与 U-Boot 不同 */
        reg = <0x0 0x1F287600 0x200>, <0x0 0x1F287800 0x200>,
              <0x0 0x1F287a00 0x200>, <0x0 0x1F287400 0x200>;
    
        /* PHY 参数配置 */
        phy_mode = <2>;
        tx_ssc_mode = <0>;
        tx_gen1_gen2_Vpp = <0xFF>,<0xFF>;
        tx_gen3_de_emphasis = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_rs1 = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_rs2 = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_ctle = <0xFF>;
    
        port_id = <0>;
        #phy-cells = <0>;
        status = "ok";  /* Kernel 使用 "ok" 而非 "okay" */
    };
    
    /* SATA Port0 AHCI 控制器配置 */
    sata {
        compatible = "sgs,sata";
        reg-names = "ahci", "ahci_port0";
        reg = <0x0 0x1F346800 0x100>, <0x0 0x1F346900 0x100>;
    
        interrupts = <GIC_SPI INT_IRQ_SATA_MAC IRQ_TYPE_LEVEL_HIGH>;  /* 中断配置 */
    
        clocks = <&CLK_sata_pm>,      /* 电源管理时钟 */
                 <&CLK_sata_phy_108>,  /* PHY 108M 时钟 */
                 <&CLK_sata_phy_200>,  /* PHY 200M 时钟 */
                 <&CLK_sata_phy_432>;  /* PHY 432M 时钟 */
    
        phy-names = "sataphy";
        phys = <&sgs_sataphy>;
    
        fbs_mode;
        sata_acp;
        dma-coherent;
    };
    
    5.1.2.2 SATA Port1 配置
    /* SATA Port1 PHY 配置 */
    sgs_sata1phy: sgs-sata1-phy {
        compatible = "sgs,sataphy";
        reg-names = "phyd", "phya", "phya2", "ahci_misc";
        reg = <0x0 0x1F288400 0x200>, <0x0 0x1F288600 0x200>,
              <0x0 0x1F288800 0x200>, <0x0 0x1F288200 0x200>;
    
        phy_mode = <2>;
        tx_ssc_mode = <0>;
        tx_gen1_gen2_Vpp = <0xFF>,<0xFF>;
        tx_gen3_de_emphasis = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_rs1 = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_rs2 = <0xFF>,<0xFF>,<0xFF>;
        rx_eq_ctle = <0xFF>;
    
        port_id = <1>;
        #phy-cells = <0>;
        status = "ok";
    };
    
    /* SATA Port1 AHCI 控制器配置 */
    sata1 {
        compatible = "sgs,sata";
        reg-names = "ahci", "ahci_port0";
        reg = <0x0 0x1F346A00 0x100>, <0x0 0x1F346B00 0x100>;
    
        interrupts = <GIC_SPI INT_IRQ_SATA2_MAC IRQ_TYPE_LEVEL_HIGH>;
    
        clocks = <&CLK_sata2_pm>,
                 <&CLK_sata2_phy_108>,
                 <&CLK_sata2_phy_200>,
                 <&CLK_sata2_phy_432>;
    
        phy-names = "sata1phy";
        phys = <&sgs_sata1phy>;
    
        fbs_mode;
        sata_acp;
        dma-coherent;
    };
    

    5.1.3 DTS 参数说明

    5.1.3.1 AHCI 控制器参数(Kernel 额外配置)
    属性 说明 是否需要修改
    compatible 用于驱动匹配 ❌ 禁止修改
    #address-cells 子节点地址信息字长 ❌ 禁止修改
    #size-cells 子节点地址范围字长 ❌ 禁止修改
    interrupts 中断号及触发方式 ❌ 禁止修改
    clocks 时钟源引用 ❌ 禁止修改
    reg 寄存器地址和大小 ❌ 不需要修改
    reg-names 寄存器区域名称列表 ❌ 不需要修改
    phys 引用的 PHY 节点 ❌ 不需要修改
    phy-names PHY 名称列表 ❌ 不需要修改
    fbs_mode 启用 FIS-Based Switching 模式 ✅ 根据需求修改
    sata_acp 启用 ACP 模式 ❌ 不需要修改
    dma-coherent 启用 DMA 一致性优化 ❌ 不需要修改
    5.1.3.2 PHY 参数(Kernel 额外配置)
    属性 说明 可配置值 是否需要修改
    compatible 用于驱动匹配 "sgs,sataphy" ❌ 禁止修改
    reg 寄存器地址和大小 固定地址 ❌ 不需要修改
    reg-names 寄存器区域名称列表 "phyd","phya","phya2","ahci_misc" ❌ 不需要修改
    phy_mode PHY 速率模式 0=GEN1, 1=GEN2, 2=GEN3 ✅ 根据需求修改
    tx_ssc_mode 扩频时钟模式 0=关闭, 1=开启 ✅ 根据需求修改
    tx_gen1_gen2_Vpp GEN1/GEN2 发送电压摆幅 0xFF=默认值 ✅ 根据信号质量调整
    tx_gen3_de_emphasis GEN3 去加重参数 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    rx_eq_ctle 接收均衡参数 CTLE 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    rx_eq_rs1 接收均衡参数 RS1 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    rx_eq_rs2 接收均衡参数 RS2 详见第 6 节 CTS 设定 ✅ 根据信号质量调整
    status PHY 使能状态 "ok" / "disabled" ✅ 可选修改

    5.1.4 模块加载顺序

    如果 SATA 驱动编译为内核模块(.ko 文件),请按以下顺序加载:

    # 1. 先加载 PHY 驱动
    insmod drv-sata-phy.ko
    
    # 2. 再加载 AHCI Host 驱动
    insmod drv-sata-host.ko
    

    ⚠️ 注意

    • 必须先加载 drv-sata-phy.ko,再加载 drv-sata-host.ko
    • 如果驱动编译为 Built-in(内置),则无需手动加载模块
    • 模块加载成功后,系统会自动识别连接的 SATA 设备

    6. HW CTS 设定

    本节介绍如何通过 Sysfs 接口进行 SATA 信号质量调优。CTS(Compliance Test Suite)设定用于优化 PHY 层的传输参数,确保信号完整性。

    🎯 目标:通过调整 PHY 参数,优化 SATA 信号质量,解决连接不稳定、传输错误等问题。

    6.1 设定流程概览

    HW CTS 设定分为以下步骤,必须按顺序执行:

    1️⃣ 设定传输速率(Speed Mode)
    2️⃣ 设定测试模式(Pattern)
    3️⃣ 设定 TX 参数(去加重和电压摆幅)
    4️⃣ 将优化后的参数更新到 DTS
    

    ⚠️ 注意:必须先设定传输速率(test_gen),再设定测试模式(cts_pattern)。因为 PHY 驱动在进入 CTS pattern 时需要先获知速率信息才能正确进行 force speed。

    6.2 Sysfs 接口路径

    CTS 设定通过 Sysfs 接口完成,节点位于:

    # SATA Port0
    cd /sys/devices/virtual/sgs/sata0
    
    # SATA Port1
    cd /sys/devices/virtual/sgs/sata1
    

    6.3 步骤一:设定传输速率(Speed Mode)

    6.3.1 速率模式说明

    test_gen 值 传输速率 说明
    0 1.5 Gbps SATA GEN1
    1 3.0 Gbps SATA GEN2
    2 6.0 Gbps SATA GEN3

    6.3.2 配置方法

    # 1. 查看当前速率模式
    cat test_gen
    
    # 2. 设置为 GEN1 (1.5 Gbps)
    echo 0 > test_gen
    
    # 3. 设置为 GEN2 (3.0 Gbps)
    echo 1 > test_gen
    
    # 4. 设置为 GEN3 (6.0 Gbps)
    echo 2 > test_gen
    

    6.4 步骤二:设定测试模式(Pattern)

    6.4.1 Pattern 类型说明

    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

    6.4.2 配置方法

    # 1. 查看当前 Pattern 设置
    cat cts_pattern
    
    # 2. 设置 Pattern(例如设置为 HFTP)
    echo 0 > cts_pattern
    
    # 3. 设置 Pattern(例如设置为 MFTP)
    echo 1 > cts_pattern
    

    6.5 步骤三:设定 TX 参数

    TX 参数包括去加重(De-emphasis)和电压摆幅(Vpp),用于优化信号质量。

    6.5.1 参数格式

    echo [enable] [db] [level] > de_emphasis
    
    参数 说明 可选值
    enable GEN3 去加重使能 0=仅使用Vpp, 1=使用去加重
    db 去加重档位(仅 enable=1 时有效) 0~3
    level 电压摆幅档位 0~8

    6.5.2 去加重档位说明

    db 值 去加重强度 适用场景
    0 -1.5 dB 短距离传输
    1 -2.5 dB 中距离传输
    2 -3.5 dB 中长距离传输
    3 -6.0 dB 长距离传输

    6.5.3 电压摆幅说明

    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 调整(level 0~4 或 0~5)
    • GEN3 支持 Vpp 和去加重调整
    • 去加重功能仅在 GEN3 模式下可用

    6.5.4 配置示例

    场景 1:仅调整 Vpp(GEN1/GEN2/GEN3 通用)
    # GEN1/GEN2:使用 0.7Vpp(不使用去加重)
    echo 0 0 3 > de_emphasis
    
    # GEN3:使用 0.7Vpp(不使用去加重)
    echo 0 0 3 > de_emphasis
    
    场景 2:GEN3 使用去加重
    # GEN3:-1.5dB 去加重 + 0.7Vpp
    echo 1 0 3 > de_emphasis
    
    # GEN3:-3.5dB 去加重 + 0.8Vpp
    echo 1 2 4 > de_emphasis
    
    # GEN3:-6.0dB 去加重 + 1.0Vpp(长距离传输)
    echo 1 3 6 > de_emphasis
    

    6.6 DTS 参数映射

    完成 CTS 测试并确认最佳参数后,需要将参数更新到设备树文件中。

    6.6.1 参数对应关系

    Sysfs 命令格式:echo [enable] [db] [level] > de_emphasis

    对应的 DTS 参数:

    tx_gen3_de_emphasis = <[enable]>, <[db]>, <[level]>;
    

    6.6.2 特殊值说明

    含义 使用场景
    0xFF 使用默认值 不进行信号优化时
    0x00~0x03 db 档位 enable=1 时有效
    0x00~0x08 level 档位 电压摆幅档位

    6.6.3 DTS 配置示例

    示例 1:使用默认配置
    tx_gen3_de_emphasis = <0xFF>, <0xFF>, <0xFF>;
    
    示例 2:GEN3 仅使用 Vpp(不使用去加重)
    /* enable=0 (仅Vpp), db忽略, level=3 (0.7Vpp) */
    tx_gen3_de_emphasis = <0>, <0xFF>, <3>;
    
    示例 3:GEN3 使用去加重
    /* enable=1 (启用去加重), db=1 (-2.5dB), level=4 (0.8Vpp) */
    tx_gen3_de_emphasis = <1>, <1>, <4>;
    
    /* enable=1 (启用去加重), db=3 (-6.0dB), level=6 (1.0Vpp) */
    tx_gen3_de_emphasis = <1>, <3>, <6>;
    
    示例 4:GEN1/GEN2 配置
    /* GEN1/GEN2 仅使用 Vpp,不使用去加重 */
    tx_gen1_gen2_Vpp = <3>, <3>;  /* 两个值分别对应 GEN1 和 GEN2 */
    
    /* GEN3 de-emphasis 参数保留默认值(仅 GEN1/GEN2 生效时) */
    tx_gen3_de_emphasis = <0xFF>, <0xFF>, <0xFF>;
    

    6.7 完整配置流程示例

    假设通过测试确定最佳参数为:GEN3 模式,-2.5dB 去加重,0.8Vpp

    步骤 1:通过 Sysfs 验证参数

    # 1. 进入 SATA sysfs 目录
    cd /sys/devices/virtual/sgs/sata0
    
    # 2. 设置速率为 GEN3
    echo 2 > test_gen
    
    # 3. 设置测试模式为 MFTP
    echo 1 > cts_pattern
    
    # 4. 设置 TX 参数:-2.5dB 去加重 + 0.8Vpp
    echo 1 1 4 > de_emphasis
    
    # 5. 进行信号质量测试(使用示波器或其他测试设备)
    # 如果测试通过,说明参数配置正确
    

    步骤 2:更新到设备树

    将验证通过的参数写入设备树文件:

    sgs_sataphy: sgs-sata-phy {
        compatible = "sgs,sataphy";
        reg-names = "phyd", "phya", "ahci_misc", "phya2";
        reg = <0x1F287600 0x200>, <0x1F287800 0x200>,
              <0x1F287400 0x200>, <0x1F287a00 0x200>;
    
        phy_mode = <2>;                      /* GEN3 模式 */
        tx_ssc_mode = <0>;
    
        /* GEN1/GEN2 Vpp 配置 */
        tx_gen1_gen2_Vpp = <0xFF>, <0xFF>;   /* 使用默认值 */
    
        /* GEN3 配置:-2.5dB 去加重 + 0.8Vpp */
        tx_gen3_de_emphasis = <1>, <1>, <4>;
    
        /* RX 均衡参数(如有需要也可调整) */
        rx_eq_rs1 = <0xFF>, <0xFF>, <0xFF>;
        rx_eq_rs2 = <0xFF>, <0xFF>, <0xFF>;
        rx_eq_ctle = <0xFF>;
    
        port_id = <0>;
        #phy-cells = <0>;
        status = "okay";
    };
    

    步骤 3:重新编译并测试

    # 1. 重新编译
    # 2. 更新设备树到目标板
    # 3. 重启系统
    # 4. 验证 SATA 设备工作正常
    

    6.8 常见问题

    Q1:如何判断需要调整 CTS 参数?

    症状

    • SATA 设备无法识别
    • 传输过程中出现超时或 CRC 错误
    • 高速传输(GEN3)不稳定

    解决方案

    1. 先尝试降低速率(GEN3 → GEN2 → GEN1)
    2. 调整 Vpp 值(提高电压摆幅)
    3. 启用去加重功能(GEN3)

    Q2:enable 参数什么时候设为 0 或 1?

    • enable=0:仅使用 Vpp 调整,适用于 GEN1/GEN2 或不需要去加重的场景
    • enable=1:启用去加重,仅适用于 GEN3 长距离传输或信号质量差的场景

    Q3:如何选择合适的 level 值?

    level 电压 推荐场景
    0~2 0.4~0.6V 短距离传输(<0.5m)
    3~4 0.7~0.8V 中等距离(0.5~1m)
    5~8 0.9~1.2V 长距离(>1m)或信号差

    Q4:RX 均衡参数需要调整吗?

    通常情况下,TX 参数(Vpp 和去加重)已经足够。只有在 TX 参数调整后仍有问题时,才考虑调整 RX 均衡参数(rx_eq_rs1, rx_eq_rs2, rx_eq_ctle)。