Rockchip · AI & Linux Hub

Display und Audio

Rockchip-RGB/MCU-Entwicklerleitfaden: Pinzuordnung, Panels, SPI und Timing

Vollständige RGB-/MCU-Protokolle, Plattformunterstützung, Pinzuordnungen, Device Trees, Initialisierungssequenzen, Bildratenformeln und Frame-Schreib-/Lesezugriffe.

· ArmSoM-Redaktion · Rockchip-Quelldokumentation · 33 Min. Lesezeit

Dies ist eine Rockchip-RGB/MCU-Plattformreferenz. Die Unterstützungstabelle von V1.7.1 nennt RK1808, RK312X/PX3SE, RK3288, RK3308B/BS, RK3326/PX30, RK3506, RK3562, RK3568, RK3576, RV1103/1106, RV1109/RV1126 und RV1126B mit unterschiedlichen Fähigkeiten. Daraus folgt keine Unterstützung auf jedem ArmSoM-Board. Die SPI-/Panel-Konfiguration unterscheidet zwischen Kernel 4.19 und älter sowie 5.10 und neuer. Prüfen Sie SDK/BSP, herausgeführte Schnittstelle, Pinmultiplexing, Spannung und Panel-Timing des Boards. Eine Prüfung an ArmSoM-Hardware wurde nicht durchgeführt; Werte und Abbildungen der Quelle sind Plattformbeispiele.

Quelle: Rockchip_Developer_Guide_RGB_MCU_CN.pdf, V1.7.1, 34 Seiten. Nur die chinesische Quelle wurde bereitgestellt. Englisch, Russisch und diese deutsche Fassung übersetzen den vollständigen technischen Haupttext; alle Fassungen verwenden die chinesischen PDF-Abbildungen, ohne übersetzte Bildbeschriftungen vorzutäuschen.

Redaktionelle Hinweise · ArmSoM-Dokumentation · Rockchip

1. Grundlagen

1.1 RGB-Schnittstelle

RGB wird auch DPI (Display Pixel Interface) genannt. Es verwendet vier Synchronisationssignale: Vsync, Hsync, Den (Enable) und DCLK (Dotclk). Nach dem Synchronisationsverfahren werden DE- und SYNC-Modus unterschieden. Das RGB-Ausgabetiming von Rockchip kann beide unterstützen.

Timing im DE-Modus

Timing im DE-Modus

1.1.1 DE-Modus

Die Gültigkeit von DB[23:0] hängt ausschließlich von Den ab. Laut Quelle sind die Daten bei Low-Pegel gültig und andernfalls ungültig.

1.1.2 SYNC-Modus

Timing im SYNC-Modus

Timing im SYNC-Modus

Die Daten DB[23:0] werden durch Vsync und Hsync synchronisiert und entsprechend dem obigen Timing abgetastet.

1.2 MCU-Schnittstelle

MCU wird auch DBI oder 8080-Schnittstelle genannt. Es unterstützt bidirektionale Kommunikation zwischen TX und RX mit vier Synchronisationssignalen: RS (CSX), CSN (D/CX), WEN (WRX) und REN (RDX). Der einleitende Quellabsatz behauptet, Rockchip unterstütze nur MCU TX; die spätere Plattformtabelle nennt jedoch Leseunterstützung für RK3506 und RV1126B. Dieser Widerspruch bleibt zur Überprüfung erhalten.

1.2.1 Schreibtiming

MCU-Schreibtiming

MCU-Schreibtiming

CSX, D/CX und WRX werden nacheinander auf Low gesetzt. Während DB[23:0] gültig ist, wechselt WRX zuerst auf Low und dann auf High.

1.2.2 Lesetiming

MCU-Lesetiming und anfängliche Dummy-Daten

MCU-Lesetiming und anfängliche Dummy-Daten

CSX, D/CX und RDX werden nacheinander auf Low gesetzt. Während DB[23:0] gültig ist, wechselt RDX zuerst auf Low und dann auf High.

Vor dem Lesen wird die Registeradresse durch einen Schreibzugriff an das Panel übertragen.

Der erste Lesezugriff liefert ungültige Daten; gültige Daten beginnen mit dem zweiten Lesezugriff.

MCU-Lesezugriffe werden häufig zur Panel-Fehlersuche, zum Ermitteln von Panel-IDs für die Unterstützung mehrerer Panels und für die später beschriebene Frame-Lesefunktion verwendet.

1.2.3 Bypass- und Normalmodus

Der Bypass-Modus wird verwendet, wenn MCU und Panel Befehle durch Schreib-/Lesezugriffe austauschen.

Das Senden von Initialisierungs-/Deinitialisierungsbefehlen aus panel-init-sequence/panel-exit-sequence und Frame-Schreib-/Lesezugriffe gehören zum Bypass-Modus. Siehe die entsprechenden Abschnitte zur Softwarekonfiguration.

Im Normalmodus sendet der Host Bilddaten über MCU in den Panel-RAM für die normale Anzeige. Dieser Modus beginnt gewöhnlich nach Übertragung von panel-init-sequence und Bestätigung einer erfolgreichen Panel-Initialisierung.

Der Bypass-Modus kann Schreib- und Lesezugriffe umfassen; der Normalmodus umfasst ausschließlich Schreibzugriffe.

2. Unterstützung auf Rockchip-Plattformen

SoC-Plattform RGB-Unterstützung MCU-Unterstützung MCU-Leseunterstützung VOP-Version Video-Port-Pfad (VOP 2.0) Unterstützte Ausgabemodi
RK1808 Y Y N VOP 1.0   RGB666/RGB565
RK312X/PX3SE Y N N VOP 1.0   RGB888/RGB666/RGB565
RK3288 Y Y N VOP 1.0   RGB888/RGB666/RGB565/RGB3x8
RK3308B/RK3308BS Y Y N VOP 1.0   RGB888/RGB666/RGB565/RGB3x8
RK3326/PX30 Y Y N VOP 1.0   RGB888/RGB666/RGB565
RK3506 Y Y Y VOP 1.0   RGB888/RGB666/RGB565/RGB3x8/RGB3x6/RGB2x8
RK3562 Y Y N VOP 2.0 VP0 RGB888/RGB666/RGB565/RGB3x8
RK3568 Y N N VOP 2.0 VP2 RGB888/RGB666/RGB565
RK3576 Y Y N VOP 2.0 VP1/VP2 RGB888/RGB666/RGB565/RGB3x8/RGB3x6/RGB2x8
RV1103 Y Y N VOP 1.0   RGB3x8
RV1106 Y Y N VOP 1.0   RGB666/RGB565/RGB3x8
RV1109/RV1126 Y Y N VOP 1.0   RGB888/RGB666/RGB565/RGB3x8
RV1126B Y Y Y VOP 1.0   RGB888/RGB666/RGB565/RGB3x8/RGB3x6/RGB2x8

Zu VOP und VP (Video Port) siehe Rockchip_Developer_Guide_DRM_Display_Driver_CN.

3. Hardwareverbindungen

3.1 RK3562/RK3576/RK3506/RV1126B

