Rockchip · AI & Linux Hub

Kameras und Video

Rockchip HDMI IN mit CameraHAL3: RK628D-Bridge, Konfiguration und Fehlersuche

RK628D-Treiber und CameraHAL3-Ablauf mit DTS, XML, EDID, APK-Integration und Protokollen sowie vollständigen Quellenbeispielen zur Bewertung einer ArmSoM-Anpassung.

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

Dies ist eine Rockchip-Plattformreferenz, keine auf ArmSoM-Hardware getestete Anleitung. Beispiele, Protokolle, Latenzwerte und Unterstützungsangaben stammen aus dem Originaldokument. Prüfen Sie vor einer Anpassung an ArmSoM den genauen SoC, die HDMI-Eingangsführung der Platine, Bridge-Chip und Verdrahtung, Takte und Stromversorgung, SDK/BSP, Kernel und Android-HAL. Eine Unterstützung aller Platinen darf daraus nicht abgeleitet werden. Es wurde ausschließlich eine chinesische PDF-Datei bereitgestellt. Englisch und Russisch übersetzen deren vollständigen technischen Haupttext; alle drei bisherigen Artikel verwenden die chinesischen Originalabbildungen. Auch die deutsche Fassung übernimmt diese Bilder aus dem englischen Artikel; Bildtext wird nicht als englisch ausgegeben. Code und Kommentare in der Quellsprache bleiben erhalten. Es wurden keine Flash-, Register-, Berechtigungs- oder SELinux-Befehle ausgeführt.

Technische Quellversion: V1.1.0. Das Original verwendet Beispiele mit RK628D und Android 9.0 und beschreibt Hotplug sowie adaptive Auflösungen 4KP30, 1080P60, 720P60, 576P50 und 480P60. Die Tabelle gibt den Geltungsbereich der Quelle wieder, keine Validierung jeder Kombination.

Chipplattform Kernel Android
RK3288 / RK3326 / RK3368 / RK3399 / RK3566 / RK3568 Linux 4.4 / 4.19 9.0 / 10.0 / 11.0

Redaktionelle Hinweise · ArmSoM-Dokumentation · Rockchip

1. HDMI-IN-Treibercode

1.1 Implementieren von HDMI IN mit RK628D

Blockdiagramm von RK AP und RK628D — chinesische PDF, S. 4

Blockdiagramm von RK AP und RK628D — chinesische PDF, S. 4

RK628D ist ein MFD-Gerät mit einem MFD-Treiber und Treibern für die einzelnen Schnittstellenmodule. Für HDMI IN wird RK628D HDMI RX zu MIPI CSI TX verwendet: RK628D wird wie ein Kameragerät behandelt, dessen Treiber im V4L2-Framework implementiert sind. Da dies vom DRM-Framework für die Anzeige abweicht, werden nur die Treiber COMBRXPHY und COMBTXPHY wiederverwendet; HDMI RX Controller, Post Process und MIPI CSI TX werden innerhalb von V4L2 neu implementiert.

Zugehöriger Treibercode:

drivers/mfd/rk628.c


drivers/gpu/drm/rockchip/rk628/rk628_combrxphy.c

drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c

drivers/media/i2c/rk628_csi.c

Kernelkonfiguration:

CONFIG_MFD_RK628=y

CONFIG_VIDEO_RK628_CSI=y


CONFIG_DRM_ROCKCHIP_RK628=y

1.2 Implementieren von HDMI IN mit anderen Bridge-Chips

Andere Bridge-Chips verwenden keinen MFD-Treiber, sondern implementieren I2C-Gerätetreiber direkt im V4L2-Framework. Beispiele sind TC358743, TC358749 und LT6911UXC.

Zugehöriger Treibercode:

drivers/media/i2c/tc35874x.c


drivers/media/i2c/lt6911uxc.c

Kernelkonfiguration:

CONFIG_VIDEO_TC35874X=y

CONFIG_VIDEO_LT6911UXC=y

2. HDMI-IN-Videoframework

