Rockchip · AI & Linux Hub

Speicher und Netzwerk

Vollständiger Rockchip-RK3576-UFS-Leitfaden: DTS, LUNs, Vendor Storage und Debugging

Vollständiger Rockchip-RK3576-UFS-Leitfaden: DTS, LUNs, Vendor Storage und Debugging — RK-KF-YF-C15 V1.5.0, kernel 6.1.

· ArmSoM Editorial · Rockchip source documentation · 15 Min. Lesezeit

Der technische Inhalt von RK-KF-YF-C15 V1.5.0 wird vollständig übernommen: CN Seiten 4–15, EN unterer Teil von Seite 4 bis Seite 17. Quellenumfang: RK3576, Kernel 6.1. UFS-Anbindung der konkreten ArmSoM-Platine, PHY-Versorgung und Referenztakt, SDK/BSP, U-Boot und Bausteinfreigabeliste prüfen. Plattformreferenz ohne ArmSoM-Hardwarevalidierung. Der Code folgt in allen vier Sprachen der chinesischen Quelle; Chinesisch verwendet deren Originalabbildung, EN/RU/DE die entsprechende englische PDF-Abbildung. Leistungslogs sind Herstellerbeispiele mit 512GB UFS 3.1, keine ArmSoM-Messungen.

FIO-Schreibzugriffe auf /dev/block/sda überschreiben Gerätedaten; nicht auf Datenträgern mit aufzubewahrenden Daten ausführen. LUN-Konfiguration, Flashen und Änderungen der Versorgungserkennung erfordern ebenfalls zielbezogene Validierung. status = <okay>; bleibt als DTS-Syntaxfrage erhalten. HS-GEAR4-Tabellenwerte belegen keine G4-Unterstützung für RK3576; die Ressourcentabelle nennt nur G1–G3. Zu Fußnoten (2)/(3) fehlt der Quellentext; ihre Bedeutung wird nicht ergänzt.

ArmSoM Docs · Rockchip Linux kernel

1. Chipressourcen

RK3576

Ressource Kompatible UFS-Versionen PHY-Raten PHY-Versorgung Hinweise
UFS 2.1, 2.2, 3.0 und 3.1 HS G1-G3 und PWM G1-G3 0.85v und 1.8v  

Hinweise:

  1. UFS bei unversorgtem PHY nicht initialisieren: Das System bleibt hängen.

  2. Bei ungenutztem UFS den DTS-Knoten auf “disabled” setzen, sonst wird der Start verlangsamt.

2. DTS-Konfiguration

RK3576

Ressource Referenzkonfiguration Controllerknoten PHY-Knoten
UFS rk3576.dtsi ufs: ufs@2a2d0000 –
  1. compatible = "rockchip,rk3576-ufs"; Erforderliche Standardkonfiguration; Treiber: drivers/ufs/host/ufs-rockchip.c.

  2. assigned-clock-parents = <&cru CLK_REF_MPHY_26M> Erforderlich: Wählt standardmäßig den 26MHz-Referenztakt der PPLL. Bei einem unabhängigen externen 26MHz-Oszillator assigned-clock-parents = <&clk_gpio_mphy_i>; verwenden und in DTS zusätzlich I/O-Eingangstakt und Frequenz angeben:

clk_gpio_mphy_i: clk_gpio_mphy_i{
            compatible = "fixed-clock";
            #clock-cells = <0>;
            clock-frequency = <26000000>;
            clock-output-names = "clk_gpio_mphy_i";
};
  1. status = <okay>; Erforderlich: Aktiviert UFS. Bei ungenutztem UFS “disabled” setzen, damit der Start nicht verlangsamt wird.

  2. pinctrl-0 = <&ufs_refclk>; Erforderlich: Konfiguriert UFS_REFCLK als Funktions-I/O zur Referenztaktausgabe an den UFS-Baustein.

  3. reset-gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;