Komponentenname Pinname RGB888 (MCU) RGB666 (MCU) RGB565 (MCU) RGB3x8 (MCU) RGB3x6 (MCU) RGB2x8 (MCU)
DCLK VO_LCDC_CLK DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS)
VSYNC VO_LCDC_VSYNC VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN)
HSYNC VO_LCDC_HSYNC HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN)
DEN VO_LCDC_DEN DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN)
R7_D23 VO_LCDC_D23 √ √ √ √ (D7_m1) √ (D5_m1) √ (D7_m1)
R6_D22 VO_LCDC_D22 √ √ √ √ (D6_m1) √ (D4_m1) √ (D6_m1)
R5_D21 VO_LCDC_D21 √ √ √ √ (D5_m1) √ (D3_m1) √ (D5_m1)
R4_D20 VO_LCDC_D20 √ √ √ √ (D4_m1) √ (D2_m1) √ (D4_m1)
R3_D19 VO_LCDC_D19 √ √ √ √ (D3_m1) √ (D1_m1) √ (D3_m1)
R2_D18 VO_LCDC_D18 √ √ × × × ×
R1_D17 VO_LCDC_D17 √ × × × × ×
R0_D16 VO_LCDC_D16 √ × × × × ×
G7_D15 VO_LCDC_D15 √ √ √ √ (D2_m1) √ (D0_m1) √ (D2_m1)
G6_D14 VO_LCDC_D14 √ √ √ √ (D1_m1) × √ (D1_m1)
G5_D13 VO_LCDC_D13 √ √ √ √ (D0_m1) × √ (D0_m1)
G4_D12 VO_LCDC_D12 √ √ √ √ (D7_m0) √ (D5_m0) √ (D7_m0)
G3_D11 VO_LCDC_D11 √ √ √ √ (D6_m0) √ (D4_m0) √ (D6_m0)
G2_D10 VO_LCDC_D10 √ √ √ √ (D5_m0) √ (D3_m0) √ (D5_m0)
G1_D9 VO_LCDC_D9 √ × × × × ×
G0_D8 VO_LCDC_D8 √ × × × × ×
B7_D7 VO_LCDC_D7 √ √ √ √ (D4_m0) √ (D2_m0) √ (D4_m0)
B6_D6 VO_LCDC_D6 √ √ √ √ (D3_m0) √ (D1_m0) √ (D3_m0)
B5_D5 VO_LCDC_D5 √ √ √ √ (D2_m0) √ (D0_m0) √ (D2_m0)
B4_D4 VO_LCDC_D4 √ √ √ √ (D1_m0) × √ (D1_m0)
B3_D3 VO_LCDC_D3 √ √ √ √ (D0_m0) × √ (D0_m0)
B2_D2 VO_LCDC_D2 √ √ × × × ×
B1_D1 VO_LCDC_D1 √ × × × × ×
B0_D0 VO_LCDC_D0 √ × × × × ×

3.2 RK3568

Komponentenname Pinname RGB888 RGB666 RGB565
DCLK LCDC_CLK DCLK DCLK DCLK
VSYNC LCDC_VSYNC VSYNC VSYNC VSYNC
HSYNC LCDC_HSYNC HSYNC HSYNC HSYNC
DEN LCDC_DEN DEN DEN DEN
R7_D23 LCDC_D23 √ √ √
R6_D22 LCDC_D22 √ √ √
R5_D21 LCDC_D21 √ √ √
R4_D20 LCDC_D20 √ √ √
R3_D19 LCDC_D19 √ √ √
R2_D18 LCDC_D18 √ √ ×
R1_D17 LCDC_D17 √ × ×
R0_D16 LCDC_D16 √ × ×
G7_D15 LCDC_D15 √ √ √
G6_D14 LCDC_D14 √ √ √
G5_D13 LCDC_D13 √ √ √
G4_D12 LCDC_D12 √ √ √
G3_D11 LCDC_D11 √ √ √
G2_D10 LCDC_D10 √ √ √
G1_D9 LCDC_D9 √ × ×
G0_D8 LCDC_D8 √ × ×
B7_D7 LCDC_D7 √ √ √
B6_D6 LCDC_D6 √ √ √
B5_D5 LCDC_D5 √ √ √
B4_D4 LCDC_D4 √ √ √
B3_D3 LCDC_D3 √ √ √
B2_D2 LCDC_D2 √ √ ×
B1_D1 LCDC_D1 √ × ×
B0_D0 LCDC_D0 √ × ×

3.3 RK312X/PX3SE/RK3288/RK3308B/RK3308BS/RK3328/RK3326/PX30/RV1109/RV1126

Komponentenname Pinname RGB888 (MCU) RGB666 (MCU) RGB666_CPADHI (MCU) RGB565 (MCU) RGB565_CPADHI (MCU) RGB3x8 (MCU)
DCLK LCDC_CLK/LCD_CLK DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS)
VSYNC LCDC_VSYNC/LCD_VSYNC VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN)
HSYNC LCDC_HSYNC/LCD_HSYNC HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN)
DEN LCDC_DEN/LCD_DEN DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN)
R7_D23 LCDC_D23/LCD_D23 √ × √ × √ ×
R6_D22 LCDC_D22/LCD_D22 √ × √ × √ ×
R5_D21 LCDC_D21/LCD_D21 √ × √ × √ ×
R4_D20 LCDC_D20/LCD_D20 √ × √ × √ ×
R3_D19 LCDC_D19/LCD_D19 √ × √ × √ ×
R2_D18 LCDC_D18/LCD_D18 √ × √ × × ×
R1_D17 LCDC_D17/LCD_D17 √ √ × × × ×
R0_D16 LCDC_D16/LCD_D16 √ √ × × × ×
G7_D15 LCDC_D15/LCD_D15 √ √ √ √ √ ×
G6_D14 LCDC_D14/LCD_D14 √ √ √ √ √ ×
G5_D13 LCDC_D13/LCD_D13 √ √ √ √ √ ×
G4_D12 LCDC_D12/LCD_D12 √ √ √ √ √ ×
G3_D11 LCDC_D11/LCD_D11 √ √ √ √ √ ×
G2_D10 LCDC_D10/LCD_D10 √ √ √ √ √ ×
G1_D9 LCDC_D9/LCD_D9 √ √ × √ × ×
G0_D8 LCDC_D8/LCD_D8 √ √ × √ × ×
B7_D7 LCDC_D7/LCD_D7 √ √ √ √ √ √
B6_D6 LCDC_D6/LCD_D6 √ √ √ √ √ √
B5_D5 LCDC_D5/LCD_D5 √ √ √ √ √ √
B4_D4 LCDC_D4/LCD_D4 √ √ √ √ √ √
B3_D3 LCDC_D3/LCD_D3 √ √ √ √ √ √
B2_D2 LCDC_D2/LCD_D2 √ √ √ √ × √
B1_D1 LCDC_D1/LCD_D1 √ √ × √ × √
B0_D0 LCDC_D0/LCD_D0 √ √ × √ × √

3.4 RK1808/RV1106

Komponentenname Pinname RGB666 (MCU) RGB565 (MCU) RGB565 (MCU) RGB3x8 (MCU)
DCLK LCDC_CLK/LCD_CLK DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS)
VSYNC LCDC_VSYNC/LCD_VSYNC VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN)
HSYNC LCDC_HSYNC/LCD_HSYNC HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN)
DEN LCDC_DEN/LCD_DEN DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN)
R5_D17 LCDC_D17/LCD_D17 √ × × ×
R4_D16 LCDC_D16/LCD_D16 √ × × ×
R3_D15 LCDC_D15/LCD_D15 √ √ √ ×
R2_D14 LCDC_D14/LCD_D14 √ √ √ ×
R1_D13 LCDC_D13/LCD_D13 √ √ √ ×
R0_D12 LCDC_D12/LCD_D12 √ √ √ ×
G5_D11 LCDC_D11/LCD_D11 √ √ √ ×
G4_D10 LCDC_D10/LCD_D10 √ √ √ ×
G3_D9 LCDC_D9/LCD_D9 √ √ √ ×
G2_D8 LCDC_D8/LCD_D8 √ √ √ ×
G1_D7 LCDC_D7/LCD_D7 √ √ √ √
G0_D6 LCDC_D6/LCD_D6 √ √ √ √
B5_D5 LCDC_D5/LCD_D5 √ √ √ √
B4_D4 LCDC_D4/LCD_D4 √ √ √ √
B3_D3 LCDC_D3/LCD_D3 √ √ √ √
B2_D2 LCDC_D2/LCD_D2 √ √ √ √
B1_D1 LCDC_D1/LCD_D1 √ √ √ √
B0_D0 LCDC_D0/LCD_D0 √ √ √ √

