Rockchip · AI & Linux Hub

Display und Audio

Rockchip RK628 For-All: vollständige Anleitung zu Anzeige, HDMI IN, Audio und Fehlersuche

Vollständige RK628D/F/H-For-All-Referenz zu Treiberportierung, DTS, Signalabstimmung, HDMI-Eingang, Audio, Tests und Fehlerbehebung.

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

Anwendbarkeit auf ArmSoM

Dies ist eine Rockchip-Plattformreferenz, kein ArmSoM-Hardwaretestbericht. RK628D/F/H sind externe Bridge-Chips; die Verwendung auf einer bestimmten ArmSoM-Platine hängt von herausgeführten Signalen, Stromversorgung, I2C, GPIO, Interrupts, Takten und dem Ziel-SDK/BSP ab. Die Quelle behandelt getrennt Misc-, Media- und U-Boot-Treiber, unter anderem für RK3399, RK356x, RK3588, RK3576 und RK3562 unter unterschiedlichen Kernelzweigen. Dies begründet keine Unterstützung auf jeder Platine. Prüfen Sie für jedes Szenario die Plattform- und Kernelvoraussetzungen. Es wurde keine Hardwarevalidierung durchgeführt.

Wie ausdrücklich genehmigt, bildet die chinesische V2.7 (122 Seiten) die gemeinsame Grundlage der drei bisherigen Sprachfassungen. Die englische V2.3 (117 Seiten) liefert Vergleichsbelege und passende Originalabbildungen. Inhalte, die in dieser älteren Ausgabe fehlen oder abweichen, werden vollständig aus dem Chinesischen übersetzt, darunter Treiberportierung, Signalanpassung/SSC, GVI-Lane-Swap und Media-Konfiguration. Die chinesische Fassung verwendet chinesische Abbildungen; die englische und russische Fassung verwenden zugeordnete englische Originale mit Quellseitenangaben in den Bildunterschriften. Diese deutsche Fassung übersetzt den vollständigen englischen Artikel und übernimmt dessen Bildadressen. Editierbare Screenshot-Übertragungen folgen den neueren chinesischen Belegen.

Sicherheit und Quellenwidersprüche: Registerschreibzugriffe, chmod 0666 und setenforce 0 sind Debug-Beispiele der Quelle, keine Produktionsempfehlungen. Widersprüchliche Knotennamen, Signalpfadbeschreibungen und Plattformgeltungsbereiche bleiben erhalten und werden dokumentiert statt durch Vermutungen beseitigt. Die ursprüngliche Nummerierung beginnt bei Kapitel 2, weil das Inhaltsverzeichniskapitel entfällt.

Redaktionelle Hinweise · ArmSoM-Dokumentation

2. Vorwort

RK628 besitzt einen Display-Pfad und einen HDMI-IN-Pfad. In der SDK-Version basiert Display auf DRM und HDMI IN auf V4L2. Unterschiedliche Frameworks oder Kernelversionen benötigen entsprechend angepasste Treiber; die SDK-Version gilt nur für Rockchip-Plattformen. Der For-All-Treiber wurde eingeführt, um andere Plattformen zu unterstützen und die Portierung zu vereinfachen. Er unterstützt derzeit RK628D und RK628F/H. Zur Versionsverwaltung der Treiberpatches siehe die RK628-Treiberversionshinweise im SDK-Patchpaket.

Auch der For-All-Treiber besitzt Display- und HDMI-IN-Pfade. Der Display-Treiber befindet sich unter drivers/misc/rk628/ und unterstützt RGB-/BT1120-/HDMI-Eingang sowie RGB-/BT1120-/LVDS-/GVI-/DSI-/HDMI-Ausgang. Der HDMI-IN-Treiber befindet sich unter drivers/media/i2c/rk628/ und unterstützt HDMI-Eingang sowie CSI-/BT1120-Ausgang. Im Folgenden bezeichnen Misc und Media diese beiden unabhängigen Treiber; jeder kann separat kompiliert und ausgeführt werden.

2.1 RK628-Blockdiagramm

Technische Originalabbildung — EN V2.3, S. 9

Technische Originalabbildung: EN V2.3, S. 9.

2.2 Typischer RK628-Hardwareentwurf

Technische Originalabbildung — EN V2.3, S. 9

Technische Originalabbildung: EN V2.3, S. 9.

2.3 Wichtigste RK628-Spezifikationen

2.3.1 Wichtigste RK628D-Spezifikationen

Videoeingangsschnittstelle Typische Auflösung Typisches Format
HDMI IN 4K@30 YUV420(4K@60) / YUV422 / YUV444 /
RGB888
BT1120 IN 1080P@60 YUV422 8bit
RGB IN 1080P@60 RGB888
Videoausgangsschnittstelle Typische Auflösung Typisches Format
GVI OUT 4K@60 RGB888
MIPI CSI 4K@30 YUV422 8bit
MIPI DSI 1080P@60 /
2.5K@60
RGB888
LVDS OUT 720P@60 /
1080P@60
RGB888
BT1120 OUT 1080P@60 YUV422 8bit
RGB OUT 1080P@60 RGB888
HDMI OUT 1080P@60 RGB888/YUV444 8bit

2.3.2 Wichtigste RK628F-Spezifikationen

Videoeingangsschnittstelle Typische Auflösung Typisches Format
HDMI IN 4K@60 RGB888 / YUV422 8bit / YUV422 10bit
/ YUV420 8bit (> 4k@30Hz) / YUV420 10bit
(> 4k@30Hz)
BT1120 IN 1080P@60 YUV422 8bit
RGB IN 1080P@60 RGB888
Videoausgangsschnittstelle Typische Auflösung Typisches Format
GVI OUT 4K@60 RGB888
MIPI CSI Dual MIPI, 4K@60 YUV422 8bit
MIPI DSI 1080P@60 /
2.5K@60
RGB888
LVDS OUT 720P@60 /
1080P@60
RGB888
BT1120 OUT 1080P@60 YUV422 8bit
RGB OUT 1080P@60 RGB888
HDMI OUT 1080P@60 RGB888 / YUV444 8bit

2.3.3 Wichtigste RK628H-Spezifikationen

Im Vergleich zu RK628F besitzt RK628H keine GVI-Schnittstelle.

Videoeingangsschnittstelle Typische Auflösung Typisches Format
HDMI IN 4K@60 RGB888 / YUV422 8bit / YUV422 10bit
/ YUV420 8bit (> 4k@30Hz) / YUV420 10bit
(> 4k@30Hz)
BT1120 IN 1080P@60 YUV422 8bit
RGB IN 1080P@60 RGB888
Videoausgangsschnittstelle Typische Auflösung Typisches Format
MIPI CSI Dual MIPI, 4K@60 YUV422 8bit
MIPI DSI 1080P@60 /
2.5K@60
RGB888
LVDS OUT 720P@60 /
1080P@60
RGB888
BT1120 OUT 1080P@60 YUV422 8bit
RGB OUT 1080P@60 RGB888
HDMI OUT 1080P@60 RGB888 / YUV444 8bit

2.4 Verbesserungen und Optimierungen von RK628F/H gegenüber RK628D

Funktionsblock RK628D RK628F/H
HDMIRX Bis 4K@60 YUV420; TMDS CLK 297M Bis 4K@60 RGB/YUV444; TMDS CLK 594M
HDMIRX Unterstützte Frequenzen sind eingeschränkt; eine bestimmte Auflösung muss bewertet werden und wird möglicherweise nicht unterstützt Unterstützt beliebige Frequenzen von 27M bis 594M für unterschiedliche Eingangsauflösungen
HDMIRX DVI MODE nicht unterstützt DVI MODE unterstützt
HDMIRX Kann yuv422-/yuv420-Eingangsvideoformate nicht erkennen Der Controller erkennt das Eingangsvideoformat
HDMIRX RK628D rxphy kann bei niedriger Amplitude der clk-Lane der Quelle nicht einrasten Dieses Problem besteht nicht
HDMIRX HDMI RX hat Probleme bei der Bitfehlererkennung Dieses Problem besteht nicht
MIPI
CSI
Ein Kanal, 4 Lanes Zwei Kanäle, 8 Lanes
MIPI
CSI
Maximal 4k@30 yuv422 8bit Maximal 4k@60 yuv422 8bit
GVI Einige Panelmodelle bleiben dunkel oder zeigen fehlerhaft an Die Quelle berichtet bei Tests mehrerer handelsüblicher Panelmodelle von keinen Auffälligkeiten; siehe Ausgangsmodulkonfiguration → GVI-Ausgang → Liste getesteter RK628F-GVI-Modelle
GVI Gemeinsame Taktquelle erforderlich Gemeinsame Taktquelle nicht erforderlich
audio Kein Audio-mclk; bei Codec-Verwendung muss der Host mclk liefern Kann mclk liefern
audio HDMI-Hotplug kann I2S-FIFO-Überlauf und falsche Kanalumschaltung verursachen Behebt eine inkonsistente Kanalreihenfolge nach FIFO-Überlauf
csc Einige Ein-/Ausgangskombinationen benötigen Farbraumkonvertierung oder Auf-/Abtastung des Bildformats; geringfügige Farbdetailabweichungen sind möglich Dieses Problem besteht nicht
hdmi tx Gemeinsame Taktquelle erforderlich rgb2hdmi benötigt eine gemeinsame Taktquelle; hdmi2hdmi nicht
Mehrere Anzeigen Gleichzeitige Ausgabe über rgb/bt1120 und hdmi tx mit gleicher Auflösung Gleichzeitige Ausgabe über rgb/bt1120, hdmi tx und gvi/dsi/csi/lvds mit gleicher Auflösung
MCU Kein integrierter MCU Integrierter MCU

3. Anleitung zur Treiberportierung

Der For-All-Treiber besitzt Display- und HDMI-IN-Pfade. Der Display-U-Boot-Treiber befindet sich unter drivers/video/drm/rk628/, der Kerneltreiber unter drivers/misc/rk628/. Unterstützt werden RGB-/BT1120-/HDMI-Eingang und RGB-/BT1120-/LVDS-/GVI-/DSI-/HDMI-Ausgang. Der HDMI-IN-Treiber befindet sich unter drivers/media/i2c/rk628/ und unterstützt HDMI-Eingang sowie CSI-/DSI-/BT1120-Ausgang.

Portieren Sie nach Bedarf die folgenden Treiber getrennt:

3.1 Display-Pfad

3.1.1 U-Boot (drivers/video/drm/rk628)

Auf Rockchip-U-Boot-Plattformen wurden für die folgenden RK628F/H-Anzeigepfade Treiber entwickelt, um ein schnelles U-Boot-Startlogo zu unterstützen.

IC Anzeigepfad Unterstützung
RK628F/H HDMI2(Dual)DSI Unterstützt
RK628F/H HDMI2(Dual)LVDS Unterstützt
RK628F HDMI2GVI Unterstützt
RK628F/H HDMI2BT1120/RGB Unterstützt
RK628F/H BT1120/RGB2(Dual)DSI Unterstützt
RK628F/H BT1120/RGB2(Dual)LVDS Unterstützt
RK628F BT1120/RGB2GVI Unterstützt

Hinweis: Der U-Boot-Startlogotreiber unterstützt RK628D nicht, weil dessen HDMIRX nicht mit beliebigen Frequenzen arbeiten kann.

Wenn Sie den RK628-Misc-Treiber erstmals hinzufügen oder unter drivers/video/drm noch kein RK628-Treiber vorhanden ist, kopieren Sie den U-Boot-Misc-RK628-Quellcode direkt nach drivers/video/drm und ändern Sie folgende Quelldateien:

drivers/video/drm/rockchip_display.c
drivers/video/drm/Kconfig
drivers/video/drm/Makefile

configs/rk3568_defconfig //以rk3568平台为例

Siehe folgenden Patch:

diff --git a/drivers/video/drm/rockchip_display.c b/drivers/video/drm/rockchip_display.c

index a1cb40a000e..041b8bdd84f 100644
--- a/drivers/video/drm/rockchip_display.c
+++ b/drivers/video/drm/rockchip_display.c
@@ -918,6 +918,23 @@ static int display_enable(struct display_state *state)
      if (state->enabled_at_spl == false)
           rockchip_connector_enable(state);

+#ifdef CONFIG_DRM_ROCKCHIP_RK628

+     /*
+     * trigger .probe helper of U_BOOT_DRIVER(rk628) in ./rk628/rk628.c
+     */
+     struct udevice * dev;
+     int phandle, ret;
+
+     phandle = ofnode_read_u32_default(state->node, "bridge", -1);
+     if (phandle < 0)
+          printf("%s failed to find bridge phandle\n",
ofnode_get_name(state->node));
+
+     ret = uclass_get_device_by_phandle_id(UCLASS_I2C_GENERIC, phandle, &dev);

+     if (ret && ret != -ENOENT)
+          printf("%s:%d failed to get rk628 device ret:%d\n", __func__,
__LINE__, ret);
+
+#endif
+
      if (crtc_state->soft_te)
           crtc_funcs->apply_soft_te(state);
diff --git a/drivers/video/drm/Kconfig b/drivers/video/drm/Kconfig
index ddc65818cba..c5073b9926b 100644
--- a/drivers/video/drm/Kconfig

+++ b/drivers/video/drm/Kconfig
@@ -191,6 +191,13 @@ config DRM_ROCKCHIP_RK618
       Choose this option to enable support for Rockchip RK618 display
       bridge chips driver. say Y to enable its driver.

+config DRM_ROCKCHIP_RK628
+     bool "Rockchip RK628 display bridge driver"
+     depends on DRM_ROCKCHIP
+     help
+      Choose this option to enable support for Rockchip RK628 display
+      bridge chips driver. say Y to enable its driver.
+
diff --git a/drivers/video/drm/Makefile b/drivers/video/drm/Makefile
index ea4219d9cf6..f11a8ff4885 100644

--- a/drivers/video/drm/Makefile
+++ b/drivers/video/drm/Makefile
@@ -36,6 +36,7 @@ obj-$(CONFIG_DRM_ROCKCHIP_RGB) += rockchip_rgb.o
 obj-$(CONFIG_DRM_ROCKCHIP_PANEL) += rockchip_panel.o
 obj-$(CONFIG_DRM_ROHM_BU18XL82) += rohm-bu18tl82.o rohm-bu18rl82.o
 obj-$(CONFIG_DRM_ROCKCHIP_RK618) += rk618.o rk618_lvds.o rk618_dsi.o
+obj-$(CONFIG_DRM_ROCKCHIP_RK628) += rk628/
 obj-$(CONFIG_DRM_ROCKCHIP_RK1000) += rk1000.o rk1000_tve.o
 obj-$(CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY) += samsung_mipi_dcphy.o
 obj-$(CONFIG_DRM_SII902X) += sii902x.o
diff --git a/configs/rk3568_defconfig b/configs/rk3568_defconfig
index acd1fb18169..94f1050eb4f 100644
--- a/configs/rk3568_defconfig

+++ b/configs/rk3568_defconfig
@@ -224,3 +224,4 @@ CONFIG_RK_AVB_LIBAVB_USER=y
 CONFIG_OPTEE_CLIENT=y
 CONFIG_OPTEE_V2=y
 CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
+CONFIG_DRM_ROCKCHIP_RK628=y

Ergänzen Sie abschließend folgende DTS-Konfiguration, um das U-Boot-Startlogo zu aktivieren:

Für RGB-Eingang:

 &route_rgb {
      status = "okay";

+
+     bridge = <&i2c2_rk628>;
 };

Für HDMI-Eingang:

&route_hdmi {
      status = "okay";
+

+     bridge = <&i2c2_rk628>;
      force-bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
      force-output;
      force_timing{

Damit der Übergang vom U-Boot-Logo zum Kernel-Logo nicht flackert, stellen Sie sicher, dass der Kernel den Patch mit folgenden Commit-Informationen enthält:

misc: rk628: add support uboot logo

Type: Function

Redmine ID: #496880 #491750
Associated modifications: NULL
Test: NULL

Change-Id: I311e2c9682f835b377ea9082e1d3a88688167172
Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>

3.1.2 Kernel (drivers/misc/rk628)

Wenn Sie auf einer Rockchip-Kernelplattform RK628 Misc erstmals hinzufügen oder unter drivers/misc kein RK628-Treiber vorhanden ist, kopieren Sie den Kernel-Misc-RK628-Quellcode direkt nach drivers/misc. Ändern Sie drivers/misc/Kconfig, drivers/misc/Makefile und arch/arm64/configs/rockchip_defconfig, um RK628 in die Kompilierung aufzunehmen. Siehe folgenden Patch:

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 276c7c4fef15..8481b9613bc9 100644
--- a/drivers/misc/Kconfig

+++ b/drivers/misc/Kconfig
@@ -5,6 +5,8 @@

 menu "Misc devices"

+source "drivers/misc/rk628/Kconfig"
+
 config RK803
      tristate "RK803"
      default n
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index b296e760fd47..14642c54a2bc 100644

--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -3,6 +3,7 @@
 # Makefile for misc devices that really don't fit anywhere else.
 #

+obj-y                 += rk628/
 obj-$(CONFIG_RK803)   += rk803.o
 obj-y                 += rockchip/
 obj-$(CONFIG_LT7911D_FB_NOTIFIER) += lt7911d-fb-notifier.o
diff --git a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig
index 28340b4bdfae..dbb7d9e55b62 100644

--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -294,6 +294,8 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=16
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=8192
 CONFIG_BLK_DEV_NVME=y
+CONFIG_RK628_MISC=y
+CONFIG_RK628_MISC_HDMITX=y
 CONFIG_LT7911D_FB_NOTIFIER=y
 CONFIG_SRAM=y
 CONFIG_UID_SYS_STATS=y
@@ -557,7 +559,6 @@ CONFIG_ROCKCHIP_THERMAL=y

 CONFIG_WATCHDOG=y
 CONFIG_DW_WATCHDOG=y
 CONFIG_MFD_RK618=y
-CONFIG_MFD_RK628=y
 CONFIG_MFD_RK630_I2C=y
 CONFIG_MFD_RK806_I2C=y
 CONFIG_MFD_RK806_SPI=y
@@ -640,7 +641,6 @@ CONFIG_ROCKCHIP_LVDS=y
 CONFIG_ROCKCHIP_RGB=y
 CONFIG_ROCKCHIP_DW_HDCP2=y
 CONFIG_DRM_ROCKCHIP_RK618=y
-CONFIG_DRM_ROCKCHIP_RK628=y
CONFIG_DRM_PANEL_SIMPLE=y
CONFIG_DRM_PANEL_MAXIM_MAX96752F=y
CONFIG_DRM_PANEL_MAXIM_MAX96772=y

Wichtig: CONFIG_MFD_RK628 und CONFIG_DRM_ROCKCHIP_RK628 wählen ältere RK628-Treiber aus und müssen aus rockchip_defconfig entfernt werden.

Misc-Treiber werden standardmäßig kompiliert; das DTS legt fest, welcher Treiber ausgeführt wird.

3.2 HDMI-IN-Pfad (drivers/media/i2c/rk628)

Verwenden Sie für Kernel vor 5.10 das Patchpaket rk628_for-all und für Kernel 5.10 kernel_5.10_rk628_media_patch. Kopieren Sie den Media-RK628-Treiber nach drivers/media/i2c/rk628/ und ändern Sie drivers/media/i2c/Kconfig, drivers/media/i2c/Makefile sowie arch/arm64/configs/rockchip_defconfig, damit RK628 kompiliert wird. Siehe folgenden Patch:

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index f3273756c612..609bb5e3db07 100644
--- a/drivers/media/i2c/Kconfig

+++ b/drivers/media/i2c/Kconfig
@@ -414,6 +414,8 @@ config VIDEO_OTP_EEPROM
      help
       This driver supports OTP load from eeprom.

+source "drivers/media/i2c/rk628/Kconfig"
+
 config VIDEO_SAA7110
      tristate "Philips SAA7110 video decoder"
      depends on VIDEO_V4L2 && I2C
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 26edd6f7590e..d6f4128b19a5 100644

--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -141,6 +141,7 @@ obj-$(CONFIG_VIDEO_ML86V7667) += ml86v7667.o
 obj-$(CONFIG_VIDEO_OV2659) += ov2659.o
 obj-$(CONFIG_VIDEO_TC358743) += tc358743.o
 obj-$(CONFIG_VIDEO_TC35874X) += tc35874x.o
+obj-$(CONFIG_VIDEO_RK628) += rk628/
 obj-$(CONFIG_VIDEO_AR0230) += ar0230.o
 obj-$(CONFIG_VIDEO_GC02M2) += gc02m2.o
 obj-$(CONFIG_VIDEO_GC08A3) += gc08a3.o
diff --git a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig
index 95ad81b12a69..c66f67ecd0c2 100644

--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -567,6 +567,8 @@ CONFIG_VIDEO_ROCKCHIP_ISPP=y
 CONFIG_VIDEO_ROCKCHIP_HDMIRX=y
 CONFIG_VIDEO_LT6911UXC=y
 CONFIG_VIDEO_LT7911D=y
+CONFIG_VIDEO_RK628_CSI=y
+CONFIG_VIDEO_RK628_BT1120=y
 CONFIG_VIDEO_TC35874X=y
 CONFIG_VIDEO_GC0312=y
 CONFIG_VIDEO_GC2145=y

Media-Treiber werden standardmäßig kompiliert; das DTS legt fest, welcher Treiber ausgeführt wird.

4. I2C-Kommunikation zwischen SoC und RK628

Der SoC kommuniziert über I2C mit RK628. Die typische 7-Bit-Adresse des RK628 lautet 0x50. Wenn mehrere RK628-Geräte denselben I2C-Bus verwenden, ändern Sie ihre I2C-Adressen wie folgt mithilfe der RK628-GPIOs:

Technische Originalabbildung — EN V2.3, S. 13

Technische Originalabbildung: EN V2.3, S. 13.

Bildtext: Die I2C-Adresse umfasst 7 Bits. Die oberen vier kennzeichnen das Gerät und sind auf 4’b1010 gesetzt; die unteren drei bilden die Geräteadresse. GPIOs ermöglichen die Programmierung der Slave-Adresse für unterschiedliche Szenarien. Die typische Adresse lautet 7’b1010000.

Adressbit Pad-Name GPIO-Einstellung
cfg_slvadr[2] IO_GPIO0a1 GPIO0A_OE[1]=1’b1
cfg_slvadr[1] IO_GPIO0a0 GPIO0A_OE[0]=1’b1
cfg_slvadr[0] IO_GPIO3b3 GPIO3B_OE[2]=1’b1

Beispielsweise die Slave-Adressen 0x50 und 0x51:

Technische Originalabbildung — EN V2.3, S. 13

Technische Originalabbildung: EN V2.3, S. 13.

Technische Originalabbildung — EN V2.3, S. 13

Technische Originalabbildung: EN V2.3, S. 13.

I2C SEL I2C ADDR
0 7’b1010000 (0x50)
1 7’b1010001 (0x51)

Halten Sie GPIO0a0 und GPIO0a1 auf Low. Bei GPIO3b3 auf High lautet die Slave-Adresse 0x51 (7’b1010001), bei GPIO3b3 auf Low dagegen 0x50 (7’b1010000).

5. Misc

5.1 Einführung in den MISC-Treiber

Der RK628-Misc-Treiber implementiert den RK628-Display-Pfad zur Konvertierung von Anzeigeprotokollen. Eingänge sind RGB, BT1120 oder HDMI; Ausgänge LVDS, GVI, DSI, RGB, BT1120 oder HDMI.

5.1.1 Treiberportierung

Siehe Anleitung zur Treiberportierung → Display-Pfad.

5.1.2 Verzeichnisstruktur des U-Boot-Treibers

drivers/video/drm/rk628/
├── Makefile

├── panel.c
├── panel.h
├── rk628.c
├── rk628_combtxphy.c
├── rk628_combtxphy.h
├── rk628_cru.c
├── rk628_cru.h
├── rk628_dsi.c
├── rk628_dsi.h
├── rk628_gvi.c
├── rk628_gvi.h
├── rk628.h

├── rk628_hdmirx.c
├── rk628_hdmirx.h
├── rk628_hdmitx.h
├── rk628_lvds.c
├── rk628_lvds.h
├── rk628_post_process.c
├── rk628_post_process.h
├── rk628_rgb.c
└── rk628_rgb.h

5.1.3 Verzeichnisstruktur des Kerneltreibers

drivers/misc/rk628/
├── Kconfig
├── Makefile

├── panel.c
├── panel.h
├── rk628.c
├── rk628_combrxphy.c
├── rk628_combrxphy.h
├── rk628_combtxphy.c
├── rk628_combtxphy.h
├── rk628_config.c

├── rk628_config.h
├── rk628_cru.c
├── rk628_cru.h
├── rk628_csi.c
├── rk628_csi.h
├── rk628_dsi.c
├── rk628_dsi.h
├── rk628_efuse.c
├── rk628_efuse.h
├── rk628_gpio.h
├── rk628_grf.h
├── rk628_gvi.c

├── rk628_gvi.h
├── rk628.h
├── rk628_hdmirx.c
├── rk628_hdmirx.h
├── rk628_hdmitx.c
├── rk628_hdmitx.h
├── rk628_lvds.c
├── rk628_lvds.h
├── rk628_pinctrl.c
├── rk628_pinctrl.h
├── rk628_post_process.c
├── rk628_post_process.h
├── rk628_rgb.c

├── rk628_rgb.h

5.1.4 Überblick über die DTS-Konfiguration

Beispiel: RGB → DSI.

&i2c2 {
   clock-frequency = <400000>;

   status = "okay";

   i2c2_rk628: rk628@50 {
      compatible = "rockchip,rk628";
      reg = <0x50>;
      interrupt-parent = <&gpio0>;
      interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
      enable-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_reset>;
      status = "okay";
   };

};

&pinctrl {
   rk628 {
      rk628_reset: rk628-reset {
         rockchip,pins = <2 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
      };

   };
};

&i2c2_rk628 {
   /* soc_24M optional */
   pinctrl-names = "default";
   pinctrl-0 = <&rk628_reset &refclk_pins>;
   assigned-clocks = <&pmucru CLK_WIFI>;
   assigned-clock-rates = <24000000>;
   clocks = <&pmucru CLK_WIFI>;
   clock-names = "soc_24M";


   panel-backlight = <&backlight>;
   panel-power-supply = <&vcc3v3_lcd0_n>;
   panel-enable-gpios = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>;

   panel-reset-delay-ms = <10>;
   panel-enable-delay-ms = <10>;
   panel-prepare-delay-ms = <60>;
   panel-unprepare-delay-ms = <10>;
   panel-disable-delay-ms = <60>;
   panel-init-delay-ms = <60>;

   rk628-rgb-in;
   rk628-dsi-out {

      dsi,eotp;
      dsi,video-mode;
      dsi,format = "rgb888";
      dsi,lanes = <4>;
      status = "okay";

      rk628-panel {
         panel-init-sequence = [
            05 78 01 11
            05 78 01 29
         ];


         panel-exit-sequence = [
            05 00 01 28
            05 00 01 10
         ];
      };
   };

   display-timings {
      src-timing {
         clock-frequency = <148500000>;
         hactive = <1920>;
         vactive = <1080>;
         hfront-porch = <88>;

         hsync-len = <44>;
         hback-porch = <148>;
         vfront-porch = <4>;
         vsync-len = <5>;
         vback-porch = <36>;
         hsync-active = <1>;

         vsync-active = <1>;
         de-active = <0>;
         pixelclk-active = <0>;
      };

      dst-timing {
         clock-frequency = <148500000>;
         hactive = <1920>;
         vactive = <1080>;
         hfront-porch = <88>;
         hsync-len = <44>;
         hback-porch = <148>;

         vfront-porch = <4>;
         vsync-len = <5>;
         vback-porch = <36>;
         hsync-active = <1>;
         vsync-active = <1>;
         de-active = <0>;
         pixelclk-active = <0>;
      };
   };
};

5.2 Konfiguration des Kerntreibers

5.2.1 RK628-Knotenkonfiguration

Der SoC kommuniziert über I2C mit RK628. Fügen Sie am Beispiel RK3568 einen RK628-Knoten (i2c2_rk628: rk628@50) unter dem DTS-I2C-Knoten i2c2 hinzu:

&i2c2 {
   clock-frequency = <400000>;

   status = "okay";

   i2c2_rk628: rk628@50 {
      compatible = "rockchip,rk628";
      reg = <0x50>;
      enable-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_reset>;
      status = "okay";
   };
};


&pinctrl {
   rk628 {
      rk628_reset: rk628-reset {
         rockchip,pins = <2 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
      };
   };
};

Eigenschaften des RK628-Knotens:

Eigenschaft Beschreibung Optionswert
compatible compatible RK628-Misc-compatible auf “rockchip,rk628” setzen
reg RK628-I2C-Slave-Adresse 0x50/0x51, entsprechend der Hardware
enable-gpios RK628-Enable-GPIO-Referenz Entsprechend der Hardware konfigurieren
reset-gpios RK628-Reset-GPIO-Referenz Entsprechend der Hardware konfigurieren
pinctrl-names RK628-Reset-Pinmux auf GPIO setzen Entsprechend der Hardware konfigurieren
pinctrl-0 RK628-Reset-Pinmux auf GPIO setzen Entsprechend der Hardware konfigurieren

5.2.2 24-MHz-Betriebstakt

Der 24-MHz-Betriebstakt des RK628 kann von einem externen 24M-Quarz oder einem 24-MHz-CLK-Pin des SoC stammen. Bei Verwendung eines externen Quarzes kann die folgende Konfiguration entfallen.

Beachten Sie, dass die HDMI-/GVI-OUT-Pfade des RK628D und der RGB-→-HDMI-Pfad des RK628F/H den 24-MHz-CLK-Ausgang des SoC als RK628-Betriebstakt benötigen, damit die Takte dieselbe Quelle verwenden. Ein externer 24M-Quarz kann in diesen Fällen Darstellungsprobleme verursachen. RK628F/H verbessert die Behandlung gemeinsamer Taktquellen: Der von HDMI RX erkannte TMDS CLK wird als Referenz der CRU PLL verwendet. Daher benötigen HDMI-IN-Pfade den 24-MHz-CLK des SoC nicht als Referenz.

Beim RK3568 können mehrere Pins 24 MHz ausgeben, darunter REF_CLKOUT (clk_wifi / gpio0_a0), CAM_CLKOUT1 (clk_cam1_out / gpio4_b0) und ETH_REFCLK_25M_M0 (clk_mac1_out / gpio3_b0). Andere Rockchip-Plattformen behandelt der Abschnitt zum RK628-24M-Quarztakt von einem anderen SoC. Nachfolgend wird der erste Pin verwendet.

1. Referenzieren Sie folgende Konfiguration im RK628-DTS-Knoten:

&i2c2_rk628 {
   /* soc_24M optional */
   pinctrl-names = "default";

   pinctrl-0 = <&rk628_reset &refclk_pins>;
   assigned-clocks = <&pmucru CLK_WIFI>;
   assigned-clock-rates = <24000000>;
   clocks = <&pmucru CLK_WIFI>;
   clock-names = "soc_24M";
   ......
};

2. Die folgende Konfiguration ist bereits in rk3568-pinctrl.dtsi enthalten:

&pinctrl {
   ......
   refclk {

      /omit-if-no-ref/
      refclk_pins: refclk-pins {
         rockchip,pins =
           /* refclk_ou */
           <0 RK_PA0 1 &pcfg_pull_none>;
      };
   };
   ......
};

24-MHz-CLK-Eigenschaften:

Eigenschaft Beschreibung Optionswert
pinctrl-names refclk-Pinmux einstellen Entsprechend der Hardware konfigurieren. Dies überschreibt die obigen RK628-Eigenschaften; daher auch die Referenz rk628_reset aufnehmen
pinctrl-0 refclk-Pinmux einstellen Entsprechend der Hardware konfigurieren. Dies überschreibt die obigen RK628-Eigenschaften; daher auch die Referenz rk628_reset aufnehmen
assigned-clocks RK628 zugewiesene Taktreferenz Entsprechend der Hardware konfigurieren
assigned-clock-rates RK628 zugewiesene Taktfrequenz (Hz) <24000000>
clocks Liste referenzierter Takt-Handles Entsprechend der Hardware konfigurieren
clock-names Dem Takt zugewiesener Name “soc_24M”

5.2.3 Auswahl der Ein- und Ausgangsmodule

Konfigurieren Sie im RK628-DTS-Knoten die benötigten Ein-/Ausgangsmoduleigenschaften (boolesch) oder Knoten. Konfigurieren Sie die jeweiligen Funktionsparameter im betreffenden Modulknoten:

&i2c2_rk628 {
   ......

   rk628-rgb-in;
   rk628-dsi-out {
      ......
   };
   ......
};

Für RGB → DSI setzen Sie die Eigenschaft „rk628-rgb-in;“ zur Auswahl des RGB-Eingangs und den Knoten „rk628-dsi-out“ zur Auswahl des DSI-Ausgangs. Aktuelle Misc-Eingangsmodule sind RGB IN, BT1120 IN und HDMI IN; Ausgangsmodule sind LVDS, GVI, DSI und HDMI. Einzelheiten finden Sie unter Eingangsmodulkonfiguration und Ausgangsmodulkonfiguration.

5.2.4 Panelkonfiguration

Konfigurieren Sie im RK628-DTS-Knoten Hintergrundbeleuchtung, Versorgung, Reset-Pin, Einschalttiming und Anzeigetiming gemäß der Panelspezifikation. Für einen HDMITX-Pfad ist diese Konfiguration nicht erforderlich:

&i2c2_rk628 {
   ......

   panel-backlight = <&backlight>;
   panel-power-supply = <&vcc3v3_lcd0_n>;
   panel-enable-gpios = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>;

   panel-reset-delay-ms = <10>;
   panel-enable-delay-ms = <10>;
   panel-prepare-delay-ms = <60>;
   panel-unprepare-delay-ms = <10>;
   panel-disable-delay-ms = <60>;
   panel-init-delay-ms = <60>;
   ......
   display-timings {
      src-timing {

         clock-frequency = <148500000>;
         hactive = <1920>;
         vactive = <1080>;
         hfront-porch = <88>;
         hsync-len = <44>;
         hback-porch = <148>;
         vfront-porch = <4>;
         vsync-len = <5>;
         vback-porch = <36>;
         hsync-active = <1>;
         vsync-active = <1>;
         de-active = <0>;

         pixelclk-active = <0>;
      };

      dst-timing {
         clock-frequency = <148500000>;
         hactive = <1920>;
         vactive = <1080>;
         hfront-porch = <88>;
         hsync-len = <44>;
         hback-porch = <148>;
         vfront-porch = <4>;
         vsync-len = <5>;
         vback-porch = <36>;

         hsync-active = <1>;
         vsync-active = <1>;
         de-active = <0>;
         pixelclk-active = <0>;
      };
   };
   ......
};

Paneleigenschaften:

Eigenschaft Beschreibung Optionswert
panel-enable-gpios Panel-Enable-GPIO-Referenz [optional] Entsprechend der Hardware konfigurieren
panel-reset-gpios Panel-Reset-GPIO-Referenz [optional] Entsprechend der Hardware konfigurieren
panel-backlight Panel-Hintergrundbeleuchtung [optional] Entsprechend der Hardware konfigurieren
panel-reset-delay-ms Einschalttiming des Panels Siehe Panelspezifikation
panel-enable-delay-ms Einschalttiming des Panels Siehe Panelspezifikation
panel-prepare-delay-ms Einschalttiming des Panels Siehe Panelspezifikation
panel-unprepare-delay-ms Einschalttiming des Panels Siehe Panelspezifikation
panel-disable-delay-ms Einschalttiming des Panels Siehe Panelspezifikation
panel-init-delay-ms Einschalttiming des Panels Siehe Panelspezifikation
src-timing Anzeigetiming-Knoten von SoC zu RK628 Gegenüber dst-timing horizontal und vertikal getrennt skalieren
dst-timing Anzeigetiming-Knoten des Panels Siehe Panelspezifikation
clock-frequency Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
hactive Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
vactive Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
hfront-porch Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
hback-porch Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
hsync-len Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
vfront-porch Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
vback-porch Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
vsync-len Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
hsync-active Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
vsync-active Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
de-active Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration
pixelclk-active Anzeigetiming Siehe Panelspezifikation und tatsächliche Scaler-Konfiguration

Beim Skalieren zwischen unterschiedlichen Ein- und Ausgangsauflösungen tragen Sie das Eingangstiming in src-timing und das Ausgangstiming in dst-timing ein. Der aktive Anzeigebereich und die Austastabschnitte müssen dasselbe Skalierungsverhältnis verwenden:

src: hactive / dst: hactive = src: hblanking / dst: hblanking
src: vactive / dst: vactive = src: vblanking / dst: vblanking
hblanking = hfront-porch + hback-porch + hsync-len

vblanking = vfront-porch + vback-porch + vsync-len

Auch die Bildrate muss vor und nach der Skalierung unverändert bleiben.

src: clock-frequency / (htotal * vtotal) = dst: clock-frequency / (htotal *
vtotal)
htotal = hactive + hfront-porch + hback-porch + hsync-len

vtotal = vactive + vfront-porch + vback-porch + vsync-len

Bei identischer Ein- und Ausgangsauflösung verwenden Sie dasselbe Zieltiming in src-timing und dst-timing.

Für zwei DSI-Panels gleicher Auflösung oder zwei LVDS-Panels gleicher Auflösung multiplizieren Sie clock-frequency, hactive, hfront-porch, hback-porch und hsync-len sowohl in src-timing als auch in dst-timing gegenüber der ursprünglichen Einzelpanelkonfiguration mit 2.

5.2.5 Unterschiedliche Anzeigepfadkombinationen

Beachten Sie die folgenden DTS-Beispiele. Einzelheiten zu jedem Pfad stehen unter den derzeit durch DTS unterstützten Kombinationen.

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2bt1120-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2dsi-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2dsi-dual-ddr4-v10.dts

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2gvi-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2lvds-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2lvds-dual-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2gvi-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2hdmi-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2lvds-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2lvds-dual-ddr4-v10.dts

5.2.6 Anpassung des Ausgangssignals

5.2.6.1 Signalanpassung für GVI / LVDS / MIPI TX

1. Die comb_tx-Register für Spannung und Preemphasis steuern unabhängig voneinander 10 Lane-Paare (tx0 ~ tx9 in der Registerkonfiguration). Die Schnittstellenzuordnung lautet:

COMB_TX GVI LVDS / MIPI
TX0 P/N GVI_TX0 P/N L/M0_TX0 P/N
TX1 P/N GVI_TX1 P/N L/M0_TX1 P/N
TX2 P/N / L/M0_TXCLK P/N
TX3 P/N GVI_TX2 P/N L/M0_TX2 P/N
TX4 P/N GVI_TX3 P/N L/M0_TX3 P/N
TX5 P/N GVI_TX4 P/N L/M1_TX0 P/N
TX6 P/N GVI_TX5 P/N L/M1_TX1 P/N
TX7 P/N / L/M1_TXCLK P/N
TX8 P/N GVI_TX6 P/N L/M1_TX2 P/N
TX9 P/N GVI_TX7 P/N L/M1_TX3 P/N

2. Testen Sie Signalanpassungen durch direktes Schreiben der Register. Diese Einstellungen bleiben nach einem Neustart nicht erhalten; ändern Sie für eine dauerhafte Konfiguration den folgenden Patch.

# 1. 电压缩放 N=0(75%), 1/2(100%), 3(125%) (通常无需调节)
# echo 0x90004 $val > /d/rk628/2-0050/registers/combtxphy

# $val:
#   tx0[Bit1:0], tx1[Bit3:2], tx2[Bit5:4], tx3[Bit7:6], tx4[Bit9:8]
#   tx5[Bit17:16], tx6[Bit19:18], tx7[Bit21:20], tx8[Bit23:22], tx9[Bit25:24]
# 以 1(100%) 为例:
echo 0x90004 0x01550155 > /d/rk628/2-0050/registers/combtxphy

# 2. 电压调节 N=0~7
# echo 0x90008 $val > /d/rk628/2-0050/registers/combtxphy
# $val:
#   tx0[Bit2:0], tx1[Bit5:3], tx2[Bit8:6], tx3[Bit11:9], tx4[Bit14:12]
#   tx5[Bit18:16], tx6[Bit21:19], tx7[Bit24:22], tx8[Bit27:25], tx9[Bit30:28]
# 以 3 档为例:
echo 0x90008 0x36db36db > /d/rk628/2-0050/registers/combtxphy


# 3. 预加重调节 N=0~9
# echo 0x9000c $val > /d/rk628/2-0050/registers/combtxphy
# $val: tx0[Bit3:0], tx1[Bit7:4], tx2[Bit11:8], tx3[Bit15:12], tx4[Bit19:16]
# echo 0x90010 $val > /d/rk628/2-0050/registers/combtxphy
# $val: tx5[Bit3:0], tx6[Bit7:4], tx7[Bit11:8], tx8[Bit15:12], tx9[Bit19:16]
# 以 5 档为例:
echo 0x9000c 0x55555 > /d/rk628/2-0050/registers/combtxphy
echo 0x90010 0x55555 > /d/rk628/2-0050/registers/combtxphy

3. Patch zur Ausgangssignalanpassung am Beispiel GVI TX. Beachten Sie die obigen Einstellungen.

diff --git a/drivers/misc/rk628/rk628_combtxphy.c b/drivers/misc/rk628/rk628_combtxphy.c

index 3387d8bd73b9..70d7a5422a35 100644
--- a/drivers/misc/rk628/rk628_combtxphy.c
+++ b/drivers/misc/rk628/rk628_combtxphy.c
@@ -139,6 +139,14 @@ static void rk628_combtxphy_gvi_power_on(struct rk628
*rk628)
      usleep_range(100, 200);

      rk628_i2c_update_bits(rk628, COMBTXPHY_CON0,
                      SW_TX_IDLE_MASK, 0);
+
+     // amplitude scale
+     rk628_i2c_write(rk628, COMBTXPHY_CON1, 0x01550155);
+     // amplitude level
+     rk628_i2c_write(rk628, COMBTXPHY_CON2, 0x36db36db);
+     // emphasis level
+     rk628_i2c_write(rk628, COMBTXPHY_CON3, 0x00055555);
+     rk628_i2c_write(rk628, COMBTXPHY_CON4, 0x00055555);
 }


 void rk628_combtxphy_power_on(struct rk628 *rk628)
5.2.6.2 HDMI-TX-Signalanpassung

1. Testen Sie Signalanpassungen durch direktes Schreiben der Register. Diese Einstellungen bleiben nach einem Neustart nicht erhalten; ändern Sie für dauerhafte Einstellungen den folgenden Patch.

# 1. 驱动强度调节
# echo 0x70388 $val > /d/rk628/2-0050/registers/hdmi

# $val: clk_driver_strength[Bit7:4], data_driver_strength[Bit3:0]
#      范围(强度从低到高):0x0  ~ 0xF
# 以 0x8 为例:
echo 0x70388 0x88 > /d/rk628/2-0050/registers/hdmi

# 2. 预加重调节
# echo 0x7038c $val > /d/rk628/2-0050/registers/hdmi
# $val: pre_emphasis_strength[Bit6:4]
#      范围(强度从低到高):0x0  ~ 0x7
#     clk_pre_driver_strength[Bit3:2], data_pre_driver_strength[Bit1:0]
#      范围(强度从低到高):0x0  ~ 0x3
# 以 pre_emphasis_strength = 0x3, clk/data_pre_driver_strength = 0x3 为例:

echo 0x7038c 0x3f > /d/rk628/2-0050/registers/hdmi

2. Patch zur HDMI-Ausgangssignalanpassung. Dieses Beispiel unterteilt (74.25M, 165M] in (74.25M, 148.5M] und (148.5M, 165M].

{ obere Frequenzbandgrenze, Preemphasis, Treiberstärke }: siehe die obigen Einstellungen.

diff --git a/drivers/misc/rk628/rk628_hdmitx.c b/drivers/misc/rk628/rk628_hdmitx.c
index f28b78a6b525..2120cf504ebe 100644

--- a/drivers/misc/rk628/rk628_hdmitx.c
+++ b/drivers/misc/rk628/rk628_hdmitx.c
@@ -231,6 +231,7 @@ static void rk628_hdmi_sys_power(struct rk628_hdmi *hdmi,
bool enable)
 static struct rk628_hdmi_phy_config rk628_hdmi_phy_config[] = {
      /* pixelclk pre-emp vlev */
      { 74250000, 0x3f, 0x88 },
+     { 148500000, 0x3f, 0x88 },
      { 165000000, 0x3f, 0x88 },
      { ~0UL,  0x00, 0x00 }
 };
5.2.6.3 SSC (Spreizspektrum)

1. Wenden Sie globales Spreizspektrum auf CPLL an, um in einem GVI-TX-Szenario eine Spreizspektrumausgabe zu erzeugen.

# echo 0xc000c $((val | 0xffff0000)) > /d/rk628/2-0050/registers/cru
# $val:
#   ssmod_spread[Bit12:8](Spread amplitude / 0.1%)

#   ssmod_divval[Bit7:4](Divider required to set the modulation frequency)
#   参数说明⻅下方描述
# 例 ssmod_spread = 3, ssmod_divval = 6 (推荐值):
echo 0xc000c 0xffff0360 > /d/rk628/2-0050/registers/cru

(1) ssmod_spread [Bit12:8]: Modulationstiefe. Sie sollte im Allgemeinen 5000 ppm nicht überschreiten. Da reale Umgebungen komplex sind, haben Messungen Vorrang: Der gemessene Wert darf 0.3% nicht überschreiten; empfohlen ist die Einstellung 0.3%, also spread = 3.

(2) ssmod_divval [Bit7:4]: Modulationsfrequenz; beschreibt, wie schnell sich die Frequenz ändert. Die Formel lautet:

f_mod = f_CLKSSCG / (128 × divval); f_CLKSSCG = f_PFD = f_REF / refdiv.

Dabei ist f_mod die Modulationsfrequenz, die 30–33 kHz betragen sollte; f_REF ist der Referenz- beziehungsweise Quarztakt. refdiv ist standardmäßig 1. Empfohlen wird divval = 6, wodurch f_mod = 31.25 kHz entsteht.

2. SSC-Patch am Beispiel GVI TX. Siehe die obigen Einstellungen.

diff --git a/drivers/misc/rk628/rk628_combtxphy.c b/drivers/misc/rk628/rk628_combtxphy.c

index 3387d8bd73b9..70d7a5422a35 100644
--- a/drivers/misc/rk628/rk628_combtxphy.c
+++ b/drivers/misc/rk628/rk628_combtxphy.c
@@ -139,6 +139,9 @@ static void rk628_combtxphy_gvi_power_on(struct rk628 *rk628)
      usleep_range(100, 200);
      rk628_i2c_update_bits(rk628, COMBTXPHY_CON0,
                      SW_TX_IDLE_MASK, 0);
+
+     // ssmod
+     rk628_i2c_write(rk628, CRU_CPLL_CON3, 0xffff0360);
 }
void rk628_combtxphy_power_on(struct rk628 *rk628)

5.3 Eingangsmodulkonfiguration

5.3.1 RGB-Eingang

5.3.1.1 Konfiguration des RGB-Eingangs

1. Ergänzen Sie im RK628-DTS-Knoten die boolesche Eigenschaft „rk628-rgb-in;“:

&i2c2_rk628 {
   ......

   rk628-rgb-in;
   ......
};

RGB IN / RGB OUT / BT1120 IN / BT1120 OUT teilen sich Pins; diese vier Funktionen können daher nicht gleichzeitig verwendet werden.

2. Konfigurieren Sie die RGB-Ausgabe des SoC. Beim RK3568 verwendet die RGB-Ausgabe DRM; RK628 wird als virtuelles Panel dargestellt:

/ {
   panel@0 {
      compatible = "simple-panel";


      disp_timings3: display-timings {
         native-mode = <&rgb2dsi_timing>;
         rgb2dsi_timing: timing0 {
           clock-frequency = <148500000>;
           hactive = <1920>;
           vactive = <1080>;
           hfront-porch = <88>;
           hsync-len = <44>;
           hback-porch = <148>;
           vfront-porch = <4>;
           vsync-len = <5>;
           vback-porch = <36>;

           hsync-active = <1>;
           vsync-active = <1>;
           de-active = <0>;
           pixelclk-active = <0>;
         };
      };

      port {
         panel_in_rgb: endpoint {
           remote-endpoint = <&rgb_out_panel>;
         };
      };

   };
};
&route_rgb {
   status = "okay";


   /* for u-boot logo display */
   bridge = <&i2c2_rk628>;
};

&rgb_in_vp2 {
   status = "okay";
};

&rgb {
   status = "okay";


   ports {
      port@1 {
         reg = <1>;

         rgb_out_panel: endpoint {
           remote-endpoint = <&panel_in_rgb>;
         };
      };
   };c
};

Das Timing in „panel@0/display-timings/timing0“ muss mit „&i2c2_rk628/display-timings/src-timing“ übereinstimmen.

5.3.2 BT1120-Eingang

5.3.2.1 Konfiguration des BT1120-Eingangs

Folgen Sie der RGB-Eingangskonfiguration und ersetzen Sie im RK628-DTS-Knoten die boolesche Eigenschaft „rk628-rgb-in;“ durch „rk628-bt1120-in;“:

&i2c2_rk628 {
   ......

   rk628-bt1120-in;
   // bt1120-dual-edge;
   // bt1120-yc-swap;
   // bt1120-uv-swap;
   ......
};

Ergänzen Sie für BT1120 mit beiden Taktflanken die boolesche Eigenschaft „bt1120-dual-edge;“ im RK628-Knoten.

Die Eigenschaften „bt1120-yc-swap“ und „bt1120-uv-swap“ ändern, wie RK628 die BT1120-Signalreihenfolge auf dem Kabel interpretiert. Probieren Sie diese Eigenschaften aus, wenn die Bildgeometrie korrekt, die Farben aber falsch sind.

RGB IN / RGB OUT / BT1120 IN / BT1120 OUT teilen sich Pins und können daher nicht gleichzeitig verwendet werden.

5.3.3 HDMI-Eingang

5.3.3.1 Konfiguration des HDMI-Eingangs

Für den HDMI-Eingang gibt es zwei Verbindungstypen: direkte Verbindung zum SoC oder Verbindung über ein HDMI-Kabel.

5.3.3.2 Direkte SoC-Verbindung

Konfigurieren Sie den RK628-DTS-Knoten wie folgt:

&i2c2_rk628 {
   ......
   rk628-hdmi-in;

   // src-mode-4k-yuv420;
   ......
};

Eine direkte SoC-Verbindung erfordert, dass die HDMI-Quelle standardmäßig ausgibt. RK628 benötigt daher keinen IO-Pin zur Hotplug-Erkennung der Quelle, und Auflösungswechsel werden nicht unterstützt. In diesem Modus fragt der Treiber zyklisch ab, ob ein HDMI-Eingangssignal anliegt.

Gibt die Quelle 4K YUV420 aus (force-bus-format = MEDIA_BUS_FMT_UYYVYY8_0_5X24 und force_timing legt 4K fest), ergänzen Sie unter RK628 die boolesche Eigenschaft „src-mode-4k-yuv420“. HDMIRX kann nämlich nicht vorab feststellen, ob die Quelle YUV420 ausgibt.

Die HDMI-Quelle des SoC auf eine bestimmte Auflösung festlegen:

Konfigurieren Sie beim RK3568 HDMI als erzwungene Ausgabe und legen Sie Quelltiming und bus-format fest:

#include <dt-bindings/display/media-bus-format.h>

&hdmi {

   status = "okay";
   force-bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
   force-output;
   force_timing{
      clock-frequency = <594000000>;
      hactive = <3840>;
      vactive = <2160>;
      hback-porch = <296>;
      hfront-porch = <176>;
      vback-porch = <72>;
      vfront-porch = <8>;
      hsync-len = <88>;
      vsync-len = <10>;

      hsync-active = <1>;
      vsync-active = <1>;
      de-active = <0>;
      pixelclk-active = <0>;
   };
};

&hdmi_in_vp0 {
   status = "okay";
};


&hdmi_in_vp1 {
   status = "disabled";
};

&route_hdmi {
   status = "okay";

   /* for u-boot logo display */
   bridge = <&i2c2_rk628>;
   force-bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
   force-output;
   force_timing{

      clock-frequency = <594000000>;
      hactive = <3840>;
      vactive = <2160>;
      hback-porch = <296>;
      hfront-porch = <176>;
      vback-porch = <72>;
      vfront-porch = <8>;
      hsync-len = <88>;
      vsync-len = <10>;
      hsync-active = <1>;
      vsync-active = <1>;
      de-active = <0>;
      pixelclk-active = <0>;

   };
};

Aktivieren Sie „&route_hdmi“, damit der HDMIRX-Pfad das Kernel-Startlogo anzeigen kann. Seine Werte „force-output“, „force-bus-format“ und „force_timing“ müssen mit dem Knoten „hdmi“ übereinstimmen.

Binden Sie beim Konfigurieren von force-bus-format <dt-bindings/display/media-bus-format.h> im DTS ein. Dieser Header definiert die Anzeigedatenformate.

Patch für erzwungene HDMI-Ausgabe auf dem SoC

Auf Rockchip-SoCs erfordert die erzwungene HDMI-Ausgabe mit festgelegter Auflösung den entsprechenden folgenden Patch. Vergleichen Sie ihn mit dem Quellcode, um festzustellen, ob er bereits angewendet wurde:

Patchliste Commit-Nachricht Patchbeschreibung
0190-drm-bridge-dw-hdmi-qp-Support-hdmi-force-output-kernel-5-10.patch drm/bridge: dw-hdmi-qp:
Support hdmi force
output
Anwenden, falls im HDMI-TX-Treiber von Rockchip-Kernel 5.10 nicht enthalten
0190-drm-bridge-synopsys-Support-hdmi-force-output-kernel-5-10.patch drm/bridge: synopsys:
Support hdmi force
output
Anwenden, falls im HDMI-TX-Treiber von Rockchip-Kernel 5.10 nicht enthalten
0190-drm-bridge-synopsys-Support-hdmi-force-output-kernel-4-19.patch drm/bridge: synopsys:
Support hdmi force
output
Anwenden, falls im HDMI-TX-Treiber von Rockchip-Kernel 4.19 nicht enthalten
0190-drm-bridge-synopsys-Support-hdmi-force-output.patch drm/bridge: synopsys:
Support hdmi force
output
Anwenden, falls im HDMI-TX-Treiber von Rockchip-Kernel 4.4 nicht enthalten
0189-drm-bridge-synopsys-dw-hdmi-Support-force-logo-displ.patch drm/bridge: synopsys:
dw-hdmi: Support force
logo display
Anwenden, falls im HDMI-TX-Treiber von Rockchip-Kernel 4.4 nicht enthalten
5.3.3.3 Verbindung über HDMI-Kabel