Die HDMI-IN-Videoimplementierung stellt RK628D als MIPI-SoC-Kameragerät dar. Videodaten werden über das Kameraframework empfangen und von der APK angezeigt. Um die Anforderungen von HDMI-IN-Anwendungen zu erfüllen, kommen die HDMI-IN-Hotplug-Behandlung und eine automatische Anpassung an die Eingangsauflösung hinzu.

2.1 Ablauf der HDMI-IN-APK

APK-Ablauf — chinesische PDF, S. 6

APK-Ablauf — chinesische PDF, S. 6

2.2 Architektur des RK628D-Treibers

Beim RK628D-Treiber sind drei Hauptbereiche zu beachten: Initialisierung, Behandlung von Hotplug-Interrupts und Behandlung von Interrupts bei Auflösungsänderungen. Beachten Sie die folgenden Ablaufdiagramme.

Hotplug-Ablauf des Treibers — chinesische PDF, S. 8

Hotplug-Ablauf des Treibers — chinesische PDF, S. 8

Initialisierungsablauf des Treibers — chinesische PDF, S. 8

Initialisierungsablauf des Treibers — chinesische PDF, S. 8

Ablauf bei Auflösungsänderung — chinesische PDF, S. 9

Ablauf bei Auflösungsänderung — chinesische PDF, S. 9

3. Konfiguration

HDMI IN erfordert eine Aktualisierung des SDK mindestens auf die angegebene Version sowie eine Anpassung der Platinenkonfiguration an die tatsächlichen Hardwareverbindungen.

3.1 Anforderungen an den SDK-Code

Hinweis: Commit-IDs können abweichen.

Der Code unter kernel/ muss folgende Commits enthalten:

git log drivers/gpu/drm/rockchip/rk628/

RK628-DRM-Commitverlauf — chinesische PDF, S. 10

RK628-DRM-Commitverlauf — chinesische PDF, S. 10

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

wendingxian@ubuntu:~/rk3288_9.0_int/kernel$ git log drivers/gpu/drm/rockchip/rk628/
commit 2420e34afd4dbd0045e13222165b159bb62df151
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Wed Apr 21 10:19:19 2021 +0800

    drm: rockchip: rk628: the combrxphy cable mode wait for clk to stabilize

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

commit 403cf034772cd268eb6554f577d98462c007a90f
Author: Shunqing Chen <csq@rock-chips.com>
Date:   Wed Apr 7 09:10:10 2021 +0800

    drm: rockchip: rk628: post_process: recalculate dst clock

    Signed-off-by: Shunqing Chen <csq@rock-chips.com>
    Change-Id: I93388ba499f0d74c5f5c549decc83f3225ae1b82

commit 71d16a0f377366d398af6b4f2ea7f53b4fbaf91b
Author: Guochun Huang <hero.huang@rock-chips.com>
Date:   Thu Jan 7 16:15:30 2021 +0800

    drm/rockchip/rk628: fix no_connector found when find_connector_by_bridge

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

commit 744285a44b5bdf864cad77dd18450c8ec0a1129e
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Mon Dec 14 15:25:19 2020 +0800

    drm: rockchip: rk628: add rk628 combrx-phy support for HDMIRX cable mode

    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I4c02fb6add7cce5fef8a52853c35f113b53040ff
git log drivers/media/i2c/rk628_csi.c

Commits des RK628-CSI-Treibers — chinesische PDF, S. 11

Commits des RK628-CSI-Treibers — chinesische PDF, S. 11

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

wendingxian@ubuntu:~/rk3288_9.0_int/kernel$ git log drivers/media/i2c/rk628_csi.c
commit 57edf24f52778f6eafad004bc70bd1f71525a28c (HEAD -> develop-4.4)
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Wed Apr 28 16:25:13 2021 +0800

    media: i2c: rk628csi: upgrade the driver version to v0.0.3

    Modify RK628_CSI_PIXEL_RATE_LOW to 400M.

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

commit ed3d2ca11c2e0635b423d24977cdab6894e90400
Author: Shunhua Lan <lsh@rock-chips.com>
Date:   Sun Apr 25 18:48:28 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

