Полный технический текст китайского RK-KF-YF-105 V1.4.0. Версии платформ приведены ниже. Это руководство драйвера RT-Thread, а не настройки Linux DRM. Для ArmSoM проверьте SoC, RT-Thread BSP/HAL, VOP, интерфейс, модель панели, временные параметры и питание. Конкретная комбинация платы не подтверждена: платформенный справочник, не поддержка всех плат. Английского PDF нет; четыре языка используют 16 технических рисунков китайского источника, а таблицы и код со снимков также перенесены в редактируемый текст. Аппаратная проверка примеров не выполнялась.
| SoC | RT-Thread |
|---|---|
| RK2108 | lts-v3.1.x |
| RK3308 | lts-v4.1.x |
| RV1109/RV1126 | lts-v3.1.x |
| RV1103/RV1106 | lts-v4.1.x |
| RK2118 | lts-v4.1.x |
| RK3506 | lts-v4.1.x |
Сохранены проблемы источника: путь VOP указан как
dsp/rockchip-common/..., остальные — bsp. Порядок умножения на рисунке матрицы и отдельные значения фиксированной точки (0.0691 → 0x05, 0.0880 → 0x08) не соответствуют заявленному умножению на 0x80; значения не изменены. В 6.4 hsync/vsync названы porch, на рисунке pulse; единицы MIPI оставлены Mbps. Таблицы структур раздела 4 не содержат все поля примеров раздела 7. Массивы инициализации на снимках — фрагменты; окончания и команды не выдуманы. Написание YUVY422 сохранено. Перед применением сверяйте HAL, регистры и спецификацию панели.
1. Обзор
Драйвер дисплея Rockchip RT-Thread регистрирует LCD-драйвер в ОС через модель IO-устройств RT-Thread и поддерживает GUI, например LittlevGL. Для использования возможностей оборудования расширены интерфейсы: многослойная композиция, цветовые эффекты, последующее масштабирование и MIPI switch.
1.1 Основные понятия
CRTC: абстракция контроллера дисплея — модуля VOP SoC (в части документов LCDC).
Plane: абстракция слоя win внутри VOP/LCDC.
Encoder/Connector: программная абстракция выходов RGB, LVDS, DSI, eDP, HDMI и других.
Panel: абстракция устройств отображения LCD, HDMI и прочих.
1.2 Тракт отображения
RK2108

Тракт дисплея RK2108
Для других платформ см. описание тракта в Rockchip_Developer_Guide_DRM_Display_Driver_CN.
2. Программная архитектура