Erforderlich: UFS_RSTN als GPIO konfigurieren, damit der Treiber den Baustein zurücksetzt.

  1. vcc-supply = <&vcc_ufs_s0>; Optional: Hauptversorgung des UFS-Bausteins.

  2. vccq-supply = <&vcc1v2_ufs_vccq_s0>; Optional: UFS-VCCQ-Versorgung.

  3. vccq2-supply = <&vcc1v8_ufs_vccq2_s0>; Optional: UFS-VCCQ2-Versorgung.

  4. freq-table-hz = <50000000 250000000>, <0 0>, <0 0>, <0 0>; Optional: UFS-DVFS-Taktbereiche. Jedes Arrayelement definiert Minimum und Maximum in der Reihenfolge der clocks im UFS-dtsi-Knoten. Ohne I/O sinken die Takte auf das Minimum, vor der Übertragung steigen sie auf das Maximum. Ohne dynamische Anpassung beide Werte auf 0 setzen.

3. menuconfig-Konfiguration

Folgende Optionen aktivieren.

CONFIG_SCSI_UFSHCD=y
CONFIG_SCSI_UFS_BSG=y
CONFIG_SCSI_UFS_HWMON=y
CONFIG_SCSI_UFSHCD_PLATFORM=y
CONFIG_SCSI_UFS_ROCKCHIP=y

4. UFS-Unterstützung in U-Boot

Das Quell-SDK unterstützt UFS standardmäßig; eine direkte Kompilierung genügt.

4.1 DTS-Anpassungen

Die Knotenkonfiguration entspricht dem Kernel. Für U-Boot in rk3576-u-boot.dtsi aktivieren.

&ufs {
    u-boot,dm-spl;
    status = "okay";
};

4.2 config-Konfiguration

UFS benötigt SCSI-Protokollunterstützung; SCSI entsprechend konfigurieren.

CONFIG_SPL_UFS_SUPPORT=y
CONFIG_CMD_UFS=y
CONFIG_UFS=y
CONFIG_ROCKCHIP_UFS=y
CONFIG_SCSI=y
CONFIG_DM_SCSI=y

4.3 UFS-MPHY-Versorgungserkennung

Zugriff auf unversorgte UFS-MPHY-Register lässt das System hängen. usbplug und uboot prüfen die Versorgung vor der UFS-Initialisierung. Die Erkennung ist mit einigen älteren UFS-Bausteinen inkompatibel; uboot bietet daher die unten gezeigte Abschaltoption.

diff --git a/configs/rk3576-usbplug.config b/configs/rk3576-usbplug.config
index 822967e7cf5..26cfa5956fe 100644
--- a/configs/rk3576-usbplug.config
+++ b/configs/rk3576-usbplug.config
@@ -101,3 +101,4 @@ CONFIG_SCSI=y
 CONFIG_CMD_UFS=y
 CONFIG_ROCKCHIP_UFS=y
 CONFIG_CMD_SCSI=y
+CONFIG_ROCKCHIP_UFS_DISABLED_LINKUP_TEST=y
diff --git a/configs/rk3576_defconfig b/configs/rk3576_defconfig
index 3ec1fdefe00..15d0451ddc9 100644
--- a/configs/rk3576_defconfig
+++ b/configs/rk3576_defconfig
@@ -223,3 +223,4 @@ CONFIG_RK_AVB_LIBAVB_USER=y
 CONFIG_OPTEE_CLIENT=y
 CONFIG_OPTEE_V2=y
 CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
+CONFIG_ROCKCHIP_UFS_DISABLED_LINKUP_TEST=y

Nach der Änderung usbplug und uboot neu bauen:

#echo 编译usbplug
./make.sh rk3576-usbplug
#echo 拷⻉usbplug.bin到rkbin替换对应⽂件,下⾯⽂件名只是参考
cp usbplug.bin ../rkbin/bin/rk35/rk3576_usbplug_v1.02.bin
#重新编译uboot和loader
./make.sh rk3576

5. UFS-LUN-Anpassung