commit 2ac8d31dbbcfa7cd0b43d20834cd31341c6da7be
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Wed Apr 21 15:14:20 2021 +0800

    media: i2c: rk628csi: upgrade the driver version to v0.0.2

    1.The hpd effective level can be configured to be inverted, when the hpd
    output circuit is reversed.

Der Code unter hardware/rockchip/camera/ muss folgenden Commit enthalten:

Commit zur CameraHAL-Konfiguration — chinesische PDF, S. 11

Commit zur CameraHAL-Konfiguration — chinesische PDF, S. 11

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

commit 4bd9632ed59261e8fc43057b7545cedcde2d927a
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Tue Apr 27 21:16:59 2021 +0800

    Add rk628 configuration for each platform

    include:
    camera3_profiles_rk3288.xml
    camera3_profiles_rk3326.xml
    camera3_profiles_rk3368.xml
    camera3_profiles_rk3399.xml
    camera3_profiles_rk3399pro.xml
    camera3_profiles_rk356x.xml

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

Der Code unter device/rockchip/common/ muss folgenden Commit enthalten:

Commit zu Geräteberechtigungen — chinesische PDF, S. 11

Commit zu Geräteberechtigungen — chinesische PDF, S. 11

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

commit 17112e1430b0f10a88b57c73ad19203e58f0eeff (HEAD -> mid_9.0, rk/rk
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

Der Code unter RKDocs/common/ muss folgenden Commit enthalten:

APK-Commit in RKDocs — chinesische PDF, S. 12

APK-Commit in RKDocs — chinesische PDF, S. 12

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

commit b1a130c7759b7f8588931acc82d5d9b88b38af45 (HEAD -> rk
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Fri May 7 17:27:12 2021 +0800

    add hdmi-in apk based on camerahal3

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

3.2 Platinenkonfiguration

Das SDK enthält eine DTS-Konfiguration für das RK3288-RK628D-EVB. Verwenden Sie folgende Datei als Referenz:

arch/arm/boot/dts/rk3288-evb-rk628-hdmi2csi-avb.dts

3.2.1 Funktionsmodule

RK628D HDMI IN benötigt COMBRXPHY, COMBTXPHY und CSI. Aktivieren Sie diese Module daher einzeln im DTS. Belassen Sie andere, nicht genannte Module auf ihren Standardwerten aus rk628.dtsi; sie müssen nicht aktiviert werden. Insbesondere gehören rk628_post_process, rk628_hdmi und rk628_hdmirx zu den RK628D-Anzeigepfaden und dürfen für diese HDMI-IN-Konfiguration nicht aktiviert werden.

&rk628_combrxphy {
      status = "okay";
};


&rk628_combtxphy {
      status = "okay";
};

&rk628_csi {
      status = "okay";
...

3.2.2 Hardwareverbindungen

RK628D ist ein I2C-Gerät und muss unter dem entsprechenden I2C-Bus angeordnet werden. Die wichtigsten Verbindungseinstellungen sind nachfolgend dargestellt:

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


      rk628: rk628@50 {
           reg = <0x50>;
           interrupt-parent = <&gpio7>;
           interrupts = <15 IRQ_TYPE_LEVEL_HIGH>;
           enable-gpios = <&gpio5 RK_PC2 GPIO_ACTIVE_HIGH>;
           reset-gpios = <&gpio7 RK_PB6 GPIO_ACTIVE_LOW>;
           status = "okay";
      };
};

reg: I2C-Adresse. Die typische 7-Bit-Adresse des RK628D ist 0x50. Bei mehreren RK628D-Geräten lassen sich ihre I2C-Adressen durch GPIO-Strapping ändern, wie nachfolgend dargestellt:

GPIO-Zuordnung der I2C-Slave-Adresse — chinesische PDF, S. 13

GPIO-Zuordnung der I2C-Slave-Adresse — chinesische PDF, S. 13

Die I2C-Adresse umfasst 7 Bits: Die oberen vier kennzeichnen das Gerät (4b’1010), die unteren drei bilden die Geräteadresse und lassen sich über GPIO programmieren. Die typische Slave-Adresse ist 7’b1010000. Der Bildtext verweist auf Tabelle 5-1, die Bildunterschrift nennt jedoch Tabelle 5-2; die ursprüngliche Zuordnung bleibt erhalten.

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

interrupt-parent / interrupts: Mit dem RK628D-Interruptsignal verbundener GPIO.

enable-gpios: GPIO zur Stromversorgungssteuerung des RK628D; kann entfallen, wenn die Versorgung ständig anliegt.

reset-gpios: GPIO zur Reset-Steuerung des RK628D.

Auch das Modul RK628_CSI benötigt Einstellungen für die Hardwareverbindungen:

&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>;
...

hpd-output-inverted: Invertiert den HPD-Ausgang. Aktivieren Sie diese Option, wenn die Schaltung den HPD-Ausgangspegel invertiert.

HPD-Schaltung — chinesische PDF, S. 14

HPD-Schaltung — chinesische PDF, S. 14

plugin-det-gpios: GPIO zur HDMI-Einsteckerkennung. Prüfen Sie, ob die Schaltung den Pegel invertiert, und konfigurieren Sie den aktiven Pegel korrekt.

Schaltung zur Einsteckerkennung — chinesische PDF, S. 14

Schaltung zur Einsteckerkennung — chinesische PDF, S. 14

power-gpios: GPIO zur Versorgungssteuerung der MIPI-RX-Stromdomäne des Rockchip-Hosts; kann entfallen, wenn die Versorgung ständig anliegt.

3.2.3 DTS-Konfiguration der Bildempfangspipeline

Behandeln Sie RK628D, TC35874x, LT6911 und ähnliche Bridges wie Kamerageräte. Wie Bildsensoren benötigen sie einen V4L2-basierten Treiber. Konfigurieren Sie die Datenpipeline auf dieselbe Weise wie für einen MIPI-SoC-Sensor.

RK3288-Beispiel: Pipeline 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 {
   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";
};

RK356x-Beispiel: Pipeline rk628 + isp2:

&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>;
      };
   };
};

