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:
-
UFS bei unversorgtem PHY nicht initialisieren: Das System bleibt hängen.
-
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 | – |
-
compatible = "rockchip,rk3576-ufs";Erforderliche Standardkonfiguration; Treiber:drivers/ufs/host/ufs-rockchip.c. -
assigned-clock-parents = <&cru CLK_REF_MPHY_26M>Erforderlich: Wählt standardmäßig den 26MHz-Referenztakt der PPLL. Bei einem unabhängigen externen 26MHz-Oszillatorassigned-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";
};
-
status = <okay>;Erforderlich: Aktiviert UFS. Bei ungenutztem UFS “disabled” setzen, damit der Start nicht verlangsamt wird. -
pinctrl-0 = <&ufs_refclk>;Erforderlich: Konfiguriert UFS_REFCLK als Funktions-I/O zur Referenztaktausgabe an den UFS-Baustein. -
reset-gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;
Erforderlich: UFS_RSTN als GPIO konfigurieren, damit der Treiber den Baustein zurücksetzt.
-
vcc-supply = <&vcc_ufs_s0>;Optional: Hauptversorgung des UFS-Bausteins. -
vccq-supply = <&vcc1v2_ufs_vccq_s0>;Optional: UFS-VCCQ-Versorgung. -
vccq2-supply = <&vcc1v8_ufs_vccq2_s0>;Optional: UFS-VCCQ2-Versorgung. -
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.
- 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
- 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 | 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 |