Vor der UFS-Nutzung LUNs konfigurieren. Das SDK richtet standardmäßig vier LUNs ein:

LUN ID Name Größe FLASH-Modus BOOT-Unterstützung Zweck
0 user(sda) Gesamtkapazität − 48MB XLC Nein Systemfirmware und Benutzerdaten
1 boot0
(sdb)
4MB SLC Ja loader-Speicher
2 boot1
(sdc)
4MB SLC Ja Backup-loader
3 data(sdd) 8MB SLC Nein Benutzerdefinierte Verwendung

Bei ungeeigneten Standardwerten die LUN-Konfiguration in der uboot-Funktion ufs_lu_configuration ändern. Anschließend usbplug neu bauen:

#echo 编译usbplug
./make.sh rk3576-usbplug
#echo 拷⻉usbplug.bin到rkbin替换对应⽂件,下⾯⽂件名只是参考
cp usbplug.bin ../rkbin/bin/rk35/rk3576_usbplug_v1.02.bin
#重新编译uboot和loader
./make.sh rk3576

6. Vendor-Storage-Unterstützung

6.1 Uboot

Uboot unterstützt Vendor Storage standardmäßig ohne Einschränkungen.

6.2 Kernel

Der Kernel-UFS-Treiber unterstützt Vendor Storage nicht, einige Treiber benötigen jedoch Lesezugriff in der Kernelphase. In DTS einen “ram-vendor-storage”-Knoten und reservierten Speicher definieren; uboot übergibt die gelesenen Daten an den Kerneltreiber.

diff --git a/arch/arm64/boot/dts/rockchip/rk3576-android.dtsi b/arch/arm64/boot/dts/rockchip/rk3576-android.dtsi
index 4e6574156dc0..b4ec015c2638 100644
--- a/arch/arm64/boot/dts/rockchip/rk3576-android.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3576-android.dtsi
@@ -55,6 +55,17 @@ ramoops: ramoops@40110000 {
                        ftrace-size = <0x00000>;
                        record-size = <0x14000>;
                };
+
+               vendor_storage_rm: vendor-storage-rm@00000000 {
+                       compatible = "rockchip,vendor-storage-rm";
+                       reg = <0x0 0x0 0x0 0x0>;
+               };
+       };
+
+       vendor_storage: vendor-storage {
+               compatible = "rockchip,ram-vendor-storage";
+               memory-region = <&vendor_storage_rm>;
+               status = "okay";
        };
 };

Für Vendor-Storage-Lese-/Schreibzugriffe aus Anwendungen siehe Android hardware/rockchip/libvendor_storage/vendor_storage_test.c. Kernelschreibzugriffe benötigen einen umständlichen Proxy auf Anwendungsebene. Die Kernelschnittstelle schreibt nur in den Speicher und speichert nicht dauerhaft in UFS.

7. UFS-Schnittstellenleistung

Die Quelle verwendet FIO direkt auf sda ohne zusätzlichen Dateisystem- oder Ver-/Entschlüsselungsaufwand mit einem 512GB-UFS-3.1-Gerät. Die Ergebnisse sind Herstellerbeispiele, keine ArmSoM-Messungen.

7.1 Sequenzielles Schreiben

Testbefehl:

/data/fio -filename=/dev/block/sda -direct=1 -iodepth 32 -thread -rw=write  -bs=1024k -size=1G -numjobs=8 -runtime=180 -group_reporting -name=seq_100write_1024k

Testergebnis der Quelle:

seq_100write_1024k: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB,
(T) 1024KiB-1024KiB, ioengine=psync, iodepth=32
...
fio-2.20
Starting 8 threads
Jobs: 7 (f=1): [W(1),f(3),_(1),f(3)][100.0%][r=0KiB/s,w=966MiB/s][r=0,w=965 IOPS]
[eta 00m:00s]
seq_100read_1024k: (groupid=0, jobs=8): err= 0: pid=2389: Wed Jun 26 16:34:04
2024
  write: IOPS=946, BW=947MiB/s (993MB/s)(8192MiB/8652msec)
    clat (msec): min=3, max=32, avg= 8.25, stdev= 2.53
     lat (msec): min=3, max=32, avg= 8.42, stdev= 2.53
    clat percentiles (usec):
     |  1.00th=[ 7072],  5.00th=[ 7136], 10.00th=[ 7200], 20.00th=[ 7264],
     | 30.00th=[ 7264], 40.00th=[ 7264], 50.00th=[ 7264], 60.00th=[ 7328],
     | 70.00th=[ 7392], 80.00th=[ 9536], 90.00th=[ 9920], 95.00th=[14400],
     | 99.00th=[14912], 99.50th=[25728], 99.90th=[29824], 99.95th=[32384],
     | 99.99th=[32384]
   bw (  KiB/s): min=89495, max=126959, per=0.01%, avg=121531.16, stdev=7781.67
    lat (msec) : 4=0.02%, 10=90.32%, 20=9.12%, 50=0.54%
  cpu          : usr=2.04%, sys=5.14%, ctx=16467, majf=0, minf=0
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwt: total=0,8192,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: bw=947MiB/s (993MB/s), 947MiB/s-947MiB/s (993MB/s-993MB/s), io=8192MiB
(8590MB), run=8652-8652msec

Disk stats (read/write):
  sda: ios=0/16382, merge=0/0, ticks=0/126485, in_queue=126485, util=98.29%

7.2 Sequenzielles Lesen

Testbefehl:

/data/fio -filename=/dev/block/sda -direct=1 -iodepth 32 -thread -rw=read  -bs=1024k -size=1G -numjobs=8 -runtime=180 -group_reporting -name=seq_100read_1024k

Testergebnis der Quelle:

seq_100read_1024k: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB,
(T) 1024KiB-1024KiB, ioengine=psync, iodepth=32
...
fio-2.20
Starting 8 threads
Jobs: 8 (f=8): [R(8)][100.0%][r=1020MiB/s,w=0KiB/s][r=1020,w=0 IOPS][eta 00m:00s]
seq_100read_1024k: (groupid=0, jobs=8): err= 0: pid=2368: Wed Jun 26 16:31:59
2024
   read: IOPS=1001, BW=1002MiB/s (1050MB/s)(8192MiB/8177msec)
    clat (msec): min=5, max=32, avg= 7.96, stdev= 1.69
     lat (msec): min=5, max=33, avg= 7.96, stdev= 1.69
    clat percentiles (usec):
     |  1.00th=[ 7584],  5.00th=[ 7712], 10.00th=[ 7712], 20.00th=[ 7776],
     | 30.00th=[ 7840], 40.00th=[ 7840], 50.00th=[ 7840], 60.00th=[ 7840],
     | 70.00th=[ 7840], 80.00th=[ 7904], 90.00th=[ 7968], 95.00th=[ 7968],
     | 99.00th=[ 8160], 99.50th=[20096], 99.90th=[33024], 99.95th=[33024],
     | 99.99th=[33024]
   bw (  KiB/s): min=96256, max=132395, per=0.01%, avg=128637.07, stdev=8204.70
    lat (msec) : 10=99.44%, 20=0.06%, 50=0.50%
  cpu          : usr=0.38%, sys=3.85%, ctx=24282, majf=0, minf=2048
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwt: total=8192,0,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
   READ: bw=1002MiB/s (1050MB/s), 1002MiB/s-1002MiB/s (1050MB/s-1050MB/s),
io=8192MiB (8590MB), run=8177-8177msec

Disk stats (read/write):
  sda: ios=16384/0, merge=0/0, ticks=119146/0, in_queue=119145, util=98.96%

7.3 Zufälliges Schreiben

Testbefehl:

/data/fio -filename=/dev/block/sda -direct=1 -iodepth 32 -thread -rw=randwrite  -bs=4k -size=1G -numjobs=8 -runtime=180 -group_reporting -name=rand_100write_4k