&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 = <&hdmiin_out0>;

           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>;
      };
   };
};

RK356x-Beispiel: Pipeline rk628 + vicap:

&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>;
      };
   };
};

&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 = <&hdmiin_out0>;

            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>;
&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 = <&hdmiin_out0>;

           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";
};

3.3 Konfiguration von camera3_profiles.xml

camera3_profiles.xml entspricht der plattformspezifischen Datei im SDK:

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

Die wichtigsten Konfigurationsaspekte sind unten aufgeführt. Einzelheiten finden Sie im Konfigurationsverfahren für SoC-Sensoren.

name: Muss mit dem Treibernamen übereinstimmen; Groß-/Kleinschreibung wird unterschieden.

moduleId: Muss mit dem im DTS des Treibers konfigurierten Index übereinstimmen.

Kameraprofil-XML — chinesische PDF, S. 19

Kameraprofil-XML — chinesische PDF, S. 19

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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

Modulindex im DTS — chinesische PDF, S. 20

Modulindex im DTS — chinesische PDF, S. 20

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

&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: Konfigurieren Sie die vom Treiber unterstützten Auflösungen und die minimalen Bildintervalle korrekt. Wird dem Treiber eine neue Auflösung hinzugefügt, ergänzen Sie deren Konfiguration auch hier.

Auflösungen und Bilddauern im XML — chinesische PDF, S. 20

Auflösungen und Bilddauern im XML — chinesische PDF, S. 20

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

<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: Bilddrehwinkel; unterstützt werden 0, 90, 180 und 270.

Sensorausrichtung im XML — chinesische PDF, S. 21

Sensorausrichtung im XML — chinesische PDF, S. 21

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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

3.4 Empfangsfähigkeiten der verschiedenen Plattformen