Konfigurieren Sie den RK628-DTS-Knoten wie folgt:

&i2c2_rk628 {
   ......
   interrupt-parent = <&gpio0>;

   interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
   plugin-det-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_LOW>;
   // hpd-output-inverted;
   rk628-hdmi-in;
   ......
};

Bei einem HDMI-Kabel erkennt RK628 das Hotplug der Quelle über IO und muss Änderungen der Auflösung und des Farbformats unterstützen. Konfigurieren Sie „plugin-det-gpios“, „interrupt-parent“ und „interrupts“. Dieser Hotplug-Pin erkennt die HDMI-Quelle aus Sicht des RK628, nicht RK628 aus Sicht der HDMI-Seite; normalerweise müssen beide Enden die Gegenseite erkennen.

Die boolesche Eigenschaft „hpd-output-inverted“ invertiert die obige Hotplug-Erkennungs-IO-Konfiguration. Aktivieren Sie sie, wenn die Schaltung den HPD-Ausgangspegel invertiert. Häufig ermöglichen auch GPIO_ACTIVE_LOW / GPIO_ACTIVE_HIGH eine softwareseitige Invertierung.

Um die HDMIRX-Auflösung im Kabelmodus zu ändern, setzen Sie src-timing im Abschnitt Panelkonfiguration auf die gewünschte Auflösung.

5.3.3.4 Audiokonfiguration

Bei HDMI als Eingang gibt RK628 Audio als Master über I2S aus. DTS-Soundkartenkonfiguration:

rk628_dc: rk628-dc {
   compatible = "rockchip,dummy-codec";
   #sound-dai-cells = <0>;

};

&i2s0 {
   rockchip,capture-only;
   status = "okay";
};

/ {
   hdmiin-sound {
      compatible = "simple-audio-card";
      simple-audio-card,format = "i2s";
      simple-audio-card,name = "rockchip,hdmiin";

      simple-audio-card,bitclock-master = <&dailink0_master>;
      simple-audio-card,frame-master = <&dailink0_master>;
      status = "okay";
      simple-audio-card,cpu {
         sound-dai = <&i2s0>;
      };
      dailink0_master: simple-audio-card,codec {
         sound-dai = <&rk628_dc>;
      };
   };
};

Arbeitet das I2S des SoC als Slave, wartet sein Treiber, wenn kein Takt vorhanden ist. Übermäßiges Warten kann Android zum Absturz bringen. Der folgende Patch ändert die Zeitüberschreitung:

diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c

index 9bc29fdd13c5..230c350c6765
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -468,6 +468,9 @@ static int rockchip_i2s_trigger(struct snd_pcm_substream
*substream,
           ret = -EINVAL;
           break;
      }
+     if(substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
+          substream->wait_time = msecs_to_jiffies(100);
+     }

      return ret;

 }
diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index b0c4ce01e2be..0602df42c309
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -1776,6 +1776,9 @@ static int rockchip_i2s_tdm_trigger(struct

snd_pcm_substream *substream,
           ret = -EINVAL;
           break;
      }
+     if(substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
+          substream->wait_time = msecs_to_jiffies(100);
+     }

      return ret;
 }

5.4 Ausgangsmodulkonfiguration

5.4.1 RGB-Ausgang

5.4.1.1 Konfiguration des RGB-Ausgangs

Ergänzen Sie im RK628-DTS-Knoten die boolesche Eigenschaft „rk628-rgb-out;“:

&i2c2_rk628 {
   ......
   rk628-rgb-out;

   ......
};

RGB IN / RGB OUT / BT1120 IN / BT1120 OUT teilen sich Pins; diese Funktionen können daher nicht gleichzeitig verwendet werden.

5.4.2 BT1120-Ausgang

5.4.2.1 Konfiguration des BT1120-Ausgangs

Ergänzen Sie im RK628-DTS-Knoten die boolesche Eigenschaft „rk628-bt1120-out;“:

&i2c2_rk628 {
   ......
   rk628-bt1120-out;

   // bt1120-dual-edge;
   ......
};

Ergänzen Sie für BT1120 mit beiden Taktflanken „bt1120-dual-edge;“. RGB IN / RGB OUT / BT1120 IN / BT1120 OUT teilen sich Pins und können nicht gleichzeitig verwendet werden.

5.4.3 DSI-Ausgang

5.4.3.1 Konfiguration des DSI-Ausgangs

Ergänzen Sie unter dem RK628-DTS-Knoten einen Knoten „rk628-dsi-out“:

&i2c2_rk628 {
   ......
   rk628-dsi-out {

      // rockchip,lane-mbps = <1100>;
      // rockchip,dual-channel;
      dsi,eotp;
      dsi,video-mode;
      // dsi,clk-non-continuous;
      dsi,format = "rgb888";
      dsi,lanes = <4>;
      status = "okay";

      rk628-panel {
         panel-init-sequence = [
           ......

           05 78 01 11
           05 78 01 29
         ];

         panel-exit-sequence = [
           05 00 01 28
           05 00 01 10
         ];
      };
   };
   ......
};

Eigenschaften von „rk628-dsi-out“:

Eigenschaft Beschreibung Optionswert
rockchip,lane-mbps Festgelegte MIPI-Datenbandbreite [optional]  
rockchip,dual-channel Einzel-/Dual-MIPI [optional] Standardmäßig Einzel-MIPI; Hinzufügen der Eigenschaft wählt Dual-MIPI
dsi,eotp EOT-Paket [optional]  
dsi,video-mode Video-/Befehlsmodus [optional] Standardmäßig Befehlsmodus; Hinzufügen der Eigenschaft wählt Videomodus
dsi,clk-non-continuous Kontinuierlicher/nicht kontinuierlicher Takt [optional] Standardmäßig kontinuierlicher Takt; Hinzufügen der Eigenschaft wählt nicht kontinuierlichen Takt
dsi,format DSI-Datenformat “rgb888” / “rgb666” / “rgb666-packed”
/ “rgb565”
dsi,lanes DSI-Lanes Bei Dual-MIPI die Lane-Anzahl wie bei Einzel-MIPI konfigurieren
panel-init-sequence Panelinitialisierungssequenz Spalte 1: Datentyp; Spalte 2: mdelays; Spalte 3: payload_lenth jedes Befehls; übrige Spalten: Befehlsnutzdaten
panel-exit-sequence Panel-Abschaltsequenz Wie oben

Gängige Datentypen

Datentyp Beschreibung Paketgröße
0x03 Generisches kurzes Schreiben, keine Parameter kurz
0x13 Generisches kurzes Schreiben, 1 Parameter kurz
0x23 Generisches kurzes Schreiben, 2 Parameter kurz
0x29 Generisches langes Schreiben lang
0x05 DCS-Kurzschreiben, keine Parameter kurz
0x15 DCS-Kurzschreiben, 1 Parameter kurz
5.4.3.2 Anpassung des Ausgangssignals

Siehe Konfiguration des Kerntreibers → Anpassung des Ausgangssignals → Signalanpassung für GVI / LVDS / MIPI TX.

5.4.4 LVDS-Ausgang

5.4.4.1 Konfiguration des LVDS-Ausgangs

Ergänzen Sie unter dem RK628-DTS-Knoten einen Knoten „rk628-lvds-out“:

&i2c2_rk628 {
   ......
   rk628-lvds {

      bus-format = <MEDIA_BUS_FMT_RGB888_1X7X4_SPWG>;
      link-type = "single_link";
      status = "okay";
   };
   ......
};

Eigenschaften von „rk628-lvds-out“:

Eigenschaft Beschreibung Optionswert
bus-format Busformat /
/
link-type Verbindungstyp “single_link”: ein Kanal
“dual_link_odd_even_pixels”: zwei Kanäle; links/rechts übertragen ungerade/gerade Pixel
“dual_link_even_odd_pixels”: zwei Kanäle; links/rechts übertragen gerade/ungerade Pixel
“dual_link_left_right_pixels”: zwei Kanäle; linkes/rechtes Panel
“dual_link_right_left_pixels”: zwei Kanäle; rechtes/linkes Panel
5.4.4.2 Anpassung des Ausgangssignals

Siehe Konfiguration des Kerntreibers → Anpassung des Ausgangssignals → Signalanpassung für GVI / LVDS / MIPI TX.

5.4.5 GVI-Ausgang

5.4.5.1 Konfiguration des GVI-Ausgangs

Ergänzen Sie unter dem RK628-DTS-Knoten einen Knoten „rk628-gvi-out“:

&i2c2_rk628 {
   ......
   rk628-gvi-out {

      bus-format = "rgb888";
      gvi,lanes = <8>;
      // rockchip,division-mode;
      // rockchip, gvi-frm-rst;
      status = "okay";
   };
   ......
};

Eigenschaften von „rk628-gvi-out“:

Eigenschaft Beschreibung Optionswert
bus-format Busformat “rgb666” / “rgb888” / “rgb101010” /
“yuyv8” / “yuyv10”
gvi,lanes GVI-Lanes 1、2、4、8
rockchip,division-mode ein Abschnitt / zwei Abschnitte
[optional]
Standardmäßig ein Abschnitt; Hinzufügen der Eigenschaft wählt zwei Abschnitte
rockchip, gvi-frm-rst GVI-Reset bei Bildbeginn
aktivieren [optional]
Standardmäßig deaktiviert; Hinzufügen der Eigenschaft aktiviert die Funktion
5.4.5.2 Vertauschen der Lane-Reihenfolge

Werden benachbarte Pixel im Bild regelmäßig vertauscht, ändern Sie folgende Register, um die Zuordnung zwischen combtx-Lanes und gvi_phy_datalane anzupassen:

# echo 0x80004 $val > /d/rk628/2-0050/registers/combtxphy
# $val(combtx_lane_n):

#   lane0[Bit2:0], lane1[Bit6:4], lane2[Bit10:8], lane3[Bit14:12]
#   lane4[Bit18:16], lane5[Bit22:20], lane6[Bit26:24], lane7[Bit30:28]
# 显示异常时可以优先考虑如下常用   val 值:
# 0x01234567 0x76543210 0x10325476 0x67452301 0x45670123 0x32107654 0x54761023
0x23016745
# 例:
echo 0x80004 0x01234567 > /d/rk628/2-0050/registers/combtxphy

Die entsprechende Softwareänderung lautet:

diff --git a/drivers/misc/rk628/rk628_gvi.c b/drivers/misc/rk628/rk628_gvi.c
index fb41c2143bb5..ef47e58ad377 100644
--- a/drivers/misc/rk628/rk628_gvi.c

+++ b/drivers/misc/rk628/rk628_gvi.c
@@ -150,6 +150,8 @@ static void rk628_gvi_pre_enable(struct rk628 *rk628, struct
rk628_gvi *gvi)

      rk628_i2c_update_bits(rk628, GVI_SYS_CTRL1, SYS_CTRL1_COLOR_DEPTH_MASK,
                      SYS_CTRL1_COLOR_DEPTH(gvi->color_depth));