Testergebnis der Quelle:

rand_100write_4k: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T)
4096B-4096B, ioengine=psync, iodepth=32
...
fio-2.20
Starting 8 threads
Jobs: 7 (f=7): [_(1),w(7)][100.0%][r=0KiB/s,w=270MiB/s][r=0,w=69.0k IOPS][eta
00m:00s]
seq_100read_1024k: (groupid=0, jobs=8): err= 0: pid=2402: Wed Jun 26 16:35:55
2024
  write: IOPS=55.2k, BW=215MiB/s (226MB/s)(8192MiB/38022msec)
    clat (usec): min=35, max=18933, avg=137.53, stdev=421.10
     lat (usec): min=36, max=18935, avg=138.68, stdev=421.21
    clat percentiles (usec):
     |  1.00th=[   49],  5.00th=[   56], 10.00th=[   61], 20.00th=[   68],
     | 30.00th=[   75], 40.00th=[   82], 50.00th=[   88], 60.00th=[   96],
     | 70.00th=[  108], 80.00th=[  127], 90.00th=[  183], 95.00th=[  278],
     | 99.00th=[  532], 99.50th=[  796], 99.90th=[ 6688], 99.95th=[ 6944],
     | 99.99th=[11584]
   bw (  KiB/s): min=22220, max=39863, per=0.01%, avg=27702.29, stdev=2097.44
    lat (usec) : 50=1.25%, 100=62.00%, 250=30.71%, 500=4.86%, 750=0.66%
    lat (usec) : 1000=0.07%
    lat (msec) : 2=0.03%, 4=0.01%, 10=0.40%, 20=0.02%
  cpu          : usr=3.73%, sys=13.05%, ctx=3190681, majf=0, minf=0
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwt: total=0,2097152,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: bw=215MiB/s (226MB/s), 215MiB/s-215MiB/s (226MB/s-226MB/s), io=8192MiB
(8590MB), run=38022-38022msec

Disk stats (read/write):
  sda: ios=0/2096660, merge=0/13, ticks=0/180540, in_queue=180540, util=99.93%

7.4 Zufälliges Lesen

Testbefehl:

/data/fio -filename=/dev/block/sda -direct=1 -iodepth 32 -thread -rw=randread  -bs=4k -size=1G -numjobs=8 -runtime=180 -group_reporting -name=rand_100read_4k

Testergebnis der Quelle:

rand_100read_4k: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T)
4096B-4096B, ioengine=psync, iodepth=32
...
fio-2.20
Starting 8 threads
[ 1393.016346][  T542] healthd: battery l=50 v=3300 t=2.6 h=2 st=3 c=-1600 fc=100
chg=au
Jobs: 8 (f=8): [r(8)][100.0%][r=223MiB/s,w=0KiB/s][r=56.0k,w=0 IOPS][eta 00m:00s]
seq_100read_1024k: (groupid=0, jobs=8): err= 0: pid=2412: Wed Jun 26 16:37:30
2024
   read: IOPS=57.5k, BW=224MiB/s (235MB/s)(8192MiB/36499msec)
    clat (usec): min=60, max=2949, avg=133.28, stdev=34.67
     lat (usec): min=61, max=2949, avg=133.69, stdev=34.78
    clat percentiles (usec):
     |  1.00th=[   95],  5.00th=[   99], 10.00th=[  103], 20.00th=[  108],
     | 30.00th=[  113], 40.00th=[  118], 50.00th=[  124], 60.00th=[  131],
     | 70.00th=[  141], 80.00th=[  153], 90.00th=[  173], 95.00th=[  197],
     | 99.00th=[  262], 99.50th=[  294], 99.90th=[  374], 99.95th=[  418],
     | 99.99th=[  580]
   bw (  KiB/s): min=27040, max=29907, per=0.01%, avg=28834.42, stdev=390.23
    lat (usec) : 100=5.06%, 250=93.56%, 500=1.36%, 750=0.02%, 1000=0.01%
    lat (msec) : 2=0.01%, 4=0.01%
  cpu          : usr=3.61%, sys=13.20%, ctx=3825319, majf=0, minf=8
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwt: total=2097152,0,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
   READ: bw=224MiB/s (235MB/s), 224MiB/s-224MiB/s (235MB/s-235MB/s), io=8192MiB