3.5 RV1103

Komponentenname Pinname RGB3x8 (MCU)
DCLK LCDC_CLK DCLK(RS)
VSYNC LCDC_VSYNC VSYNC(CSN)
HSYNC LCDC_HSYNC HSYNC(WRN)
DEN LCDC_DEN DEN(RDN)
D7 LCDC_D7 √
D6 LCDC_D6 √
D5 LCDC_D5 √
D4 LCDC_D4 √
D3 LCDC_D3 √
D2 LCDC_D2 √
D1 LCDC_D1 √
D0 LCDC_D0 √

3.6 RV1126B-P

RV1126B-P führt eine Datenzuordnung ein, um das Hardware-Verbindungsschema des bisherigen RV1126 beizubehalten. Unterschiedliche Datenzuordnungen leiten Daten an unterschiedliche Hardware-Pins.

Die vollständigen Definitionen der Datenzuordnungen stehen in include/dt-bindings/display/rockchip_vop.h:

/* mcu_data[23:0] */
#define ROCKCHIP_MCU_DATA_MAP_DATA_1x24 0
/*

 * { mcu_data[7:3], 3'b0, mcu_data[2:0], mcu_data[7:5], 2'b0, mcu_data[4:0], 3'b0 }
 * That is:
 *   LCDC_D23 -> MCU_D7_M1
 *   LCDC_D22 -> MCU_D6_M1
 *   LCDC_D21 -> MCU_D5_M1
 *   LCDC_D20 -> MCU_D4_M1
 *   LCDC_D19 -> MCU_D3_M1
 *   LCDC_D18 -> N/A
 *   LCDC_D17 -> N/A
 *   LCDC_D16 -> N/A
 *   LCDC_D15 -> MCU_D2_M1
 *   LCDC_D14 -> MCU_D1_M1

 *   LCDC_D13 -> MCU_D0_M1
 *   LCDC_D12 -> MCU_D7_M0
 *   LCDC_D11 -> MCU_D6_M0
 *   LCDC_D10 -> MCU_D5_M0
 *   LCDC_D9 -> N/A

 *   LCDC_D8 -> N/A
 *   LCDC_D7 -> MCU_D4_M0
 *   LCDC_D6 -> MCU_D3_M0
 *   LCDC_D5 -> MCU_D2_M0
 *   LCDC_D4 -> MCU_D1_M0
 *   LCDC_D3 -> MCU_D0_M0
 *   LCDC_D2 -> N/A
 *   LCDC_D1 -> N/A
 *   LCDC_D0 -> N/A
 */
#define ROCKCHIP_MCU_DATA_MAP_DATA_WITH_DUMMY_0 1

Beim Standard-RV1126B entsprechen die folgenden MCU-Standardverbindungen ROCKCHIP_MCU_DATA_MAP_DATA_WITH_DUMMY_0.

Komponentenname Pinname RGB888 (MCU) RGB666 (MCU) RGB565 (MCU) RGB3x8 (MCU) RGB3x6 (MCU) RGB2x8 (MCU)
DCLK VO_LCDC_CLK DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS)
VSYNC VO_LCDC_VSYNC VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN)
HSYNC VO_LCDC_HSYNC HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN)
DEN VO_LCDC_DEN DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN)
R7_D23 VO_LCDC_D23 √ √ √ √ (D7_m1) √ (D5_m1) √ (D7_m1)
R6_D22 VO_LCDC_D22 √ √ √ √ (D6_m1) √ (D4_m1) √ (D6_m1)
R5_D21 VO_LCDC_D21 √ √ √ √ (D5_m1) √ (D3_m1) √ (D5_m1)
R4_D20 VO_LCDC_D20 √ √ √ √ (D4_m1) √ (D2_m1) √ (D4_m1)
R3_D19 VO_LCDC_D19 √ √ √ √ (D3_m1) √ (D1_m1) √ (D3_m1)
R2_D18 VO_LCDC_D18 √ √ × × × ×
R1_D17 VO_LCDC_D17 √ × × × × ×
R0_D16 VO_LCDC_D16 √ × × × × ×
G7_D15 VO_LCDC_D15 √ √ √ √ (D2_m1) √ (D0_m1) √ (D2_m1)
G6_D14 VO_LCDC_D14 √ √ √ √ (D1_m1) × √ (D1_m1)
G5_D13 VO_LCDC_D13 √ √ √ √ (D0_m1) × √ (D0_m1)
G4_D12 VO_LCDC_D12 √ √ √ √ (D7_m0) √ (D5_m0) √ (D7_m0)
G3_D11 VO_LCDC_D11 √ √ √ √ (D6_m0) √ (D4_m0) √ (D6_m0)
G2_D10 VO_LCDC_D10 √ √ √ √ (D5_m0) √ (D3_m0) √ (D5_m0)
G1_D9 VO_LCDC_D9 √ × × × × ×
G0_D8 VO_LCDC_D8 √ × × × × ×
B7_D7 VO_LCDC_D7 √ √ √ √ (D4_m0) √ (D2_m0) √ (D4_m0)
B6_D6 VO_LCDC_D6 √ √ √ √ (D3_m0) √ (D1_m0) √ (D3_m0)
B5_D5 VO_LCDC_D5 √ √ √ √ (D2_m0) √ (D0_m0) √ (D2_m0)
B4_D4 VO_LCDC_D4 √ √ √ √ (D1_m0) × √ (D1_m0)
B3_D3 VO_LCDC_D3 √ √ √ √ (D0_m0) × √ (D0_m0)
B2_D2 VO_LCDC_D2 √ √ × × × ×
B1_D1 VO_LCDC_D1 √ × × × × ×
B0_D0 VO_LCDC_D0 √ × × × × ×

RV1126B-P verwendet ROCKCHIP_MCU_DATA_MAP_DATA_1x24, damit die MCU-Hardwareausgabe dem bisherigen RV1126 entspricht. Die Verbindungen sind nachfolgend dargestellt:

Komponentenname Pinname RGB888 (MCU) RGB666 (MCU) RGB666_CPADHI (MCU) RGB565 (MCU) RGB565_CPADHI (MCU) RGB3x8 (MCU)
DCLK LCDC_CLK/LCD_CLK DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS) DCLK(RS)
VSYNC LCDC_VSYNC/LCD_VSYNC VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN) VSYNC(CSN)
HSYNC LCDC_HSYNC/LCD_HSYNC HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN) HSYNC(WRN)
DEN LCDC_DEN/LCD_DEN DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN) DEN(RDN)
R7_D23 LCDC_D23/LCD_D23 √ × √ × √ ×
R6_D22 LCDC_D22/LCD_D22 √ × √ × √ ×
R5_D21 LCDC_D21/LCD_D21 √ × √ × √ ×
R4_D20 LCDC_D20/LCD_D20 √ × √ × √ ×
R3_D19 LCDC_D19/LCD_D19 √ × √ × √ ×
R2_D18 LCDC_D18/LCD_D18 √ × √ × × ×
R1_D17 LCDC_D17/LCD_D17 √ √ × × × ×
R0_D16 LCDC_D16/LCD_D16 √ √ × × × ×
G7_D15 LCDC_D15/LCD_D15 √ √ √ √ √ ×
G6_D14 LCDC_D14/LCD_D14 √ √ √ √ √ ×
G5_D13 LCDC_D13/LCD_D13 √ √ √ √ √ ×
G4_D12 LCDC_D12/LCD_D12 √ √ √ √ √ ×
G3_D11 LCDC_D11/LCD_D11 √ √ √ √ √ ×
G2_D10 LCDC_D10/LCD_D10 √ √ √ √ √ ×
G1_D9 LCDC_D9/LCD_D9 √ √ × √ × ×
G0_D8 LCDC_D8/LCD_D8 √ √ × √ × ×
B7_D7 LCDC_D7/LCD_D7 √ √ √ √ √ √
B6_D6 LCDC_D6/LCD_D6 √ √ √ √ √ √
B5_D5 LCDC_D5/LCD_D5 √ √ √ √ √ √
B4_D4 LCDC_D4/LCD_D4 √ √ √ √ √ √
B3_D3 LCDC_D3/LCD_D3 √ √ √ √ √ √
B2_D2 LCDC_D2/LCD_D2 √ √ √ √ × √
B1_D1 LCDC_D1/LCD_D1 √ √ × √ × √
B0_D0 LCDC_D0/LCD_D0 √ √ × √ × √