Die maximalen Bildempfangsfähigkeiten unterscheiden sich aufgrund der unterschiedlichen ISP-/VICAP-Leistung der Plattformen. Beachten Sie folgende Tabelle aus der Quelle:

Chipplattform Empfänger Maximal unterstützte Auflösung
RK3288/RK3326/RK3368 isp 1920x1080P60
RK3399 isp 3840x2160P30 (ISP-Übertaktung erforderlich)
RK3566/RK3568 vicap/isp 3840x2160P30

3.4.1 Konfigurieren der ISP-Übertaktung auf RK3399

Konfigurieren Sie 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 RK3399-ISP-Frequenz 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[] = {

Konfigurieren Sie die ISP-Frequenz im Bridge-Chip-Treiber:

#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 schlägt auf die konfigurierte Frequenz weitere 25% Reserve auf. Setzen Sie daher im Treiber einen geeigneten Wert für RK628_CSI_PIXEL_RATE_HIGH.

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;
...
}

3.4.2 Konfigurieren des ISP zur Verwendung von CMA-Speicher

Beim Empfang von HDMI-IN-Bildern auf bestimmten Plattformen kann die tatsächliche Systemlast zu unzureichender Bandbreite führen. Mögliche Folgen sind verlorene Bilder oder fehlerhafter MIPI-Empfang. Ein Beispielprotokoll folgt:

[ 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 in diesem Fall die DDR-Frequenz. Hilft dies nicht, reservieren Sie CMA-Speicher für den ISP, um das Problem abzumildern:

Reservieren Sie in rockchip_defconfig 128 MB CMA-Speicher:

CONFIG_CMA=y
CONFIG_CMA_SIZE_MBYTES=128

Deaktivieren Sie die ISP-IOMMU im DTS, damit der ISP CMA-Speicher verwendet:

&isp_mmu {
      status = "disabled";

};

3.5 EDID-Konfiguration

RK628D unterstützt konfigurierbares EDID. Das EDID im Quelltreiber unterstützt folgende Auflösungen:

3840x2160P30, 1920x1080P60, 1920x1080P30, 1280x720P60, 720x576P50, 720x480P60.

Ändern Sie die unterstützten Auflösungen, indem Sie EDID direkt im Treibercode bearbeiten:

drivers/media/i2c/rk628_csi.c

static u8 edid_init_data[] = {

      0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
      0x52, 0x62, 0x01, 0x88, 0x00, 0x88, 0x88, 0x88,
      0x1C, 0x15, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,
      0x0A, 0x0D, 0xC9, 0xA0, 0x57, 0x47, 0x98, 0x27,
      0x12, 0x48, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x01,
      0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
      0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3A,
      0x80, 0x18, 0x71, 0x38, 0x2D, 0x40, 0x58, 0x2C,
      0x45, 0x00, 0xC4, 0x8E, 0x21, 0x00, 0x00, 0x1E,
      0x01, 0x1D, 0x00, 0x72, 0x51, 0xD0, 0x1E, 0x20,
      0x6E, 0x28, 0x55, 0x00, 0xC4, 0x8E, 0x21, 0x00,
      0x00, 0x1E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x54,
      0x37, 0x34, 0x39, 0x2D, 0x66, 0x48, 0x44, 0x37,

      0x32, 0x30, 0x0A, 0x20, 0x00, 0x00, 0x00, 0xFD,
      0x00, 0x14, 0x78, 0x01, 0xFF, 0x1D, 0x00, 0x0A,
      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x7B,

      0x02, 0x03, 0x1A, 0x71, 0x47, 0x5F, 0x90, 0x22,
   0x04, 0x11, 0x02, 0x01, 0x23, 0x09, 0x07, 0x01,
...

4. Anpassen der HDMI-IN-APK

4.1 Beziehen und Kompilieren des APK-Quellcodes

Der APK-Quellcode befindet sich im SDK-Verzeichnis:

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

Kopieren und entpacken Sie den Quellcode nach:

packages/apps/

Nehmen Sie für RK3288 unter device/rockchip/rk3288/ Änderungen entsprechend dem folgenden Beispiel vor, um die APK rkCamera2 in den Build aufzunehmen:

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 += \

4.2 Anpassen des APK-Quellcodes

Die APK greift mittels ioctl auf den RK628D-Geräteknoten zu, um den aktuellen Verbindungszustand und die Auflösung abzufragen. Der RK628D-Geräteknoten kann sich zwischen den Pipelines isp1, isp2 und vicap unterscheiden. Passen Sie den APK-Quellcode an die tatsächliche Konfiguration an. Die Debug-Befehlsbeispiele erläutern, wie der Knoten ermittelt wird.

rkCamera2/jni/native.cpp

C++-Beispiel zum Öffnen des Geräts — chinesische PDF, S. 25

C++-Beispiel zum Öffnen des Geräts — chinesische PDF, S. 25

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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);
    }
}

