Это справочный материал по платформе Rockchip RK3588 для Linux kernel 5.10, указанного в оригинале. Для проекта ArmSoM проверьте SoC платы, доступный интерфейс дисплея, поддержку VRR панелью/мостом и патчи SDK/BSP. Это не означает поддержку на всех платах ArmSoM. Проверка на оборудовании ArmSoM не проводилась; журналы, осциллограммы, фотографии и описания испытаний взяты из оригинала.
Источник: Rockchip_RK3588_Developer_Guide_Vsync_Adjust_CN.pdf, V1.2.0, 11 страниц. Предоставлен только китайский оригинал. Во всех трёх статьях используются его рисунки; английская и русская версии полностью переводят основной текст и подписи/alt, сохраняя исходные надписи внутри рисунков.
Редакционная проверка · ArmSoM documentation · Rockchip
1. Тайминги развёртки
Для вывода кадра на экран обычно используется следующая развёртка:

Развёртка и активная область изображения
Каждая строка состоит из hsync, hback porch, hactive и hfront porch. Каждый кадр состоит из vsync, vback porch, vactive и vfront porch.
Определение htotal:
htotal = hsync + hbackporch + hactive + hfrontporch
Определение vtotal:
vtotal = vsync + vbackporch + vactive + vfrontporch
Для развёртки с пиксельной частотой pixel_clk и частотой обновления fps должно выполняться следующее соотношение:
pixel_clk = htotal * vtotal * fps
Из диаграммы видно, что период Vsync равен 1/fps. Изменить период Vsync означает изменить fps; для этого можно изменить pixel clock, htotal или vtotal. При фиксированном разрешении
hactive и vactive остаются неизменными. В htotal можно менять только hbank (hsync + hback porch + hfront porch), а в vtotal — только vbank (vsync + vback porch + vfront porch).
Для панелей, рассмотренных в оригинале, изменение hbank обычно означает изменение HFP (hfront porch), а изменение vbank — VFP (vfront porch). На RK3588 изменение pixel clock соответствует изменению dclk rate.
Далее рассматриваются только три способа изменения периода Vsync: VFP, HFP и dclk rate.
2. Тракты вывода изображения
Тракты вывода RK3588 показаны ниже:

Тракты вывода RK3588 и необязательный DSC
Поддерживаются выходы HDMI, DSI, DP и eDP. На HDMI и DSI может использоваться DSC. При оценке изменения периода Vsync для DSI и HDMI необходимо отдельно рассматривать работу с DSC и без DSC.
3. Настройка VOP
Регистры VOP RK3588 позволяют менять VFP, HFP и dclk rate. Для VFP можно выбрать немедленное применение либо применение на границе кадра. Изменения HFP и dclk rate применяются только на границе кадра.
Для изменения периода Vsync через dclk rate действуют ограничения:
1. Только VP0 и VP2 могут менять период Vsync переключением источника dclk.
2. VP0 может переключаться между dclk0 и dclk1, а VP2 — между dclk2 и dclk1.