(8590MB), run=36499-36499msec

Disk stats (read/write):
  sda: ios=2088272/0, merge=16/0, ticks=222685/0, in_queue=222685, util=99.91%

8. UFS-Geräteinformationen und Operationen

Auf Linux-Kernelplattformen UFS-Geräte mit ufs-utils abfragen und bedienen. Es folgen gängige Befehle.

  1. Gerätezustand abfragen.
ufs-utils  desc -t 9 -p /dev/bsg/ufs-bsg0  #Linux平台
ufs-utils  desc -t 9 -p /dev/ufs-bsg0      #Android平台
Device Health Descriptor: [Byte offset 0x0]: bLength = 0x25
Device Health Descriptor: [Byte offset 0x1]: bDescriptorType = 0x9
Device Health Descriptor: [Byte offset 0x2]: bPreEOLInfo = 0x1
Device Health Descriptor: [Byte offset 0x3]: bDeviceLifeTimeEstA = 0x1
Device Health Descriptor: [Byte offset 0x4]: bDeviceLifeTimeEstB = 0x1

bPreEOLInfo:
Pre End of Life Information
00h: Not defined
01h: Normal
02h: Warning. Consumed 80% of reserved blocks.
03h: Critical. Consumed 90% of reserved blocks.
Others: Reserved

bDeviceLifeTimeEstA
bDeviceLifeTimeEstB:
provides an indication of the device life time  based on the amount of performed
program/erase cycles
00h: Information not available
01h: 0% - 10% device life time used
02h: 10% - 20% device life time used
03h: 20% - 30% device life time used
04h: 30% - 40% device life time used
05h: 40% - 50% device life time used
06h: 50% - 60% device life time used
07h: 60% - 70% device life time used
08h: 70% - 80% device life time used
09h: 80% - 90% device life time used
0Ah: 90% - 100% device life time used
0Bh: Exceeded its maximum estimated device life time
Others: Reserved
  1. Aktuelle Protokollversion, Geschwindigkeit und Lane-Anzahl abfragen.
#查询当前双⽅运⾏的协议版本:
ufs-utils  desc -t 9 -p /dev/bsg/ufs-bsg0  #Linux平台
ufs-utils  desc -t 9 -p /dev/ufs-bsg0      #Android平台

#查询链接状态
ufs-utils uic -t 1 -a -p /dev/bsg/ufs-bsg0 #Linux平台
ufs-utils uic -t 1 -a -p /dev/ufs-bsg0     #Android平台

1. 速度(HS Gear接⼝速度请查看附录):
Gear: 1:Gear1  2:Gear2  3:Gear3  4:Gear4
HSSeries: 1: rate A  2: rate B
[0x1568]PA_TxGear                : local = 0x00000001, peer = 0x00000001
[0x1583]PA_RxGear                : local = 0x00000001, peer = 0x00000001
[0x156a]PA_HSSeries              : local = 0x00000002, peer = 0x00000002

2. Lane数量:
双⽅可以提供的物理层lane数量
[0x1520]PA_AvailTxDataLanes      : local = 0x00000002, peer = 0x00000002
[0x1540]PA_AvailRxDataLanes      : local = 0x00000002, peer = 0x00000002
双⽅实际物理层链接上的lane数量
[0x1561]PA_ConnectedTxDataLanes  : local = 0x00000002, peer = 0x00000002
[0x1581]PA_ConnectedRxDataLanes  : local = 0x00000002, peer = 0x00000002
双⽅实际通信使⽤到的lane数量
[0x1560]PA_ActiveTxDataLanes     : local = 0x00000001, peer = 0x00000001
[0x1580]PA_ActiveRxDataLanes     : local = 0x00000001, peer = 0x00000001