Программная архитектура дисплея
2.1 Файлы уровня Driver
| Драйвер | Файл | Описание |
|---|---|---|
| Core | bsp/rockchip-common/drivers/drv_display.c | Фреймворк дисплея RT-Thread: регистрирует драйвер, загружает модули, связывает приложения и драйвер и управляет всеми модулями. |
| VOP | bsp/rockchip-common/drivers/drv_vop.c dsp/rockchip-common/drivers/drv_vop.h |
Драйвер дисплейного модуля VOP |
| DSI | bsp/rockchip-common/drivers/drv_dsi.c bsp/rockchip-common/drivers/drv_dsi.h |
Драйвер дисплейного модуля DSI/DPHY |
| PANEL | bsp/rockchip-common/drivers/drv_panel.c bsp/rockchip-common/drivers/drv_panel_cfg.h |
Драйвер панели: абстракция команд инициализации, временных параметров, питания и других операций. |
2.2 Файлы уровня HAL
| Драйвер | Файл | Описание |
|---|---|---|
| Core | bsp/rockchip-common/hal/lib/hal/inc/hal_display.h | Определения основных структур дисплея |
| VOP | bsp/rockchip-common/hal/lib/hal/src/hal_vop.c bsp/rockchip-common/hal/lib/hal/inc/hal_vop.h |
Аппаратные функции VOP |
| DSI | bsp/rockchip-common/hal/lib/hal/src/hal_dsi.c bsp/rockchip-common/hal/lib/hal/inc/hal_dsi.h |
Аппаратные функции DSI/DPHY |
3. Основные интерфейсы
GUI-приложения RT-Thread взаимодействуют с драйвером через операции control, аналогичные Linux IOCTL. Расширенные операции:
| Параметр | Описание |
|---|---|
| RK_DISPLAY_CTRL_ENABLE | Включить дисплей |
| RK_DISPLAY_CTRL_DISABLE | Выключить дисплей |
| RK_DISPLAY_CTRL_SET_PLANE | Настроить указанный слой |
| RK_DISPLAY_CTRL_SET_SCALE | Настроить последующее масштабирование |
| RK_DISPLAY_CTRL_LOAD_LUT | Настроить таблицу bpp |
| RK_DISPLAY_CTRL_SET_COLOR_MATRIX | Задать матрицу цветового преобразования |
| RK_DISPLAY_CTRL_SET_GAMMA_COE | Задать коэффициенты gamma |
| RK_DISPLAY_CTRL_SET_BCSH | Задать BCSH: яркость, контраст, насыщенность, тон |
| RK_DISPLAY_CTRL_SET_POST_CLIP | Задать коэффициент clip |
| RK_DISPLAY_CTRL_MIPI_SWITCH | Переключить тракт MIPI switch |
| Параметр | Описание |
|---|---|
| RK_DISPLAY_CTRL_COMMIT | Обновить конфигурацию дисплея |
4. Основные структуры данных
4.1 struct display_state
Центральная структура драйвера включает структуры device и graphic_info RTT, а также абстракции оборудования Rockchip.
| Параметр | Описание |
|---|---|
| struct rt_device_graphic_info graphic_info | Структура информации о дисплее RTT |
| struct rt_device lcd | Структура устройства LCD |
| uint32_t *rtt_framebuffer | Адрес framebuffer RTT |
| struct crtc_state crtc_state | Контроллер дисплея VOP Rockchip |
| struct connector_state conn_state | Преобразователь дисплея MIPI DSI Rockchip |
| struct panel_state panel_state | Команды инициализации панели, питание и связанные сведения |
| struct DISPLAY_MODE_INFO mode | Временные параметры развёртки и сведения о панели |
4.2 struct crtc_state
Описывает модуль VOP процессора Rockchip; основные поля:
| Параметр | Описание |
|---|---|
| struct VOP_REG *hw_base | Базовый адрес регистров VOP |
| const struct rockchip_crtc_funcs *funcs | Указатели функций основных операций VOP |
| struct CRTC_WIN_STATE win_state | Структура слоя WIN |
| struct VOP_POST_SCALE_INFO post_scale | Информация последующего масштабирования |
| uint8_t irqno | Номер прерывания VOP |
| uint8_t power_state | Состояние питания |
4.3 struct CRTC_WIN_STATE
Описывает слой WIN модуля VOP Rockchip:
| Параметр | Описание |
|---|---|
| bool winEn | Слой: 0 выключен, 1 включён |
| uint8_t winId | Выбор: 0,1,2 означают win0,win1,win2 |
| uint8_t zpos | Порядок Z: 0,1,2 снизу вверх |
| uint8_t format | Формат; значения в rt-thread/include/rtdef.h |
| uint32_t yrgbAddr | Адрес RGBX или компоненты Y в YUV |
| uint32_t cbcrAddr | Адрес компоненты UV в YUV |
| uint16_t xVir | Виртуальная ширина; выравнивание 4Byte |
| uint16_t srcX | Координата X слоя на панели |
| uint16_t srcY | Координата Y слоя на панели |
| uint16_t srcW | Ширина отображения слоя |
| uint16_t srcH | Высота отображения слоя |
| uint8_t hwFormat | Аппаратная настройка драйвера; приложение не задаёт |
| uint16_t hwCrtcX | Аппаратная настройка драйвера; приложение не задаёт |
| uint16_t hwCrtcY | Аппаратная настройка драйвера; приложение не задаёт |
| uint16_t xLoopOffset | Настройка loop по X |
| uint16_t yLoopOffset | Настройка loop по Y |
| bool alphaEn | Включение alpha |
| uint8_t alphaMode | Общая alpha: VOP_ALPHA_MODE_USER_DEFINED; попиксельная: VOP_ALPHA_MODE_PER_PIXEL |
| uint8_t alphaPreMul | Предумножение alpha: YES VOP_PREMULT_ALPHA; NO VOP_NON_PREMULT_ALPHA |
| uint8_t alphaSatMode | Изменение alpha: 1 — alpha = alpha + alpha[7]; 0 — без изменения. Рекомендуется 0. |
| uint8_t globalAlphaValue | Общая alpha: 0~0xff |
| uint32_t *lut | Таблица bpp: см. display_test.c или задайте свою |
4.4 struct VOP_POST_SCALE_INFO
Описывает последующее масштабирование в VOP Rockchip:
| Параметр | Описание |
|---|---|
| uint16_t srcW | Разрешение источника X |
| uint16_t srcH | Разрешение источника Y |
| uint16_t dstX | Координата X после масштабирования |
| uint16_t dstY | Координата Y после масштабирования |
| uint16_t dstW | Ширина после масштабирования |
| uint16_t dstH | Высота после масштабирования |
| bool postScaleEn | Включение аппаратного масштаба: определяет драйвер, не приложение |
| eVOP_PostSclMode postSclHmode | Аппаратный масштаб вычисляет драйвер; приложение не задаёт |
| eVOP_PostSclMode postSclVmode | Аппаратный масштаб вычисляет драйвер; приложение не задаёт |
4.5 struct VOP_BCSH_INFO
Описывает выходной блок BCSH VOP:
| Параметр | Описание |
|---|---|
| uint8_t brightness | Яркость: 0~100, по умолчанию 50 |
| uint8_t contrast | Контраст: 0~100, по умолчанию 50 |
| uint8_t satCon | Насыщенность: 0~100, по умолчанию 50 |
| uint8_t hue | Тон: 0~100, по умолчанию 50 |
4.6 struct VOP_COLOR_MATRIX_INFO
Описывает выходную цветовую матрицу VOP:
| Параметр | Описание |
|---|---|
| bool colorMatrixEn | Включение |
| uint8_t *colorMatrixCoe | Коэффициенты матрицы |
| uint8_t *colorMatrixOffset | Смещения матрицы |