Переключение источника dclk для VP0/VP2
Пример: DSI, подключённый к VP2, обеспечивает динамическое переключение 120/60fps. Информация о разрешении:
console:/ # cat /sys/kernel/debug/dri/0/summary
Video Port0: DISABLED
Video Port1: DISABLED
Video Port2: ACTIVE
Connector: DSI-1
bus_format[1018]: RGB101010_1X30
overlay_mode[0] output_mode[f] color_space[0], eotf:0
Display mode: 3024x2016p120
clk[1187744] real_clk[1187744] type[48] flag[a]
H: 3024 4416 4432 4532
V: 2016 2042 2044 2184
Variable refresh rate info:
Min refresh rate: 60
Max refresh rate: 120
Current refresh rate: 60
Type: DCLK
Current pixel clock:593872
Cluster1-win0: ACTIVE
win_id: 2
format: AB24 little-endian (0x34324241)[AFBC] SDR[0] color_space[0]
glb_alpha[0xff]
rotate: xmirror: 0 ymirror: 0 rotate_90: 0 rotate_270: 0
csc: y2r[0] r2y[0] csc mode[0]
zpos: 0
src: pos[0, 0] rect[3024 x 2016]
dst: pos[0, 0] rect[3024 x 2016]
buf[0]: addr: 0x00000000ef7b9000 pitch: 12096 offset: 0
Video Port3: DISABLED
Для переключения 120/60fps подключите dclk1 и dclk2 к v0pll. Их частоты отличаются вдвое, что обеспечивает точное деление при неизменной частоте родительского PLL. Связи тактовых сигналов:
cat /sys/kernel/debug/clk/clk_summary
...
pll_v0pll 1 1 0 1187743988 0 0 50000
v0pll 2 2 0 1187743988 0 0 50000
dclk_vop2_src 1 2 0 296935997 0 0 50000
dclk_vop2 1 2 0 296935997 0 0 50000
dclk_vop1_src 1 2 0 148467999 0 0 50000
dclk_vop1 1 2 0 148467999 0 0 50000
...
4. Настройка DSC
DSC поддерживает изменение VFP и HFP, но только с немедленным применением. Режим DSC также поддерживает тайминги, поступающие от VOP после изменения dclk.
5. Настройка DSI
Изменения регистров DSI, включая VFP и HFP, применяются немедленно. DSI имеет режимы Manual и Auto-Calculation. В режиме Auto-Calculation контроллер извлекает всю необходимую информацию и параметры тайминга из интерфейсов IPI и PPI для формирования кадров видеорежима. Кадры IPI могут динамически меняться, а контроллер адаптирует выходные кадры. Поэтому DSI автоматически корректирует выход PHY в соответствии с таймингами VOP без перенастройки регистров DSI. Поддерживаемые способы изменения различаются между режимами.
5.1 Настройка VFP
DSI может менять период Vsync изменением VFP.
В режиме Manual при прерывании Vsync одновременно измените регистры VFP в VOP, DSC (если включён) и DSI с немедленным применением. Это изменяет VFP текущего кадра. Ограничение регистров DSI задаёт максимальное значение VFP 1023.
Для получения большего VFP можно изменить только регистры VFP в VOP и DSC (если используется сжатие DSC). Однако неизменённый VFP DSI влияет на передачу пакетов в VFP, как показано ниже:

Осциллограмма оригинала: отсутствующие пакеты синхронизации при неизменённом VFP DSI
Пакеты синхронизации отсутствуют. Если панель не принимает такую форму сигнала, возможны нарушения изображения. Поэтому не рекомендуется оставлять VFP DSI без настройки.
В режиме Auto-Calculation при прерывании Vsync достаточно одновременно изменить VOP и DSC (если включён) с немедленным применением. Ограничение VFP DSI до 1023 сохраняется.
5.2 Настройка HFP
Риски реализации динамической частоты кадров через регистр HFP DSC:
Регистры тайминга DSC применяются немедленно, в отличие от покадрового механизма VOP. Изменение регистров DSC в конце кадра нарушает тайминг текущего кадра и вносит ошибку его длительности. В видеорежиме DSC тайминги развёртки VOP и DSC должны совпадать максимально точно, иначе внутренний буфер DSC переполняется.
Следующая аномальная форма сигнала MIPI DPHY соответствует ошибке DSC: данные не передаются.

Отсутствие данных MIPI DPHY после ошибки DSC
В режиме Manual DSI RK3588 не поддерживает изменение Vsync через HFP. В локальном тесте автора оригинала изменение HFP в режиме DSC вызвало показанное нарушение изображения; это не испытание ArmSoM.

Фотография оригинала: нарушение изображения после изменения HFP в режиме DSC
В режиме Auto-Calculation без DSC достаточно изменить HFP VOP; DSI поддерживает этот способ. При включённом DSC необходимо менять регистры VOP и DSC, но невозможно гарантировать применение изменений HFP на одной строке. В этом случае изменение HFP не поддерживается.
5.3 Настройка dclk rate
Режим Manual не поддерживает изменение периода Vsync через dclk rate VOP.
Режим Auto-Calculation поддерживает изменение периода Vsync через dclk rate как с DSC, так и без него. Контроллер DSI автоматически адаптирует выход.
Переключение частоты кадров поясняют два набора таймингов A/B для 120/60fps, выделенные красной рамкой:

Два набора таймингов 120/60fps; красная рамка: 10 bit 3.75x A/B
| Параметр | Единица | 10 bit 3x A | 10 bit 3x B | 10 bit 3.75x A | 10 bit 3.75x B |
|---|---|---|---|---|---|
| Timing | 120(FPP)+60(Finger) | A | B | A | B |
| Frame-Rate | Hz | 120 | 60 | 120 | 60 |
| VSA | Line | 2 | 2 | 2 | 2 |
| VBP | Line | 140 | 140 | 140 | 140 |
| Vadr | Line | 2016 | 2016 | 2016 | 2016 |
| VFP | Line | 26 | 26 | 26 | 26 |
| HAS | Pixel | 10 | 10 | 10 | 10 |
| HBP | Pixel | 20 | 306 | 38 | 332 |
| Hadr | Pixel | 3024 | 3024 | 3024 | 3024 |
| HFP | Pixel | 30 | 308 | 38 | 334 |
| MIPI speed | Mbps | 1108 | 1108 | 928 | 928 |
| Interface | MIPI | Dphy 2port 8lane+DSC | Dphy 2port 8lane+DSC | Dphy 2port 8lane+DSC | Dphy 2port 8lane+DSC |
5.3.1 Подробности переключения кадров через dclk rate
На рисунке красный сигнал обозначает HSYNC, декодированный внутри IC панели. Изменение частоты кадров через dclk применяется на границе кадра. В момент переключения после подсчёта 26 строк VFP предыдущего кадра панель ожидает VSYNC, затем 140+2 строк VBP+VSA до DATA. IC панели использует среднюю ширину первых 4 строк после VSYNC и время перехода для определения переключения частоты кадров.

Осциллограмма оригинала 60→120fps. Зелёные подписи: внутренний HSYNC, одно переключение на hsync, 26 строк предыдущего кадра, 142 строки до DATA и средняя ширина четырёх строк.
5.3.2 Переход со 120fps на 60fps

120→60fps: фактическое переключение внешней частоты и момент переключения, определённый IC
5.3.3 Переход с 60fps на 120fps

60→120fps: фактическое переключение внешней частоты и момент переключения, определённый IC
6. Настройка eDP/DP
Для VRR через eDP и DP необходима поддержка контроллера и соответствующих описаний DPCD/EDID. Поддержка VRR в eDP/DP также называется Adaptive-Sync.
6.1 Поддержка VRR через DPCD
Пакеты MSA содержат параметры, по которым Sink восстанавливает тайминги видеопотока. Эти параметры предназначены для статических таймингов. Если тайминги потока меняются динамически, Sink не может использовать информацию MSA. Source читает MSA_TIMING_PAR_IGNORED в DOWN_STREAM_PORT_COUNT (адрес DPCD 00006h, bit6), чтобы определить поддержку Sink бесшовного изменения таймингов (VRR). Если функция поддерживается и
Source требуется эта функция, оригинал указывает MSA_TIMING_PAR_IGNORE_EN в DOWNSPREAD_CTRL (адрес DPCD 00107h, bit7); Sink игнорирует перечисленные ниже параметры MSA. В исходном предложении отсутствует точная операция записи и её значение; здесь они не додумываются.

Исходная таблица параметров MSA, которые можно игнорировать
| HTotal[15:0] | HStart[15:0] | HSyncPolarity (HSP) | HSyncWidth[14:0] (HSW) |
|---|---|---|---|
| VTotal[15:0] | VStart[15:0] | VSyncPolarity (VSP) | VSyncWidth[14:0] (VSW) |
6.2 Поддержка VRR через EDID
EDID определяет Display Range Limit Descriptor для описания поддержки VRR:

Исходный фрагмент таблицы Display Range Limits; последующие байты внизу исходного изображения видны не полностью
| Byte | Value / bits | Описание |
|---|---|---|
| 0, 1 | (00 00)h | Обозначает 18-байтовый Display Descriptor. |
| 2 | 00h | Зарезервировано: 00h при использовании как Display Descriptor. |
| 3 | FDh | Тег Display Range Limits Descriptor. |
| 4 | bits 7 6 5 4 3 2 1 0 | Флаги смещения диапазона. |
| 4 | 0000 –00 | Смещения вертикальной частоты равны нулю. |
| 4 | 0000 –10 | Максимальная вертикальная частота +255 Hz; минимум без смещения. |
| 4 | 0000 –11 | Максимальная и минимальная вертикальные частоты +255 Hz. |
| 4 | 0000 00– | Смещения горизонтальной частоты равны нулю. |
| 4 | 0000 10– | Максимальная горизонтальная частота +255 kHz; минимум без смещения. |
| 4 | 0000 11– | Максимальная и минимальная горизонтальные частоты +255 kHz. |
| 4 | 01h, 04h → 07h, 09h, 0Dh, 10h → FFh | Зарезервировано; не использовать. В оригинале отсутствует разделитель между 0Dh и 10h; значения сохранены. |
| 5 | 01h → FFh | Минимальная вертикальная частота (частота полей для чересстрочной развёртки) |
| 5 | Byte 4, bits 1, 0 ≠ 11 | Двоичное целое значение, диапазон 1 Hz ~ 255 Hz |
| 5 | Byte 4, bits 1, 0 = 11 | Двоичное целое значение, диапазон 256 Hz ~ 510 Hz |
| 5 | 00h | Зарезервировано; не использовать. |
| 6 | 01h → FFh | Максимальная вертикальная частота (частота полей для чересстрочной развёртки) |
| 6 | Byte 4, bits 1 ≠ 1 | Двоичное целое значение, диапазон 1 Hz ~ 255 Hz |
| 6 | Byte 4, bits 1 = 1 | Двоичное целое значение, диапазон 256 Hz ~ 510 Hz |
| 6 | Note | Минимальная частота не должна превышать максимальную. |
| 6 | 00h | Зарезервировано; не использовать. |
| 7 | 01h → FFh | Минимальная горизонтальная частота |
| 7 | Byte 4, bits 3, 2 ≠ 11 | Двоичное целое значение, диапазон 1 kHz ~ 255 kHz |
| 7 | Byte 4, bits 3, 2 = 11 | Двоичное целое значение, диапазон 256 kHz ~ 510 kHz |
| 7 | 00h | Зарезервировано; не использовать. |
| 8 | 01h → FFh | Максимальная горизонтальная частота |
| 8 | Byte 4, bits 3 ≠ 1 | Двоичное целое значение, диапазон 1 kHz ~ 255 kHz |
| 8 | Byte 4, bits 3 = 1 | Двоичное целое значение, диапазон 256 kHz ~ 510 kHz |
| 8 | Note | Минимальная частота не должна превышать максимальную. |
| 8 | 00h | Зарезервировано; не использовать. |
Этот дескриптор задаёт поддерживаемый диапазон VRR.
В оригинале указано, что тайминги EDID используют минимальные vblank и hblank. Например, при диапазоне VRR из EDID 30 ~ 100 Hz для тайминга с частотой 60Hz
поддерживается VRR 30 ~ 60Hz, а для тайминга 24 Hz VRR не поддерживается. Чтобы получить более низкие частоты кадров в заданном диапазоне VRR, необходимо увеличить vbank.
6.3 Настройка VRR eDP
eDP поддерживает изменение Vsync через VFP. Достаточно менять VFP VOP; в DTS eDP необходимо задать analogix,force-stream-valid, чтобы eDP автоматически адаптировался к таймингам VOP.
Панель eDP может не поддерживать EDID. В этом случае диапазон VRR необходимо определить в DTS.