+
+     rk628_i2c_write(rk628, GVI_SYS_CTRL3, 0x01234567);
 }

 static void rk628_gvi_enable_color_bar(struct rk628 *rk628,
5.4.5.3 Ausgangssignalanpassung und Spreizspektrum

Siehe Konfiguration des Kerntreibers → Anpassung des Ausgangssignals → Signalanpassung für GVI / LVDS / MIPI TX.

Zu SSC siehe Konfiguration des Kerntreibers → Anpassung des Ausgangssignals → SSC.

5.4.5.4 Liste getesteter RK628F-GVI-Modelle
TCON Modell Panelhersteller Auflösung
IN8205A M280DGJ-L30 Innolux 3840*2160
IN8205A M315DJJ Innolux  
Ursprünglich IN8908A; Ende 2021 auf IN8210 geändert S500DJ2-KS5 Innolux  
Ursprünglich IN8908A; Ende 2021 auf IN8210 geändert V500DJ2-KS5 Innolux  
SW0894A LC860EQY-FJA5 Xunshi (Quelle: 巡视)  
  LC550EGE LGDisplay  
Hi3231V530 HV550QUB-N8D BOE  
SW0894A MZ860004-07 ACT  
SW0894A 86S13DCX    
TLi2461MC ACT-MZ750004-07    
LP71517      
SW08006A 848.2    
TLi2380EP ist-ITV-016 FunTV  
SW08008      
10301 L22650USWL1 Lenove  
10302 HV860QUB-E1D    
CSQ12-B0S SG8561D03-1    
CSTU01-A0H H750D4-BA080AA    
CSTU01-A0W SL(LX)-23    
KV7636-VPP ST7461D02-6    
KV7626      
AUO-12417      
AUO-12415 ICB-VN65 HiteVision  
NT71120MFG-001      
EK76603E V650DK-KS5    
iLITEK-2326      
IN8205A      
MST6M60FV TN2A1FV4LCZZ    
  HS-86AW-L09PA    
  HV650QUB-F70    
  CEJZ650L07Q1 CSOT  
  MT5461D01-1 CSOT  
  BOEI650WQ1    
  UV650QUB-N90    
  LC650EQQ-SMA5    

5.4.6 HDMI-Ausgang

Zur Unterstützung von Auflösungswechseln ist der aktuelle Misc-RK628-Treiber als DRM-Bridge implementiert:

Technische Originalabbildung — EN V2.3, S. 37

Technische Originalabbildung: EN V2.3, S. 37.

5.4.6.1 Konfiguration des HDMI-Ausgangs

Ergänzen Sie im RK628-DTS-Knoten die boolesche Eigenschaft „rk628-hdmi-out“. Verbinden Sie „&rgb“ und RK628 über „remote-endpoint“:

&i2c2_rk628 {
   pinctrl-names = "default";

   pinctrl-0 = <&rk628_reset &refclk_pins>;
   assigned-clocks = <&pmucru CLK_WIFI>;
   assigned-clock-rates = <24000000>;
   clock-names = "soc_24M";
   clocks = <&pmucru CLK_WIFI>;

   rk628-rgb-in;
   rk628-hdmi-out;
   // mode-sync-pol = <0>;
   status = "okay";

   port {

      rgb_in_hdmi: endpoint {
         remote-endpoint = <&rgb_out_hdmi>;
      };
   };
};
&route_rgb {
   status = "disabled";

};

&rgb_in_vp2 {
   status = "okay";
};

&rgb {
   status = "okay";

   ports {
      port@1 {
         reg = <1>;


         rgb_out_hdmi: endpoint {
           remote-endpoint = <&rgb_in_hdmi>;
         };
      };
   };
};

Auflösung und Polarität von HDMITX folgen Standardauflösungen; daher werden keine Panelparameter konfiguriert. Setzen Sie bei RGB-/BT1120-Eingang mode-sync-pol entsprechend den tatsächlichen Werten von hsync-active und vsync-active. Da es nur eine Eigenschaft gibt, müssen hsync-active und vsync-active gleich sein. Die Standardpolarität ist 1 (positiv). Probieren Sie diese Eigenschaft bei einem gestörten Bild aus.

Der HDMITX-Pfad benötigt Takte aus einer gemeinsamen Quelle; andernfalls können Darstellungsfehler auftreten. Siehe Konfiguration des Kerntreibers → 24-MHz-Betriebstakt.

5.4.6.2 Anpassung des Ausgangssignals

Siehe Konfiguration des Kerntreibers → Anpassung des Ausgangssignals → HDMI-TX-Signalanpassung.

5.4.6.3 Audiokonfiguration
&i2s0 {
   rockchip,playback-only;

   status = "oaky";
};

/ {
   rk628_sound: rk628-sound {
      compatible = "simple-audio-card";
      simple-audio-card,format = "i2s";
      simple-audio-card,mclk-fs = <128>;
      simple-audio-card,name = "rockchip,hdmi-rk628";
      status = "oaky";
      simple-audio-card,cpu {
         sound-dai = <&i2s0>;
      };
      simple-audio-card,codec {
         sound-dai = <&i2c2_rk628>;
      };

   };
}

5.5 Derzeit durch DTS unterstützte Kombinationen

5.5.1 Konvertierung RGB → DSI

Referenz-DTS:

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-ddr4-v10.dtsi
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts

Diese DTS-Dateien erweitern rk3568-evb.dtsi um RK628-RGB-zu-MIPI-DSI-Unterstützung. Vergleichen Sie den Code mit den Abschnitten zur Ein- und Ausgangsmodulkonfiguration, um die Unterschiede zu verstehen.

Zur RGB-Ausgabe des SoC mit festgelegtem Timing siehe Eingangsmodulkonfiguration → RGB-Eingang.

5.5.2 Konvertierung RGB → LVDS

Referenz-DTS:

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-ddr4-v10.dtsi
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2lvds-ddr4-v10.dts
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2lvds-dual-ddr4-v10.dts

Die Quelle beschreibt diese DTS-Dateien als Ergänzung von RK628-RGB-zu-MIPI-DSI-Unterstützung in rk3568-evb.dtsi, obwohl dieser Abschnitt LVDS behandelt. rk3568-evb-rk628-rgb2lvds-ddr4-v10.dts gibt einkanaliges LVDS aus; rk3568-evb-rk628-rgb2lvds-dual-ddr4-v10.dts zweikanaliges LVDS. Vergleichen Sie den Code mit den Ein-/Ausgangsmodulbeschreibungen.

Zur RGB-Ausgabe des SoC mit festgelegtem Timing siehe Eingangsmodulkonfiguration → RGB-Eingang.

5.5.3 Konvertierung RGB → GVI

Referenz-DTS:

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-ddr4-v10.dtsi
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2gvi-ddr4-v10.dts

Diese DTS-Dateien erweitern rk3568-evb.dtsi um die RK628-RGB-zu-GVI-Konvertierung. Vergleichen Sie den Code mit den Ein-/Ausgangsmodulbeschreibungen.

Zur RGB-Ausgabe des SoC mit festgelegtem Timing siehe Eingangsmodulkonfiguration → RGB-Eingang.

5.5.4 Konvertierung RGB → HDMI

Referenz-DTS:

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-ddr4-v10.dtsi
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2hdmi-ddr4-v10.dts

Diese DTS-Dateien erweitern rk3568-evb.dtsi um die RK628-RGB-zu-HDMI-Konvertierung. Vergleichen Sie den Code mit den Ein-/Ausgangsmodulbeschreibungen.

HDMITX erkennt die vom Panel unterstützten Auflösungen und wählt eine Zielauflösung aus. Daher wird das RGB-Ausgabetiming des SoC nicht im DTS konfiguriert.

5.5.5 Konvertierung HDMI → DSI

Referenz-DTS:

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-ddr4-v10.dtsi
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2dsi-ddr4-v10.dts

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2dsi-dual-ddr4-v10.dts

Diese DTS-Dateien erweitern rk3568-evb.dtsi um die RK628-HDMI-zu-DSI-Konvertierung im direkten SoC-Modus. rk3568-evb-rk628-hdmi2dsi-ddr4-v10.dts gibt Einzel-MIPI-DSI aus; rk3568-evb-rk628-hdmi2dsi-dual-ddr4-v10.dts Dual-MIPI-DSI. Vergleichen Sie den Code mit den Ein-/Ausgangsmodulbeschreibungen.

Zur SoC-Ausgabe mit festgelegtem Timing nennt die Quelle RGB, verweist jedoch auf Eingangsmodulkonfiguration → HDMI-Eingang; überprüfen Sie diese Terminologie.

5.5.6 Konvertierung HDMI → LVDS

Referenz-DTS:

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-ddr4-v10.dtsi
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2lvds-ddr4-v10.dts

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2lvds-dual-ddr4-v10.dts

Diese DTS-Dateien erweitern rk3568-evb.dtsi um die RK628-HDMI-zu-LVDS-Konvertierung im direkten SoC-Modus. rk3568-evb-rk628-hdmi2lvds-ddr4-v10.dts gibt einkanaliges LVDS aus; rk3568-evb-rk628-hdmi2lvds-dual-ddr4-v10.dts zweikanaliges LVDS. Vergleichen Sie den Code mit den Ein-/Ausgangsmodulbeschreibungen.

Zur SoC-Ausgabe mit festgelegtem Timing nennt die Quelle RGB, verweist jedoch auf Eingangsmodulkonfiguration → HDMI-Eingang; überprüfen Sie diese Terminologie.

5.5.7 Konvertierung HDMI → GVI

Referenz-DTS:

arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-ddr4-v10.dtsi
arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2gvi-ddr4-v10.dts

Diese DTS-Dateien erweitern rk3568-evb.dtsi um die RK628-HDMI-zu-GVI-Konvertierung im direkten SoC-Modus. Vergleichen Sie den Code mit den Ein-/Ausgangsmodulbeschreibungen.

Zur SoC-Ausgabe mit festgelegtem Timing nennt die Quelle RGB, verweist jedoch auf Eingangsmodulkonfiguration → HDMI-Eingang; überprüfen Sie diese Terminologie.

5.6 Grundlegende Debug-Befehle

5.6.1 Register-Debug-Knoten

Unter /sys/kernel/debug/regmap:

rk3568_t:/ # ls /sys/kernel/debug/regmap/
0-001c        2-0050-dsi1 2-0050-hdmirx 4-0050-gpio0
0-0020        2-0050-efuse 4-0050-adapter 4-0050-gpio1

0-0020-rk817-codec 2-0050-gpio0 4-0050-combrxphy 4-0050-gpio2
2-0050-adapter 2-0050-gpio1 4-0050-combtxphy 4-0050-gpio3
2-0050-combrxphy 2-0050-gpio2 4-0050-cru 4-0050-grf
2-0050-combtxphy 2-0050-gpio3 4-0050-csi 4-0050-gvi
2-0050-cru    2-0050-grf 4-0050-dsi0  4-0050-hdmi
2-0050-csi    2-0050-gvi 4-0050-dsi1  4-0050-hdmirx
2-0050-dsi0   2-0050-hdmi 4-0050-efuse ......

Oder unter /sys/kernel/debug/rk628/x-xxxx/registers:

rk3568_t:/ # ls /sys/kernel/debug/rk628/2-0050/registers/
adapter combrxphy combtxphy cru csi dsi0 dsi1 efuse gpio0 gpio1 gpio2
gpio3 grf gvi hdmi hdmirx

Dabei ist 2 die I2C-Busnummer und 0050 die RK628-Slave-Adresse.

1. Register lesen, am Beispiel GRF:

Unter /sys/kernel/debug/regmap:

rk3568_t:/ # cat /sys/kernel/debug/regmap/2-0050-grf/registers
000: 06000088
004: ffffffff

008: 00000000
00c: 00000000
010: 00000001
014: 00000000
018: 00050000
01c: 002c0898
020: 00c00840
......

rk3568_t:/ # cat /sys/kernel/debug/regmap/2-0050-grf/registers | grep 200:
200: 20230321

Oder unter /sys/kernel/debug/rk628/x-xxxx/registers:

rk3568_t:/ # cat /sys/kernel/debug/rk628/2-0050/registers/grf
rk628_grf:


0x0000: 06000298 ffffffff 00000000 00000001
0x0010: 00000001 00000000 000404b6 002804ba
0x0020: 0046047e 000a079e 00140794 0046047e
0x0030: 00140794 00000004 00000000 00000000
0x0040: 04380004 80000000 00000000 00000000
0x0050: 80000000 00000000 10000000 00000000
0x0060: 000002ea 01f0ea00 00000000 01f00000
0x0070: 0000155c 00005602 00000000 00000000
0x0080: 00006000 00000000 00000000 00000000
......

rk3568_t:/ # cat /sys/kernel/debug/rk628/2-0050/registers/grf | grep 0200:

0x0200: 20230321 00000000 00000000 00000000

2. Register schreiben, am Beispiel GRF:

Unter /sys/kernel/debug/regmap:

rk3568_t:/ # echo 0x010 0x02000200 > /sys/kernel/debug/regmap/2-0050-
grf/registers

Oder unter /sys/kernel/debug/rk628/x-xxxx/registers:

rk3568_t:/ # echo 0x010 0x02000200 > /sys/kernel/debug/rk628/2-0050/registers/grf

5.6.2 Selbsttestbefehle

Verwenden Sie bei fehlerhafter Ausgabe den folgenden Befehl, um festzustellen, ob das Problem auf der RK628-Eingangs- oder Ausgangsseite liegt. Dies ist nur auf RK628F/H verfügbar.

# Enable horizontal color bar
rk3568_t:/ # echo 1 > /sys/kernel/debug/rk628/2-0050/scaler_color_bar


# Enable vertical color bar
rk3568_t:/ # echo 2 > /sys/kernel/debug/rk628/2-0050/scaler_color_bar

# Disable color bar
rk3568_t:/ # echo 0 > /sys/kernel/debug/rk628/2-0050/scaler_color_bar

Wird der Scaler-Farbbalken korrekt angezeigt, untersuchen Sie die Hostausgabe, den RK628-Eingang und die RK628-Process-Konfiguration. Prüfen Sie andernfalls zuerst den RK628-Ausgang und verwenden Sie dann die folgenden Schnittstellen-Farbbalken, um Controller, PHY und Panelpfad einzeln zu testen. Funktionieren diese Modulfarbbalken, während der Scaler-Farbbalken weiterhin fehlt, untersuchen Sie den RK628-Eingang weiter.

Die folgenden Befehle testen den Ausgangscontroller, seinen PHY und den Panelpfad:

1. HDMITX-Farbbalken

# Enable normal color bar
rk3568_t:/ # echo 1 > /sys/kernel/debug/rk628/2-0050/hdmitx_color_bar


# Enable special color bar
rk3568_t:/ # echo 2 > /sys/kernel/debug/rk628/2-0050/hdmitx_color_bar

# Enable black color bar
rk3568_t:/ # echo 3 > /sys/kernel/debug/rk628/2-0050/hdmitx_color_bar

# Disable color bar
rk3568_t:/ # echo 0 > /sys/kernel/debug/rk628/2-0050/hdmitx_color_bar

2. DSI-Farbbalken

# Enable dsi color bar
rk3568_t:/ # echo 1 > /sys/kernel/debug/rk628/2-0050/dsi_color_bar


# Disable dsi color bar
rk3568_t:/ # echo 0 > /sys/kernel/debug/rk628/2-0050/dsi_color_bar

3. GVI-Farbbalken

# Enable color bar
rk3568_t:/ # echo 1 > /sys/kernel/debug/rk628/2-0050/gvi_color_bar


# Disable color bar
rk3568_t:/ # echo 0 > /sys/kernel/debug/rk628/2-0050/gvi_color_bar

5.6.3 RGB-IN-Fehlersuche (nur RK628F/H)

Auf RK628F/H meldet der folgende Befehl die tatsächlich von RGB IN empfangene Auflösung und hilft zu bestimmen, ob RGB RX korrekt arbeitet:

rk3568_t:/ # cat /sys/kernel/debug/rk628/2-0050/rgb_resolution
1080x1920 pclk:131967000

5.7 Häufige Anzeigeprobleme

5.7.1 Kein regmap-Knoten

Prüfen Sie die Protokolle auf RK628-Fehler wie die folgenden, die eine erfolgreiche Probe-Initialisierung verhindern:

rk3568_t:/ # dmesg | grep rk628
[  0.294331] rk628 2-0050: the driver version is 0.1.0 of RK628-F/B/G

[  0.294426] rk628 2-0050: failed to request enable GPIO: -16

5.7.2 I2C-Kommunikationsfehler

Diese Protokolle zeigen, dass RK628-I2C-Fehler die Registrierung seiner Module verhindern. Prüfen Sie die RK628-Einschaltreihenfolge, den 24-MHz-Referenztakt (siehe Allgemeine Anforderungen) und das IOMUX der betreffenden Pins.

[  0.960609] rk628 1-0050: failed to access register: -6

5.7.3 DSI/GVI zeigt Inhalte, aber ein gestörtes Bild

Versuchen Sie, die Austastpolaritäten in src-timing im DTS zu ändern. Dies gilt sowohl für DSI als auch für GVI.

Beispielsweise:

--- a/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts
@@ -347,8 +347,8 @@ src-timing {

                       vfront-porch = <15>;
                       hsync-len = <2>;
                       vsync-len = <2>;
-                      hsync-active = <0>;
-                      vsync-active = <0>;
+                      hsync-active = <1>;
+                      vsync-active = <1>;
                       de-active = <0>;
                       pixelclk-active = <0>;

5.7.4 Keine DSI-Anzeige nach Erhöhung von clock-frequency

Eine höhere Bildwiederholrate erfordert normalerweise eine Erhöhung von clock-frequency, beispielsweise:

--- a/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts
@@ -338,7 +338,7 @@ rk628-panel {


           display-timings {
                 src-timing {
-                      clock-frequency = <132000000>;
+                      clock-frequency = <148500000>;
                       hactive = <1080>;
                       vactive = <1920>;
                       hback-porch = <30>;
@@ -354,7 +354,7 @@ src-timing {
                 };

                 dst-timing {

-                      clock-frequency = <132000000>;
+                      clock-frequency = <148500000>;
                       hactive = <1080>;
                       vactive = <1920>;
                       hback-porch = <30>;

Ein höherer CLK kann Flackern oder ein fehlendes Bild verursachen. Versuchen Sie dann, die Lane-Rate wie folgt anzupassen:

--- a/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-rgb2dsi-ddr4-v10.dts
@@ -57,6 +57,7 @@ &i2c2_rk628 {


           rk628-rgb-in;
           rk628-dsi-out {
+                rockchip,lane-mbps = <1000>;
                 //rockchip,dual-channel;
                 dsi,eotp;
                 dsi,video-mode;

5.7.5 Bildversatz

Erzeugt beispielsweise der HDMI-Eingang nachgelagert ein versetztes Bild, passen Sie im DTS die Panel-Austastzeiten entsprechend der Versatzrichtung an: hfront-porch/hback-porch/hsync-len und vfront-porch/vback-porch/vsync-len in src-timing/dst-timing. Stellen Sie sicher, dass die Ausgangs-clock-frequency dem HDMI-Eingang entspricht, beispielsweise 148500000 auf beiden Seiten.

--- a/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2dsi-ddr4-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb-rk628-hdmi2dsi-ddr4-v10.dts
@@ -314,7 +314,7 @@ src-timing {

                 hfront-porch = <60>;
                 vback-porch = <10>;
                 vfront-porch = <10>;
-                hsync-len = <20>;
+                hsync-len = <40>;
                 vsync-len = <10>;
                 hsync-active = <1>;
                 vsync-active = <1>;

5.7.6 Ansteuern der RK628-GPIOs

Rufen Sie an der gewünschten Stelle die GPIO-Schnittstelle auf und binden Sie rk628_pinctrl.h sowie rk628_gpio.h ein. Die Schnittstelle umfasst IOMUX, Richtung und Pegel. Folgendes setzt I2S_D2_M0 in den GPIO-Modus und treibt es auf High:

#include "rk628_pinctrl.h"
#include "rk628_gpio.h"


rk628_misc_gpio_direction_output(rk628, GPIO0_A6, 1);

Zum Wiederherstellen der ursprünglichen Funktion rufen Sie auf:

rk628_misc_pinctrl_set_mux(rk628, GPIO0_A6, I2SM0D2);

6. Media

6.1 Treiberüberblick

Technische Originalabbildung — EN V2.3, S. 46

Technische Originalabbildung: EN V2.3, S. 46.

Media ist der Treibercode für den HDMI-IN-Pfad des RK628. Er verwendet RK628 wie ein Kameragerät, um die oben dargestellten Funktionen umzusetzen.

6.1.1 Verbesserungen von RK628F/H gegenüber RK628D

Der Media-Treiber verbindet hauptsächlich HDMI2CSI, HDMI2DSI oder HDMI2BT1120 mit einem Host-SoC. Gegenüber RK628D sind die wichtigsten Verbesserungen von RK628F/H in diesem Bereich:

主要改进点

Modul

Unterstützt HDMI2.0 und RGB-4K60-Eingang.

HDMIRX unterstützt zusätzliche Frequenzpunkte.

Unterstützt DVI-Modus mit schnellerem und stabilerem Einrasten.

解决了不同图像格式输入,格式转换下采样引入的色偏问题
增加一路  MIPI-CSI,双 MIPI-CSI 支持 4K60 输出

MIPI-CSI

CSC ergänzt eine Matrix für flexiblere Bildfarbraumkonvertierung.

6.1.2 Treiberverzeichnisstruktur

Der RK628-Media-Treibercode unterscheidet sich je nach Kernelversion. Vor kernel-5.10 verwenden Sie das Patchpaket rk628_for-all, für kernel-5.10 dagegen kernel_5.10_rk628_media_patch.

Für Kernel vor kernel-5.10 lautet die Verzeichnisstruktur:

drivers/media/i2c/rk628
├── Makefile

├── rk628_bt1120_v4l2.c
├── rk628.c
├── rk628_combrxphy.c
├── rk628_combrxphy.h
├── rk628_combtxphy.c
├── rk628_combtxphy.h
├── rk628_cru.c
├── rk628_cru.h
├── rk628_csi.c
├── rk628_csi.h
├── rk628_csi_v4l2.c
├── rk628_dsi.c

├── rk628_dsi.h
├── rk628_gpio.h
├── rk628_grf.h
├── rk628.h
├── rk628_hdmirx.c
├── rk628_hdmirx.h
├── rk628_mipi_dphy.c
├── rk628_mipi_dphy.h
├── rk628_pinctrl.c
├── rk628_pinctrl.h
├── rk628_post_process.c
├── rk628_post_process.h

└── rk628_v4l2_controls.h

Für kernel-5.10 lautet das Treiberverzeichnis:

drivers/media/i2c/rk628
├── Makefile

├── rk628_bt1120_v4l2.c
├── rk628.c
├── rk628_combrxphy.c
├── rk628_combrxphy.h
├── rk628_combtxphy.c
├── rk628_combtxphy.h
├── rk628_cru.c
├── rk628_cru.h
├── rk628_csi.c
├── rk628_csi.h
├── rk628_csi_v4l2.c
├── rk628_dsi.c
├── rk628_dsi.h

├── rk628.h
├── rk628_hdmirx.c
├── rk628_hdmirx.h
├── rk628_mipi_dphy.c
├── rk628_mipi_dphy.h
├── rk628_post_process.c
└── rk628_post_process.h

Die wichtigsten Treiberdateien und vorgesehenen Anwendungsfälle sind:

rk628_csi.c: HDMI2CSI für CameraHal1 und Drittanbieter-SoCs.

rk628_csi_v4l2.c: HDMI2CSI / HDMI2DSI für V4L2-basierte Plattformen wie CameraHal3 und TV input.

rk628_bt1120_v4l2.c: HDMI2BT1120 für V4L2-basierte Plattformen wie CameraHal3.

6.1.3 Treiberportierung

Siehe Treiberportierung → HDMI-IN-Pfad (drivers/media/i2c/rk628).

6.2 HDMI-IN-Videoframework

Die HDMI-IN-Videoimplementierung modelliert RK628 als MIPI-SoC-Kameragerät. Das Kamera- oder TV-Framework empfängt Video zur Anzeige in einer APK. HDMI-IN-Hotplug und automatische Auflösungsanpassung kommen für HDMI-Eingangsszenarien hinzu.

Android9/10/11 verwendet cameraHAL3. Siehe Rockchip_Developer_Guide_HDMI_IN_Based_On_CameraHal3_CN.pdf unter RKDocs/common/camera/hdmi-in im SDK.

Android12/13 verwendet cameraHAL3/TVinput. Siehe folgendes Dokument unter RKDocs/common/camera/hdmi-in im SDK:

Rockchip_Developer_Guide_Android12+_HDMI_IN_Bridge_CN

6.2.1 Ablauf der HDMI-IN-APK

Der allgemeine APK-Ablauf ist nachfolgend dargestellt:

Technische Originalabbildung — EN V2.3, S. 49

Technische Originalabbildung: EN V2.3, S. 49.

Bei kernel-4.19 oder kernel-4.4 (Android 9/10/11) kann rkCamera2 die Vorschau direkt öffnen.

Unterscheiden Sie bei kernel-5.10 (Android 12/13) zwischen Kamera- und TV-Framework. Siehe:

Rockchip_Developer_Guide_Android12+_HDMI_IN_Bridge_CN

6.2.2 Architektur des RK628-Treibers

Drei Treiberbereiche erfordern besondere Aufmerksamkeit: Initialisierung, Hotplug-Interruptbehandlung und Behandlung von Auflösungsänderungsinterrupts. Es folgen Referenzablaufdiagramme:

Technische Originalabbildung — EN V2.3, S. 51

Technische Originalabbildung: EN V2.3, S. 51.

Technische Originalabbildung — EN V2.3, S. 50

Technische Originalabbildung: EN V2.3, S. 50.

Technische Originalabbildung — EN V2.3, S. 52

Technische Originalabbildung: EN V2.3, S. 52.

6.3 DTS-Konfiguration

6.3.1 RK628-Knotenkonfiguration

&i2c5 {
   status = "okay";


   rk628_csi: rk628_csi@50 {
      reg = <0x50>;
      compatible = "rockchip,rk628-csi-v4l2";
      status = "okay";
      power-domains = <&power RK3588_PD_VI>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_pin>;
      interrupt-parent = <&gpio2>;
      interrupts = <RK_PC4 IRQ_TYPE_LEVEL_HIGH>;
      enable-gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
      plugin-det-gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>;

      continues-clk = <1>;

      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "HDMI-MIPI";
      rockchip,camera-module-lens-name = "RK628-CSI";

      multi-dev-info {
         dev-idx-l = <0>;
         dev-idx-r = <1>;
         combine-idx = <0>;
         pixel-offset = <0>;

         dev-num = <2>;
      };

      port {
         hdmiin_out0: endpoint {
           remote-endpoint = <&hdmi_mipi0_in>;
           data-lanes = <1 2 3 4>;
         };
      };
   };
};

reg: I2C-Adresse. Die typische 7-Bit-Adresse des RK628 ist 0x50. Bei mehreren RK628-Geräten kann dessen GPIO die Adresse ändern; siehe I2C-Kommunikation zwischen SoC und RK628.

compatible:

compatible = “rockchip,rk628-csi” wählt rk628_csi.c; compatible = “rockchip,rk628-csi-v4l2” wählt rk628_csi_v4l2.c; compatible = “rockchip,rk628-bt1120-v4l2” wählt rk628_bt1120_v4l2.c.

interrupt-parent/interrupts: GPIO-Pin, der mit dem RK628-Interrupt verbunden ist.

enable-gpios: GPIO zur RK628-Stromversorgungssteuerung; bei dauerhafter Versorgung weglassen.

reset-gpios: GPIO zur RK628-Resetsteuerung.

hpd-output-inverted: HPD-Ausgabe invertieren. Aktivieren, wenn die Hardwareschaltung den HPD-Pegel invertiert.

Technische Originalabbildung — EN V2.3, S. 54

Technische Originalabbildung: EN V2.3, S. 54.

plugin-det-gpios: GPIO zur Erkennung des HDMI-Einsteckens. Prüfen Sie, ob die Schaltung den Pegel invertiert, und konfigurieren Sie den aktiven Pegel entsprechend.

Technische Originalabbildung — EN V2.3, S. 54

Technische Originalabbildung: EN V2.3, S. 54.

power-gpios: GPIO zur Steuerung der MIPI-RX-Stromversorgungsdomäne des Rockchip-Hosts; bei dauerhafter Versorgung weglassen.

hdcp-enable: HDCP aktivieren.

continues-clk: kontinuierlichen oder nicht kontinuierlichen MIPI-CSI-Ausgabetakt wählen.

multi-dev-info: für Dual-MIPI 4K60 erforderlich (nur RK628F/H). Die Quelle nennt RK3588/RK3562/RK3576 und Kernelversionen ab 5.10.

6.3.2 Bildempfangspfade

Entwickeln Sie RK628 als kameraähnlichen Konverter mit einem V4L2-Treiber, ebenso wie einen Kamerasensor. Konfigurieren Sie den Datenpfad wie bei einem MIPI-SoC-Sensor. Drei häufige Kombinationen sind:

RK628 → HDMI2CSI → SoC

RK628 → HDMI2DSI → SoC

RK628 → HDMI2BT1120 → SoC

6.3.3 HDMI2CSI-Pfad

6.3.3.1 RK628D

Beispiel RK3288 + CSI_V4L2: Pfadkonfiguration rk628 + isp1.

&rk628_csi {
   status = "okay";
   /*

   * If the hpd output level is inverted on the circuit,
   * the following configuration needs to be enabled.
   */
   /* hpd-output-inverted; */
   plugin-det-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
   power-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
   rockchip,camera-module-index = <0>;
   rockchip,camera-module-facing = "back";
   rockchip,camera-module-name = "RK628-CSI";

   rockchip,camera-module-lens-name = "NC";

   port {
      hdmiin_out0: endpoint {
         remote-endpoint = <&mipi_in>;
         data-lanes = <1 2 3 4>;
      };
   };
};

&mipi_phy_rx0 {
   status = "okay";


   ports {
      #address-cells = <1>;
      #size-cells = <0>;

      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;

         mipi_in: endpoint@1 {
            reg = <1>;
            remote-endpoint = <&hdmiin_out0>;

            data-lanes = <1 2 3 4>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;

         dphy_rx_out: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&isp_mipi_in>;

         };
      };
   };
};

&rkisp1 {
   status = "okay";
   port {
      #address-cells = <1>;
      #size-cells = <0>;

      isp_mipi_in: endpoint@0 {
         reg = <0>;

         remote-endpoint = <&dphy_rx_out>;
      };
   };
};

&isp_mmu {

   status = "okay";
};

Beispiel RK3568 + CSI_V4L2: Pfadkonfiguration rk628 + isp2:

&i2c2 {
   status = "okay";

   pinctrl-names = "default";
   pinctrl-0 = <&i2c2m1_xfer>;

   rk628_csi: rk628_csi@32 {
      compatible = "rockchip,rk628-csi-v4l2";
      reg = <0x50>;
      interrupt-parent = <&gpio4>;
      interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_irq>;
      reset-gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>;
      plugin-det-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
      rockchip,camera-module-index = <0>;

      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "RK628-CSI";
      rockchip,camera-module-lens-name = "NC";
      port {
         rk628_out: endpoint {
           remote-endpoint = <&mipi_in>;
           data-lanes = <1 2 3 4>;
         };
      };
   };
};


&csi2_dphy_hw {
   status = "okay";
};

&csi2_dphy0 {
   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;
      port@0 {
         reg = <0>;
         #address-cells = <1>;

         #size-cells = <0>;

         mipi_in: endpoint@0 {
           reg = <0>;
           remote-endpoint = <&rk628_out>;
           data-lanes = <1 2 3 4>;
         };
      };
      port@1 {
         reg = <1>;

         #address-cells = <1>;
         #size-cells = <0>;

         csidphy0_out: endpoint@0 {
           reg = <0>;
           remote-endpoint = <&isp0_in>;
         };
      };
   };
};

&rkisp {

   status = "okay";
};

&rkisp_mmu {
   status = "okay";
};

&rkisp_vir0 {
   status = "okay";

   port {
      #address-cells = <1>;
      #size-cells = <0>;


      isp0_in: endpoint@0 {
         reg = <0>;
         remote-endpoint = <&csidphy0_out>;
      };
   };
};

RK3568-Pfadkonfiguration rk628 + vicap:

&i2c2 {
   status = "okay";
   pinctrl-names = "default";

   pinctrl-0 = <&i2c2m1_xfer>;

   rk628_csi: rk628_csi@32 {
      compatible = "rockchip,rk628-csi-v4l2";
      reg = <0x50>;
      //clocks = <&ext_cam_clk>;
      //clock-names = "xvclk";

      interrupt-parent = <&gpio4>;
      interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_irq>;

      //power-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>;
      plugin-det-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";

      rockchip,camera-module-name = "RK628-CSI";
      rockchip,camera-module-lens-name = "NC";
      port {
         rk628_out: endpoint {
            remote-endpoint = <&mipi_in>;
            data-lanes = <1 2 3 4>;
         };
      };
   };
};

&csi2_dphy_hw {

   status = "okay";
};

&csi2_dphy0 {
   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;
      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;


         mipi_in: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&rk628_out>;
            data-lanes = <1 2 3 4>;
         };
      };
      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;


         csidphy0_out: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&mipi_csi2_input>;
            data-lanes = <1 2 3 4>;
         };
      };
   };
};

&mipi_csi2 {
   status = "okay";

   ports {

      #address-cells = <1>;
      #size-cells = <0>;
      port@0 {
         reg = <0>;
         #address-cells = <1>;

         #size-cells = <0>;

         mipi_csi2_input: endpoint@1 {
           reg = <1>;
           remote-endpoint = <&csidphy0_out>;
           data-lanes = <1 2 3 4>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;

         #size-cells = <0>;

         mipi_csi2_output: endpoint@0 {
           reg = <0>;
           remote-endpoint = <&cif_mipi_in>;
           data-lanes = <1 2 3 4>;
         };
      };
   };
};

&rkcif {
   status = "okay";

};

&rkcif_mipi_lvds {
   status = "okay";

   port {
      cif_mipi_in: endpoint {
         remote-endpoint = <&mipi_csi2_output>;
         data-lanes = <1 2 3 4>;
      };
   };
};


&rkcif_mmu {
   status = "okay";
};
6.3.3.2 RK628F/H

Die DTS-Konfiguration des Host-SoC für RK628F/H entspricht im Wesentlichen RK628D; siehe das dortige Beispiel.

RK628F/H unterstützt Dual-MIPI. Dieser Absatz nennt nur RK3588/RK3562 als unterstützte Hosts. Das folgende RK3588-Dual-MIPI-Beispiel verbindet RK628F/H CSI0/CSI1 über vicap mit RK3588 CSI0/CSI1.

&csi2_dphy0 {
   status = "okay";
   ports {
      #address-cells = <1>;

      #size-cells = <0>;
      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;

         hdmi_mipi2_in: endpoint@1 {
            reg = <1>;
            remote-endpoint = <&hdmiin_out1>;
            data-lanes = <1 2 3 4>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;

         csidphy0_out: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&mipi2_csi2_input>;
         };
      };
   };
};


&csi2_dphy0_hw {
   status = "okay";
};

&csi2_dphy1_hw {
   status = "okay";
};

&i2c3 {
   status = "okay";
   clock-frequency = <400000>;


   rk628_csi: rk628_csi@50 {
      reg = <0x50>;
      compatible = "rockchip,rk628-csi-v4l2";
      status = "okay";
      power-domains = <&power RK3588_PD_VI>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_pin>;
      interrupt-parent = <&gpio1>;
      interrupts = <RK_PB2 IRQ_TYPE_LEVEL_HIGH>;
      enable-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;
      plugin-det-gpios = <&gpio2 RK_PB6 GPIO_ACTIVE_LOW>;
      continues-clk = <1>;


      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "HDMI-MIPI2";
      rockchip,camera-module-lens-name = "RK628-CSI";


      multi-dev-info {
         dev-idx-l = <2>;
         dev-idx-r = <4>;
         combine-idx = <2>;
         pixel-offset = <0>;
         dev-num = <2>;
      };

      port {
         hdmiin_out1: endpoint {
            remote-endpoint = <&hdmi_mipi2_in>;
            data-lanes = <1 2 3 4>;

         };
      };
   };
};

&mipi_dcphy0 {
   status = "okay";
};

&mipi_dcphy1 {
   status = "okay";
};


&mipi2_csi2 {
   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;

      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;


         mipi2_csi2_input: endpoint@1 {
            reg = <1>;
            remote-endpoint = <&csidphy0_out>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;

         mipi2_csi2_output: endpoint@0 {
            reg = <0>;

            remote-endpoint = <&cif_mipi_in2>;
         };
      };
   };
};


&rkcif {
   status = "okay";
};

&rkcif_mipi_lvds2 {
   status = "okay";

   port {
      cif_mipi_in2: endpoint {
         remote-endpoint = <&mipi2_csi2_output>;
      };
   };

};

&rkcif_mmu {
   status = "okay";
};

6.3.4 HDMI2DSI-Konvertierung

6.3.4.1 RK628D

Bei RK628D HDMI-zu-MIPI-CSI können Farbraumkonvertierung oder Auf-/Abwärtsabtastung geringe Abweichungen bei Farbdetails verursachen. HDMI-zu-MIPI-DSI ist eine Alternative: Der Host empfängt RGB888 direkt und die Anwendung konvertiert es mit rgb2yuv. Beachten Sie:

Maximale Auflösung: 1080P60.

Als Unterstützung für MIPI-DSI-Empfang nennt die Quelle folgende APs: RK1109, RK1126, RK3566, RK3568, RK3588, RK3562 und RK3576 (Schreibweisen der Quelle beibehalten).

Ältere APs wie RK3288, RK3326, RK3368 und RK3399 unterstützen keinen MIPI-DSI-Empfang.

CSI und DSI verwenden gemeinsamen kompatiblen Code und werden durch DTS compatible unterschieden:

CSI: compatible = “rockchip,rk628-csi-v4l2”;

DSI: compatible = “rockchip,rk628-dsi-v4l2”;

RK3568-Beispiel:

&i2c2 {
   status = "okay";
   pinctrl-names = "default";

   pinctrl-0 = <&i2c2m1_xfer>;

   rk628_csi: rk628_csi@32 {
      compatible = "rockchip,rk628-dsi-v4l2";
      reg = <0x50>;

      interrupt-parent = <&gpio4>;
      interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_irq>;
      //power-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>;

      plugin-det-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "RK628-CSI";
      rockchip,camera-module-lens-name = "NC";
      port {
         rk628_out: endpoint {
            remote-endpoint = <&hdmi2mipi_in>;
            data-lanes = <1 2 3 4>;
         };
      };
   };

};

&mipi_csi2 {
   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;

      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;


         mipi_csi2_input: endpoint@1 {
            reg = <1>;
            remote-endpoint = <&csidphy_out>;
            data-lanes = <1 2 3 4>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;


         mipi_csi2_output: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&cif_mipi_in>;
            data-lanes = <1 2 3 4>;
         };
      };
   };
};

&rkcif {
   status = "okay";
};


&rkcif_mipi_lvds {
   status = "okay";
   port {
      cif_mipi_in: endpoint {

         remote-endpoint = <&mipi_csi2_output>;
         data-lanes = <1 2 3 4>;
      };
   };
};

&rkcif_mmu {
   status = "okay";
};

&csi2_dphy_hw {
   status = "okay";

};

&csi2_dphy0 {
   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;
      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;


         hdmi2mipi_in: endpoint@0 {
           reg = <1>;
           remote-endpoint = <&rk628_out>;
           data-lanes = <1 2 3 4>;
         };
      };
      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;

         csidphy_out: endpoint@0 {

           reg = <0>;
           remote-endpoint = <&mipi_csi2_input>;
         };
      };
   };
};

Bei einem RK3568-Host mit älterem Code benötigt CIF folgenden Commit zum Empfang von RGB888:

Die RK3588-Treiber für kernel-5.10 unterstützen RGB888 standardmäßig.

From e925e385a41a857e8e50020b5df9a2d41b166d83 Mon Sep 17 00:00:00 2001
From: Zefa Chen <zefa.chen@rock-chips.com>
Date: Thu, 02 Sep 2021 15:07:13 +0800

Subject: [PATCH] media: rockchip: cif fix errors in rgb24 data format
Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
Change-Id: I0766997860f06dc25e604c2ea8425049a987fdc5

---

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 6c0aa7d..36bd2c9 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1785,13 +1785,11 @@
     * needs aligned with :ALIGN(bits_per_pixel * width * 2, 8), to optimize
reading and
     * writing of ddr, aliged with 256
     */

-   if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact) {
+   if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
+      fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
       channel->virtual_width = ALIGN(channel->width * fmt->raw_bpp / 8, 256);
    } else {
-      if (fmt->fmt_type == CIF_FMT_TYPE_RAW && fmt->csi_fmt_val !=
CSI_WRDDR_TYPE_RAW8)
-         channel->virtual_width = ALIGN(channel->width * 2, 8);
-      else
-         channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
+      channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
    }


    if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)
@@ -3240,7 +3238,8 @@

       if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
          (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2 ||
-         dev->active_sensor->mbus.type == V4L2_MBUS_CCP2)) {
+         dev->active_sensor->mbus.type == V4L2_MBUS_CCP2) &&
+         fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
          bpl = ALIGN(width * fmt->raw_bpp / 8, 256);
       } else {
          bpp = rkcif_align_bits_per_pixel(stream, fmt, i);
@@ -4659,13 +4658,11 @@

     * needs aligned with :ALIGN(bits_per_pixel * width * 2, 8), to optimize
reading and
     * writing of ddr, aliged with 256
     */
-   if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact) {
+   if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
+      fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
       *crop_vwidth = ALIGN(raw_width * fmt->raw_bpp / 8, 256);
    } else {
-      if (fmt->fmt_type == CIF_FMT_TYPE_RAW)
-         *crop_vwidth = ALIGN(raw_width * 2, 8);
-      else
-         *crop_vwidth = ALIGN(raw_width * fmt->bpp[0] / 8, 8);

+      *crop_vwidth = ALIGN(raw_width * fmt->bpp[0] / 8, 8);
    }
if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)

rk628-dsi gibt standardmäßig im Befehlsmodus aus; auch der CIF-Empfang muss den Befehlsmodus verwenden. Ändern Sie Folgendes:

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c