Исходная цветовая матрица
[csc_out0] [csc_in0] [coe00 coe01 coe02] [offset0]
[csc_out1] = [csc_in1] X [coe10 coe11 coe12] + [offset1]
[csc_out2] [csc_in2] [coe20 coe21 coe22] [offset2]
Пример: матрица преобразования bt709tobt2020:
{0.6274, 0.3293, 0.0433},
{0.0691, 0.9195, 0.0114},
{0.0164, 0.0880, 0.8956}
После перевода в фиксированную точку с 0x80 (bit7 — знак):
coe00 = 0.6274 * 0x80 = 0x50
coe01 = 0.3293 * 0x80 = 0x2a
coe02 = 0.0433 * 0x80 = 0x05
Аналогично источник приводит:
colorMatrixCoe[3][3] = {
{0x50, 0x2a, 0x05},
{0x05, 0x75, 0x02},
{0x02, 0x08, 0x72}
};
4.7 struct VOP_POST_CLIP_INFO
Описывает выходной блок clip VOP:
| Параметр | Описание |
|---|---|
| bool postClipEn | Включение |
| uint8_t postYThres | Значение clip |
5. Требования к выравниванию
5.1 Выравнивание данных
RK2108

Выравнивание данных RK2108
| Формат | crtc W (пиксели) | crtc H (строки) | xLoopOffset (пиксели) | yLoopOffset (строки) | xVir (байты) | act_xoff (пиксели) | act_yoff (строки) |
|---|---|---|---|---|---|---|---|
| RGB ARGB8888 | 1 | 1 | 1 | 1 | 4 | 1 | 1 |
| RGB RGB888 | 1 | 1 | 1 | 1 | 4 | 1 | 1 |
| RGB RGB565 | 1 | 1 | 1 | 1 | 4 | 1 | 1 |
| RGB RGB444 | 1 | 1 | 2 | 1 | 4 | 2 | 1 |
| YUV YUV420 4bit | 4 | 2 | 4 | 2 | 4 | 4 | 2 |
| YUV YUV420 8bit | 2 | 2 | 2 | 2 | 4 | 2 | 2 |
| YUV YUV422 4bit | 4 | 1 | 4 | 1 | 4 | 4 | 1 |
| YUV YUV422 8bit | 2 | 1 | 2 | 1 | 4 | 2 | 1 |
| YUV YUV444 4bit | 4 | 1 | 4 | 1 | 4 | 4 | 1 |
| YUV YUV444 8bit | 1 | 1 | 1 | 1 | 4 | 1 | 1 |
| YUV YUVY422 4bit | 2 | 1 | 2 | 1 | 4 | 2 | 1 |
| YUV YUVY422 8bit | 2 | 1 | 2 | 1 | 4 | 2 | 1 |
| 8BPP | 1 | 1 | 1 | 1 | 4 | 1 | 1 |
| 4BPP | 1 | 1 | 2 | 1 | 4 | 2 | 1 |
| 2BPP | 1 | 1 | 4 | 1 | 4 | 4 | 1 |
| 1BPP | 1 | 1 | 8 | 1 | 4 | 8 | 1 |
5.2 Выравнивание панели
Некоторые панели требуют выравнивания. У S6E3HC2 при 1440x3120 размер среза DSC — 720x65: положение частичного обновления выравнивается по 720x65, размер области — по 720x195. При 720x1560 срез равен 360x52: положение выравнивается по 360x52, размер — по 360x390.
6. Настройка панели
6.1 Выбор поддерживаемой панели
Выберите конфигурацию панели через меню:
cd bsp/rockchip-pisces
scons --menuconfig
RT-Thread rockchip common drivers --->
Panel Type (R17 SS mipi panel, resolution is 1080x2340) --->
6.2 Добавление новой панели
-
Перейдите в каталог:
cd bsp/rockchip-common/drivers/panel_cfg. -
Скопируйте имеющийся .h в new_panel.h и измените параметры по разделу 6.4 и спецификации панели.
-
Вернитесь командой
cd ../в bsp/rockchip-common/drivers/. -
Откройте Kconfig, найдите “Panel Type” и определите RT_USING_PANEL_NEW_PANEL по примеру config RT_USING_PANEL.