如果双⽅物理层链接上lane数量⼩于双⽅可以提供的物理层lane数量,则说明信号不佳导致有lane训练失
败,或者实际硬件只接了⼀个lane。
如果双⽅实际通信使⽤的lane数量⼩于双⽅实际物理层链接上的lane数量,说明配置信息被修改过,可以是
ufs驱动修改pwr_info或者通过ufs-utils修改。

Gear 1/2/3/4 bedeutet Gear1/Gear2/Gear3/Gear4, HSSeries 1/2 rate A/rate B. PA_AvailTxDataLanes/PA_AvailRxDataLanes sind physisch verfügbare Lanes, PA_ConnectedTxDataLanes/PA_ConnectedRxDataLanes verbundene Lanes und PA_ActiveTxDataLanes/PA_ActiveRxDataLanes tatsächlich verwendete Lanes. Weniger verbundene als verfügbare Lanes weist auf fehlgeschlagenes Training wegen schlechter Signale oder nur eine verdrahtete Lane hin. Weniger aktive als verbundene Lanes weist auf eine geänderte Konfiguration über pwr_info des UFS-Treibers oder ufs-utils hin.

9. Häufige Probleme

9.1 Startfehler nach Firmwareupdate: GPT-Fehler

UFS verwendet 4K-Blöcke; GPT muss daher mit 4K-Blockgröße erzeugt werden. Werkzeuge auf folgende oder neuere Versionen aktualisieren.

RKDevTool_v3.28_for_window

FactoryTool_v1.88

upgrade_tool_v2.30_for_linux

9.2 Startfehler nach Update ohne serielle Ausgabe

Falsche “BOOT MODE CONFIG”: UFS-Boot anhand der gleichnamigen Schaltplantabelle einstellen. Ein nicht unterstützter UFS-Baustein ist eine weitere mögliche Ursache; einen neuen Baustein eines anderen Modells testen.

9.3 Fehlerstatistik bei Kernel-Dauertests

bash-5.2# cat /sys/kernel/debug/ufshcd/2a2d0000.ufs/stats
PHY Adapter Layer errors (except LINERESET): 0  #UECPA类型
Data Link Layer errors: 0                       #UECDL类型
Network Layer errors: 0                         #UECN类型
Transport Layer errors: 0                       #UECT类型
Generic DME errors: 0                           #UECDME类型
Auto-hibernate errors: 0                        #UHES和UHXS类型
IS Fatal errors (CEFES, SBFES, HCFES, DFES): 0
DME Link Startup errors: 0                      #DME link startup错误
PM Resume errors: 0                             #唤醒失败
PM Suspend errors : 0                           #待机失败
Logical Unit Resets: 1                          #复位设备次数,开机、休眠唤醒、出错处理
均会增加
Host Resets: 0                                  #复位控制器重新初始化次数,出错会增加
SCSI command aborts: 0                          #SCSI命令通信出错次数

9.4 Kernel kann nach dem Start keine Partitionen einhängen