Der Code zum Abfragen des aktuellen Verbindungszustands und der Auflösung ist nachfolgend dargestellt:

C++-Signal-/Formatabfrage — chinesische PDF, S. 25

C++-Signal-/Formatabfrage — chinesische PDF, S. 25

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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. Der Screenshot zeigt den Wechsel in den permissiven Modus. Dies ist ein Debug-Verfahren der Quelle, keine Empfehlung, Schutzmechanismen im Produktivbetrieb zu deaktivieren.

SELinux-Debug-Beispiel — chinesische PDF, S. 25

SELinux-Debug-Beispiel — chinesische PDF, S. 25

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

rk3288:/ # getenforce
Enforcing
rk3288:/ # setenforce 0
rk3288:/ #
rk3288:/ # getenforce
Permissive

4.3 Vorbereitung der APK-Fehlersuche

Schließen Sie zuerst die Treiberprüfung gemäß dem entsprechenden Abschnitt ab. Prüfen Sie anschließend mit folgendem Befehl, ob das Kameragerät korrekt bei CameraHal registriert ist. Ist die Registrierung fehlerhaft, prüfen Sie camera3_profiles.xml wie im Konfigurationsabschnitt beschrieben.

Status des Kameradienstes — chinesische PDF, S. 26

Status des Kameradienstes — chinesische PDF, S. 26

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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)

5. Treiberfehlersuche

Prüfen Sie den Treiber wie einen SoC-Sensor. Für weitere Informationen verweist die Quelle auf folgendes Redmine-Dokument:

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

5.1 Beziehen der Debug-Werkzeuge

Benötigt werden media-ctl und v4l2-ctl. Das in der Quelle beschriebene SDK kopiert sie beim Kompilieren automatisch in die Firmware; sie befinden sich unter:

hardware/rockchip/camera/etc/tools/

Beziehen Sie die Werkzeuge bei älteren SDK-Versionen ü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.

5.2 Beispiele für Debug-Befehle

Das folgende Beispiel verwendet RK3288 + RK628D zum Empfang von 1920x1080P. Passen Sie die Befehle an die tatsächliche Konfiguration an.

Pipelinetopologie prüfen:

Führen Sie den Befehl zur Prüfung der Media-Knoten-Topologie aus. Je nach Plattform und Pipeline kann der Knoten /dev/media0 oder /dev/media1 sein.

media-ctl -d /dev/media0 –p

Der folgende RK628D-Auszug nennt /dev/v4l-subdev2 als Geräteknoten und 1920x1080 als erkannte HDMI-IN-Auflösung.

...
- 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]
...

Pipelineverbindungen konfigurieren:

Nach Reset und Systemstart sind die Verbindungen standardmäßig aktiviert. Durch Öffnen und anschließendes Beenden der HDMI-IN-APK werden sie getrennt. Stellen Sie sie nur dann erneut her, wenn [ENABLED] in der Topologieausgabe 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]'

Bilddatenstrom erfassen:

Resultierende Konfiguration prüfen:

media-ctl -d /dev/media0 –p

Bilddatenstrom erfassen:

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

--set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080

Erfassen Sie eine YUV-Bilddatei, übertragen Sie diese mit adb pull und prüfen Sie sie mit einem Werkzeug wie 7yuv:

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

