Skip to main content

Linux SATA 开发指南

:::info 文档信息

文档标识:RK-KF-YF-148 · 发布版本:V2.0.0 · 发布日期:2021-12-23 · 页数:8 · 语言:中文

原始文档:Rockchip_Developer_Guide_SATA_CN.pdf

:::

章节大纲​

  • Linux SATA 开发指南(P1)
    • 芯片资源介绍(P4)
    • DTS 配置(P4)
    • menuconfig 配置(P6)
    • 常见问题(P6)

在线预览​

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


1. 芯片资源介绍​

RK3566

资源模式支持PM芯片扩展PHY复用备注
SATA16G/3G/1.5G支持USB、QSGMII
SATA26G/3G/1.5G支持PCIE、QSGMII

RK3568

资源速率支持PM芯片扩展PHY复用备注
SATA06G/3G/1.5G支持USB
SATA16G/3G/1.5G支持USB、QSGMII
SATA26G/3G/1.5G支持PCIE、QSGMII

2. DTS 配置​

RK3566

资源参考配置控制器节点PHY节点
SATA1rk3568.dtsisata1combphy1 usq _
SATA2rk3568.dtsisata2combphy2 psq _

RK3568

资源参考配置控制器节点PHY节点
SATA0rk3568.dtsisata0combphy0 us _
SATA1rk3568.dtsisata1combphy1 usq _
SATA2rk3568.dtsisata2combphy2 psq _

RK3588

资源参考配置控制器节点PHY节点
SATA0rk3588s.dtsisata0combphy0 ps _
SATA1rk3588.dtsisata1combphy1 ps _
SATA2rk3588s.dtsisata2combphy2 psu _

RK3588s

资源参考配置控制器节点PHY节点
SATA0rk3588s.dtsisata0combphy0 ps _
SATA2rk3588s.dtsisata2combphy2 psu _
1. compatible = "rockchip,rk-ahci", "snps,dwc-ahci";

必须配置项:默认配置,对应驱动:drivers/ata/ahci_platform.c。

2. phy-names = "sata-phy“;

必须配置项:不可以修改,AHCI驱动会根据"sata-phy“名字找到对应combphy节点。

3. status = <okay>;

必须配置项:此配置需要在 SATA控制器节点和对应的 phy 节点同时使能。

4. assigned-clock-rates = <100000000>;

必须配置项:可以配置的参考时钟频率值有:24000000、25000000和100000000,推荐配置100000000。

5. pinctrl-0 = <&sata_pm_reset>;
sata_pm_reset: sata-pm-reset {
rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_output_high>;
&combphy1_usq {
pinctrl-names = "default";
pinctrl-0 = <&sata_pm_reset>;

可选配置项:外接PM芯片扩展SATA口时,可能需要一个GPIO来复位PM芯片,具体可以参考“rk3568- nvr-demo-v10.dtsi”里面设置。

6. pinctrl-0 = <&sata2_pins>;
&sata0 {
pinctrl-names = "default";
pinctrl-0 = <&sata0_pins>;
&sata1 {
pinctrl-names = "default";
pinctrl-0 = <&sata1_pins>;
&sata2 {
pinctrl-names = "default";
pinctrl-0 = <&sata2_pins>;

可选配置项:在对应的sata控制器节点增加pinctrl配置来启用SATA ACT LED功能。

3. menuconfig 配置​

需要确保如下配置打开,方可正确的使用 SATA相关功能。

CONFIG_ATA=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y

4. 常见问题​

Q1: 是否支持通过SATA接口给PM芯片下载固件?

A1: 目前验证过JMB575,没法下载固件。需要外接一个SPI NOR用于存放JMB575最新固件。

Q2: SATA性能怎么测试?

A2: 参考文档 RK-KF-YF-138 《Rockchip_RK3568_Reference_SATA_Performance_CN》。

Q3: 默认SDK代码认不到SATA设备,什么原因?

A3: 软件情况1:第一版SDK代码单独更新uboot后,会出现这个问题,需要更新一下kernel下phy驱动。

commit b3f78165e536d35b2337063093bb33a018ff518d
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Wed Dec 23 16:17:31 2020 +0800
phy: rockchip: naneng-combphy: Reset phy if not being used
Change-Id: Ia62481ebf5aa5684c359fd00a3933bb02e2caaff
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>

软件情况2: SATA和PCIE只能二选一,DTS里面需要把PCIE配置为disabled

硬件情况: SATA和PCIE只能二选一,如果有做兼容布板会影响信号,把PCIE走线部分的分支割掉。

Q4: 如何限制SATA速度到1.5G或者3G?

A4:限制到1.5G补丁:

diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
index 08445c1890eb..3df0e0e05ab4 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -604,7 +604,7 @@ static const struct rockchip_combphy_grfcfg
rk3568_combphy_grfcfgs = {
.con2_for_sata         = { 0x0008, 15, 0, 0x00, 0x80c3 },
.con3_for_sata         = { 0x000c, 15, 0, 0x00, 0x4407 },
/* pipe-grf */
-       .pipe_con0_for_sata     = { 0x0000, 15, 0, 0x00, 0x2220 },
+       .pipe_con0_for_sata     = { 0x0000, 15, 0, 0x00, 0x0000 },
.pipe_sgmii_mac_sel     = { 0x0040, 1, 1, 0x00, 0x01 },
.pipe_xpcs_phy_ready   = { 0x0040, 2, 2, 0x00, 0x01 },
.u3otg0_port_en         = { 0x0104, 15, 0, 0x0181, 0x1100 },

限制到3G补丁:

diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
index 08445c1890eb..3df0e0e05ab4 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -604,7 +604,7 @@ static const struct rockchip_combphy_grfcfg
rk3568_combphy_grfcfgs = {
.con2_for_sata         = { 0x0008, 15, 0, 0x00, 0x80c3 },
.con3_for_sata         = { 0x000c, 15, 0, 0x00, 0x4407 },
/* pipe-grf */
-       .pipe_con0_for_sata     = { 0x0000, 15, 0, 0x00, 0x2220 },
+       .pipe_con0_for_sata     = { 0x0000, 15, 0, 0x00, 0x1110 },
.pipe_sgmii_mac_sel     = { 0x0040, 1, 1, 0x00, 0x01 },
.pipe_xpcs_phy_ready   = { 0x0040, 2, 2, 0x00, 0x01 },
.u3otg0_port_en         = { 0x0104, 15, 0, 0x0181, 0x1100 },

**Q5: RK356X怎么启用FBS功能?

A5: 更新下面补丁,然后dtsi修改sata的节点 compatible = "rockchip,rk-ahci", "snps,dwc-

ahci";
diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
index 3aab2e3d57f3..1825b33cc274 100644
--- a/drivers/ata/ahci_platform.c
+++ b/drivers/ata/ahci_platform.c
@@ -62,6 +62,9 @@ static int ahci_probe(struct platform_device *pdev)
if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci"))
hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ;
+       if (of_device_is_compatible(dev->of_node, "rockchip,rk-ahci"))
+               hpriv->flags |= AHCI_HFLAG_YES_FBS;
+
port = acpi_device_get_match_data(dev);
if (!port)
port = &ahci_port_info;
@@ -88,6 +91,7 @@ static const struct of_device_id ahci_of_match[] = {
{ .compatible = "snps,dwc-ahci", },
{ .compatible = "hisilicon,hisi-ahci", },
{ .compatible = "cavium,octeon-7130-ahci", },
+       { .compatible = "rockchip,rk-ahci", },
{},