Normalerweise benötigen weder RV1126B noch RV1126B-P eine zusätzliche Konfiguration. Falls Änderungen nötig sind, können sie in DTS angegeben werden.

Das folgende Beispiel konfiguriert RV1126B für die bisherigen RV1126-Hardwareverbindungen. Beim RV1126B-P ist dies bereits die Standardeinstellung.

&rgb {
   /*

   * RV1126 compatible pin output mode 0.
   * MCU: ROCKCHIP_MCU_DATA_MAP_DATA_1x24
   */
   rockchip,data-map-mode = <0>;
};

4. Softwarekonfiguration

4.1 Anzeigepfade

RGB-/MCU-Pfade für VOP 1.0/2.0

RGB-/MCU-Pfade für VOP 1.0/2.0

VOP (Video Output Process) ist Rockchips Anzeigeverarbeitungseinheit. VOP 1.0 und VOP 2.0 unterscheiden sich hauptsächlich in der Mehrdisplay-Unterstützung; siehe Rockchip_Developer_Guide_DRM_Display_Driver_CN. Die linke und rechte Abbildung zeigen die RGB-/MCU-Pfade für VOP 1.0 bzw. VOP 2.0. VOP liest und verarbeitet Bilddaten aus DDR und sendet sie an RGB/MCU. Die Schnittstelle wandelt das Bild in einen protokollkonformen Datenstrom um und überträgt ihn an das Panel.

4.2 Panel-Konfiguration

Der RGB-Panel-Treiber steht in drivers/gpu/drm/panel/panel-simple.c. Ein typischer Panel-Knoten lautet:

/ {
   panel: panel {

      compatible = "simple-panel";
      bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
      backlight = <&backlight>;
      enable-gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>;
      enable-delay-ms = <20>;
      reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
      reset-delay-ms = <10>;
      status = "okay";

      display-timings {

         native-mode = <&fx070_dhm11boe_timing>;

         fx070_dhm11boe_timing: timing0 {
           clock-frequency = <50000000>;
           hactive = <1024>;
           vactive = <600>;
           hback-porch = <140>;
           hfront-porch = <160>;
           vback-porch = <20>;
           vfront-porch = <20>;
           hsync-len = <20>;
           vsync-len = <2>;

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

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

};

&backlight {
   pwms = <&pwm9 0 25000 0>;
   status = "okay";
};

Setzen Sie bus-format entsprechend dem Anzeigemodus des Panels, normalerweise ermittelt aus den Pin-Definitionen im Datenblatt und den vom Treiber-IC unterstützten Anzeigemodi. DTS-Makros sind in include/uapi/linux/media-bus-format.h definiert. Ihre Hardwarezuordnungen lauten:

Anzeigemodus Busformat Takte pro Pixel
RGB888 (24bit) MEDIA_BUS_FMT_RGB888_1X24 1
RGB666 (18bit) MEDIA_BUS_FMT_RGB666_1X18 1
RGB666_CPADHI (18bit) MEDIA_BUS_FMT_RGB666_1X24_CPADHI 1
RGB565 (16bit) MEDIA_BUS_FMT_RGB565_1X16 1
RGB565_CPADHI (16bit) MEDIA_BUS_FMT_RGB565_1X24_CPADHI 1
RGB3x8 (8bit) MEDIA_BUS_FMT_RGB888_3X8 MEDIA_BUS_FMT_RGB888_3X8 3
RGB4x8(8bit) MEDIA_BUS_FMT_RGB888_DUMMY_4X8 MEDIA_BUS_FMT_BGR888_DUMMY_4X8 4

Passen Sie die pwms-Konfiguration des backlight-Knotens an die tatsächliche Verdrahtung an. Stellen Sie sicher, dass die Hintergrundbeleuchtung vor der Bildanzeige eingeschaltet ist. Siehe Rockchip_Developer_Guide_Linux_PWM_CN.

Konfigurieren Sie enable-gpios/reset-gpios und enable-delay-ms/reset-delay-ms/prepare-delay-ms/unprepare-delay-ms/disable-delay-ms entsprechend den Stromversorgungs-/Reset-Timinganforderungen des Panels und der tatsächlichen Schaltung.

Optional: enable steuert normalerweise die Panel-Stromversorgung. Die GPIO-Konfiguration hängt von der Versorgungsschaltung ab.

Optional: Das Panel führt üblicherweise einen Reset-Pin heraus und beschreibt die Reset-Bedingungen im Datenblatt. Die GPIO-Konfiguration hängt von der Reset-Schaltung ab.

Optional: Konfigurieren Sie enable-delay-ms/reset-delay-ms/prepare-delay-ms/unprepare-delay-ms/disable-delay-ms nach dem Versorgungs-, Reset- und Signaltiming des Datenblatts.

Das Panel-Datenblatt empfiehlt Werte für display-timings. Diese dürfen innerhalb der angegebenen Minimal-/Maximalgrenzen an die Anwendung angepasst werden. Das folgende Datenblatt gehört zum Beispiel-Panel-Knoten:

Original-Timingtabelle des Beispielpanels

Original-Timingtabelle des Beispielpanels

Modus Parameter Symbol Min Typ Max Einheit Hinweis
DE Pixeltakt 1/tCLK 45 51.2 57 MHz  
DE DCLK-Tastgrad Tcwh 40 50 60 %  
DE Horizontale Gesamtdauer tH 1324 1344 1364 tCLK  
DE Horizontaler aktiver Bereich tHA   1024   tCLK  
DE Horizontale Austastung tHB 300 320 340 tCLK  
DE Vertikale Gesamtdauer tV 625 635 645 tH  
DE Vertikaler aktiver Bereich tVA   600   tH  
DE Vertikale Austastung tVB 25 35 45 tH  
SYNC Horizontale Gesamtdauer TH 1324 1344 1364 tCLK  
SYNC Horizontale Pulsbreite Thpw   20 - tCLK thb + thpw = 160DCLK (fest)
SYNC Horizontale hintere Schwarzschulter Thb   140 - tCLK thb + thpw = 160DCLK (fest)
SYNC Horizontale vordere Schwarzschulter Thfp 140 160 180 tCLK  
SYNC Horizontaler aktiver Bereich THA   1024   tCLK  
SYNC Vertikale Gesamtdauer TV 625 635 645 th  
SYNC Vertikale Pulsbreite Tvpw   3 - th tvpw + tvb = 23th (fest)
SYNC Vertikale hintere Schwarzschulter Tvb - 20 - th tvpw + tvb = 23th (fest)
SYNC Vertikale vordere Schwarzschulter Tvfp 2 12 22 th  
SYNC Vertikaler gültiger Bereich Tvd   600   th  

Die DRM-Struktur display_timing und die Beschreibungen ihrer Mitglieder stehen in include/video/display_timing.h:

/*
 * Single "mode" entry. This describes one set of signal timings a display can
 * have in one setting. This struct can later be converted to struct videomode

 * (see include/video/videomode.h). As each timing_entry can be defined as a
 * range, one struct display_timing may become multiple struct videomodes.
 *
 * Example: hsync active high, vsync active low
 *
 *            Active Video
 * Video ______________________XXXXXXXXXXXXXXXXXXXXXX_____________________
 *  |<- sync ->|<- back ->|<----- active ----->|<- front ->|<- sync..
 *  |    |  porch |        |  porch |
 *
 * HSync _|¯¯¯¯¯¯¯¯¯¯|___________________________________________|¯¯¯¯¯¯¯¯¯
 *

 * VSync ¯|__________|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|_________
 */
struct display_timing {
   struct timing_entry pixelclock;

   struct timing_entry hactive; /* hor. active video */
   struct timing_entry hfront_porch; /* hor. front porch */
   struct timing_entry hback_porch; /* hor. back porch */
   struct timing_entry hsync_len; /* hor. sync len */

   struct timing_entry vactive; /* ver. active video */
   struct timing_entry vfront_porch; /* ver. front porch */
   struct timing_entry vback_porch; /* ver. back porch */

   struct timing_entry vsync_len; /* ver. sync len */

   enum display_flags flags; /* display flags */
};

Bei RGB/MCU bestimmt clock-frequency in display-timings die VOP-Ausgabebildrate. Zur Berechnung dienen die DRM-Timingwerte htotal und vtotal. Nachfolgend ein Auszug; Details stehen in include/drm/drm_modes.h.

Die Bildratenberechnung implementiert drm_mode_vrefresh() in drivers/gpu/drm/drm_modes.c. Mit fr als Bildrate lautet die Formel:

fr = clock / (htotal * vtotal)
/**
 * struct drm_display_mode - DRM kernel-internal display mode structure

 * @hdisplay: horizontal display size
 * @hsync_start: horizontal sync start
 * @hsync_end: horizontal sync end
 * @htotal: horizontal total size
 * @hskew: horizontal skew?!
 * @vdisplay: vertical display size
 * @vsync_start: vertical sync start
 * @vsync_end: vertical sync end
 * @vtotal: vertical total size
 * @vscan: vertical scan?!
......
 *

 * The horizontal and vertical timings are defined per the following diagram.
 *
 * ::
 *
 *
 *          Active           Front      Sync       Back
 *         Region           Porch                  Porch
 *   <-----------------------><----------------><-------------><-------------->
 *    //////////////////////|
 *    ////////////////////// |
 *   ////////////////////// |.................. ................
 *                                  _______________

 *   <----- [hv]display ----->
 *   <------------- [hv]sync_start ------------>
 *   <--------------------- [hv]sync_end --------------------->
 *   <-------------------------------- [hv]total ----------------------------->*
 *
......
 */

/**
 * drm_mode_vrefresh - get the vrefresh of a mode
 * @mode: mode
 *
 * Returns:

 * @modes's vrefresh rate in Hz, rounded to the nearest integer. Calculates the
 * value first if it is not yet set.
 */
int drm_mode_vrefresh(const struct drm_display_mode *mode)
{
   unsigned int num, den;

   if (mode->htotal == 0 || mode->vtotal == 0)
      return 0;

   num = mode->clock;
   den = mode->htotal * mode->vtotal;


   if (mode->flags & DRM_MODE_FLAG_INTERLACE)
      num *= 2;
   if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
      den *= 2;
   if (mode->vscan > 1)
      den *= mode->vscan;

   return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(num, 1000), den);
}
EXPORT_SYMBOL(drm_mode_vrefresh);

4.2.1 SPI-Initialisierung

Manche RGB-Panels benötigen Initialisierungsbefehle über SPI. drivers/gpu/drm/panel/panel-simple.c unterstützt das serielle Dreidrahtprotokoll mit 9 Bit:

Dreidraht-SPI-Initialisierungsprotokoll mit 9 Bit

Dreidraht-SPI-Initialisierungsprotokoll mit 9 Bit

Rockchips SPI-Hardware unterstützt Übertragungseinheiten von 4/8/16 Bit, dieses Protokoll verwendet jedoch 9 Bit. Deshalb implementiert panel-simple SPI durch GPIO-Bit-Banging.

Typische Konfiguration für Kernel 5.10 und neuer:

spi_gpio: spi-gpio {
   compatible = "spi-gpio";

   #address-cells = <0x1>;
   #size-cells = <0x0>;
   pinctrl-names = "default";
   pinctrl-0 = <&spi_gpio_pins>;
   spi-delay-us = <10>;
   status = "okay";

   sck-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
   miso-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
   mosi-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
   cs-gpios = <&gpio4 RK_PA4 GPIO_ACTIVE_HIGH>;
   num-chipselects = <1>;


   /*
   * 320x480 RGB/MCU screen K350C4516T
   */
   panel: panel {
      compatible = "simple-panel-spi";
      reg = <0>;
      bus-format = <MEDIA_BUS_FMT_RGB666_1X18>;
      backlight = <&backlight>;
      enable-gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>;
      enable-delay-ms = <20>;
      reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
      reset-delay-ms = <10>;

      prepare-delay-ms = <20>;
      unprepare-delay-ms = <20>;
      disable-delay-ms = <20>;
      init-delay-ms = <10>;
      width-mm = <217>;
      height-mm = <136>;
      rockchip,cmd-type = "spi";

      status = "okay";

      // type:0 is cmd, 1 is data
      panel-init-sequence = [
         /* type delay num val1 val2 val3 */
         00 00 01 e0
         01 00 01 00
         ......
         00 78 01 11
         00 00 01 29
      ];


      panel-exit-sequence = [
         //type delay num val1 val2 val3
         00 0a 01 28
         00 78 01 10
      ];

      display-timings {
         native-mode = <&kd050fwfba002_timing>;

         kd050fwfba002_timing: timing0 {
           /*
            * 10453500 for RGB666(18bit)
            */

           clock-frequency = <10453500>;
           hactive = <320>;
           vactive = <480>;
           hback-porch = <10>;
           hfront-porch = <5>;
           vback-porch = <10>;
           vfront-porch = <5>;
           hsync-len = <10>;
           vsync-len = <10>;
           hsync-active = <0>;
           vsync-active = <0>;
           de-active = <0>;

           pixelclk-active = <1>;
         };
      };

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

Aktivieren Sie CONFIG_SPI_GPIO und konfigurieren Sie sck-gpios, miso-gpios, mosi-gpios sowie

cs-gpios entsprechend der Hardware; siehe drivers/spi/spi-gpio.c. Der Panel-Knoten entspricht im Wesentlichen dem obigen, mit folgenden Besonderheiten:

Ändern Sie compatible in “simple-panel-spi”.

Setzen Sie rockchip,cmd-type auf “spi”.

Tragen Sie in panel-init-sequence/panel-exit-sequence die passenden Initialisierungs-/Deinitialisierungssequenzen ein.

Bei Kernel 4.19 und älter emuliert simple-panel SPI RGB SDI/SCL/CS direkt über GPIO, ohne zusätzlichen SPI-Treiber. SDI wird tatsächlich nicht unterstützt: Die als SDI bezeichnete DTS-Eigenschaft meint Hardware-SDO; dies ist ein Tippfehler der frühen Version. Beispiel:

panel: panel {
   compatible = "simple-panel";

   ......
   spi-sdi-gpios = <&gpio1 RK_PC7 GPIO_ACTIVE_HIGH>;
   spi-scl-gpios = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
   spi-cs-gpios = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
   ......
   rockchip,cmd-type = "spi";

   /* type:0 is cmd, 1 is data */
   panel-init-sequence = [
      /* type delay num val1 val2 val3 */
       00  00 01 e0
       ......
       00  78 01 11

       00  00 01 29
   ];

   panel-exit-sequence = [
      /* type delay num val1 val2 val3 */
      00 0a 01 28
      00 78 01 10
   ];
   ......
};

SPI-RGB-Referenzkonfigurationen nach Kernel-Version:

Kernel 4.19 und älter: arch/arm64/boot/dts/rockchip/rk3308-evb-ext-v10.dtsi

Kernel 5.10 und neuer: arch/arm64/boot/dts/rockchip/rk3562-evb1-lp4x-v10-rgb-k350c4516t.dts

4.3 RGB-Schnittstelle

Der RGB-Treiber ist drivers/gpu/drm/rockchip/rockchip_rgb.c. DTS-Referenzkonfiguration:

&rgb {
   status = "okay";

   pinctrl-0 = <&rgb666_pins>;
   ports {
      port@1 {
         reg = <1>;


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

//VOP 1.0
&rgb_in_vop {
   status = "okay";
};


//VOP 2.0
&rgb_in_vp0 {
   status = "okay";
};

Die RGB-Knotenkonfiguration unterscheidet sich zwischen VOP 1.0 und VOP 2.0. Referenzkonfigurationen:

VOP 1.0: arch/arm/boot/dts/rv1106-evb-ext-rgb-v10.dtsi.

VOP 2.0: arch/arm64/boot/dts/rockchip/rk3562-evb1-lp4x-v10-rgb-FX070-DHM11BOE-A.dts.

Wählen Sie pinctrl entsprechend den tatsächlichen Hardwareverbindungen. Definitionen der Pinreihenfolge stehen in rkxxxx-pinctrl.dtsi/rvxxxx-pinctrl.dtsi.

4.4 MCU-Schnittstelle

MCU-Schnittstellen- und MCU-Panel-Treiber stehen in drivers/gpu/drm/rockchip/rockchip_rgb.c. DTS entspricht im Wesentlichen RGB, ergänzt um MCU-Modusauswahl und Timing. Referenzkonfiguration:

&rgb {
   status = "okay";

   rockchip,data-sync-bypass;
   pinctrl-names = "default";
   /*
   * rgb3x8_pins_m0/rgb3x8_pins_m1 for RGB3x8(8bit)
   * rgb565_pins for RGB565(16bit)
   */
   pinctrl-0 = <&rgb565_pins>;

   /*
   * 320x480 RGB/MCU screen K350C4516T
   */
   mcu_panel: mcu-panel {
      /*

      * MEDIA_BUS_FMT_RGB888_3X8 for RGB3x8(8bit)
       * MEDIA_BUS_FMT_RGB565_1X16 for RGB565(16bit)
       */
      bus-format = <MEDIA_BUS_FMT_RGB565_1X16>;

      backlight = <&backlight>;
      enable-gpios = <&gpio1 RK_PA3 GPIO_ACTIVE_LOW>;
      enable-delay-ms = <20>;
      reset-gpios = <&gpio1 RK_PA4 GPIO_ACTIVE_LOW>;
      reset-value = <0>;
      reset-delay-ms = <10>;
      prepare-delay-ms = <20>;
      unprepare-delay-ms = <20>;
      disable-delay-ms = <20>;
      init-delay-ms = <10>;
      width-mm = <217>;
      height-mm = <136>;


      // type:0 is cmd, 1 is data
      panel-init-sequence = [
         //type delay num val1 val2 val3
          ......
          01  00 01 55 /*
                       * interface pixel format:
                       * 66 for RGB3x8(8bit)
                       * 55 for RGB565(16bit)
                       */
          ......
          01  00 01 a0 /*
                       * frame rate control:

                       * 70 (45hz) for RGB3x8(8bit)
                       * a0 (60hz) for RGB565(16bit)
                       */
          ......
          01  00 01 02 /*
                       * display function control:
                       * 32 for RGB
                       * 02 for MCU
                       */
          00  78 01 11
          00  32 01 29
          00  00 01 2c

      ];

      panel-exit-sequence = [
         //type delay num val1 val2 val3
          00  0a 01 28
          00  78 01 10
      ];

      display-timings {
         native-mode = <&kd050fwfba002_timing>;

         kd050fwfba002_timing: timing0 {
            /*
             * 7840125 for frame rate 45Hz
             * 10453500 for frame rate 60Hz
             */

            clock-frequency = <10453500>;
            hactive = <320>;
            vactive = <480>;
            hback-porch = <10>;
            hfront-porch = <5>;
            vback-porch = <10>;
            vfront-porch = <5>;
            hsync-len = <10>;
            vsync-len = <10>;
            hsync-active = <0>;
            vsync-active = <0>;
            de-active = <0>;

            pixelclk-active = <1>;
         };
      };

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

      ports {
         rgb_out: port@1 {

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

            rgb_out_panel: endpoint@0 {
               reg = <0>;
               remote-endpoint = <&panel_in_rgb>;
            };
         };
      };
   };
};


//VOP 1.0
&rgb_in_vop {
   status = "okay";
};

&vop {
   status = "okay";

   /*
    * Default config is as follows:
    *
    * mcu-pix-total = <9>;
   * mcu-cs-pst = <1>;
   * mcu-cs-pend = <8>;
   * mcu-rw-pst = <2>;

   * mcu-rw-pend = <5>;
   * mcu-hold-mode = <0>; // default set to 0
   *
   * To increase the frame rate, reduce all parameters because
   * the max dclk rate of mcu is 150M in rv1103/rv1106.
   */
   mcu-timing {
      mcu-pix-total = <5>;
      mcu-cs-pst = <1>;
      mcu-cs-pend = <4>;
      mcu-rw-pst = <2>;
      mcu-rw-pend = <3>;


      mcu-hold-mode = <0>; // default set to 0
   };
};

//VOP 2.0
&rgb_in_vp0 {
   status = "okay";
};

&vp0 {
   status = "okay";


   /*
   * Default config is as follows:
   *
   * mcu-pix-total = <9>;
   * mcu-cs-pst = <1>;
   * mcu-cs-pend = <8>;
   * mcu-rw-pst = <2>;
   * mcu-rw-pend = <5>;
   * mcu-hold-mode = <0>; // default set to 0
   *
   * To increase the frame rate, reduce all parameters because
   * the max dclk rate of mcu is 150M in rk3562.

   */
   mcu-timing {
      mcu-pix-total = <5>;
      mcu-cs-pst = <1>;
      mcu-cs-pend = <4>;
      mcu-rw-pst = <2>;
      mcu-rw-pend = <3>;

      mcu-hold-mode = <0>; // default set to 0
   };
};

Die MCU-Knotenkonfiguration unterscheidet sich zwischen VOP 1.0 und VOP 2.0. Referenzkonfigurationen:

VOP 1.0: arch/arm/boot/dts/rv1106-evb-ext-mcu-v10.dtsi.

VOP 2.0: arch/arm64/boot/dts/rockchip/rk3562-evb1-lp4x-v10-mcu-k350c4516t.dts. Der Treiber wählt MCU oder RGB über rockchip,data-sync-bypass im rgb-Knoten. Ohne diese Eigenschaft gilt standardmäßig RGB; ihre Aktivierung wählt MCU.

Bei Kernel 5.10 und neuer wird das MCU-Panel unter dem rgb-Knoten angeordnet. Bei Kernel 4.19 und älter erfolgt die Initialisierung über simple-panel als eigenständigen Knoten. Beim Verschieben eines Panel-Knotens von simple-panel unter rgb beachten Sie:

Benennen Sie den Knoten mcu-panel; anhand dieses Namens erkennt und verarbeitet der Treiber die MCU-Panel-Parameter.

Die Eigenschaft compatible kann entfernt werden; sie ist nicht erforderlich.

Ein MCU-Panel benötigt gewöhnlich eine Initialisierungssequenz für Anzeigemodus, Pixelformat und Bildrate, abhängig vom Treiber-IC, sowie eine Deinitialisierungssequenz zum Abschalten oder Wechsel in einen Energiesparmodus. Für panel-init-sequence und panel-exit-sequence gilt:

Der Panel-Hersteller liefert die Sequenz, die meist aus einer C-Datei nach DTS übertragen werden muss.

Jede Sequenzzeile enthält von links nach rechts: Befehlstyp cmd/data, Wartezeit in ms, Datenlänge in Bytes und Daten.

Die Bildrate wird normalerweise während der Sequenzinitialisierung konfiguriert und muss zur im Abschnitt Panel-Konfiguration berechneten Rate passen. Das Beispielhandbuch des Treiber-ICs nennt:

Originaltabelle des FRMCTR1-Registers zur Bildratensteuerung

Originaltabelle des FRMCTR1-Registers zur Bildratensteuerung

FRMCTR1 (B1h) D/CX RDX WRX D[23:8] D7..D0 HEX
Befehl 0 1 ↑ XX 1 0 1 1 0 0 0 1 B1h
1. Parameter 1 1 ↑ XX FRS[3:0] / 0 / 0 / DIVA[1:0] B0h
2. Parameter 1 1 ↑ XX 0 / 0 / 0 / RTNA[4:0] 11h

Originalauszug zur Zuordnung von FRS und Bildrate

Originalauszug zur Zuordnung von FRS und Bildrate

FRS[3:0] CNT Hz / TE OFF (R34h) Hz / TE ON (R35h), VBP+VFP <24
0000 37 28.78 27.64
0001 35 30.38 29.17
0010 33 32.17 30.89
0011 31 34.18 32.82
0100 29 36.46 35.01
0101 27 39.06 37.51
0110 25 42.07 40.40
0111 23 45.57 43.76
1000 21 49.71 47.74
1001 19 54.69 52.52
1010 17 60.76 58.35
1011 15 68.36 65.65
1100 13 78.13 75.03
1101 11 91.15 87.53

mcu-timing konfiguriert die Normalmodus-Steuersignale CSN/WEN/REN. Seine Eigenschaften entsprechen den folgenden Zeitintervallen. Die detaillierten Timing- und Intervallanforderungen stammen aus dem Datenblatt des im DTS-Beispiel verwendeten Panels. Nachfolgend wird die Konfiguration von mcu-timing und clock-frequency in display-timings erläutert.

Steuersignaltiming im normalen MCU-Modus

Steuersignaltiming im normalen MCU-Modus

Schreib-/Lesetiming des Panels

Schreib-/Lesetiming des Panels

Original-Timinganforderungen des Panel-Treiber-ICs

Original-Timinganforderungen des Panel-Treiber-ICs

Signal Symbol Parameter Min Max Einheit Beschreibung
DCX tast Adress-Setup-Zeit 0 - ns -
DCX that Adresshaltezeit (Schreiben/Lesen) 0 - ns -
CSX tchw CSX-High-Pulsbreite 0 - ns -
CSX tcs Chip-Select-Setup (Schreiben) 15 - ns -
CSX trcs Chip-Select-Setup (ID lesen) 45 - ns -
CSX trcsfm Chip-Select-Setup (FM lesen) 355 - ns -
CSX tcsf Chip-Select-Wartezeit (Schreiben/Lesen) 0 - ns -
WRX twc Schreibzyklus 30 - ns -
WRX twrh High-Dauer der Schreibsteuerung 15 - ns -
WRX twrl Low-Dauer der Schreibsteuerung 15 - ns -
RDX (FM) trcfm Lesezyklus (FM) 450 - ns Framespeicher lesen
RDX (FM) trdhfm High-Dauer der Lesesteuerung (FM) 90 - ns Framespeicher lesen
RDX (FM) trdlfm Low-Dauer der Lesesteuerung (FM) 355 - ns Framespeicher lesen
RDX (ID) trc Lesezyklus (ID) 160 - ns ID-Daten lesen
RDX (ID) trdh High-Dauer der Lesesteuerung 90 - ns ID-Daten lesen
RDX (ID) trdl Low-Dauer der Lesesteuerung 45 - ns ID-Daten lesen
DB[23:0], DB[17:0], DB[15:0], DB[8:0], DB[7:0] tdst Setup-Zeit der Schreibdaten 10 - ns Maximum: CL=30pF; Minimum: CL=8pF
DB[23:0], DB[17:0], DB[15:0], DB[8:0], DB[7:0] tdht Haltezeit der Schreibdaten 10 - ns Maximum: CL=30pF; Minimum: CL=8pF
DB[23:0], DB[17:0], DB[15:0], DB[8:0], DB[7:0] trat Lesezugriff - 40 ns Maximum: CL=30pF; Minimum: CL=8pF
DB[23:0], DB[17:0], DB[15:0], DB[8:0], DB[7:0] tratfm Lesezugriff - 340 ns Maximum: CL=30pF; Minimum: CL=8pF
DB[23:0], DB[17:0], DB[15:0], DB[8:0], DB[7:0] trod Deaktivierung des Leseausgangs 20 80 ns Maximum: CL=30pF; Minimum: CL=8pF

ptotal bezeichnet mcu-pix-total in mcu-timing. Laut Panel-Datenblatt darf das MCU_PIX_TOTAL-Intervall nicht kürzer als tmin sein:

Das Panel-Datenblatt nennt twc = 40, das Treiber-IC-Datenblatt dagegen twc = 30. Verwenden Sie den größeren Wert.

tmin = T_CHW + T_AST + T_WC + T_CHW = 40 ns

Das Beispielpanel unterstützt MEDIA_BUS_FMT_RGB888_3X8 und MEDIA_BUS_FMT_RGB565_1X16. cpp bezeichnet Cycles Per Pixel, die Anzahl der Takte zur Übertragung eines Pixels; siehe Panel-Konfiguration. Die theoretischen maximalen Bildraten frs-max und frp-max lauten:

fr < 1000000000 / (htotal * ptotal * cpp * tmin)
htotal = hactive + hback-porch + hfront-porch + hsync-len = 345
vtotal = vactive + vback-porch + vfront-porch + vsync-len = 505
fr_s-max < 1000000000 / (345 * 505 * 3 * 40) ≈ 47.83 Hz
fr_p-max < 1000000000 / (345 * 505 * 1 * 40) ≈ 143.49 Hz

Redaktioneller Hinweis: Die allgemeine Quellformel verwendet ptotal, setzt numerisch jedoch 505 ein, also den angegebenen vtotal-Wert. Beides bleibt erhalten, ohne die Formel stillschweigend zu korrigieren.

Die Quelle wählt daher frs = 45(Hz) für serielles rgb3x8 und frp = 60(Hz) für paralleles rgb1x16.

Nachfolgend bedeutet das Suffix s seriell und p parallel.

Die clock-frequency-Werte in display-timings lauten:

clock_s = fr_s * htotal * vtotal = 45 * 345 * 505 = 7840125
clock_p = fr_p * htotal * vtotal = 60 * 345 * 505 = 10453500

Jede Plattform begrenzt MCU dclk. Siehe mcu_max_dclk_rate in drivers/gpu/drm/rockchip/rockchip_rgb.c; üblicherweise beträgt die Grenze 150000000 Hz. Die Prüfung erfolgt in rockchip_rgb_encoder_mode_valid().

Berechnen Sie aus dclkmax und der in der Initialisierungssequenz konfigurierten Bildrate fr, normalerweise 60Hz, den maximalen ptotal-Wert:

ptotal_max < dclk_max / (cpp * clock) - 1
ptotal_s-max < 150000000 / (3 * 7840125) - 1 ≈ 5.38
ptotal_p-max < 150000000 / (1 * 10453500) - 1 ≈ 13.35

Wählen Sie den kleineren Wert ptotal = 5 und bestimmen Sie die übrigen mcu-timing-Werte anhand des Timingdiagramms.

Prüfen Sie abschließend die berechneten tatsächlichen Werte gegen die Timinganforderungen des Datenblatts.

Der tatsächliche MCU-dclk entspricht nicht einfach clock-frequency aus display-timings, sondern hängt auch von mcu-pix-total in mcu-timing und Cycles Per Pixel ab:

dclk = clock * cpp * (ptotal + 1)
dclk_s = 7840125 * 3 * 6 = 141122250
dclk_p = 10453500 * 1 * 6 = 62721000

Beide dclk-Werte bleiben unter dclkmax. Die tatsächlichen MCU_PIX_TOTAL-Zeiten lauten:

t_s = (ptotal + 1) * 1000000000 / dclk_s ≈ 42.52 ns
t_p = (ptotal + 1) * 1000000000 / dclk_p ≈ 95.66 ns

Beide MCU_PIX_TOTAL-Zeiten t erfüllen die Anforderung, über 40 ns zu liegen.

4.4.1 MCU-Bypass-Timing

Frühe MCU-fähige Plattformen wie RK3308 und PX30 verwenden dasselbe Timing für Bypass- und Normalmodus. Ab RK3562 wurde das IC-Design optimiert; der Treiber stellt ein Standard-Bypass-Timing für die meisten Schreib-/Leseanforderungen bereit. Siehe beispielsweise die vop_mcu_bypass_cfg-Definitionen in drivers/gpu/drm/rockchip/rockchip_vop_reg.c und drivers/gpu/drm/rockchip/rockchip_vop2_reg.c:

static struct rockchip_mcu_timing rk3506_mcu_bypass_timing = {
   .mcu_pix_total = 26,
   .mcu_cs_pst = 3,

   .mcu_cs_pend = 24,
   .mcu_rw_pst = 6,
   .mcu_rw_pend = 15,
};

static const struct vop_mcu_bypass_cfg rk3506_mcu_bypass_cfg = {
   .timing = &rk3506_mcu_bypass_timing,
   .dclk_rate = 120000000,
};

Erfüllt das Standard-Bypass-Timing die Anwendungsanforderungen nicht, geben Sie es in DTS an; siehe arch/arm/boot/dts/rk3506g-evb1-v10-mcu-k350c4516t.dts:

&vop {
   mcu-timing {

      mcu-pix-total = <5>;
      mcu-cs-pst = <1>;
      mcu-cs-pend = <4>;
      mcu-rw-pst = <2>;
      mcu-rw-pend = <3>;

      mcu-hold-mode = <0>;
   };

   mcu-bypass-timing {
      mcu-pix-total = <9>;
      mcu-cs-pst = <1>;
      mcu-cs-pend = <8>;

      mcu-rw-pst = <2>;
      mcu-rw-pend = <7>;

      mcu-hold-mode = <0>;
   };
};

Der Bypass-Modus kann MCU-Lesezugriffe umfassen. Die Mindestzeiten für Lesen sind normalerweise größer als für Schreiben; siehe das vorherige Beispieldatenblatt. Deshalb wird mcu-bypass-timing meist anhand der Lesegrenzen berechnet, um beide Anforderungen zu erfüllen.

4.4.2 MCU-Frame-Schreib-/Lesezugriffe

Im normalen MCU-Modus ermöglichen Frame-Schreib-/Lesezugriffe den Befehlsaustausch zwischen Host und Panel zwischen den Frames, etwa zum Lesen von Statusregistern oder Ändern der Anzeigestartposition. Dies wird häufig bei elektrostatischen Belastungstests oder bei Panels verwendet, deren Anzeigestart für jeden Frame aktualisiert werden muss.

Aktivieren Sie die Funktion durch Konfiguration von panel-frame-sequence in DTS. Siehe arch/arm/boot/dts/rk3506g-evb1-v10-mcu-k350c4516t.dts:

&rgb {
   ......
   mcu_panel: mcu-panel {

      ......
      panel-frame-sequence = [
         //type delay num val1 val2 val3
          00  00 01 0a
          02  00 01 0a
          02  00 01 0a
          00  00 01 2c
      ];
      ......
   };
   ......
};

Die Schreib-/Lesezugriffe zwischen Frames sind in drivers/gpu/drm/rockchip/rockchip_rgb.c implementiert:

static void mcu_interframe_work_func(struct work_struct *work)
{
   struct rockchip_mcu_panel *mcu_panel =

      container_of(work, struct rockchip_mcu_panel, interframe_work);
   struct drm_panel *panel = &mcu_panel->base;
   struct drm_display_mode *mode = mcu_panel->desc->mode;
   struct drm_crtc *crtc = mcu_panel->encoder->crtc;
   u32 timeout = DIV_ROUND_CLOSEST_ULL(1000, drm_mode_vrefresh(mode));
   int ret;

   ret = rockchip_drm_wait_vact_end(crtc, timeout);
   if (ret) {
      DRM_DEV_ERROR(panel->dev, "wairt vact end timed out\n");
      return;
   }


   ret = rockchip_mcu_panel_xfer_mcu_cmd_seq(mcu_panel, mcu_panel->desc->frame_seq);
   if (ret) {
      DRM_DEV_ERROR(panel->dev, "failed to send frame cmds seq\n");
      return;
   }

   schedule_work(&mcu_panel->interframe_work);
};

Passen Sie für spezielle Anwendungsanforderungen die Implementierung des obigen Work-Items an.

5. Vorgehen bei der Fehlersuche

1. Prüfen Sie die Hardwareverbindungen sämtlicher RGB-/MCU-Pins. Pinzuordnungen können sich zwischen Plattformen unterscheiden; siehe

den obigen Abschnitt Hardwareverbindungen.

Beispielhafte RGB-/MCU-Pinverbindungen

Beispielhafte RGB-/MCU-Pinverbindungen

2. Konfigurieren Sie anhand des Panel-Datenblatts Enable-/Reset-Polarität, Einschaltreihenfolge und PWM-Kanal der Hintergrundbeleuchtung. Stellen Sie bei MCU-Panels zusätzlich die richtige Initialisierungssequenz ein.

Beispielverbindungen für Reset, Enable und Hintergrundbeleuchtungs-PWM

Beispielverbindungen für Reset, Enable und Hintergrundbeleuchtungs-PWM

3. Prüfen Sie bei eingeschalteter Hintergrundbeleuchtung erneut die Enable-/Reset-Pegel. Weichen Messwerte weiterhin ab, prüfen Sie die korrekte GPIO-Auswahl durch iomux.

6. Häufige Probleme

6.1 RGB/MCU zeigt ein gestörtes oder versetztes Bild

Versuchen Sie, die dclk-Polarität über pixelclk-active in display-timings umzukehren. Dies ändert die relative Phase zwischen dclk und Daten.

display-timings {
   native-mode = <&fx070_dhm11boe_timing>;


   fx070_dhm11boe_timing: timing0 {
      clock-frequency = <50000000>;
      hactive = <1024>;
      vactive = <600>;
      hback-porch = <140>;
      hfront-porch = <160>;
      vback-porch = <20>;
      vfront-porch = <20>;
      hsync-len = <20>;
      vsync-len = <2>;
      hsync-active = <0>;
      vsync-active = <0>;

      de-active = <0>;
      pixelclk-active = <0>; // 1 翻转,0 不翻转
   };
};

Dieses Thema entdecken → · Lernpfade →