Новая панель в Kconfig
--- a/bsp/rockchip-common/drivers/Kconfig
+++ b/bsp/rockchip-common/drivers/Kconfig
@@ -58,6 +58,9 @@ choice
config RT_USING_PANEL_S6E3HC2_X4
bool "S6E3HC2_X4 mipi panel, resolution is 720x1560"
+
+ config RT_USING_PANEL_NEW_PANEL
+ bool "It's a new panel demo, resolution is wxh"
endchoice
6.3 Типовая временная диаграмма развёртки

Временная диаграмма развёртки
6.4 Параметры панели
| Параметр | Описание |
|---|---|
| RT_HW_LCD_XRES | Горизонтальное разрешение; hactive в 6.3 |
| RT_HW_LCD_YRES | Вертикальное разрешение; vactive в 6.3 |
| RT_HW_LCD_PIXEL_CLOCK | Пиксельная частота, khz |
| RT_HW_LCD_LANE_MBPS | Частота MIPI DPHY CLK Lane, Mbps |
| RT_HW_LCD_LEFT_MARGIN | Левое гашение; hback-porch в 6.3 |
| RT_HW_LCD_RIGHT_MARGIN | Правое гашение; hfront-porch в 6.3 |
| RT_HW_LCD_UPPER_MARGIN | Верхнее гашение; vback-porch в 6.3 |
| RT_HW_LCD_LOWER_MARGIN | Нижнее гашение; vfront-porch в 6.3 |
| RT_HW_LCD_HSYNC_LEN | Горизонтальная синхронизация; источник называет hsync-porch в 6.3 |
| RT_HW_LCD_VSYNC_LEN | Вертикальная синхронизация; источник называет vsync-porch в 6.3 |
| RT_HW_LCD_CONN_TYPE | Тип панели, например RK_DISPLAY_CONNECTOR_DSI |
| RT_HW_LCD_BUS_FORMAT | Формат шины, например MEDIA_BUS_FMT_RGB888_1X24 |
| RT_HW_LCD_VMODE_FLAG | Полярность, поддержка DSC и другие флаги |
| RT_HW_LCD_INIT_CMD_TYPE | Тип команд; CMD_TYPE_DEFAULT — MIPI CMD |
| RT_HW_LCD_DISPLAY_MODE | Выбор CMD или video |
| RT_HW_LCD_AREA_DISPLAY | Поддержка частичного обновления |
| RT_HW_LCD_XACT_ALIGN | Выравнивание ширины области, пиксели |
| RT_HW_LCD_YACT_ALIGN | Выравнивание высоты области, пиксели |
| Параметр | Описание |
|---|---|
| RT_HW_LCD_XPOS_ALIGN | Выравнивание позиции X, пиксели |
| RT_HW_LCD_YPOS_ALIGN | Выравнивание позиции Y, пиксели |
| RT_HW_LCD_PREPARE_DELAY_MS | Время готовности к приёму изображения, ms |
| RT_HW_LCD_UNPREPARE_DELAY_MS | Время полного отключения питания, ms |
| RT_HW_LCD_ENABLE_DELAY_MS | Время от готовности до нормального изображения, ms |
| RT_HW_LCD_DISABLE_DELAY_MS | Время выхода из нормального отображения, ms |
| RT_HW_LCD_INIT_DELAY_MS | Время от сброса до отправки команд инициализации, ms |
| RT_HW_LCD_RESET_DELAY_MS | Время полного сброса панели, ms |
| struct rockchip_cmd cmd_on[] | Команды инициализации панели |
| struct rockchip_cmd cmd_off[] | Команды деинициализации панели |
| struct rockchip_cmd cmd_aod_on[] | Команды входа в AOD |
| struct rockchip_cmd cmd_aod_off[] | Команды выхода из AOD |
6.5 Команды инициализации панели
- Пример MIPI DSI CMD:

Фрагмент команд инициализации
struct rockchip_cmd cmd_on[] =
{
/* sleep out */
{0x05, 0x05, 0x01, {0x11}},
/* FD Setting */
{0x29, 0x00, 0x03, {0xf0, 0x5a, 0x5a}},
{0x23, 0x00, 0x02, {0xb0, 0x01}},
{0x23, 0x00, 0x02, {0xcd, 0x01}},
{0x29, 0x14, 0x03, {0xf0, 0xa5, 0xa5}},
/* 4. Common Setting */
/* 4.1 TE(Vync) ON/OFF */
{0x29, 0x00, 0x03, {0x9f, 0xa5, 0xa5}},
{0x15, 0x00, 0x02, {0x35, 0x00}},
{0x29, 0x00, 0x03, {0x9f, 0x5a, 0x5a}},
Первые три шестнадцатеричных байта — Data Type, Delay и Payload Length. Начиная с четвёртого байта идёт полезная нагрузка длиной Payload Length.
- Разбор первой команды:

Первая команда инициализации
/* sleep out */
{0x05, 0x05, 0x01, {0x11}},
Data Type: 0x05 (DCS Short Write)
Delay: 0x05 (5 ms)
Payload Length: 0x01 (1 байт)
Payload: 0x11
- Разбор второй команды:

Вторая команда инициализации
/* FD Setting */
{0x29, 0x00, 0x03, {0xf0, 0x5a, 0x5a}},
Data Type: 0x29 (Generic Long Write)
Delay: 0x00 (0 ms)
Payload Length: 0x03 (3 байта)
Payload: 0xf0 0x5a 0x5a
- Определения Data Type

Типы пакетов от процессора
| Data Type (hex) | Data Type (binary) | Описание | Тип пакета |
|---|---|---|---|
| 0x01 | 00 0001 | Начало V Sync | Короткий |
| 0x11 | 01 0001 | Конец V Sync | Короткий |
| 0x21 | 10 0001 | Начало H Sync | Короткий |
| 0x31 | 11 0001 | Конец H Sync | Короткий |
| 0x08 | 00 1000 | Пакет конца передачи (EoTp) | Короткий |
| 0x02 | 00 0010 | Выключить Color Mode (CM) | Короткий |
| 0x12 | 01 0010 | Включить Color Mode (CM) | Короткий |
| 0x22 | 10 0010 | Выключить периферию | Короткий |
| 0x32 | 11 0010 | Включить периферию | Короткий |
| 0x03 | 00 0011 | Generic Short WRITE, без параметров | Короткий |
| 0x13 | 01 0011 | Generic Short WRITE, 1 параметр | Короткий |
| 0x23 | 10 0011 | Generic Short WRITE, 2 параметра | Короткий |
| 0x04 | 00 0100 | Generic READ, без параметров | Короткий |
| 0x14 | 01 0100 | Generic READ, 1 параметр | Короткий |
| 0x24 | 10 0100 | Generic READ, 2 параметра | Короткий |
| 0x05 | 00 0101 | DCS Short WRITE, без параметров | Короткий |
| 0x15 | 01 0101 | DCS Short WRITE, 1 параметр | Короткий |
| 0x06 | 00 0110 | DCS READ, без параметров | Короткий |
| 0x37 | 11 0111 | Задать максимальный размер ответного пакета | Короткий |
| 0x09 | 00 1001 | Пустой пакет без данных | Длинный |
| 0x19 | 01 1001 | Пакет гашения без данных | Длинный |
| 0x29 | 10 1001 | Generic Long Write | Длинный |
| 0x39 | 11 1001 | Пакет DCS Long Write/write_LUT | Длинный |
| 0x0C | 00 1100 | Неплотно упакованный поток, 20-bit YCbCr, 4:2:2 | Длинный |
| 0x1C | 01 1100 | Упакованный поток, 24-bit YCbCr, 4:2:2 | Длинный |
| 0x2C | 10 1100 | Упакованный поток, 16-bit YCbCr, 4:2:2 | Длинный |
| 0x0D | 00 1101 | Упакованный поток, 30-bit RGB, 10-10-10 | Длинный |
| 0x1D | 01 1101 | Упакованный поток, 36-bit RGB, 12-12-12 | Длинный |

Продолжение типов пакетов
| Data Type (hex) | Data Type (binary) | Описание | Тип пакета |
|---|---|---|---|
| 0x3D | 11 1101 | Упакованный поток, 12-bit YCbCr, 4:2:0 | Длинный |
| 0x0E | 00 1110 | Упакованный поток, 16-bit RGB, 5-6-5 | Длинный |
| 0x1E | 01 1110 | Упакованный поток, 18-bit RGB, 6-6-6 | Длинный |
| 0x2E | 10 1110 | Неплотно упакованный поток, 18-bit RGB, 6-6-6 | Длинный |
| 0x3E | 11 1110 | Упакованный поток, 24-bit RGB, 8-8-8 | Длинный |
| 0xX0 / 0xXF / unspecified | XX 0000 / XX 1111 | НЕ ИСПОЛЬЗОВАТЬ. Неуказанные коды зарезервированы. |
- DCS Write

Типы DCS Write
| Data Type (hex) | Data Type (binary) | Описание | Тип пакета |
|---|---|---|---|
| 0x05 | 00 0101 | DCS Short WRITE, без параметров | Короткий |
| 0x15 | 01 0101 | DCS Short WRITE, 1 параметр | Короткий |
| 0x39 | 11 1001 | Пакет DCS Long Write/write_LUT | Длинный |
Пакет DCS содержит байт команды и n байтов параметров. При n < 2 используется Short Packet: n=0 — только команда, Data Type 0x05; n=1 — один параметр, Data Type 0x15. При n >= 2 используется Long Packet с командой и n параметрами, Data Type 0x39.
- Generic Write

Типы Generic Write
| Data Type (hex) | Data Type (binary) | Описание | Тип пакета |
|---|---|---|---|
| 0x03 | 00 0011 | Generic Short WRITE, без параметров | Короткий |
| 0x13 | 01 0011 | Generic Short WRITE, 1 параметр | Короткий |
| 0x23 | 10 0011 | Generic Short WRITE, 2 параметра | Короткий |
| 0x29 | 10 1001 | Generic Long Write | Длинный |
Generic Packet содержит n байтов параметров. При n < 3 используется Short Packet: n=0 — без параметров, Data Type 0x03; n=1 — один параметр, 0x13; n=2 — два параметра, 0x23. При n >= 3 используется Long Packet с n параметрами, Data Type 0x29.
-
Delay — задержка в ms после текущего пакета перед следующей командой.
-
Payload Length — длина полезной нагрузки пакета.
-
Payload — полезные данные длиной Payload Length.
-
Пример

Регулировка яркости и команды
| Command | R/W | Values | Описание |
|---|---|---|---|
| 0xF0 | W | { 0x5A, 0x5A } | Включить доступ ключа Level2 |
| 0xB0 | W | { 0x07 } | |
| 0xB7 | W | { 0xXX }; /* 0xFF : 255Frames; ~; 0x01 : 1Frame */ | Скорость регулировки яркости |
| 0xF0 | W | { 0xA5, 0xA5 } | Отключить доступ ключа Level2 |
| 0x53 | W | { 0x28 } | WRCTRLD |
| 0x51 | W | { 0xXX, 0xXX }; /* Brightness can control */ | WRDISBV |
/* 5.1 Dimming Setting */
{0x29, 0x00, 0x03, {0xf0, 0x5a, 0x5a}},
{0x23, 0x00, 0x02, {0xb0, 0x07}},
{0x23, 0x00, 0x02, {0xb7, 0x01}},
{0x29, 0x00, 0x03, {0xf0, 0xa5, 0xa5}},
{0x15, 0x00, 0x02, {0x53, 0x28}},
{0x39, 0x00, 0x03, {0x51, 0x03, 0xff}},
7. Инструмент display_test
display_test применим только к RK2108. На других платформах для проверки дисплея используется описанный ниже modetest.
7.1 Поддерживаемые тесты
Команда:
display_test cmd
dsc; winloop; winmove; winalpha; scale; coe; bcsh; gamma; clip; mipi_switch;
ebook; color_bar
| Параметр | Описание |
|---|---|
| winloop | Проверка loop слоя |
| winmove | Проверка перемещения слоя |
| dsc | Частичное обновление с выравниванием DSC панели 2k |
| winalpha | Проверка alpha слоя |
| scale | Проверка последующего масштаба |
| coe | Проверка цветового преобразования; демо 709to2020 |
| bcsh | Проверка яркости, контраста, насыщенности, тона через BCSH |
| gamma | Изменение изображения кривой gamma |
| clip | Проверка clip |
| mipi_switch | Проверка MIPI switch |
| ebook | Демо электронной книги с изображением 1bpp |
| color_bar | Демо циклических цветовых полос |
7.2 Порядок работы демо
- Найдите устройство LCD.
g_display_dev = rt_device_find("lcd");
RT_ASSERT(g_display_dev != RT_NULL);
- Откройте LCD.
ret = rt_device_open(g_display_dev, RT_DEVICE_FLAG_RDWR);
RT_ASSERT(ret == RT_EOK);
- Включите LCD.
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_ENABLE, NULL);
RT_ASSERT(ret == RT_EOK);
- Получите информацию о панели.
ret = rt_device_control(g_display_dev, RTGRAPHIC_CTRL_GET_INFO, (void *)graphic_info);
RT_ASSERT(ret == RT_EOK);
- Инициализируйте win_config и post_scale. Инициализация win_config:
static void display_win_init(struct CRTC_WIN_STATE *win_config)
{
win_config->winEn = true;
win_config->winId = 0;
win_config->zpos = 0;
win_config->format = SRC_DATA_FMT;
win_config->yrgbAddr = (uint32_t)rtt_framebuffer_test;
win_config->cbcrAddr = (uint32_t)rtt_framebuffer_uv;
win_config->yrgbLength = 0;
win_config->cbcrLength = 0;
win_config->xVir = SRC_DATA_W;
win_config->srcX = 0;
win_config->srcY = 0;
win_config->srcW = SRC_DATA_W;
win_config->srcH = SRC_DATA_H;
win_config->crtcX = 0;
win_config->crtcY = 0;
win_config->crtcW = SRC_DATA_W;
win_config->crtcH = SRC_DATA_H;
win_config->xLoopOffset = 0;
win_config->yLoopOffset = 0;
}
Инициализация post_scale для полного экрана без масштабирования:
static void display_post_init(struct CRTC_WIN_STATE *win_config,
struct VOP_POST_SCALE_INFO *post_scale,
struct rt_device_graphic_info *graphic_info)
{
post_scale->srcW = graphic_info->width;
post_scale->srcH = graphic_info->height;
post_scale->dstX = 0;
post_scale->dstY = 0;
post_scale->dstW = graphic_info->width;
post_scale->dstH = graphic_info->height;
}
Инициализация post_scale для частичного обновления с увеличением 2x по горизонтали и вертикали:
static void display_post_init(struct CRTC_WIN_STATE *win_config,
struct VOP_POST_SCALE_INFO *post_scale,
struct rt_device_graphic_info *graphic_info)
{
post_scale->srcW = graphic_info->width / 2;
post_scale->srcH = win_config->srcH;
post_scale->dstX = 0;
post_scale->dstY = 0;
post_scale->dstW = graphic_info->width;
post_scale->dstH = win_config->srcH * 2;
}
- Загрузите палитру LUT для bpp; для других форматов пропустите.
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_LOAD_LUT, &lut_state);
RT_ASSERT(ret == RT_EOK);
- Настройте post_scale: размер данных до масштабирования и отображения после него.
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_SCALE, post_scale);
RT_ASSERT(ret == RT_EOK);
- Настройте сведения о слое win_config.
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_PLANE, win_config);
RT_ASSERT(ret == RT_EOK);
- Примените отображение.
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_COMMIT, NULL);
RT_ASSERT(ret == RT_EOK);
Для одного кадра выполните шаги 1–9. Для нескольких меняйте win_config и post_scale и повторяйте 7, 8, 9.
7.3 Координаты частичного обновления
- Пример для панелей с частичным обновлением по X и Y.