[    3.220417]  sda: sda1 sda2 sda3 sda4 sda5 sda6 sda7 sda8 sda9
[    3.221108] sd 0:0:0:0: [sda] Attached SCSI disk
[    3.467971] EXT4-fs (sda7): bad block size 1024
[    3.468341] EXT4-fs (sda7): bad block size 1024
[    3.468528] EXT4-fs (sda7): bad block size 1024
[    3.468733] FAT-fs (sda7): utf8 is not a recommended IO charset for FAT
filesystems, filesystem will be case sensitive!
[    3.468903] ISOFS: unsupported/invalid hardware sector size 4096
[    3.470737] EXT4-fs (sda7): bad block size 1024
[    3.471013] EXT4-fs (sda7): bad block size 1024
[    3.471260] EXT4-fs (sda7): bad block size 1024
[    3.471494] FAT-fs (sda7): utf8 is not a recommended IO charset for FAT
filesystems, filesystem will be case sensitive!
[    3.471659] ISOFS: unsupported/invalid hardware sector size 4096
[    3.472991] List of all partitions:
[    3.473009] 0100            4096 ram0
[    3.473014]  (driver?)
[    3.473035] 0800       124936192 sda
[    3.473039]  driver: sd
[    3.473050]   0801            8192 sda1 17b18c43-1d24-4484-8883-d0c618e42411
[    3.473054]
[    3.473065]   0802            8192 sda2 97c64638-8824-46d3-d83e-582a6a48d4fb
[    3.473070]
[    3.473080]   0803            4096 sda3 e6edc612-f94f-44b7-b9f1-1561474fafbb
[    3.473084]
[    3.473095]   0804           65536 sda4 d04a9010-9d09-4d47-96ba-3fa854d3c5c5
[    3.473099]
[    3.473110]   0805          131072 sda5 f2d9eb7f-2700-4ba8-9422-0e502db7c35c
[    3.473114]
[    3.473124]   0806           32768 sda6 1382357d-a655-48e7-f1da-99e05054ea34
[    3.473129]
[    3.473139]   0807        14680064 sda7 614e0000-0000-4b53-8000-1d28000054a9
[    3.473143]
[    3.473153]   0808          131072 sda8 d5f63744-ff57-4447-c9ee-b98e63e9b69b
[    3.473158]
[    3.473168]   0809       109871084 sda9 ec8c0d6e-d426-462e-bfc0-366c6e064804
[    3.473172]
[    3.473185] 0810            4096 sdb
[    3.473189]  driver: sd
[    3.473201] 0820            4096 sdc
[    3.473205]  driver: sd
[    3.473217] 0830            8192 sdd

Das Imagewerkzeug verwendete eine falsche Dateisystemblockgröße. Im obigen Log wurde ext4 mit 1KB-Blöcken erstellt, während UFS Unterstützung für 4KB-Blöcke benötigt.

9.5 U-Boot erkennt UFS nicht

Bei Dual-Storage-Boot, etwa eMMC+UFS mit UFS als sekundärem Speicher, deaktiviert U-Boot bei fehlgeschlagener Erkennung UFS im DTB. Dann fehlt auch im Kernel die Initialisierungsausgabe des UFS-Controllers. Dies deutet meist auf ein Hardwareproblem hin: Zuerst Eintrag in der Hersteller-AVL und erfolgte Einrichtung im maskrom-Upgrademodus bestätigen, dann Versorgung und Beschaltung anhand des Referenzschaltplans prüfen.

Timedout waiting for UIC response
Host controller enable failed
ufshcd_pltfrm_init() failed -5
FDT: UFS was not detected, disabling UFS.

10. Anhang

10.1 ufs-utils beziehen

Nach Erhalt des Redmine-Zugriffs ufs-utils über den Quellenlink beziehen. Zugriff und Verfügbarkeit wurden hier nicht geprüft.

10.2 HS-Gear-Informationen

HS Gear: Original aus dem englischen PDF

HS Gear: Original aus dem englischen PDF

HS-GEAR Rate A Serie (f_ref 19.2/26/38.4 MHz) Rate B Serie (f_ref 19.2/38.4 MHz) Rate B Serie (f_ref 26 MHz) Rate A Serie (aus MIPI-M-PHY, f_ref 19.2/26/38.4 MHz) Rate B Serie (3) (aus MIPI-M-PHY, f_ref 19.2/26/38.4 MHz) Einheit
HS-GEAR1 1248 (2) 1459.2 1456.0 1248 1457.6 Mbps
HS-GEAR2 2496 2918.4 2912.0 2496 2915.2 Mbps
HS-GEAR3 4992 5836.8 5824.0 4992 5830.4 Mbps
HS-GEAR4 9984 11673.6 11648.0 9984 11660.8 Mbps

Dieses Thema entdecken → · Lernpfade →