--stream-to=/data/rk628_1920x1080.yuv --stream-poll

Bei normalem Empfang meldet die Ausgabe die Bildrate. Beispielprotokoll:

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. Fehlerbehebung

6.1 Aktivieren der Protokollierung

Aktivieren Sie die RK628D-Protokollierung mit folgendem Befehl und rufen Sie anschließend das Kernelprotokoll ab. Die Quelle schreibt den Protokollbefehl als demsg; prüfen Sie dmesg auf dem Zielsystem.

echo 1 > /sys/module/rk628_csi/parameters/debug

Um Protokolle ab dem Einschalten und Systemstart zu erfassen, empfiehlt die Quelle eine Codeänderung sowie das erneute Bauen und Flashen der betreffenden Kernelkomponenten:

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.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 = 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.2 Lesen und Schreiben von Registern

Die Register-Debug-Knoten des RK628 sind nachfolgend dargestellt. Im Beispiel ist RK628 an I2C1 unter der Adresse 0x51 angeschlossen.

rk3288:/ # ls -l /d/regmap/
total 0
drwxr-xr-x 2 root root 0 1970-01-01 00:00 0-001b

drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-combrxphy
drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-combtxphy
drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-cru
drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-csi
drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-grf
drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-hdmirx
drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-key_map
drwxr-xr-x 2 root root 0 1970-01-01 00:00 1-0051-rk628-pinctrl
drwxr-xr-x 2 root root 0 1970-01-01 00:00 2-001a
drwxr-xr-x 2 root root 0 1970-01-01 00:00 ff890000.i2s

drwxr-xr-x 2 root root 0 1970-01-01 00:00 ff96c000.video-phy

Registerknoten sind standardmäßig schreibgeschützt. Zur Aktivierung von Registerschreibzugriffen nennt die Quelle folgende Änderung:

diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-
debugfs.c
index 3f0a7e262d69..b819645edd84 100644

--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -259,7 +259,7 @@ static ssize_t regmap_map_read_file(struct file *file, char
__user *user_buf,
                         count, ppos);
 }