index 36bd2c99c707..fc4181daed2c 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1753,7 +1753,7 @@ static int rkcif_csi_channel_init(struct rkcif_stream
*stream,

      channel->fmt_val = stream->cif_fmt_out->csi_fmt_val;

-     channel->cmd_mode_en = 0; /* default use DSI Video Mode */
+     channel->cmd_mode_en = 1; /* default use DSI Video Mode */

      if (stream->crop_enable) {
           channel->crop_en = 1;

Anbindung an das Kamera-Framework

RK356X-Hosts können nur das Kamera-Framework verwenden, das RGB nicht direkt zur Anzeige weiterleiten kann. Fügen Sie die Bibliothek rgb2yuv hinzu.

Fügen Sie CameraHal die folgende rgb2yuv-Bibliothek hinzu. Wenden Sie bei Android-11-R9-SDK-Code rk356x_HAL3_support_rgb2yuv_patch.rar direkt an.

Nehmen Sie bei R10 oder R11 zunächst die folgende Änderung unter hardware/rockchip/camera vor und wenden Sie anschließend den obigen Patch an.

diff --git a/psl/rkisp2/RKISP2GraphConfig.cpp b/psl/rkisp2/RKISP2GraphConfig.cpp
index 2a5fa5a..3d2409c 100755
--- a/psl/rkisp2/RKISP2GraphConfig.cpp

+++ b/psl/rkisp2/RKISP2GraphConfig.cpp
@@ -76,6 +76,7 @@ const string MEDIACTL_POSTVIEWNAME = "postview";

 const string MEDIACTL_STATNAME = "rkisp1-statistics";
 const string MEDIACTL_VIDEONAME_CIF = "stream_cif_dvp_id0";
+const string MEDIACTL_VIDEONAME_CIF_MIPI_ID0 = "stream_cif_mipi_id0";

 RKISP2GraphConfig::RKISP2GraphConfig() :
      mManager(nullptr),
@@ -2620,6 +2621,13 @@ status_t RKISP2GraphConfig::getImguMediaCtlConfig(int32_t
cameraId,
            addLinkParams("rkisp-isp-subdev", 2, "rkisp_mainpath", 0, 1,

MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
            addLinkParams("rkisp-isp-subdev", 2, "rkisp_selfpath", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
         }
+     } else if(mipName2.find("mipi") != std::string::npos) {
+        addLinkParams(mipName, mipSrcPad, mipName2, csiSinkPad, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        addLinkParams(mipName2, 1, "stream_cif_mipi_id0", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        addLinkParams(mipName2, 2, "stream_cif_mipi_id1", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        addLinkParams(mipName2, 3, "stream_cif_mipi_id2", 0, 1,

MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        addLinkParams(mipName2, 4, "stream_cif_mipi_id3", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        mSensorLinkedToCIF = true;
      } else {
         addLinkParams(mipName, mipSrcPad, csiName, csiSinkPad, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
         addLinkParams(csiName, csiSrcPad, IspName, ispSinkPad, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
@@ -2628,6 +2636,12 @@ status_t RKISP2GraphConfig::getImguMediaCtlConfig(int32_t
cameraId,
         addLinkParams(csiName, 5, "rkisp_rawwr3", 0, 1,

MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
      }
   }
+  if(mSensorLinkedToCIF){
+     addImguVideoNode(IMGU_NODE_VIDEO, MEDIACTL_VIDEONAME_CIF_MIPI_ID0,
mediaCtlConfig);
+     addFormatParams(MEDIACTL_VIDEONAME_CIF_MIPI_ID0, mCurSensorFormat.width,
mCurSensorFormat.height,
+           0, V4L2_PIX_FMT_NV12, 0, 0, mediaCtlConfig);
+     return OK;
+  }
   // isp input pad format and selection config
   addFormatParams(IspName, ispInWidth, ispInHeight, ispSinkPad, ispInFormat,

0, 0, mediaCtlConfig);
   addSelectionParams(IspName, ispInWidth, ispInHeight, 0, 0,
V4L2_SEL_TGT_CROP, ispSinkPad, mediaCtlConfig);

Dieser Patch gilt nur für RK3568+ANDROID11.

Anbindung an das TV-Framework

Bei RK3588 oder RK3576 kann HDMI-zu-DSI über das TV-Framework RGB888 ohne rgb2yuv-Bibliothek direkt zur Anzeige weiterleiten. Siehe APK-Anpassung weiter unten.

6.3.4.2 RK628F/H

RK628F/H behebt die bei RK628D durch Konvertierung/Abwärtsabtastung verschiedener Eingabeformate verursachten Farbabweichungen.

Für Anwendungen mit hohen Bildqualitätsanforderungen kann RK628F/H RGB888 über DSI ausgeben. Hosts wie RK3588 können RGB888 empfangen und ohne Farbkonvertierung direkt über TV anzeigen; laut Quelle bleibt so die Bildqualität erhalten. RK628F/H besitzt zwei MIPI-DSI-Schnittstellen und unterstützt außerdem eine Dual-MIPI-Verbindung zu RK3588.

Dual-MIPI-Beispiel RK3588 + RK628F/H:

Nur compatible muss auf den DSI-Wert geändert werden.

......
&i2c3 {

   status = "okay";
   clock-frequency = <400000>;
   rk628_csi: rk628_csi@50 {
      reg = <0x50>;

      compatible = "rockchip,rk628-dsi-v4l2";
      status = "okay";
      power-domains = <&power RK3588_PD_VI>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_pin>;
      interrupt-parent = <&gpio1>;
      interrupts = <RK_PB2 IRQ_TYPE_LEVEL_HIGH>;
      enable-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;
      plugin-det-gpios = <&gpio2 RK_PB6 GPIO_ACTIVE_LOW>;

      rockchip,camera-module-index = <0>;

      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "HDMI-MIPI2";
      rockchip,camera-module-lens-name = "RK628-CSI";

      multi-dev-info {
         dev-idx-l = <2>;
         dev-idx-r = <4>;
         combine-idx = <2>;
         pixel-offset = <0>;
         dev-num = <2>;
      };

      port {

         hdmiin_out1: endpoint {
           remote-endpoint = <&hdmi_mipi2_in>;
           data-lanes = <1 2 3 4>;
         };
      };
   };
};
......

6.3.5 HDMI2BT1120-Konvertierung

Die HDMI2BT1120-Pfadkonfiguration ist bei RK628D und RK628F/H im Wesentlichen gleich und wird daher nicht wiederholt.

Beispiel RK3568 + BT1120_V4L2:

&i2c4 {
   pinctrl-names = "default";
   pinctrl-0 = <&i2c4m1_xfer>;

   clock-frequency = <400000>;
   status = "okay";

   rk628_bt1120: rk628_bt1120@50 {
      compatible = "rockchip,rk628-bt1120-v4l2";
      reg = <0x50>;
      status = "disabled";
      pinctrl-names = "default";
      pinctrl-0 = <&cif_dvp_clk &cif_dvp_bus16 &cif_dvp_bus8>;
      interrupt-parent = <&gpio2>;
      interrupts = <15 IRQ_TYPE_LEVEL_HIGH>;

      enable-gpios = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio2 RK_PB0 GPIO_ACTIVE_LOW>;
      plugin-det-gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_LOW>;
      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "RK628-BT1120";
      rockchip,camera-module-lens-name = "NC";
      dual-edge = <1>;

      port {
         lt8619c_out: endpoint {
           remote-endpoint = <&cif_para_in>;

           bus-width = <16>;
           pclk-sample = <1>;
         };
      };
   };
};

&rkcif_dvp {
   status = "okay";

   port {
      /* Parallel bus endpoint */
      cif_para_in: endpoint {

         remote-endpoint = <&lt8619c_out>;
      };
   };
};

&rkcif {
   status = "okay";
};

&rkcif_mmu {
   status = "okay";
};

6.4 HDCP aktivieren

RK628 HDMIRX unterstützt HDCP1.4. HDCP ist standardmäßig deaktiviert; aktivieren Sie es bei Bedarf:

1. Aktivieren Sie HDCP im RK628-DTS-Knoten.

           reset-gpios = <&gpio7 RK_PB4 GPIO_ACTIVE_LOW>;
           plugin-det-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;

           power-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+          hdcp-enable = <1>;

2. Programmieren Sie den HDCP-RX-Schlüssel.

HDCP-Schlüssel müssen bei der HDCP-Vereinigung erworben werden; Rockchip stellt sie nicht bereit. Das Original unterscheidet TX und „RK Key“ und verlangt „RK Key“. Diese Schreibweise widerspricht der RX-Überschrift und bleibt als Unklarheit der Quelle dokumentiert, statt stillschweigend korrigiert zu werden.

Verwenden Sie nach Erhalt der Schlüsselquelldatei KeyConverter, um die Schlüssel aufzuteilen und in .skf-Programmierdateien umzuwandeln; befolgen Sie die Werkzeuganleitung.

Programmieren Sie die .skf-Datei mit RKDevInfoWriteTool, das den Schlüssel verschlüsselt. Siehe Werkzeuganleitung.

6.5 Scaler aktivieren

Einige Hosts können MIPI 4K nicht empfangen, obwohl RK628 HDMI IN 4K-Eingang akzeptiert. Ergänzen Sie folgende DTS-Konfiguration, um CSI unabhängig von der Eingangsauflösung mit 1080P auszugeben:

           reset-gpios = <&gpio7 RK_PB4 GPIO_ACTIVE_LOW>;
           plugin-det-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
           power-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;

+          scaler-en = <1>;

6.6 CSI mit zwei Lanes

CSI verwendet standardmäßig 4 Lanes:

csi->csi_lanes_in_use = USE_4_LANES;

Setzen Sie für 2 Lanes csi->csi_lanes_in_use auf 2.

6.7 Kontinuierliches und nicht kontinuierliches MIPI

Konfigurieren Sie DTS zum Aktivieren des kontinuierlichen MIPI-Modus:

continues-clk = <1>;

6.8 Dual-MIPI-Konfiguration (nur RK628F/H)

Die MIPI-DPHY-Datenrate begrenzt RK628F/H bei einer MIPI-Schnittstelle auf 4K30. RK628F/H besitzt zwei MIPI-CSI-Schnittstellen. Bei Hosts wie RK3588/RK3562 mit mehreren CSI-Eingängen lässt sich 4K60-Video in eine linke und rechte Hälfte teilen, über zwei MIPI-CSI-Verbindungen mit jeweils 4 Lanes übertragen und im Host wieder zu 4K60 zusammensetzen.

Laut Quelle setzen Hosts wie RK3588 die Bilder direkt im VI-Treiber ohne zusätzliche Latenz oder Last zusammen. Dies ist eine Aussage der Quelle, keine ArmSoM-Messung.

6.8.1 Dual-MIPI-Teilungsmodus

RK628F/H kann das HDMIRX-Bild intern in eine linke und rechte Hälfte teilen und jede über eine CSI-Schnittstelle ausgeben:

Technische Originalabbildung — EN V2.3, S. 72

Technische Originalabbildung: EN V2.3, S. 72.

So können Hosts mit mehreren MIPI-Schnittstellen wie RK3588 4K60 über Dual-MIPI empfangen. Der Funktionsablauf ist nachfolgend dargestellt.

Technische Originalabbildung — EN V2.3, S. 72

Technische Originalabbildung: EN V2.3, S. 72.

6.8.2 Dual-MIPI-Konfiguration

Die folgende Konfiguration verbindet RK628F/H über Dual-MIPI mit RK3588 für 4K60-HDMI-IN.

Zum Dual-MIPI-Debugging mit Rockchip-SoCs siehe Rockchip_RK3588_HDMI_To_CSI_Dual_Mipi_Developer_Guide unter RKDocs/common/camera/HAL3 im SDK.

6.8.2.1 RK628F/H-Konfiguration

Der RK628F/H-Treiber unterstützt Dual-MIPI und verwendet standardmäßig zwei CSI-Schnittstellen für 4K60-HDMI-IN. Die DTS-Felder von multi-dev-info sind:

dev-idx-l: MIPI-Schnittstellenindex für die linke Bildhälfte.

dev-idx-r: MIPI-Schnittstellenindex für die rechte Bildhälfte.

combine-idx: Index, unter dem beide Bildhälften zusammengeführt werden; verwenden Sie diesen Index für den DTS-Pfad.

pixel-offset: Pixelversatz, standardmäßig 0.

dev-num: Anzahl der zusammenzuführenden MIPI-Geräte.

Beispiel: RK628F/H CSI0/1 mit RK3588 CSI0/1 RX verbunden:

&i2c3 {
   status = "okay";

   clock-frequency = <400000>;

   rk628_csi: rk628_csi@50 {
      reg = <0x50>;
      compatible = "rockchip,rk628-csi-v4l2";
      status = "okay";
      power-domains = <&power RK3588_PD_VI>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_pin>;
      interrupt-parent = <&gpio1>;
      interrupts = <RK_PB2 IRQ_TYPE_LEVEL_HIGH>;
      enable-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;

      plugin-det-gpios = <&gpio2 RK_PB6 GPIO_ACTIVE_LOW>;
      continues-clk = <1>;

      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "HDMI-MIPI2";
      rockchip,camera-module-lens-name = "RK628-CSI";

      multi-dev-info {
         dev-idx-l = <2>;
         dev-idx-r = <4>;
         combine-idx = <2>;

         pixel-offset = <0>;
         dev-num = <2>;
      };

      port {
         hdmiin_out1: endpoint {
           remote-endpoint = <&hdmi_mipi2_in>;
           data-lanes = <1 2 3 4>;
         };
      };
   };
};
6.8.2.2 Anforderungen an den Host-SoC-Treiber

Die Quelle nennt RK3588/RK3562/RK3576 als Rockchip-Hosts mit Dual-MIPI-Unterstützung; erforderlich ist Code der kernel-5.10-Generation oder neuer. Der Host-Code muss ausreichend aktuell sein; aktualisieren Sie das Android-12/13-SDK gemäß der Quellenempfehlung. Ein allein aktualisierter RK628-Treiber für kernel-

5.10 kann Kompilierungsfehler verursachen, wenn das restliche SDK für Dual-MIPI zu alt ist. Aktualisieren Sie das SDK oder kontaktieren Sie Rockchip-Entwickler über Redmine.

6.9 Empfangsfähigkeiten nach Chip

Die maximale Empfangsfähigkeit hängt von der ISP/VICAP-Leistung der Plattform ab. Siehe Tabelle:

SoC-Plattform Empfangscontroller Maximal unterstützte Auflösung
RK3288/RK3326/RK3368 isp 1920x1080P60
RK3399 isp 3840x2160P30 (ISP-Übertaktung erforderlich)
RK3566/RK3568 vicap/isp 3840x2160P30 (bei ISP-Anbindung maximal 1080P60)
RK3588/RK3562/RK3576 vicap 3840x2160P60 (Dual-MIPI)

6.9.1 ISP-Übertaktung konfigurieren

Konfigurieren Sie RK3399 PLL_NPLL auf 650M:

--- a/arch/arm64/boot/dts/rockchip/rk3399-vop-clk-set.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-vop-clk-set.dtsi
@@ -148,7 +148,7 @@

                  <50000000>, <100000000>,
                  <75000000>, <75000000>,
                  <816000000>, <816000000>,
-                 <600000000>, <200000000>,
+                 <650000000>, <200000000>,
                  <800000000>, <150000000>,
                  <75000000>, <37500000>,
                  <300000000>, <100000000>,

Ändern Sie die maximal unterstützte ISP-Frequenz des RK3399 auf 650M:

--- a/drivers/media/platform/rockchip/isp1/dev.c
+++ b/drivers/media/platform/rockchip/isp1/dev.c
@@ -757,7 +757,7 @@ static const unsigned int rk3368_isp_clk_rate[] = {


 /* isp clock adjustment table (MHz) */
 static const unsigned int rk3399_isp_clk_rate[] = {
-     300, 400, 600
+     300, 400, 650
 };

 static struct isp_irqs_data rk1808_isp_irqs[] = {

Bei sporadischen RK3288-ISP-Fehlern kann ebenfalls eine höhere ISP-Frequenz erprobt werden. Gewöhnlich muss nur die höchste Frequenz verbleiben. Diese Änderung dient ausschließlich der Diagnose.

--- a/drivers/media/platform/rockchip/isp1/dev.c
+++ b/drivers/media/platform/rockchip/isp1/dev.c
@@ -849,7 +849,7 @@ static const unsigned int rk1808_isp_clk_rate[] = {


 /* isp clock adjustment table (MHz) */
static const unsigned int rk3288_isp_clk_rate[] = {
-     150, 384, 500, 594
+     594
 };

Konfigurieren Sie die ISP-Frequenz im Konvertertreiber.

#define RK628_CSI_PIXEL_RATE_HIGH 600000000
...


static int rk628_csi_set_fmt(struct v4l2_subdev *sd,
           struct v4l2_subdev_pad_config *cfg,
           struct v4l2_subdev_format *format)
{
...
      if ((mode->width == 3840) && (mode->height == 2160)) {
           v4l2_dbg(1, debug, sd,
                 "%s res wxh:%dx%d, link freq:%llu, pixrate:%u\n",
                 __func__, mode->width, mode->height,
                 link_freq_menu_items[1], RK628_CSI_PIXEL_RATE_HIGH);
           __v4l2_ctrl_s_ctrl(csi->link_freq, 1);
           __v4l2_ctrl_s_ctrl_int64(csi->pixel_rate,

                 RK628_CSI_PIXEL_RATE_HIGH);
      }
...
}

Der ISP-Treiber addiert eine Reserve von 25% zur konfigurierten Frequenz; setzen Sie daher RK628_CSI_PIXEL_RATE_HIGH im Treiber entsprechend.

drivers/media/platform/rockchip/isp1/dev.c

static int __isp_pipeline_s_isp_clk(struct rkisp1_pipeline *p)

{
...
      ctrl = v4l2_ctrl_find(sd->ctrl_handler, V4L2_CID_PIXEL_RATE);
      if (!ctrl) {
           v4l2_warn(sd, "No pixel rate control in subdev\n");
           return -EPIPE;
      }

      /* calculate data rate */
      data_rate = v4l2_ctrl_g_ctrl_int64(ctrl) *
              dev->isp_sdev.in_fmt.bus_width;
      data_rate >>= 3;
      do_div(data_rate, 1000 * 1000);


      /* increase 25% margin */
      data_rate += data_rate >> 2;
...
}

6.9.2 ISP für CMA-Speicher konfigurieren

Auf einigen Plattformen kann die Systemlast während des HDMI-IN-Empfangs zu unzureichender Bandbreite und damit zu verlorenen Bildern oder MIPI-Fehlern führen. Beispiel eines Fehlerprotokolls:

[ 228.999567] rkisp1: MIPI mis error: 0x00800000
[ 228.999925] rkisp1: CIF_ISP_PIC_SIZE_ERROR (0x00000001)
[ 228.999976] rkisp1: CIF_ISP_PIC_SIZE_ERROR (0x00000001)rkisp1:

CIF_ISP_PIC_SIZE_ERROR (0x00000001)
[ 229.000081] rkisp1: CIF_ISP_PIC_SIZE_ERROR (0x00000001)rkisp1:
CIF_ISP_PIC_SIZE_ERROR (0x00000001)
[ 229.000187] rkisp1: CIF_ISP_PIC_SIZE_ERROR (0x00000001)rkisp1:
CIF_ISP_PIC_SIZE_ERROR (0x00000001)
[ 229.000294] rkisp1: CIF_ISP_PIC_SIZE_ERROR (0x00000001)rkisp1:
CIF_ISP_PIC_SIZE_ERROR (0x00000001)

Erhöhen Sie die DDR-Frequenz. Hilft dies nicht, reservieren Sie zur Verbesserung CMA-Speicher für ISP:

Reservieren Sie 128MB CMA in rockchip_defconfig.

CONFIG_CMA=y
CONFIG_CMA_SIZE_MBYTES=128

Deaktivieren Sie ISP IOMMU in DTS und verwenden Sie CMA-Speicher.

&isp_mmu {
      status = "disabled";

};

6.10 EDID-Konfiguration

RK628 unterstützt die EDID-Konfiguration. Der aktuelle Quelltreiber meldet gängige Auflösungen, darunter:

3840x2160P60, 3840x2160P30, 1920x1080P60, 1920x1080P30, 1280x720P60, 720x576P50 und 720x480P60. Ändern Sie zur Anpassung der unterstützten Auflösungen EDID direkt im Treiber:

static u8 rk628f_edid_init_data[] = {
   0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
   0x24, 0xD0, 0x8F, 0x62, 0x01, 0x00, 0x00, 0x00,

   0x2D, 0x21, 0x01, 0x03, 0x80, 0x78, 0x44, 0x78,
   0x0A, 0xCF, 0x74, 0xA3, 0x57, 0x4C, 0xB0, 0x23,
   0x09, 0x48, 0x4C, 0x21, 0x08, 0x00, 0x61, 0x40,
   0x01, 0x01, 0x81, 0x00, 0x95, 0x00, 0xA9, 0xC0,
   0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0xE8,
   0x00, 0x30, 0xF2, 0x70, 0x5A, 0x80, 0xB0, 0x58,
   0x8A, 0x00, 0xC4, 0x8E, 0x21, 0x00, 0x00, 0x1E,
   0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40,
   0x58, 0x2C, 0x45, 0x00, 0xB9, 0xA8, 0x42, 0x00,
   0x00, 0x1E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x49,
   0x46, 0x50, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6C,

   0x61, 0x79, 0x0A, 0x20, 0x00, 0x00, 0x00, 0xFD,
   0x00, 0x3B, 0x46, 0x1F, 0x8C, 0x3C, 0x00, 0x0A,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0xA8,

   0x02, 0x03, 0x39, 0xF2, 0x4D, 0x01, 0x03, 0x12,
   0x13, 0x84, 0x22, 0x1F, 0x90, 0x5D, 0x5E, 0x5F,
   0x60, 0x61, 0x23, 0x09, 0x07, 0x07, 0x83, 0x01,
   0x00, 0x00, 0x6D, 0x03, 0x0C, 0x00, 0x10, 0x00,
   0x00, 0x44, 0x20, 0x00, 0x60, 0x03, 0x02, 0x01,
   0x67, 0xD8, 0x5D, 0xC4, 0x01, 0x78, 0xC0, 0x00,
   0xE3, 0x05, 0x03, 0x01, 0xE4, 0x0F, 0x00, 0x18,
   0x00, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D,

   0x40, 0x58, 0x2C, 0x45, 0x00, 0xB9, 0xA8, 0x42,
   0x00, 0x00, 0x1E, 0x08, 0xE8, 0x00, 0x30, 0xF2,
   0x70, 0x5A, 0x80, 0xB0, 0x58, 0x8A, 0x00, 0xC4,
   0x8E, 0x21, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93,
};

Die Quelle empfiehlt diesen EDID-Editor (historischer Quellenlink, kein aktuell geprüfter Download): http://www.quantumdata.com/support/downloads/980/release_5_05/R_980mgr_5.05_Win32.msi

6.11 camera3_profiles.xml konfigurieren

Die Vorschau über das Kamera-Framework benötigt eine Anpassung von camera3_profiles.xml zur Registrierung des Kamerageräts.

camera3_profiles.xml liegt im SDK-Verzeichnis des jeweiligen Chips:

hardware/rockchip/camera/etc/camera/camera3_profiles_rk3xxx.xml

Es folgen wichtige Konfigurationspunkte. Einzelheiten siehe SoC-Sensor-Konfiguration.

name: muss einschließlich Groß-/Kleinschreibung dem Treibernamen entsprechen.

moduleId: muss index im DTS des Treibers entsprechen.

Technische Originalabbildung — EN V2.3, S. 78

Technische Originalabbildung: EN V2.3, S. 78.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

</Profiles>
<Profiles cameraId="0" name="rk628-csi" moduleId="m00">
    <Supported_hardware>
        <hwType value="SUPPORTED_HW_RKISP1"/>

Technische Originalabbildung — EN V2.3, S. 78

Technische Originalabbildung: EN V2.3, S. 78.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

&rk628_csi {
    status = "okay";
    /*
     * If the hpd output level is inverted on the circuit,
     * the following configuration needs to be enabled.
     */
    /* hpd-output-inverted; */
    plugin-det-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
    power-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
    rockchip,camera-module-index = <0>;
    rockchip,camera-module-facing = "back";
    rockchip,camera-module-name = "RK628-CSI";
    rockchip,camera-module-lens-name = "NC";

scaler.availableStreamConfigurations/scaler.availableMinFrameDurations/scaler.availableStallDurations: unterstützte Auflösungen und minimale Bildintervalle korrekt angeben. Ergänzen Sie passende Einträge, sobald der Treiber eine Auflösung hinzufügt.

Technische Originalabbildung — EN V2.3, S. 79

Technische Originalabbildung: EN V2.3, S. 79.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

<scaler.availableStreamConfigurations value="BLOB,3840x2160,OUTPUT,
    BLOB,1920x1080,OUTPUT,
    BLOB,1280x720,OUTPUT,
    BLOB,720x576,OUTPUT,
    BLOB,720x480,OUTPUT,
    YCbCr_420_888,3840x2160,OUTPUT,
    YCbCr_420_888,1920x1080,OUTPUT,
    YCbCr_420_888,1280x720,OUTPUT,
    YCbCr_420_888,720x576,OUTPUT,
    YCbCr_420_888,720x480,OUTPUT,
    IMPLEMENTATION_DEFINED,3840x2160,OUTPUT,
    IMPLEMENTATION_DEFINED,1920x1080,OUTPUT,
    IMPLEMENTATION_DEFINED,1280x720,OUTPUT,
    IMPLEMENTATION_DEFINED,720x576,OUTPUT,
    IMPLEMENTATION_DEFINED,720x480,OUTPUT" />
<scaler.availableMinFrameDurations value="BLOB,3840x2160,33333333,
    BLOB,1920x1080,16666667,
    BLOB,1280x720,16666667,
    BLOB,720x576,20000000,
    BLOB,720x480,16666667,
    YCbCr_420_888,3840x2160,33333333,
    YCbCr_420_888,1920x1080,16666667,
    YCbCr_420_888,1280x720,16666667,
    YCbCr_420_888,720x576,20000000,
    YCbCr_420_888,720x480,16666667,
    IMPLEMENTATION_DEFINED,3840x2160,33333333,
    IMPLEMENTATION_DEFINED,1920x1080,16666667,
    IMPLEMENTATION_DEFINED,1280x720,16666667,
    IMPLEMENTATION_DEFINED,720x576,20000000,
    IMPLEMENTATION_DEFINED,720x480,16666667"/>
<scaler.availableStallDurations value="BLOB,3840x2160,33333333,
    BLOB,1920x1080,16666667,
    BLOB,1280x720,16666667,
    BLOB,720x576,20000000,
    BLOB,720x480,16666667"/>

sensor.orientation: Bilddrehung; unterstützt 0, 90, 180 und 270.

Technische Originalabbildung — EN V2.3, S. 79

Technische Originalabbildung: EN V2.3, S. 79.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

<sensor.maxAnalogSensitivity value="2400"/>
<sensor.orientation value="0"/>
<sensor.profileHueSatMapDimensions value="0,0,0"/>

6.12 HDMI-IN-APK anpassen

6.12.1 Android 9/10/11

Android 9/10/11 verwendet kernel-4.4/kernel-4.19 und das For-All-Patchpaket. Nur cameraHAL3 steht zur Verfügung.

6.12.1.1 APK-Quellen beziehen und bauen

Die APK-Quellen liegen in diesem SDK-Verzeichnis:

RKDocs/common/hdmi-in/apk/rkCamera2_based_on_CameraHal3_V1.3.tar.gz

Kopieren und entpacken Sie die Quellen nach:

packages/apps/

Ändern Sie für RK3288 device/rockchip/rk3288/ wie folgt, um rkCamera2 zu bauen:

diff --git a/device.mk b/device.mk
index 6667b5c..96f08f1 100644

--- a/device.mk
+++ b/device.mk
@@ -17,7 +17,8 @@
 PRODUCT_PACKAGES += \
   memtrack.$(TARGET_BOARD_PLATFORM) \
   WallpaperPicker \
-  Launcher3
+  Launcher3 \
+  rkCamera2

 #$_rbox_$_modify_$_zhengyang: add displayd
 PRODUCT_PACKAGES += \
6.12.1.2 APK-Quellen anpassen

Die APK greift über ioctl auf den RK628-Geräteknoten zu, um Verbindungsstatus und Auflösung abzufragen. Der Knoten kann zwischen isp1/isp2/vicap-Pfaden variieren. Passen Sie die APK-Quellen an den tatsächlichen Knoten an; Beispiele zum Auffinden stehen bei den Debugging-Befehlen.

rkCamera2/jni/native.cpp

Technische Originalabbildung — EN V2.3, S. 81

Technische Originalabbildung: EN V2.3, S. 81.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

static void openDevice(JNIEnv *env, jobject thiz)
{
    (void)*env;
    (void)thiz;

    char video_name[64];
    memset(video_name, 0, sizeof(video_name));
    strcat(video_name, "/dev/v4l-subdev2");

    camFd = open(video_name, O_RDWR);
    if (camFd < 0) {
        LOGE("open %s failed,erro=%s",video_name,strerror(errno));
    } else {
        LOGD("open %s success,fd=%d",video_name,camFd);
    }
}

Code zum Abfragen von Verbindungsstatus und Auflösung:

Technische Originalabbildung — EN V2.3, S. 81

Technische Originalabbildung: EN V2.3, S. 81.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

static void getDeviceFormat(int *format)
{
    struct v4l2_control control;
    memset(&control, 0, sizeof(struct v4l2_control));
    control.id = V4L2_CID_DV_RX_POWER_PRESENT;
    int err = ioctl(camFd, VIDIOC_G_CTRL, &control);
    if (err < 0) {
        LOGV("Set POWER_PRESENT failed ,%d(%s)", errno, strerror(errno));
    }

    unsigned int noSignalAndSync = 0;
    ioctl(camFd, VIDIOC_G_INPUT, &noSignalAndSync);
    LOGV("noSignalAndSync ? %s",noSignalAndSync?"YES":"NO");

    struct v4l2_dv_timings dv_timings;
    memset(&dv_timings, 0 ,sizeof(struct v4l2_dv_timings));
    err = ioctl(camFd, VIDIOC_SUBDEV_QUERY_DV_TIMINGS, &dv_timings);
    if (err < 0) {
        LOGV("Set VIDIOC_SUBDEV_QUERY_DV_TIMINGS failed ,%d(%s)", errno, strerror(errno));
    }

    format[0] = dv_timings.bt.width;
    format[1] = dv_timings.bt.height;
    format[2] = control.value && !noSignalAndSync;
}

Da die APK auf einen Geräteknoten zugreift, fordert die Quelle eine Prüfung mit getenforce, ob SELinux deaktiviert ist. Dies ist eine Debugging-Anweisung der Quelle, keine Sicherheitsempfehlung für den Produktivbetrieb:

Technische Originalabbildung — EN V2.3, S. 81

Technische Originalabbildung: EN V2.3, S. 81.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

rk3288:/ # getenforce
Enforcing
rk3288:/ # setenforce 0
rk3288:/ #
rk3288:/ # getenforce
Permissive
6.12.1.3 APK-Debugging vorbereiten

Schließen Sie zunächst das Treiber-Debugging ab (siehe Treiber-Debugging). Prüfen Sie anschließend die Kameraregistrierung in CameraHal mit folgendem Befehl. Bei fehlerhafter Registrierung prüfen Sie camera3_profiles.xml gemäß dem zugehörigen Konfigurationsabschnitt.

Technische Originalabbildung — EN V2.3, S. 82

Technische Originalabbildung: EN V2.3, S. 82.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

rk3288:/ #
rk3288:/ # dumpsys media.camera

== Service global info: ==

Number of camera devices: 1
Number of normal camera devices: 1
    Device 0 maps to "0"
Active Camera Clients:
[]
Allowed user IDs: 0

== Camera service events log (most recent at top): ==
  04-08 11:08:31 : USER_SWITCH previous allowed user IDs: <None>, current allowed user IDs: 0
  01-18 08:50:15 : ADD device 0, reason: (Device status changed from 0 to 1)
  01-18 08:50:15 : ADD device 0, reason: (Device added)

6.12.2 Android 12+

Android 12/13 verwendet kernel-5.10 und das passende Treiber-Patchpaket. Anwendungen verwenden entweder Kamera oder TV (nachfolgend auch TIF genannt). Zum Debugging siehe Rockchip_Android12+_HDMI_TO_MIPI_Developer_Guide.

Android14 verwendet kernel-6.1; der Treiber ist im SDK enthalten. Die Quelle empfiehlt das TV-Framework.

6.12.2.1 APK-Quellen

packages/apps/TV/partner_support/samples: TV-Quelldatendienst, der über das Framework mit HAL und der Vorschau-APK interagiert. Er läuft als verborgener Dienst beim Systemstart; sein APK-Symbol wird daher im Launcher ausgeblendet.

hardware/rockchip/tv_input: TVHAL-Code zum Befehlsaustausch mit dem Treiber für Stream-Start/-Stopp, Hotplug und Auflösungsänderungen.

hardware/rockchip/camera: cameraHAL-Code für Kamera-Streaming, Einzelbildaufnahme und verwandte Funktionen.

vendor/rockchip/hardware/interfaces/hdmi: vom Kamerasystem verwendet; überwacht Auflösungsänderungen und Hotplug und kommuniziert mit Treiber und APK.

packages/apps/rkCamera2: Vorschau-APK mit zwei Ansichten. Die standardmäßige MainActivity zeigt die Vorschau über TIF und interagiert über das Framework mit dem TV-Quelldienst. RockchipCamera2 zeigt die Vorschau über Camera und öffnet mit der Standard-Camera-API die cameraid des MIPI-Knotens. Das Launcher-Symbol heißt HdmiIn. Kunden ersetzen sie häufig durch eine eigene Vorschau-APK.

HDMI IN ist im Standard-SDK deaktiviert. Setzen Sie die folgende Eigenschaft, um es zu aktivieren und die relevanten Module einschließlich der obigen APKs zu bauen:

vim device/rockchip/rk3588/BoardConfig.mk
BOARD_HDMI_IN_SUPPORT := true

Aktivieren Sie für das Kamera-Framework:

vim device/rockchip/rk3588/BoardConfig.mk
CAMERA_SUPPORT_HDMI := true

Wenn nur CAMERA_SUPPORT_HDMI ohne BOARD_HDMI_IN_SUPPORT konfiguriert ist, nehmen Sie rkCamera2 in den Build auf und setzen persist.sys.hdmiinmode auf 2, um die Vorschau mit rkCamera2 über das Kamerasystem anzuzeigen. Weitere Einzelheiten siehe:

Rockchip_Developer_Guide_HDMI_RX_CN

PRODUCT_PACKAGES += \
   rkCamera2
6.12.2.2 APK-Vorschau

Die APK zeigt entweder den RK3588-HDMI-RX-Pfad oder den HDMI-zu-MIPI-CSI-Pfad an; wählen Sie den passenden Pfad.

Wählen Sie für die TIF-Vorschau den MIPI-CSI2-Pfad:

setprop vendor.tvinput.hdmiin.type 1

Öffnen Sie für die Kamera-Vorschau RockchipCamera2 und stellen Sie sicher, dass CAMERA_SUPPORT_HDMI aktiviert ist.

setprop persist.sys.hdmiinmode 2
6.12.2.3 TIF- und Kamera-Vorschau im Vergleich
  TIF Kamera
Vorteile Geringe Latenz Die Anwendung kann Vorschaudaten zur Nachverarbeitung erhalten
Nachteile Keine Bildschirmdrehung, geteilte Ansicht oder Bild-in-Bild; die Anwendung kann keine Vorschaupufferdaten erhalten; screencap-Bildschirmaufnahmebefehle werden nicht unterstützt Höhere Latenz als TIF

6.13 Gängige Methoden zum Treiber-Debugging

Debuggen Sie den Treiber wie einen SoC-Sensor. Weitere Informationen enthält das Redmine-Dokument:

https://redmine.rock-chips.com/documents/53

6.13.1 Debugging-Werkzeuge beziehen

media-ctl und v4l2-ctl werden benötigt. Das Quell-SDK kopiert sie beim Build automatisch in die Firmware; ihr SDK-Verzeichnis lautet:

hardware/rockchip/camera/etc/tools/

Bei älteren SDK-Versionen beziehen Sie sie über Redmine:

https://redmine.rock-chips.com/documents/104

Kopieren Sie media-ctl und v4l2-ctl mit adb push nach /vendor/bin/ auf dem Gerät.

6.13.2 Beispiele für Debugging-Befehle

Dieses Beispiel verwendet RK3288 + RK628 mit 1920x1080P-Empfang. Passen Sie es an das tatsächliche System an. Geben Sie folgende Befehle in der angegebenen Reihenfolge ein; übersprungene Konfigurationen können den Betrieb verhindern.

Verbindungstopologie prüfen:

Führen Sie den Befehl zum Prüfen der Medienknotentopologie aus. Je nach Plattform und Verbindungen kann der Knoten /dev/media0 oder /dev/media1 sein.

media-ctl -d /dev/media0 –p

Im RK628-Auszug lautet das Gerät /dev/v4l-subdev2 und die erkannte HDMI-IN-Auflösung 1920x1080.

...
- entity 8: m00_b_rk628-csi rk628-csi (1 pad, 1 link)
         type V4L2 subdev subtype Sensor

         device node name /dev/v4l-subdev2
      pad0: Source
           [fmt:UYVY2X8/1920x1080]
           -> "rockchip-mipi-dphy-rx":0 [ENABLED]
...

Verbindungen konfigurieren:

Nach Reset/Systemstart sind die Verbindungen standardmäßig hergestellt. Öffnen und Schließen der HDMI-IN-APK trennt sie. Stellen Sie sie nur wieder her, wenn in der Topologie [ENABLED] fehlt.

media-ctl -d /dev/media0 -l \
'"m00_b_rk628-csi rk628-csi":0->"rockchip-mipi-dphy-rx":0 [1]'

media-ctl -d /dev/media0 -l \
'"rockchip-mipi-dphy-rx":1->"rkisp1-isp-subdev":0 [1]'
media-ctl -d /dev/media0 -l '"rkisp1-input-params":0->"rkisp1-isp-subdev":1 [1]'
media-ctl -d /dev/media0 -l '"rkisp1-isp-subdev":2->"rkisp1_mainpath":0 [1]'
media-ctl -d /dev/media0 -l '"rkisp1-isp-subdev":2->"rkisp1_selfpath":0 [1]'
media-ctl -d /dev/media0 -l '"rkisp1-isp-subdev":3->"rkisp1-statistics":0 [1]'

Auflösung konfigurieren:

media-ctl -d /dev/media0 \
--set-v4l2 '"rkisp1-isp-subdev":0[fmt:UYVY2X8/1920x1080]'
media-ctl -d /dev/media0 \

--set-v4l2 '"rkisp1-isp-subdev":0[crop:(0,0)/1920x1080]'
media-ctl -d /dev/media0 \
--set-v4l2 '"rkisp1-isp-subdev":2[fmt:UYVY2X8/1920x1080]'
media-ctl -d /dev/media0 \
--set-v4l2 '"rkisp1-isp-subdev":2[crop:(0,0)/1920x1080]'

Bildstrom erfassen:

Konfigurationsergebnisse prüfen:

media-ctl -d /dev/media0 –p

Bildstrom erfassen:

v4l2-ctl --verbose -d /dev/video0 --set-fmt-
video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4

Erfassen Sie eine YUV-Bilddatei, übertragen Sie sie mit adb pull und prüfen Sie sie beispielsweise mit 7yuv:

v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12'
--stream-mmap=3 --stream-skip=4 --stream-to=/data/1920x1080p60_nv12.yuv --stream-
count=5 --stream-poll

Bei normalem Bilddatenempfang werden Bildraten ausgegeben. Protokollbeispiel der Quelle:

VIDIOC_QUERYCAP: ok
VIDIOC_G_FMT: ok
VIDIOC_S_FMT: ok

Format Video Capture Multiplanar:
      Width/Height : 1920/1080
      Pixel Format : 'NV12'
      Field        : None
      Number of planes : 1
      Flags        :
      Colorspace   : Default
      Transfer Function : Default
      YCbCr Encoding : Default
      Quantization : Full Range
      Plane 0      :
        Bytes per Line : 1920
        Size Image : 3110400

VIDIOC_G_SELECTION: ok
VIDIOC_S_SELECTION: ok
VIDIOC_REQBUFS: ok
VIDIOC_QUERYBUF: ok
VIDIOC_QUERYBUF: ok
VIDIOC_QBUF: ok
VIDIOC_QUERYBUF: ok
VIDIOC_QBUF: ok
VIDIOC_QUERYBUF: ok
VIDIOC_QBUF: ok
VIDIOC_QUERYBUF: ok
VIDIOC_QBUF: ok

VIDIOC_STREAMON: ok
idx: 0 seq: 0 bytesused: 3110400 ts: 131.560377
idx: 1 seq: 1 bytesused: 3110400 ts: 131.577023 delta: 16.646 ms
idx: 2 seq: 2 bytesused: 3110400 ts: 131.593697 delta: 16.674 ms
idx: 3 seq: 3 bytesused: 3110400 ts: 131.610363 delta: 16.666 ms
idx: 0 seq: 4 bytesused: 3110400 ts: 131.627033 delta: 16.670 ms fps: 60.01
idx: 1 seq: 5 bytesused: 3110400 ts: 131.643721 delta: 16.688 ms fps: 59.99
idx: 2 seq: 6 bytesused: 3110400 ts: 131.660390 delta: 16.669 ms fps: 59.99
idx: 3 seq: 7 bytesused: 3110400 ts: 131.677058 delta: 16.668 ms fps: 59.99

6.13.3 Protokollierung aktivieren

Aktivieren Sie RK628-Protokolle mit folgendem Befehl und erfassen Sie anschließend das Kernelprotokoll. Die Quelle schreibt den Abrufbefehl demsg; prüfen Sie den tatsächlichen Befehl dmesg auf dem Zielsystem.

echo 1 > /sys/kernel/debug/rk628/x-0050/debug //x为挂载的i2c总线,50为对应的i2c地址
echo 2 > /sys/module/rk628_csi/parameters/debug
echo 2 > /sys/module/rk628_csi_v4l2/parameters/debug //内核为linux4.4或者4.19

dmesg -n 8

Ändern Sie zur Erfassung von Einschalt-/Bootprotokollen den Code direkt und bauen/flashen Sie die Kernelkomponenten erneut:

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index c763a9558169..bd7f3effb45a 100644
--- a/drivers/media/i2c/rk628_csi_v4l2.c

+++ b/drivers/media/i2c/rk628_csi_v4l2.c
@@ -34,7 +34,7 @@
 #include <video/videomode.h>
 #include "rk628_csi.h"

-static int debug;
+static int debug = 1;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");

diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h
index 1cc0c5ba16b3..e74f3a85f0b8 100644
--- a/include/media/v4l2-common.h

+++ b/include/media/v4l2-common.h
@@ -75,7 +75,7 @@
 #define v4l2_dbg(level, debug, dev, fmt, arg...)   \
      do {                                          \
           if (debug >= (level))                    \
-                v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); \
+                v4l2_printk(KERN_INFO, dev, fmt , ## arg); \
      } while (0)

6.13.4 Register lesen und schreiben

Es folgen die RK628-Register-Debugknoten. In diesem Beispiel befindet sich RK628 an I2C3 mit Adresse 0x50:

console:/ # ls /sys/kernel/debug/rk628/3-0050/registers/
adapter combtxphy csi dsi0 gpio0 gpio2 grf hdmirxphy

combrxphy cru   csi1 dsi1 gpio1 gpio3 hdmirx

Die Registerknoten unterstützen Lese- und Schreibzugriffe.

Register lesen:

console:/ # cat /sys/kernel/debug/rk628/3-0050/registers/cru
rk628_cru:


0xc0000: 00001031 00000441 00800000 00000007
0xc0010: 00007f00
0xc0020: 00001028 00000441 00f5c28f 00000007
0xc0030: 00007f00
0xc0040: 00005019 00000541 0099735e 00000007
0xc0050: 00007f00
0xc0060: 00000015
0xc0080: 00008989 00000003 00000007 00004b80
0xc0090: 03355460 000080d7 00008004 0000003b
0xc00a0: 00002c00 00000000 00000000 00000000
0xc00b0: 00285f58 00010008 00010008 00000103
0xc00c0: 00000300 00000703 0000000b 00000008

0xc00d0: 0001000a 00000b07
0xc0180: 00000000 00000000 00000000 00000000
0xc0190: 00000000 00000000
0xc0200: 00000000 00000000 00000000 00000000
0xc0210: 00000000

Register schreiben:

rk3288:/ # echo 0x000 0xffffffff > /sys/kernel/debug/rk628/3-0050/registers/grf

6.13.5 HDMI-RX-Status lesen

Lesen Sie HDMI-RX-Informationen einschließlich Auflösung, Verriegelungszustand, Steckzustand und Farbformat mit:

console:/ # cat /sys/kernel/debug/rk628/3-0050/hdmirx/status
status: plugin

Clk-Ch:Lock Ch0:Lock   Ch1:Lock    Ch2:Lock
Color Format: RGB
Timing: 1920x1080p60 (2200x1125)   hfp:88 hs:45 hbp:147 vfp:4
vs:5 vbp:36
Pixel Clk: 148500000
Mode: HDMI
Color Depth: 8 bit
Color Range: Limited
Color Space: RGB

6.13.6 Testmusterausgabe

RK628 unterstützt die Farbbalkenausgabe des Scalers. Befehle:

echo 1 > /sys/kernel/debug/rk628/3-0050/scaler_color_bar

//pattern 模式选择

echo 2 > /sys/kernel/debug/rk628/3-0050/scaler_color_bar

6.14 Audiomodul

Audio lässt sich abhängig von HDMIRX oder HDMITX als Ausgang oder Eingang konfigurieren. Bei HDMIRX wird empfangenes HDMI-Audio entpackt und über I2S ausgegeben. Bei HDMITX empfängt RK628D I2S Audio, das paketiert und über HDMITX gesendet wird. Beide Konfigurationen folgen:

6.14.1 HDMIRX

HDMIRX initialisiert Audio gewöhnlich beim Laden des Treibers; zusätzliche Konfiguration ist nicht erforderlich. Wenn der HDMI-Sender Audio wiedergibt, gibt RK628 es über I2S aus und muss als Master arbeiten. RK628 I2S kann direkt mit einem I2S-fähigen DAC oder SoC verbunden werden. I2S-Format:

Technische Originalabbildung — EN V2.3, S. 86

Technische Originalabbildung: EN V2.3, S. 86.

Bei Anschluss an einen SoC benötigt RK628 I2S keine zusätzliche Konfiguration; verwenden Sie dummy_codec, um eine Soundkarte für das System anzulegen:

rk628_dc: rk628-dc {
      compatible = "rockchip,dummy-codec";
      #sound-dai-cells = <0>;

};

hdmiin-sound {
      compatible = "simple-audio-card";
      simple-audio-card,format = "i2s";
      simple-audio-card,name = "rockchip,hdmiin";
      simple-audio-card,bitclock-master = <&dailink0_master>;
      simple-audio-card,frame-master = <&dailink0_master>;
      status = "okay";
      simple-audio-card,cpu {
                 sound-dai = <&i2s0>;
      };

      dailink0_master: simple-audio-card,codec {
                 sound-dai = <&rk628_dc>;
      };
};

Bei einem DAC ist die obige Soundkartenkonfiguration unnötig; der DAC erzeugt direkt ein Analogsignal. Die meisten DACs benötigen MCLK, wofür RK628 keinen Anschluss vorgesehen hat. Die Quellenlösung verwendet GPIO1_A0 (H7) als TEST_CLKO zur Ausgabe eines 128FS-Takts. Die Quelle berichtet Kompatibilität mit vielen DACs sowie Tests mit CS4344 und ES7144; dies sind keine ArmSoM-Tests. Rufen Sie zur Aktivierung von MCLK an GPIO1_A0 die folgende Initialisierungsschnittstelle auf und wählen Sie den passenden Projekttreiber:

--- a/drivers/media/i2c/rk628/rk628_hdmirx.h
+++ b/drivers/media/i2c/rk628/rk628_hdmirx.h
@@ -392,5 +392,5 @@ bool rk628_audio_ctsnints_enabled(HAUDINFO info);
 void rk628_csi_isr_ctsn(HAUDINFO info, u32 pdec_ints);

 void rk628_csi_isr_fifoints(HAUDINFO info, u32 fifo_ints);
 int rk628_is_avi_ready(struct rk628 *rk628, bool avi_rcv_rdy);
+void rk628_hdmirx_audio_set_mclk_output(HAUDINFO info);

--- a/drivers/media/i2c/rk628/rk628_csi.c
+++ b/drivers/media/i2c/rk628/rk628_csi.c
@@ -957,6 +957,9 @@ static void rk628_csi_initial_setup(struct rk628_csi *csi)
 {
      struct v4l2_subdev_edid def_edid;

+     //enable rk628 mclk
+     rk628_hdmirx_audio_set_mclk_output(csi->audio_info);


--- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c
+++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c
@@ -1096,6 +1096,9 @@ static void rk628_csi_initial_setup(struct v4l2_subdev *sd)
      struct rk628_csi *csi = to_csi(sd);
      struct v4l2_subdev_edid def_edid;

+     //enable rk628 mclk
+     rk628_hdmirx_audio_set_mclk_output(csi->audio_info);

Für RK3288 EVB erklärt die Quelle, dass sowohl RK3288 I2S als auch RK628 I2S mit RT5651 I2S2 verbunden sind. Durch Umschalten der internen RT5651-Routen werden verschiedene Aufnahme-/Wiedergabepfade gewählt. DTS-Konfiguration:

hdmiin-sound {
      compatible = "rockchip,rockchip-rt5651-rk628-sound";
      rockchip,cpu = <&i2s>;

      rockchip,codec = <&rt5651>;
      status = "okay";
};

Standardmäßig gibt I2S nur während der Vorschau aus. Ergänzen Sie für kontinuierliche Ausgabe i2s-enable-default in DTS.

&i2c4 {
      clock-frequency = <400000>;
      status = "okay";

      rk628_csi_v4l2: rk628_csi_v4l2@50 {
           reg = <0x50>;
           compatible = "rockchip,rk628-csi-v4l2";
           ....
           i2s-enable-default;
           ....
      };
};

6.14.2 HDMITX

HDMITX benötigt nur die HDMI-Soundkartenkonfiguration. Hier ist RK628 I2S mit SoC I2S0 verbunden:

hdmi_sound: hdmi-sound {
      compatible = "simple-audio-card";
      simple-audio-card,format = "i2s";

      simple-audio-card,name = "hdmi-sound";
      status = "okay";
      simple-audio-card,cpu {
           sound-dai = <&i2s0>;
      };
      simple-audio-card,codec {
           sound-dai = <&rk628_hdmi>;
      };
};

6.14.3 Audio-Fehlersuche

6.14.3.1 Keine I2S-Ausgabe
echo 0x000 0x6000220 > /sys/kernel/debug/regmap/0-0050-grf/registers //i2s 的
IOMUX

echo 0x70 0xfffff55c > /sys/kernel/debug/regmap/0-0050-grf/registers
echo 0x70 0x155c155c > /sys/kernel/debug/regmap/0-0050-grf/registers // 设置输出
6.14.3.2 v4l2_dbg-Ausgabe aktivieren
diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 5e8e3710a82f..638ac2acc472 100644

--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -34,7 +34,7 @@
 #include <video/videomode.h>
 #include "rk628_csi.h"

-static int debug;
+static int debug = 3;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");

diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h
index cdc87ec61e54..f159118d4a6b 100644

--- a/include/media/v4l2-common.h
+++ b/include/media/v4l2-common.h
@@ -82,7 +82,7 @@
 #define v4l2_dbg(level, debug, dev, fmt, arg...)   \
      do {                                          \
           if (debug >= (level))                    \
-                v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); \
+                v4l2_printk(KERN_INFO, dev, fmt , ## arg); \
      } while (0)


 /**
6.14.3.3 Störgeräusche in Anwendungsaufnahmen

Dies kann durch eine Abweichung zwischen der Abtastrate des HDMI-Senders und der HAL-Aufnahmeabtastrate entstehen.

(1) Prüfen Sie die HDMITX-Abtastrate.

Kernelprotokollierung aktivieren: echo 3 > /sys/module/rk628_csi/parameters/debug

(2) Ermitteln Sie nach Aktivierung der Protokolle die TX-Abtastrate aus folgender Ausgabe.

m00_b_rk628-csi rk628-csi: rk628_hdmirx_audio_fs: clkrate:1500 tmdsclk:74250000,
n_decoded:6144, cts_decoded:74250, fs_audio:48000

m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_FILLSTS1:0xfe, single offset:0, total offset:-2
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_ISTS:0x4
m00_b_rk628-csi rk628-csi: rk628_hdmirx_audio_fs: clkrate:1500 tmdsclk:74250000,
n_decoded:6144, cts_decoded:74250, fs_audio:48000
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_FILLSTS1:0xfc, single offset:-2, total offset:-4
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_ISTS:0x4
m00_b_rk628-csi rk628-csi: rk628_hdmirx_audio_fs: clkrate:1500 tmdsclk:74250000,
n_decoded:6144, cts_decoded:74250, fs_audio:48000
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:

HDMI_RX_AUD_FIFO_FILLSTS1:0xfc, single offset:0, total offset:-4
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_ISTS:0x4
m00_b_rk628-csi rk628-csi: rk628_hdmirx_audio_fs: clkrate:1500 tmdsclk:74250000,
n_decoded:6144, cts_decoded:74250, fs_audio:48000
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_FILLSTS1:0xfc, single offset:0, total offset:-4
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_ISTS:0x4
m00_b_rk628-csi rk628-csi: rk628_hdmirx_audio_fs: clkrate:1500 tmdsclk:74250000,
n_decoded:6144, cts_decoded:74250, fs_audio:48000
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:

HDMI_RX_AUD_FIFO_FILLSTS1:0xfa, single offset:-2, total offset:-6
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_ISTS:0x4
m00_b_rk628-csi rk628-csi: rk628_hdmirx_audio_fs: clkrate:1500 tmdsclk:74250000,
n_decoded:6144, cts_decoded:74250, fs_audio:48000
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_FILLSTS1:0xfc, single offset:2, total offset:-4
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_ISTS:0x4
m00_b_rk628-csi rk628-csi: rk628_hdmirx_audio_fs: clkrate:1500 tmdsclk:74250000,
n_decoded:6144, cts_decoded:74250, fs_audio:48000
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:
HDMI_RX_AUD_FIFO_FILLSTS1:0xfa, single offset:-2, total offset:-6
m00_b_rk628-csi rk628-csi: rk628_csi_delayed_work_audio:

HDMI_RX_AUD_FIFO_ISTS:0x4

(3) HAL-Aufnahmeabtastrate:

getprop vendor.hdmiin.audiorate
6.14.3.4 IOMUX direkt einstellen
 static void rk628_hdmirx_initial_setup(struct rk628_hdmirx *hdmirx)
 {
      struct v4l2_subdev_edid def_edid;

@@ -783,6 +937,8 @@ static void rk628_hdmirx_initial_setup(struct rk628_hdmirx
*hdmirx)

      // ddc and hpd pinctrl
      regmap_write(hdmirx->grf, GRF_GPIO1AB_SEL_CON, 0x07000700);
+     //i2s pinctrl
+     regmap_write(hdmirx->grf, GRF_GPIO0AB_SEL_CON, 0x155c155c);

      rk628_hdmirx_controller_reset(hdmirx);
6.14.3.5 Falsche tmdsclk-Berechnung

1. Stimmen Sie die Bitmaske auf den Takt ab.

git sholsh@rk-intel-1:~/rk-sdk/android11-rk3399/kernel$ git show
007131063748ea69facbf4bbe7aaee71c34fd921

commit 007131063748ea69facbf4bbe7aaee71c34fd921
Author: Shunhua Lan <lsh@rock-chips.com>
Date: Fri Apr 23 18:43:59 2021 +0800

   media: i2c: rk628csi: fix mask for clkrate and fs audio align to 100

   Signed-off-by: Shunhua Lan <lsh@rock-chips.com>
   Change-Id: I15b290319463f1b41e6908e54caa99ef9c6db4f4

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 89c4a926a985..a970bc621e0e 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c

@@ -1064,7 +1064,7 @@ static void rk628_csi_delayed_work_audio(struct work_struct
*work)

      /* fout=128*fs=ftmds*N/CTS */
      regmap_read(csi->hdmirx_regmap, HDMI_RX_HDMI_CKM_RESULT, &clkrate);
-     clkrate = clkrate & 0xfff;
+     clkrate = clkrate & 0xffff;
      /* tmdsclk = (clkrate/1000) * 49500000 */
      tmdsclk = clkrate * (49500000 / 1000);
      regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_ACR_CTS, &cts_decoded);
@@ -1073,6 +1073,8 @@ static void rk628_csi_delayed_work_audio(struct work_struct

*work)
      if (cts_decoded != 0) {
           fs_audio = div_u64((tmdsclk * n_decoded), cts_decoded);
           fs_audio = div_u64(fs_audio, 128);
+          fs_audio = div_u64(fs_audio + 50, 100);
+          fs_audio *= 100;
      }
      v4l2_dbg(2, debug, sd,
           "%s: clkrate:%d tmdsclk:%llu, n_decoded:%d, cts_decoded:%d,
fs_audio:%llu\n",

Fehlerprotokoll:

[67.440094] m00_b_rk628-csi rk628-csi:rk628_csi_delayed_work_audio:clkrate:1904
tmdsclk:94248000,n_decoded:6144,cts_decoded:297000,fs_audio:15232

Für die 4K-Anzeige in diesem Beispiel sollte der berechnete tmdsclk 297M betragen.

tmdsclk = clkrate * (49500000 / 1000);

1904 —> 0x770

6000 —> 0x1770

tmdsclk 6*49500000 = 297000000

6.14.3.6 GPIO-Testtaktausgabe

Schnellkonfiguration:

grf: gpio0 相关 iomux 切换,配置为 IO 口:
echo 0x70 0x0fff0000 > registers


gpio0 配置为输出口, 1-0051-rk628-pinctrl:
echo 0xd0008 0x00EC00EC > registers

grf,选择在哪一级拉出信号:
HDMI_RX:
echo 0x300 0x11 > registers
ASYNC_IN:
echo 0x300 0x14 > registers
ASYNC_OUT:
echo 0x300 0x15 > registers
SCALER:
echo 0x300 0x16 > registers
6.14.3.7 Besondere IOMUX-Behandlung bei RK356X

Jede RK356X-I2S-Schnittstelle kann mehrere Pingruppen multiplexen und benötigt dafür eine zusätzliche GRF_IOFUNC_SEL4-Konfiguration:

Bit Attribut Resetwert Beschreibung
14 RW 0x0 i2s3_iomux_sel I2S3-IO-Mux-Auswahl
1’b0:M0-Mux-Lösung
1’b1:M1-Mux-Lösung
12 RW 0x0 i2s2_iomux_sel I2S2-IO-Mux-Auswahl
1’b0:M0-Mux-Lösung
1’b1:M1-Mux-Lösung
11:10 RW 0x0 i2s1_iomux_sel I2S1-IO-Mux-Auswahl
2’b00:M0-Mux-Lösung
2’b01:M1-Mux-Lösung
2’b10:M2-Mux-Lösung
2’b11: Reserviert

Der pinctrl-Treiber konfiguriert die zugehörigen GRF-Bits entsprechend dem ausgewählten mclk. Code:

static struct rockchip_mux_route_data rk3568_mux_route_data[] = {
   ....
   RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO

mux M0 */
   RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO
mux M1 */
   RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO
mux M2 */
   RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO
mux M0 */
   RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO
mux M1 */
   RK_MUXROUTE_GRF(3, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO
mux M0 */
   RK_MUXROUTE_GRF(4, RK_PC4, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO
mux M1 */

   ....
}

Anwendungen wie RK628, die keinen mclk benötigen, konfigurieren ihn nicht; dadurch werden diese Bits nicht gesetzt. Ergänzen Sie die Behandlung manuell. Da I2S normalerweise sclk verwendet, ergänzen Sie hier sclk. Laut Quelle wird ein späteres RK356X-SDK diesen Patch enthalten; prüfen Sie das tatsächlich verwendete SDK.

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-
rockchip.c

index 871c49ef0c2a..3d10e6c2ed27 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -1046,13 +1046,26 @@ static struct rockchip_mux_route_data
rk3568_mux_route_data[] = {
      RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9
IO mux M0 */
      RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9
IO mux M1 */
      RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9

IO mux M2 */
+
      RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1
IO mux M0 */
      RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1
IO mux M1 */
      RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1
IO mux M2 */
+     RK_MUXROUTE_GRF(1, RK_PA3, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1
IO mux sclk tx M0 */
+     RK_MUXROUTE_GRF(1, RK_PA4, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1
IO mux sclk rx M0 */

+     RK_MUXROUTE_GRF(3, RK_PC7, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1
IO mux sclk tx M1 */
+     RK_MUXROUTE_GRF(4, RK_PA6, 5, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1
IO mux sclk rx M1 */
+     RK_MUXROUTE_GRF(2, RK_PD1, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1
IO mux sclk tx M2 */
+     RK_MUXROUTE_GRF(3, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1
IO mux sclk rx M2 */
      RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2
IO mux M0 */
      RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2
IO mux M1 */
+     RK_MUXROUTE_GRF(2, RK_PC2, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2

IO mux sclk tx M0 */
+     RK_MUXROUTE_GRF(2, RK_PB7, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2
IO mux sclk rx M0 */
+     RK_MUXROUTE_GRF(4, RK_PB7, 4, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1
IO mux sclk tx M1 */
+     RK_MUXROUTE_GRF(4, RK_PC1, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1
IO mux sclk rx M1 */
      RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3
IO mux M0 */
      RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3
IO mux M1 */
+     RK_MUXROUTE_GRF(3, RK_PA3, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3

IO mux sclk M0 */
+     RK_MUXROUTE_GRF(4, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3
IO mux sclk M1 */
      RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO
mux M0 */
      RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO
mux M0 */
      RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO
mux M1 */
6.14.3.8 Besondere LRCK-Behandlung bei RK3399

Eine falsche Richtungseinstellung kann nach dem Öffnen der Soundkarte jeglichen Datenempfang verhindern. Es folgt ein typisches Protokoll; passen Sie die Knotenpfade an das Gerät an:

console:/ # cat /proc/asound/cards
 0 [rockchiphdmi ]: rockchip_hdmi - rockchip,hdmi
                rockchip,hdmi

 1 [rockchiphdmiin ]: rockchip_hdmiin - rockchip,hdmiin
                rockchip,hdmiin

console:/ # cat /proc/asound/card1/pcm0c/sub0/status
state: RUNNING
owner_pid : 1415
trigger_time: 1632716135.151992694
tstamp   : 0.000000000
delay    : 0
avail    : 0
avail_max : 0
-----

hw_ptr   : 0
appl_ptr : 0

Eine normale Ausgabe sollte etwa so aussehen:

console:/ # cat /proc/asound/card1/pcm0c/sub0/status
state: RUNNING
owner_pid : 1421

trigger_time: 1632892868.412331044
tstamp   : 1632892881.181113577
delay    : 232
avail    : 232
avail_max : 264
-----
hw_ptr   : 543736
appl_ptr : 543504

RK628 ist Master und RK3399 Slave; die Konfiguration hängt daher von der Verdrahtung ab. Wenn LRCK_TX mit RK628 verbunden ist, konfigurieren Sie rockchip,clk-trcm wie folgt:

+&i2s0 {
+     rockchip,clk-trcm = <1>;

+     status = "okay";
+};

console:/ # io -4 0xff880008
ff880008: 18071f1f

Wenn LRCK_RX mit RK628 verbunden ist, konfigurieren Sie rockchip,clk-trcm wie folgt:

+&i2s0 {
+     rockchip,clk-trcm = <2>;
+     status = "okay";

+};
正常寄存器如下:
console:/ # io -4 0xff880008
ff880008: 28071f1f

Die Bits 29:28 von I2S_CKR sind wie folgt definiert:

Tx and Rx Common Use
2'b00/2'b11:tx_lrck/rx_lrck are used as synchronous signal for TX
/RX respectively.

2'b01:only tx_lrck is used as synchronous signal for TX and RX.
2'b10:only rx_lrck is used as synchronous signal for TX and RX.

Aktualisieren Sie den RK628-Code auf v15-210926 oder neuer und verwenden Sie anschließend die Audiokonfiguration in arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-rk628-hdmi2csi-v4l2-avb.dts als Referenz.

6.14.3.9 Falsche HDMI-IN-Soundkarte ausgewählt

Die APK ordnet Soundkarten beim Öffnen anhand ihres Namens zu. Früher Code kann den falschen Namen zuordnen und dadurch das Öffnen der HDMI-IN-Soundkarte verhindern. Fehlerbeispiel:

09-28 07:03:13.341 261 1386 D AudioHardwareTiny: card0 id:rockchiphdmi
09-28 07:03:13.341 261 1386 D AudioHardwareTiny: SPEAKER card, got
card=0,device=0

09-28 07:03:13.341 261 1386 D AudioHardwareTiny: HDMI card, got
card=0,device=0
09-28 07:03:13.341 261 1386 D AudioHardwareTiny: SPDIF card, got
card=0,device=0
09-28 07:03:13.341 261 1386 D AudioHardwareTiny: BT card, got card=0,device=0
09-28 07:03:13.342 261 1386 D AudioHardwareTiny: card1 id:rockchiphdmiin
09-28 07:03:13.342 261 1386 D AudioHardwareTiny: SPEAKER card, got
card=1,device=0
09-28 07:03:13.342 261 1386 D AudioHardwareTiny: HDMI card, got
card=1,device=0
09-28 07:03:13.342 261 1386 D AudioHardwareTiny: SPDIF card, got
card=1,device=0

09-28 07:03:13.342 261 1386 D AudioHardwareTiny: BT card, got card=1,device=0
09-28 07:03:13.342 261 1386 D AudioHardwareTiny: No exist
proc/asound/card2/id, break and finish parsing
09-28 07:03:13.343 261 1386 D AudioHardwareTiny: dump out device info
09-28 07:03:13.343 261 1386 D AudioHardwareTiny: dev_info SPEAKER card=1,
device:0
09-28 07:03:13.343 261 1386 D AudioHardwareTiny: dev_info HDMI card=1,
device:0
09-28 07:03:13.343 261 1386 D AudioHardwareTiny: dev_info SPDIF card=1,
device:0
09-28 07:03:13.343 261 1386 D AudioHardwareTiny: dev_info BT card=1, device:0

HDMI card, got card=1,device=0 entspricht nicht dem tatsächlichen Gerät; daher lässt sich die Soundkarte nicht öffnen.

Wenden Sie den folgenden Patch an oder aktualisieren Sie den RK628-Code auf V15-210926 oder neuer.

hardware/rockchip/audio
commit 1b51a62fc62e9d63850e4e5a39f1e3cff0aa9b88 (HEAD)
Author: Shunhua Lan <lsh@rock-chips.com>

Date: Tue Sep 28 17:25:44 2021 +0800

   [audio hal] use levenshtein distance for sound card matching

   Signed-off-by: Shunhua Lan <lsh@rock-chips.com>
   Change-Id: I16f1692715d710a0693ae74875b0272669a04ba2

6.14.4 Weitere Audiodokumente

Für eine direkte Verbindung von RK628 zum SoC siehe RK628-DIRECT-TO-SOC.pdf.

Für eine Verbindung von RK628 über einen Audiocodec zum SoC siehe RK628-RT5640-AUDIO-CONFIG.pdf.

Zu Audioproblemen der HDMI-IN-APK siehe RK628-HDMIIN-APP-AUDIO.pdf.

Bei Abweichungen oder Widersprüchen anderer Dokumente zu diesem Quellleitfaden hat dieser Leitfaden Vorrang.

6.15 Gängige Methoden zur Fehlersuche

6.15.1 clk-det-Fehler

6.15.1.1 RK628D

Erkennt COMBRXPHY kein Signal, kann die Polarität der HDMI-Steckerkennung oder von HPD falsch sein und die normale Übertragung der Quelle verhindern. Prüfen Sie plugin-det-gpios und hpd-output-inverted unter rk628_csi und messen Sie HPD mit einem Multimeter.

Fehler lösen Wiederholungen bis retry 2 aus. Gelingt ein Wiederholungsversuch, behandelt die Quelle das Signal als normal.

rk628-csi-v4l2 1-0051: clk det over cnt:10, reg_0x6654:0x403f0000
rk628-csi-v4l2 1-0051: |d2_p| level detection anomaly
rk628-csi-v4l2 1-0051: clock detected failed, cfg resistance manual!

rk628-csi-v4l2 1-0051: err, clk not stable, reg_0x6630:0x87000d,
reg_0x6608:0x110100
m00_b_rk628-csi 1-0051: hdmi rxphy power on failed

Das obige Protokoll zeigt eine fehlerhafte data2_p-Spannungserkennung an, möglicherweise durch fehlendes Signal oder unzureichende Amplitude.

rk628-csi-v4l2 1-0051: clk det over cnt:10, reg_0x6654:0x403f0000
rk628-csi-v4l2 1-0051: Clock detection anomaly
rk628-csi-v4l2 1-0051: clock detected failed, cfg resistance manual!

rk628-csi-v4l2 1-0051: err, clk not stable, reg_0x6630:0x87000d,
reg_0x6608:0x110100
m00_b_rk628-csi 1-0051: hdmi rxphy power on failed

Das obige Protokoll zeigt eine fehlerhafte Frequenzerkennung an, möglicherweise außerhalb des RK628D-Bereichs. HDMIRX unterstützt laut Quelle folgende Frequenzen:

25175, 27000, 33750, 40000, 59400, 65000, 68250, 74250,
75000, 83500, 85500, 88750, 928125, 101000, 102250, 108000,
118800, 119000, 135000, 148500, 150000, 162000, 165000, 297000

6.15.2 Normalen HDMI-RX-Betrieb prüfen

Nach Verriegelung von COMBRXPHY sollte der HDMI-RX-Controller das Timing korrekt auswerten. Berechnete Timings können kleine Fehler aufweisen, häufig eine Abweichung von 1. Detaillierte Timings siehe CEA-Standards.

Technische Originalabbildung — EN V2.3, S. 100

Technische Originalabbildung: EN V2.3, S. 100.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

m00_b_rk628-csi rk628-csi: cnt_num:1000, tmds_cnt:3000, hs_cnt:15, vs_cnt:3667, hofs:192
m00_b_rk628-csi rk628-csi: SCDC_REGS1:0xffff0f00, act:1920x1080, total:2200x1125, fps:60,
m00_b_rk628-csi rk628-csi: hfp:88, hs:45, hbp:147, vfp:4, vs:5, vbp:36, interlace:0
m00_b_rk628-csi rk628-csi: rk628_csi_s_dv_timings: 1920x1080p60.0 (2200x1125)
m00_b_rk628-csi rk628-csi: enable_stream: disable

6.15.3 Berechtigungsfehler beim Öffnen von subdev

Technische Originalabbildung — EN V2.3, S. 100

Technische Originalabbildung: EN V2.3, S. 100.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

D JNI     : JNI CAMERA CALL init
I HdmiInput-native: JNI OnLoad
I HdmiInput-native: Apk Version: V1.2
E HdmiInput-native: openDevice(91): open /dev/v4l-subdev2 failed,erro=Permission denied
D RockchipCamera2: remove fake pic button
D RockchipCamera2: recreateTextureview
D RockchipCamera2: textureView remove
D RockchipCamera2: onResume

Prüfen Sie, ob /dev/v4l-subdev* entsprechend dem Quellenbeispiel den Modus 666 besitzt. Abfrage in der Geräteshell:

rk3288:/ # cat /vendor/ueventd.rc | grep subdev
/dev/v4l-subdev*   0666 media   camera

Das Quell-SDK enthält diesen Commit bereits. Falls er fehlt, passen Sie folgende Änderung unter device/rockchip/common/ an:

Technische Originalabbildung — EN V2.3, S. 100

Technische Originalabbildung: EN V2.3, S. 100.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

wendingxian@ubuntu:~/rk3288_9.0_int/device/rockchip/common$ git show
commit 17112e1430b0f10a88b57c73ad19203e58f0eeff (HEAD -> mid_9.0, rk/rk/rk33/mid/9.0/develop)
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Tue Apr 27 21:26:48 2021 +0800

    ueventd.rockchip.rc: modify the /dev/v4l-subdev* permission to 666

    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: Id4848209fd983f7e525761f19c7f0420b9fee747

diff --git a/ueventd.rockchip.rc b/ueventd.rockchip.rc
index 1914490b..52935d49 100755
--- a/ueventd.rockchip.rc
+++ b/ueventd.rockchip.rc
@@ -178,7 +178,7 @@
 /dev/ovr0                0664   system     system
 
 #for rk_isp1
-/dev/v4l-subdev*         0660   media      camera
+/dev/v4l-subdev*         0666   media      camera

 /dev/video0             0660   media      camera
 /dev/video1             0660   media      camera

6.15.4 Signal wird nicht erkannt

Schritt 1. Wenn HDMI-Ein-/Ausstecken keine RK628-Protokolle auf der seriellen Konsole erzeugt, ist die GPIO-Konfiguration des det-Pins falsch.

Schritt 2. Wenn Ausstecken Protokolle erzeugt, Einstecken jedoch nicht, ist die Polarität von plugin-det-gpios umgekehrt. Verwenden Sie bei einem invertierenden Transistor GPIO_ACTIVE_LOW. Ändern Sie zur Ereignisprüfung static int debug; in rk628_csi_v4l2.c zu static int debug = 3;. Korrekte Protokolle lauten tx_5v_power_present: 1 beim Einstecken und tx_5v_power_present: 0 beim Ausstecken.

Schritt 3. Wenn nach dem Einstecken nie ein gültiges Signal erkannt wird, prüfen Sie folgende Fälle:

Fall 1: invertiertes HPD. Der HDMI-Eingangsanschluss muss einen hohen HPD-Pegel erhalten, damit die Quelle ausgibt. Bei einem Inverter muss RK628 einen niedrigen Pegel treiben, damit am Anschluss ein hoher Pegel entsteht. Ergänzen Sie hpd-output-inverted; in DTS.

Fall 2: PHY kann nicht verriegeln; siehe clk-det-Fehlersuche.

Fall 3: Auflösung verriegelt nicht; HDMIRX erkennt möglicherweise eine Bitrate außerhalb des zulässigen Bereichs.

Fall 4: Auflösung verriegelt, aber AVI wird nicht bereit. avi_rcv_rdy sollte nach Signalverriegelung 1 werden. Wiederholtes avi_rcv_rdy:0 trotz erkannter Auflösung kann auf einen unkonfigurierten Interrupt-Pin hinweisen. Prüfen Sie zuerst die Interruptkonfiguration.

rk628d 1-0050: rk628_is_avi_ready PDEC_AVI_PB:0x10000840, avi_rcv_rdy:0
rk628d 1-0050: SCDC_REGS1:0x80000f00, act:1920x1080, total:2200x1125, fps:60,

pixclk:148500000

Die Quelle berichtet unter diesen Bedingungen gelegentlich geteilte Bilder bei RK3288-Aufnahmen; dies ist kein ArmSoM-Test.

6.15.5 Fehlerhafte Anzeige

(1) Prüfen Sie, ob die Eingangsquelle den DVI-Modus verwendet; RK628D unterstützt DVI nicht. Prüfen Sie dieses Protokoll:

rk628-csi-v4l2 1-0051: DVI mode detected

(2) Prüfen Sie, ob die Quelle HDCP-Verschlüsselung verwendet. Aktivieren Sie in diesem Fall RK628 HDMIRX HDCP.

6.15.6 Nur die halbe Bildfläche wird angezeigt

Wahrscheinlich ist eine 4K60-HDMI-Quelle an einen älteren Single-MIPI-Host wie RK3399, RK3568 oder RK3288 angeschlossen. RK628F/H teilt 4K60 in eine linke und rechte Hälfte; der Host empfängt daher nur die Hälfte. Begrenzen Sie in diesem Fall EDID durch Verwendung der RK628D-EDID auf 4K30:

diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c
index 32182d4433605..36568f5a081e0 100644

--- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c
+++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c
@@ -1347,7 +1347,7 @@ static void rk628_csi_initial_setup(struct v4l2_subdev *sd)
      def_edid.start_block = 0;
      def_edid.blocks = 2;
      if (csi->rk628->version >= RK628F_VERSION)
-          def_edid.edid = rk628f_edid_init_data;
+          def_edid.edid = edid_init_data;
      else
           def_edid.edid = edid_init_data;
      rk628_csi_s_edid(sd, &def_edid);

6.15.7 Aufnahmefehler

(1) Android ab 9.0 und Linux

Verwenden Sie v4l2-ctl zur Aufnahme unter Rockchip Android ab 9.0 oder Linux. Führen Sie zuerst media-ctl -d /dev/mediaX -p aus. Die Knotennummerierung hängt von der Plattform ab. Nach Deaktivierung des CIF-Controllers bleibt häufig media0; RK3399 an PHY1 kann media1 verwenden. Machen Sie sich mit der Kamerakonfiguration der Plattform vertraut. Wenn kein RK628-Knoten in der Topologie erscheint, prüfen Sie DTS. Weichen die Topologieauflösungen vom Eingang ab, setzen Sie sie mit media-ctl einheitlich.

Führen Sie anschließend aus:

v4l2-ctl -d /dev/video0 --set-fmt-
video=width=1920,height=1080,pixelformat=NV12 --stream-mmap=3`

Eine kontinuierliche Ausgabe von <<<<<<<<<< zeigt normale Aufnahme an und bedeutet gewöhnlich, dass der Treiber arbeitet. Bei dauerhaften oder sporadischen Fehlern:

rkisp1: MIPI mis error:

Die Ursache kann in der Hardware liegen. Prüfen Sie HDMI-Leitungsabzweige und Impedanzabweichungen. Einige Platinen ergänzen Serienwiderstände in den HDMI-Leitungen, die im Referenzschaltplan fehlen; die Quelle verwendet 0 Ohm, sofern nichts anderes erforderlich ist. Andere Werte können sporadische Fehler verursachen. Analysieren Sie die tatsächliche Hardware und die Signale zwischen RK628 und Host.

Ein weiteres mögliches Protokoll lautet:

rkisp-vir0: MIPI error: overflow: 0x00000001

Dieses Protokoll kann bei RK356X/RV11XX auftreten, wenn ISP 4K empfängt. Die Quelle empfiehlt einen RK628+VICAP-Pfad; siehe VICAP-Konfiguration in diesem Leitfaden.

SIZE_ERROR kann eine Auflösungsabweichung anzeigen, beispielsweise 720p-Eingang bei Aufnahme mit 1080p. Prüfen Sie jede Topologieauflösung und die v4l2-ctl-Aufnahmeauflösung. Die Quelle empfiehlt, zunächst durchgehend mit 1080p zu testen.

rkisp1 ff910000.rkisp1: CIF_ISP_PIC_SIZE_ERROR

Das System fragt die Auflösung gewöhnlich über /dev/v4l-subdev2 ab, media-ctl -p kann jedoch stattdessen /dev/v4l-subdev3 anzeigen:

 - entity 70: m00_b_rk628-csi rk628-csi (1 pad, 1 link)
       type V4L2 subdev subtype Sensor
       device node name /dev/v4l-subdev3

pad0: Source
   [fmt:UYVY2X8/1280x720]
   -> "rockchip-csi2-dphy0":0 []

Dann kann die Anwendung die Auflösung nicht erkennen und gibt möglicherweise CIF_ISP_PIC_SIZE_ERROR aus. Ändern Sie jni/native.cpp der Android-Anwendung wie folgt:

strcat(video_name, "/dev/v4l-subdev2");

Ändern in:

strcat(video_name, "/dev/v4l-subdev3");

(2) Keine Bilder bei 4K

4K verwendet höhere Frequenzen; daher kann schlechte Signalqualität die Ursache sein. Auch RK3399 ISP benötigt einen höheren Takt; siehe Konfigurationsmethode zur RK3399-ISP-Übertaktung.

6.15.8 APK lässt sich nicht öffnen

Der veröffentlichte Patch enthält den rkCamera2-Quellcode. Bauen Sie ihn im Systemquellbaum, beispielsweise indem Sie ihn im Wurzelverzeichnis ablegen und mmm für das APK-Verzeichnis ausführen. Abstürze können folgende Ursachen haben:

(1) Abhängige Bibliotheken

Die alleinige APK-Installation kann Folgendes erzeugen:

AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library
"/system/lib64/libhdmiinput_jni.so" needed or dlopened by

"/apex/com.android.runtime/lib64/libnativeloader.so" is not accessible for
the namespace "classloader-namespace"

Bauen und paketieren Sie die APK im SDK, damit die abhängigen Bibliotheken im Image enthalten sind.

(2) Dateiberechtigungen

Die APK greift über ioctl auf RK628-Knoten zu, beispielsweise:

HdmiInput-navtive: openDevice(113): open /dev/v4l-subdev2
failed,erro=Permission denied

Prüfen Sie zuerst die Dateiberechtigungen; der Quellpatch setzt den Modus 666. Da die APK auf Geräteknoten zugreift, fragt die Quelle außerdem, ob SELinux deaktiviert ist; prüfen Sie seinen Zustand mit getenforce. Dies beschreibt die Debugging-Umgebung der Quelle und ist keine Empfehlung, die Sicherheit im Produktivbetrieb zu schwächen.

(3) Konfiguration der höheren Schichten

Konfigurieren Sie camera3_profiles.xml für Android ab 9.0 beziehungsweise cam_board.xml für ältere Versionen. Prüfen Sie dumpsys media.camera; fehlende Einträge können auf fehlende Konfiguration hinweisen:

$ dumpsys media.camera

== Service global info: ==


Number of camera devices: 1
Number of normal camera devices: 1

(4) Absturz der Kamerabibliothek

Der folgende Fehler kann durch einen falschen Kameranamen entstehen: getDataFromXmlFile liefert einen Namen, der nicht zum Treiber passt, und verursacht dadurch einen Absturz.

09-29 04:43:30.673 405 405 W ServiceManagement: Waited one second for
android.hardware.camera.provider@2.4::ICameraProvider/legacy/0. Waiting

another...
09-29 04:43:31.673 405 405 W ServiceManagement: Waited one second for
android.hardware.camera.provider@2.4::ICameraProvider/legacy/0. Waiting
another...
...
09-29 04:43:31.904 1404 1404 F DEBUG : backtrace:
09-29 04:43:31.904 1404 1404 F DEBUG : #00 pc 0007214e
/vendor/lib/hw/camera.rk30board.so
(android::camera2::ChromeCameraProfiles::handleAndroidStaticMetadata(char const*,
char const**)+546)
09-29 04:43:31.904 1404 1404 F DEBUG : #01 pc 00007895 /system/lib/vndk-
28/libexpat.so (doContent+432)
09-29 04:43:31.905 1404 1404 F DEBUG : #02 pc 0000637b /system/lib/vndk-

28/libexpat.so (contentProcessor+40)
09-29 04:43:31.905 1404 1404 F DEBUG : #03 pc 00003825 /system/lib/vndk-
28/libexpat.so (XML_ParseBuffer+84)
09-29 04:43:31.905 1404 1404 F DEBUG : #04 pc 000711ad
/vendor/lib/hw/camera.rk30board.so
(android::camera2::CameraProfiles::getDataFromXmlFile()+148)
09-29 04:43:31.905 1404 1404 F DEBUG : #05 pc 00071e97
/vendor/lib/hw/camera.rk30board.so
(android::camera2::ChromeCameraProfiles::init()+86)
09-29 04:43:31.905 1404 1404 F DEBUG : #06 pc 000734c7
/vendor/lib/hw/camera.rk30board.so (android::camera2::PlatformData::init()+198)
09-29 04:43:31.905 1404 1404 F DEBUG : #07 pc 000cecb3

/vendor/lib/hw/camera.rk30board.so (initCameraHAL()+46)
...

Wenn V4L2 erforderlich ist (Android ab 9.0), ändern Sie name=”rk628-csi” in camera3_profiles_rk3399.xml wie folgt zu name=”rk628-csi-v4l2”:

hardware/rockchip/camera
--- a/etc/camera/camera3_profiles_rk3399.xml
+++ b/etc/camera/camera3_profiles_rk3399.xml

@@ -769,7 +769,7 @@

 <!-- ******************PSL specific section end
**************************************************************-->
   </Profiles>
-  <Profiles cameraId="0" name="rk628-csi" moduleId="m00">
+  <Profiles cameraId="0" name="rk628-csi-v4l2" moduleId="m00">

(5) Berechtigungsbedingte APK-Abstürze

Das Protokoll dieses Problems sieht gewöhnlich wie folgt aus:

Wenn V4L2 erforderlich ist (Android ab 9.0), ändern Sie rk628-csi zu rk628-csi-v4l2.

09-24 10:21:20.154 1552 1570 E AndroidRuntime: FATAL EXCEPTION: Thread-2
09-24 10:21:20.154 1552 1570 E AndroidRuntime: Process:

com.android.rockchip.camera2, PID: 1552
09-24 10:21:20.154 1552 1570 E AndroidRuntime: java.lang.IllegalStateException:
startRecording() called on an uninitialized AudioRecord.
09-24 10:21:20.154 1552 1570 E AndroidRuntime: at
android.media.AudioRecord.startRecording(AudioRecord.java:983)
09-24 10:21:20.154 1552 1570 E AndroidRuntime: at
com.android.rockchip.camera2.AudioStream$recordSound.run(AudioStream.java:199)
09-24 10:21:20.154 1552 1570 E AndroidRuntime: at
java.lang.Thread.run(Thread.java:764)
09-24 10:21:20.164 464 820 W ActivityManager: Force finishing activity
com.android.rockchip.camera2/.RockchipCamera2
09-24 10:21:20.183 1552 1552 D RockchipCamera2: onPause

Folgender Patch kann das Problem beheben:

packages/apps/rkCamera2
--- a/AndroidManifest.xml

+++ b/AndroidManifest.xml
@@ -4,7 +4,8 @@
   package="com.android.rockchip.camera2">

      <uses-permission android:name="android.permission.CAMERA" />
-     <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
+     <uses-permission android:name="android.permission.RECORD_AUDIO" />
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"

diff --git a/src/com/android/rockchip/camera2/RockchipCamera2.java b/src/com/android/rockchip/camera2/RockchipCamera2.java
index 9dc29b8..02ee104 100755
--- a/src/com/android/rockchip/camera2/RockchipCamera2.java
+++ b/src/com/android/rockchip/camera2/RockchipCamera2.java
@@ -100,9 +100,11 @@ public class RockchipCamera2 extends Activity {
      if (ActivityCompat.checkSelfPermission(this,
         Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
         && ActivityCompat.checkSelfPermission(this,
-             Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED) {
+             Manifest.permission.WRITE_EXTERNAL_STORAGE) !=

PackageManager.PERMISSION_GRANTED
+        && ActivityCompat.checkSelfPermission(this,
+             Manifest.permission.RECORD_AUDIO) !=
PackageManager.PERMISSION_GRANTED) {
         ActivityCompat.requestPermissions(RockchipCamera2.this,
-          new String[] { Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE },
+          new String[] { Manifest.permission.CAMERA,

Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO},
           REQUEST_CAMERA_PERMISSION);
         return;
      }

6.15.9 DTS verbindet mit rkcif, aber die APK-Vorschau scheitert

Wenn bei RK356X mit Android-11-Codeversion R10/R11 DTS den RK628 mit rkcif verbindet und die Bilderfassung funktioniert, die APK-Vorschau jedoch scheitert, unterstützt der cameraHAL-Code in R10 und R11 möglicherweise diese Pipeline nicht. Laut Quelle besteht das Problem bei R9 nicht. Diagnose und Behebung:

(1) cameraHAL-Debugging aktivieren:

setprop persist.vendor.camera.hal.debug 5

(2) Erfassen Sie logcat, wenn das Öffnen der APK scheitert. Relevante Protokolleinträge:

Technische Originalabbildung — EN V2.3, S. 107

Technische Originalabbildung: EN V2.3, S. 107.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:rockchip-csi2-dphy0, srcPad:1, sinkName:none, sinkPad:0, enable:1, flags:1
I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:none, srcPad:1, sinkName:none, sinkPad:0, enable:1, flags:1
I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:none, srcPad:2, sinkName:rkisp_rawwr0, sinkPad:0, enable:1, flags:1
I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:none, srcPad:4, sinkName:rkisp_rawwr2, sinkPad:0, enable:1, flags:1
I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:none, srcPad:5, sinkName:rkisp_rawwr3, sinkPad:0, enable:1, flags:1
I RkCamera: <HAL> RKISP2GraphConfig: @addFormatParams, entityName:none, width:1920, height:1080, pad:0, format:0x2006:V4L2_MBUS_FMT_UYVY8_2X8, field:0
I RkCamera: <HAL> RKISP2GraphConfig: @addSelectionParams, width:1920, height:1080, left:0, top:0, target:0, pad:0, entityName:none
I RkCamera: <HAL> RKISP2GraphConfig: @addSelectionParams, width:1920, height:1080, left:0, top:0, target:0, pad:2, entityName:none
I RkCamera: <HAL> RKISP2GraphConfig: @addFormatParams, entityName:none, width:1920, height:1080, pad:2, format:0x2008:V4L2_MBUS_FMT_YUYV8_2X8, field:0
I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:none, srcPad:3, sinkName:none, sinkPad:0, enable:1, flags:1
I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:none, srcPad:0, sinkName:none, sinkPad:1, enable:1, flags:1
D RkCamera: <HAL> RKISP2GraphConfig: @ isNeedPathCrop : stream ratios: 1.777778
D RkCamera: <HAL> RKISP2GraphConfig: @ isNeedPathCrop : mp_need_crop 1, sp_need_crop 0, sp_enabled 0
D RkCamera: <HAL> RKISP2GraphConfig: @ calc_crop : src_ratio:1.777778, dst_ratio:1.777778, src(1920x1080), dst(1920x1080)
I RkCamera: <HAL> RKISP2GraphConfig: @addSelectionVideoParams, width:1920, height:1080, left:0, top:0, target:0, type:1, flags:0 entityName:none
I RkCamera: <HAL> RKISP2GraphConfig: @addFormatParams, entityName:none, width:1920, height:1080, pad:0, format:0x3231564e:V4L2_PIX_FMT_NV12, field:0
I RkCamera: <HAL> RKISP2GraphConfig: @addLinkParams, srcName:none, srcPad:2, sinkName:none, sinkPad:0, enable:1, flags:1
I RkCamera: <HAL> RKISP2GraphConfig: @getImguMediaCtlConfig : No need for selfPath

Wenn das obige Protokoll erscheint, hat cameraHAL die zugehörige Pipeline standardmäßig für rkisp konfiguriert, während DTS sie für rkcif konfiguriert. Die Quelle schreibt cameraHAL an dieser Stelle als ameraHAL.

(3) Lösung

Ergänzen Sie folgende Änderungen in hardware/rockchip/camera:

diff --git a/psl/rkisp2/RKISP2GraphConfig.cpp b/psl/rkisp2/RKISP2GraphConfig.cpp
index 2a5fa5a..3d2409c 100755
--- a/psl/rkisp2/RKISP2GraphConfig.cpp

+++ b/psl/rkisp2/RKISP2GraphConfig.cpp
@@ -76,6 +76,7 @@ const string MEDIACTL_POSTVIEWNAME = "postview";

 const string MEDIACTL_STATNAME = "rkisp1-statistics";
 const string MEDIACTL_VIDEONAME_CIF = "stream_cif_dvp_id0";
+const string MEDIACTL_VIDEONAME_CIF_MIPI_ID0 = "stream_cif_mipi_id0";

 RKISP2GraphConfig::RKISP2GraphConfig() :
      mManager(nullptr),
@@ -2620,6 +2621,13 @@ status_t RKISP2GraphConfig::getImguMediaCtlConfig(int32_t
cameraId,
            addLinkParams("rkisp-isp-subdev", 2, "rkisp_mainpath", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);

            addLinkParams("rkisp-isp-subdev", 2, "rkisp_selfpath", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
         }
+     } else if(mipName2.find("mipi") != std::string::npos) {
+        addLinkParams(mipName, mipSrcPad, mipName2, csiSinkPad, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);

+        addLinkParams(mipName2, 1, "stream_cif_mipi_id0", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        addLinkParams(mipName2, 2, "stream_cif_mipi_id1", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        addLinkParams(mipName2, 3, "stream_cif_mipi_id2", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        addLinkParams(mipName2, 4, "stream_cif_mipi_id3", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
+        mSensorLinkedToCIF = true;
      } else {
         addLinkParams(mipName, mipSrcPad, csiName, csiSinkPad, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);

         addLinkParams(csiName, csiSrcPad, IspName, ispSinkPad, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
@@ -2628,6 +2636,12 @@ status_t RKISP2GraphConfig::getImguMediaCtlConfig(int32_t
cameraId,
         addLinkParams(csiName, 5, "rkisp_rawwr3", 0, 1,
MEDIA_LNK_FL_ENABLED, mediaCtlConfig);
      }
   }
+  if(mSensorLinkedToCIF){
+     addImguVideoNode(IMGU_NODE_VIDEO, MEDIACTL_VIDEONAME_CIF_MIPI_ID0,
mediaCtlConfig);
+     addFormatParams(MEDIACTL_VIDEONAME_CIF_MIPI_ID0, mCurSensorFormat.width,
mCurSensorFormat.height,

+           0, V4L2_PIX_FMT_NV12, 0, 0, mediaCtlConfig);
+     return OK;
+  }
   // isp input pad format and selection config
   addFormatParams(IspName, ispInWidth, ispInHeight, ispSinkPad, ispInFormat,
0, 0, mediaCtlConfig);
   addSelectionParams(IspName, ispInWidth, ispInHeight, 0, 0,
V4L2_SEL_TGT_CROP, ispSinkPad, mediaCtlConfig);

6.15.10 RK628-GPIOs bedienen

Rufen Sie die GPIO-Schnittstelle direkt an der Stelle auf, an der GPIO-Steuerung benötigt wird. Diese Schnittstelle umfasst IOMUX-Auswahl, GPIO-Richtung und Konfiguration des Ausgangspegels. Die folgenden Operationen konfigurieren beispielsweise I2C_SDA_HDMI und I2C_SCL_HDMI als GPIOs.

rk628_gpio_direction_output(rk628, GPIO1_B1, GPIO_REG_HIGH);
rk628_gpio_direction_output(rk628, GPIO1_B2, GPIO_REG_HIGH);

Rufen Sie zur Wiederherstellung der ursprünglichen Funktion folgende Schnittstelle auf:

rk628_pinctrl_set_mux(rk628, GPIO1_B1, DDCM0SDARX);
rk628_pinctrl_set_mux(rk628, GPIO1_B2, DDCM0SCLRX);

6.15.11 Soundkartenregistrierung scheitert

Im folgenden Beispiel wird die hdmiin-Soundkarte nach dem Systemstart nicht gefunden:

# cat /proc/asound/cards
 1 [rockchiphdmiin ]: rockchip_hdmiin - rockchip,hdmiin
                rockchip,hdmiin

Prüfen Sie zunächst, ob die soc-dai- und codec-dai-Geräte, von denen die Soundkarte abhängt, erfolgreich geladen wurden:

rk3399:/ # cat /sys/kernel/debug/asoc/components
...
dummy-codec

ff8a0000.i2s
ff8a0000.i2s
ff880000.i2s
ff880000.i2s
...
rk3399:/ # cat /sys/kernel/debug/asoc/dais
...
ff8a0000.i2s
ff880000.i2s
dummy-codec
....

Falls diese Knoten nicht geladen werden, prüfen Sie defconfig und DTS.

Wenn soc dai und codec dai erfolgreich registriert werden, die Soundkarte jedoch nicht, reichen möglicherweise die DMA-Ressourcen nicht aus. Die Quelle berichtet dies besonders häufig bei RK3399. Ergänzen Sie bei Kerneln ab 4.19 folgende Eigenschaft im i2s-Knoten zur Behebung:

--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi

@@ -1788,6 +1788,7 @@
           clocks = <&cru SCLK_I2S2_8CH>, <&cru HCLK_I2S2_8CH>;
           resets = <&cru SRST_I2S2_8CH>, <&cru SRST_H_I2S2_8CH>;
           reset-names = "reset-m", "reset-h";
+          rockchip,capture-only;
           power-domains = <&power RK3399_PD_SDIOAUDIO>;
           status = "disabled";

7. Häufige Anforderungen

7.1 Einen von einem anderen SoC gelieferten RK628-24M-Takt konfigurieren

Die folgenden Beispiele beschreiben die Konfiguration für mehrere Rockchip-Host-SoCs. Dabei wird vorausgesetzt, dass alle in diesen DTS-Beispielen konfigurierten Takte im Code aktiviert werden. Andernfalls wird der 24M-Takt nach dem Booten abgeschaltet, was I2C-Kommunikationsfehler verursacht.

7.1.1 24M-Unterstützung auf RK3399 ergänzen

(1) Verwenden Sie folgende Konfiguration als Referenz im rk628-DTS:

pinctrl-names = "default";
pinctrl-0 = <&rk628_rst>, <&clk_testout2>;
assigned-clocks = <&cru SCLK_TESTCLKOUT2>;

assigned-clock-rates = <24000000>;
clocks = <&cru SCLK_TESTCLKOUT2>;
clock-names = "soc_24M";

(2) Ergänzen Sie die PINCTRL-Konfiguration der I/O-Pins entsprechend den tatsächlichen Hardwareverbindungen:

&pinctrl {
      test {
           clk_testout2: clk_testout2 {

           rockchip,pins = <0 8 RK_FUNC_3 &pcfg_pull_none>;
      };
};

7.1.2 24M-Unterstützung auf RK3288 ergänzen

(1) Verwenden Sie folgende Konfiguration als Referenz im rk628-DTS:

pinctrl-names = "default";
pinctrl-0 = <&test_clkout>;
assigned-clocks = <&cru SCLK_TESTOUT_SRC>;

assigned-clock-parents = <&xin24m>;
clocks = <&cru SCLK_TESTOUT>;
clock-names = "soc_24M";

(2) Ergänzen Sie die PINCTRL-Konfiguration der I/O-Pins entsprechend den tatsächlichen Hardwareverbindungen:

&pinctrl {
      test {
           test_clkout: test-clkout {

                 rockchip,pins = <0 17 RK_FUNC_1 &pcfg_pull_none>;
           };
      };
};

7.1.3 24M-Unterstützung auf RK356X ergänzen

RK356X besitzt mehrere Pins zur Ausgabe von 24 MHz, darunter REF_CLKOUT (clk_wifi/gpio0_a0), CAM_CLKOUT1 (clk_cam1_out/gpio4_b0) und ETH_REFCLK_25M_M0 (clk_mac1_out/gpio3_b0). Das folgende Beispiel verwendet clk_wifi.

(1) Verwenden Sie folgende Konfiguration als Referenz im rk628-DTS:


&i2c2_rk628 {
   pinctrl-names = "default";
   pinctrl-0 = <&rk628_reset &refclk_pins>;

   assigned-clocks = <&pmucru CLK_WIFI>;
   assigned-clock-rates = <24000000>;
   clocks = <&pmucru CLK_WIFI>;
   clock-names = "soc_24M";
};

&pinctrl {
   rk628 {
      rk628_reset: rk628-reset {
         rockchip,pins = <2 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
      };
   };

};

(2) Folgende Konfiguration ist bereits in rk3568-pinctrl.dtsi enthalten:

&pinctrl {
   ......

   refclk {
      /omit-if-no-ref/
      refclk_pins: refclk-pins {
         rockchip,pins =
           /* refclk_ou */
           <0 RK_PA0 1 &pcfg_pull_none>;
      };
   };
   ......
};

Für hier nicht aufgeführte Rockchip-Chips siehe Rockchip_Develop_Guide_Gpio_Output_Clocks_CN.pdf zur 24M-Taktkonfiguration.

7.2 Unterstützung für zwei RK628

7.2.1 HDMI2CSI + HDMI2CSI unterstützen

7.2.1.1 Wichtige Hinweise

(1) Zwei RK628-Geräte arbeiten ähnlich wie eine Dual-Kamera-Konfiguration. Für gleichzeitigen Betrieb beider RK628 muss der Host zwei ISP-Controller unterstützen, die zwei Eingänge gleichzeitig verarbeiten, wie bei RK3399.

(2) Verbinden Sie im Hardwaredesign die beiden RK628-Geräte mit verschiedenen I2C-Bussen oder mit unterschiedlichen I2C-Adressen am selben I2C-Bus.

(3) Die DTS-Konfiguration muss dem Hardwaredesign entsprechen. Ob ein bestimmter RK628 physisch mit mipi_phy_rx0 oder mipi_phy_tx1rx1 verbunden ist, muss auch in seiner DTS-Konfiguration abgebildet sein.

(4) Beim Einsatz zweier RK628-Geräte für HDMI2CSI dürfen deren RESET- und INT-Steuer-I/Os nicht gemeinsam verwendet werden; andernfalls ist der Betrieb fehlerhaft.

7.2.1.2 Kernel-DTS-Konfiguration

Das folgende Beispiel konfiguriert zwei RK628-Geräte an RK3399.

(1) rk628 -> mipi_dphy_rx0 -> rkisp1_0: Der erste Pfad hat index 0 und facing ist auf back gesetzt.

&i2c1 {
   status = "okay";


   rk628_csi_v4l2: rk628_csi_v4l2@50 {
      compatible = "rockchip,rk628-csi-v4l2";
      reg = <0x50>;
      //clocks = <&ext_cam_clk>;
      //clock-names = "xvclk";

      interrupt-parent = <&gpio4>;
      interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_irq>;
      //power-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>;

      plugin-det-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "RK628-CSI";
      rockchip,camera-module-lens-name = "NC";
      port {
         rk628_out: endpoint {
           remote-endpoint = <&hdmi2mipi_in>;
           data-lanes = <1 2 3 4>;
         };
      };
   };

};

&mipi_dphy_rx0 {
   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;

      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;


         hdmi2mipi_in: endpoint@1 {
           reg = <1>;
           remote-endpoint = <&rk628_out>;
           data-lanes = <1 2 3 4>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;


         dphy_rx0_out: endpoint@0 {
           reg = <0>;
           remote-endpoint = <&isp0_mipi_in>;
         };
      };
   };
};

&rkisp1_0 {
   status = "okay";


   port {
      #address-cells = <1>;
      #size-cells = <0>;

      isp0_mipi_in: endpoint@0 {
         reg = <0>;
         remote-endpoint = <&dphy_rx0_out>;
      };
   };
};

(2) rk628 -> mipi_dphy_tx1rx1 -> rkisp1_1: Der zweite Pfad hat index 1 und facing ist auf front gesetzt.

&i2c4 {
   status = "okay";


   rk628_csi_v4l2_1: rk628_csi_v4l2_1@50 {
      compatible = "rockchip,rk628-csi-v4l2";
      reg = <0x50>;
      //clocks = <&ext_cam_clk>;
      //clock-names = "xvclk";

      interrupt-parent = <&gpio3>;
      interrupts = <12 IRQ_TYPE_LEVEL_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_irq1>;
      //power-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
      reset-gpios = <&gpio4 RK_PD3 GPIO_ACTIVE_LOW>;

      plugin-det-gpios = <&gpio0 RK_PD7 GPIO_ACTIVE_LOW>;
      rockchip,camera-module-index = <1>;
      rockchip,camera-module-facing = "front";
      rockchip,camera-module-name = "RK628-CSI";
      rockchip,camera-module-lens-name = "NC";
      port {
         rk628_out1: endpoint {
           remote-endpoint = <&hdmi2mipi_in1>;
           data-lanes = <1 2 3 4>;
         };
      };
   };
};

&mipi_dphy_tx1rx1 {

   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;

      port@0 {
         reg = <0>;
         #address-cells = <1>;
         #size-cells = <0>;

         hdmi2mipi_in1: endpoint@1 {

           reg = <1>;
           remote-endpoint = <&rk628_out1>;
           data-lanes = <1 2 3 4>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;
         #size-cells = <0>;

         dphy_tx1rx1_out: endpoint@0 {
           reg = <0>;

           remote-endpoint = <&isp1_mipi_in>;
         };
      };
   };
};

&rkisp1_1 {
   status = "okay";

   port {
      #address-cells = <1>;
      #size-cells = <0>;


      isp1_mipi_in: endpoint@0 {
         reg = <0>;
         remote-endpoint = <&dphy_tx1rx1_out>;
      };
   };
};
7.2.1.3 Android-Konfiguration

(1) Hinweise zur Konfiguration von camera3_profiles.xml:

moduleId muss index in DTS entsprechen.

Erster RK628:

Technische Originalabbildung — EN V2.3, S. 115

Technische Originalabbildung: EN V2.3, S. 115.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

</Profiles>
<Profiles cameraId="0" name="rk628-csi" moduleId="m00">
    <Supported_hardware>
        <hwType value="SUPPORTED_HW_RKISP1"/>
    </Supported_hardware>

Zweiter RK628:

Technische Originalabbildung — EN V2.3, S. 115

Technische Originalabbildung: EN V2.3, S. 115.

Editierbare Transkription des vollständig sichtbaren Screenshot-Texts. Abgeschnittene Randzeichen werden nicht rekonstruiert; Fragmente sind nicht unbedingt eigenständig ausführbare Beispiele.

</Profiles>
<Profiles cameraId="1" name="rk628-csi" moduleId="m01">
    <Supported_hardware>
        <hwType value="SUPPORTED_HW_RKISP1"/>
    </Supported_hardware>

(2) Ergänzen Sie zur gleichzeitigen Verwendung beider RK628-Geräte die cameraHAL-Unterstützung durch folgende Änderungen in SDK/hardware/rockchip/camera:

diff --git a/common/platformdata/PlatformData.cpp b/common/platformdata/PlatformData.cpp

index 36d2ac9..d3fcb4b 100755
--- a/common/platformdata/PlatformData.cpp
+++ b/common/platformdata/PlatformData.cpp
@@ -1047,7 +1047,7 @@ CameraHWInfo::CameraHWInfo() :
   mProductName = "<not_set>";
   mManufacturerName = "<not set>";
   mCameraDeviceAPIVersion = CAMERA_DEVICE_API_VERSION_3_3;
-  mSupportDualVideo = false;
+  mSupportDualVideo = true;
   mSupportExtendedMakernote = false;
   mSupportFullColorRange = true;
   mSupportIPUAcceleration = false;

7.2.2 HDMI2CSI + HDMI2DSI unterstützen

7.2.2.1 Kernel-DTS-Konfiguration

Bei einer HDMI2CSI-+-HDMI2DSI-Kombination verbindet sich ein RK628 über das Kamera-Framework mit dem Host, während der andere RK628 mit der Anzeige verbunden ist. Das folgende Beispiel verwendet RK3399.

(1) HDMI2CSI-Konfiguration

Verwenden Sie rk628 -> mipi_phy_rx0 -> rkisp1_0 oder rk628 -> mipi_dphy_tx1rx1 -> rkisp1_1. Das Beispiel verbindet mit rkisp1_0.

&i2c1 {
   status = "okay";


   rk628_csi_v4l2: rk628_csi_v4l2@50 {
      compatible = "rockchip,rk628-csi-v4l2";
      reg = <0x50>;
      //clocks = <&ext_cam_clk>;
      //clock-names = "xvclk";

      interrupt-parent = <&gpio4>;
      interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
      pinctrl-names = "default";
      pinctrl-0 = <&rk628_irq>;
      //power-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;

      reset-gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>;
      plugin-det-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
      rockchip,camera-module-index = <0>;
      rockchip,camera-module-facing = "back";
      rockchip,camera-module-name = "RK628-CSI";
      rockchip,camera-module-lens-name = "NC";
      port {
         rk628_out: endpoint {
            remote-endpoint = <&hdmi2mipi_in>;
            data-lanes = <1 2 3 4>;
         };
      };

   };
};

&mipi_dphy_rx0 {
   status = "okay";

   ports {
      #address-cells = <1>;
      #size-cells = <0>;

      port@0 {
         reg = <0>;
         #address-cells = <1>;

         #size-cells = <0>;

         hdmi2mipi_in: endpoint@1 {
            reg = <1>;
            remote-endpoint = <&rk628_out>;
            data-lanes = <1 2 3 4>;
         };
      };

      port@1 {
         reg = <1>;
         #address-cells = <1>;

         #size-cells = <0>;

         dphy_rx0_out: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&isp0_mipi_in>;
         };
      };
   };
};

&rkisp1_0 {
   status = "okay";


   port {
      #address-cells = <1>;
      #size-cells = <0>;
      isp0_mipi_in: endpoint@0 {
         reg = <0>;

         remote-endpoint = <&dphy_rx0_out>;
      };
   };
};

(2) HDMI2DSI-Konfiguration

Siehe direkt die HDMI2DSI-Konvertierungskonfiguration in Abschnitt 2.4.5.

7.2.2.2 Android-Konfiguration

(1) HDMI2CSI: Folgen Sie der Konfiguration eines einzelnen RK628-HDMI2CSI-Pfads und konfigurieren Sie camera3_profiles.xml korrekt.

(2) HDMI2DSI: Auf Android-Seite ist keine Konfiguration erforderlich.

Dieses Thema entdecken → · Lernpfade →