Координаты обновления XY
Красная область — win0 в (X0,Y0), размер (W0,H0). Настройка:
win_config->winId = 0;
win_config->winEn = 1;
……
win_config->srcX = X0;
win_config->srcY = Y0;
win_config->srcW = W0;
win_config->srcH = H0;
Зелёная область — win1 в (X1,Y1), размер (W1,H1). Настройка:
win_config->winId = 1;
win_config->winEn = 1;
……
win_config->srcX = X1;
win_config->srcY = Y1;
win_config->srcW = W1;
win_config->srcH = H1;
Настройка последующего масштабирования:
post_scale->srcW = W1;
post_scale->srcH = H2;
post_scale->dstX = X1;
post_scale->dstY = Y0;
post_scale->dstW = W1;
post_scale->dstH = H2;
В коде сначала настройте последующее масштабирование:
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_SCALE, post_scale);
RT_ASSERT(ret == RT_EOK);
Затем настройте WIN0 и WIN1:
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_PLANE, win_config);
RT_ASSERT(ret == RT_EOK);
Наконец примените отображение:
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_COMMIT, NULL);
RT_ASSERT(ret == RT_EOK);
- Пример обновления только по Y, без поддержки X.

Координаты обновления только Y
Красная область — win0 в (X0,Y0), размер (W0,H0). Настройка:
win_config->winId = 0;
win_config->winEn = 1;
……
win_config->srcX = X0;
win_config->srcY = Y0;
win_config->srcW = W0;
win_config->srcH = H0;
Зелёная область — win1 в (X1,Y1), размер (W1,H1). Настройка:
win_config->winId = 1;
win_config->winEn = 1;
……
win_config->srcX = X1;
win_config->srcY = Y1;
win_config->srcW = W1;
win_config->srcH = H1;
Настройка последующего масштабирования:
post_scale->srcW = Xres;
post_scale->srcH = H2;
post_scale->dstX = 0;
post_scale->dstY = Y0;
post_scale->dstW = Xres;
post_scale->dstH = H2;
Без частичного обновления по X, в отличие от случая 1, ширина источника post scale и dstW равны ширине панели Xres, dstX=0. Остальные шаги те же. Сначала настройте масштабирование:
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_SCALE, post_scale);
RT_ASSERT(ret == RT_EOK);
Затем настройте WIN0 и WIN1:
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_PLANE, win_config);
RT_ASSERT(ret == RT_EOK);
Наконец примените отображение:
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_COMMIT, NULL);
RT_ASSERT(ret == RT_EOK);
8. Инструмент modetest
8.1 Поддерживаемые тесты
modetest [-afgp]
-p <plane_id>:<w>x<h>:<crtc_w>x<crtc_h>[+<x>+<y>][#<zpos>][@<format>] set plane
-f <pattern> specify fill pattern
-a test alpha
-g test gamma
Пример команды:
modetest -p 0:720x1280:720x1280@AR24 -a -g
9. Color Key
VOP может сделать выбранный цвет слоя полностью прозрачным, открывая следующий слой или фон. Драйвер использует win_config.colorKey: биты [23,0] содержат компоненты RGB, bit24 включает/выключает функцию. В примерах RGB888 и RGB565 R_VAL, G_VAL, B_VAL — компоненты прозрачного цвета.
#define COLOR_KEY_EN BIT(24)
9.1 Color Key для RGB888
- Полная прозрачность красного:
win_config->colorKey = 0xFF0000 | COLOR_KEY_EN;
- Полная прозрачность зелёного:
win_config->colorKey = 0x00FF00 | COLOR_KEY_EN;
- Полная прозрачность синего:
win_config->colorKey = 0x0000FF | COLOR_KEY_EN;
То есть:
win_config->colorKey = (R_VAL << 16) | (G_VAL << 8) | (B_VAL) | COLOR_KEY_EN;
9.2 Color Key для RGB565
- Полная прозрачность красного:
win_config->colorKey = 0xF80000 | COLOR_KEY_EN;
- Полная прозрачность зелёного:
win_config->colorKey = 0x00FC00 | COLOR_KEY_EN;
- Полная прозрачность синего:
win_config->colorKey = 0x0000F8 | COLOR_KEY_EN;
То есть:
R_VAL_CONFIG = R_VAL << 3; //R[4,0] -> R[7,0]
G_VAL_CONFIG = G_VAL << 2; //G[5,0] -> G[7,0]
B_VAL_CONFIG = B_VAL << 3; //B[4,0] -> B[7,0]
win_config->colorKey = (R_VAL_CONFIG << 16) | (G_VAL_CONFIG << 8) | B_VAL_CONFIG | COLOR_KEY_EN;
9.3 Отключение Color Key
win_config->colorKey = 0;
10. Обновление LUT
Для LUT слоя нужен lut_en. После включения LUT защищена и её регистры недоступны для чтения/записи. Изменение lut_en вступает в силу по кадру. При смене сценария обновляйте LUT так:
- Отключите LUT. (1) Установите формат не bpp, исключая:
RTGRAPHIC_PIXEL_FORMAT_GRAY1
RTGRAPHIC_PIXEL_FORMAT_GRAY4,
RTGRAPHIC_PIXEL_FORMAT_GRAY16,
RTGRAPHIC_PIXEL_FORMAT_GRAY256,
RTGRAPHIC_PIXEL_FORMAT_RGB332,
(2) Отключите все слои и обновите изображение 32x32 в месте без отображаемого содержимого. Размер не фиксирован: нужен невидимый кадр, применяющий отключение lut_en без изменения текущего изображения.
-
Обновите массив LUT и вызовите RK_DISPLAY_CTRL_LOAD_LUT.
-
Настройте новый кадр: задайте win соответствующий формат bpp и обновите кадр. Новая LUT вступит в силу.
11. Справочные документы
-
Rockchip DRM Display Driver Development Guide
-
Rockchip_DRM_Panel_Porting_Guide.pdf