-#undef REGMAP_ALLOW_WRITE_DEBUGFS
+#define REGMAP_ALLOW_WRITE_DEBUGFS
 #ifdef REGMAP_ALLOW_WRITE_DEBUGFS
 /*
 * This can be dangerous especially when we have clients such as

Register lesen:

rk3288:/ # cat /d/regmap/1-0051-cru/registers
c0000: 00001063

c0004: 00001442
c0008: 00000000
c000c: 00000007
c0010: 00007f00
c0020: 00006010
c0024: 00000581
c0028: 00ef348b
c002c: 00000007
c0030: 00007f00
...

Ein Register schreiben:

rk3288:/ # echo 0x000 0xffffffff > /d/regmap/1-0051-grf/registers

6.3 MFD-Gerätefehler

RK628D ist ein MFD-Gerät. Unmittelbar nach dem Einschalten kann die Probe-Initialisierung untergeordneter Geräte wie COMBRXPHY mit -517 fehlschlagen, weil die des übergeordneten Geräts noch nicht abgeschlossen ist. Die Initialisierung wird wiederholt; diese anfänglichen Fehler sind daher unbedenklich, wenn die verzögerte Initialisierung anschließend erfolgreich ist.

MFD-Probe-Protokoll — chinesische PDF, S. 31

MFD-Probe-Protokoll — chinesische PDF, S. 31

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

0.950153] rk3x-i2c ff650000.i2c: Initialized RK3xxx I2C bus at e15c6000
0.951507] rk628 1-0051: GPIO lookup for consumer enable
0.951550] rk628 1-0051: using device tree for GPIO lookup
0.951677] rk628 1-0051: GPIO lookup for consumer reset
0.951696] rk628 1-0051: using device tree for GPIO lookup
0.998162] rk628-pinctrl rk628-pinctrl: bank->clk get error -517
0.998958] rk628-combrxphy rk628-combrxphy: failed to get pclk: -517
1.007020] rk628-hdmi rk628-hdmi: could not find pctldev for node /i2c@ff

1.008377] rk3x-i2c ff140000.i2c: Initialized RK3xxx I2C bus at e15c8000
1.009677] rk3x-i2c ff660000.i2c: Initialized RK3xxx I2C bus at e15ca000
1.010690] rk628-csi rk628-csi: could not find pctldev for node /i2c@ff14

6.4 Fehler bei Clk det

Erkennt COMBRXPHY kein Signal, kann ein falscher aktiver Pegel der HDMI-Einsteckerkennung oder von HPD die normale HDMI-Ausgabe der Quelle verhindern. Prüfen Sie plugin-det-gpios und hpd-output-inverted unter rk628_csi; der HPD-Pegel lässt sich auch mit einem Multimeter messen.

Fehler lösen Wiederholungen bis retry 2 aus. Funktioniert der Betrieb nach der Wiederholung normal, bewertet die Quelle das Signal als normal.

Protokoll wiederholter Takterkennung — chinesische PDF, S. 31

Protokoll wiederholter Takterkennung — chinesische PDF, S. 31

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

0_b_rk628-csi rk628-csi: tx_5v_power_present hdp det gpio val:0x1!
628-combrxphy rk628-combrxphy: rk628_combrxphy_power_on
628-combrxphy rk628-combrxphy: clk det over cnt:10, reg_0x6654:0x501f000
628-combrxphy rk628-combrxphy: clock detected failed, cfg resistance manual!
628-combrxphy rk628-combrxphy: error,clock error!
hy phy-rk628-combrxphy.4: phy poweron failed --> -22
0_b_rk628-csi rk628-csi: hdmi rxphy power on failed
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:1
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:2
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:3
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:4
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:5
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:6
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:7
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:8
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:9
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:10
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:11
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:12
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:13
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:14
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup read wxh:0x0, total:0x0, SCDC_REGS1:0x0, cnt:15
0_b_rk628-csi rk628-csi: rk628_hdmirx_phy_setup hdmi rxphy lock failed, retry:0
628-combrxphy rk628-combrxphy: rk628_combrxphy_power_on
628-combrxphy rk628-combrxphy: clock detected!

6.5 Feststellen, ob HDMI RX normal funktioniert

Sobald COMBRXPHY ordnungsgemäß einrastet, kann der HDMI-RX-Controller die Timings auswerten. Diese werden berechnet; daher können kleine Abweichungen auftreten, häufig um eine Einheit. Detaillierte Timingdefinitionen finden Sie in den CEA-Standarddokumenten.

Protokoll eines normalen HDMI-Timings — chinesische PDF, S. 31

Protokoll eines normalen HDMI-Timings — chinesische PDF, S. 31

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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.6 Berechtigungsfehler beim Öffnen eines Untergeräts

Fehlerprotokoll zu Geräteberechtigungen — chinesische PDF, S. 32

Fehlerprotokoll zu Geräteberechtigungen — chinesische PDF, S. 32

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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 take pic button
D RockchipCamera2: recreatTextureview
D RockchipCamera2: textureView remove
D RockchipCamera2: onResume

Prüfen Sie, ob /dev/v4l-subdev* die von der Quelle angegebenen Berechtigungen 666 besitzt. Abfrage über die Geräteshell:

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

Das in der Quelle beschriebene SDK enthält diesen Commit bereits. Fehlt er, verwenden Sie folgende Änderung unter device/rockchip/common/ als Referenz. Weitreichende Geräteberechtigungen erfordern vor dem Produktiveinsatz eine Sicherheitsprüfung.

ueventd-Berechtigungspatch — chinesische PDF, S. 32

ueventd-Berechtigungspatch — chinesische PDF, S. 32

Übertragung des im Screenshot sichtbaren Codes (die Quelle zeigt einen Bildausschnitt; abgeschnittene Inhalte werden nicht erfunden):

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

Dieses Thema entdecken → · Lernpfade →