Платформа R128 предоставляет интерфейс SPI TFT ACCC SPI DBI, который имеет следующие функции:
В то же время для экранов SPI предусмотрена среда драйверов SPILCD.
Конфигурация менюconfig модуля SPILCD следующая (на примере экрана kld2844b):
Drivers Options --->
soc related device drivers --->
SPILCD Devices --->
[*] DISP Driver Support(spi_lcd)
[*] spilcd hal APIs test //spilcdТестовые примеры модулей
LCD_FB panels select ---> //spilcd screendriveConfiguration
[*] LCD support kld2844B panel
[ ] LCD support kld35512 panel
Board select --->
[ ] board kld2844b support //Отображение уровня платыиспользоватьдрайвер приватный режим дисплея из элемента Конфигурация, в то время как режим Usesys_config.fex не использует Конфигурацию
Другие элементы конфигурации, на которые, возможно, придется положиться, включают:
Структура исходного кода и основные файлы драйверов следующие:
spilcd/
├── lcd_fb/
│ ├── dev_lcd_fb.c # spilcd driver слой
│ ├── disp_display.c
│ ├── disp_lcd.c
│ ├── lcd_fb_intf.c
│ └── panels/ # ЖК-драйвер, связанный
│ ├── kld2844b.c
│ ├── lcd_source.c
│ ├── panels.c
│ └── panels.h
└── soc/
├── disp_board_config.c # Уровень совета Конфигурацияанализировать └── kld2844b_config.c # Показать приватный режим на уровне платы Файлы конфигурации
Текущий дисплей уровня платы поддерживает два метода настройки. Один из них — использование. sys_config.fex
изспособ Конфигурация,Во-вторых, он не поддерживаетsys_config.fex
В этом случае вы можете настроить его, сделав драйвер дисплея частным. Эти два метода описаны ниже.
FreeRTOSсистемный путь:имя платы/чипа/имя решения/configs/sys_config.fex
Конкретный файл конфигурации зависит от фактического используемого решения чипа. Имя файла конфигурации также может быть sys_config_xxx.fex (xx — идентификатор решения хранилища, например sys_config_nor.cfg, sys_config_nand.cfg).
Конкретные примеры конфигурации следующие:
;----------------------------------------------------------------------------------
;lcd_fb0 configuration
;----------------------------------------------------------------------------------
[lcd_fb0]
lcd_used = 1 ; использовать Отображать
lcd_model_name = "spilcd" ; Модель: spilcd
lcd_driver_name = "jlt35031c" ; Драйвер экрана: jlt35031c
lcd_x = 320 ; разрешение ширины экрана
lcd_y = 480 ; Экран высокого разрешения
lcd_width = 49 ; физическая ширина экрана
lcd_height = 74 ; Физическая высота экрана
lcd_data_speed = 60 ; SPI Частота привода 60MHz
lcd_pwm_used = 1 ; lcdisпользовать ШИМ подсветку
lcd_pwm_ch = 1 ; lcdisпользовать ШИМ 1 канал преступный мир
lcd_pwm_freq = 5000 ; lcdisпользовать ШИМ подсветкучастота5000Hz
lcd_pwm_pol = 0 ; lcdisпользовать ШИМ подсветку Фаза0
lcd_if = 0 ; lcdиспользоватьspiинтерфейс,0-spi, 1-dbi
lcd_pixel_fmt = 11
lcd_dbi_fmt = 2
lcd_dbi_clk_mode = 1
lcd_dbi_te = 1
fb_buffer_num = 2
lcd_dbi_if = 4
lcd_rgb_order = 0
lcd_fps = 60
lcd_spi_bus_num = 1
lcd_frm = 2
lcd_gamma_en = 1
lcd_backlight = 100
lcd_power_num = 0
lcd_gpio_regu_num = 0
lcd_bl_percent_num = 0
lcd_spi_dc_pin = port:PA19<1><0><3><0> ; Нога постоянного тока
;RESET Pin
lcd_gpio_0 = port:PA20<1><0><2><0> ; Сброс PIN-кода
Lcdдрайвер экранаизимя(нить),Должен быть подключен к драйверу экранасерединаstrcut __lcd_panel
переменнаяизname
Члены единодушны。
Название модели ЖК-экрана не является обязательным и может использоваться в одном и том же драйвере экрана для дальнейшего различения разных экранов.
Lcd Interface
Соответствующее значение установки соответствующего значения:
0:spiинтерфейс
1:dbiинтерфейс
spi
интерфейс Это общее имяиз4Линейный режим,Это потому, чтодля Требуется дополнительная помощь при отправке данныхDC
линии для различения команд и данных,иsclk
,cs
иsda
Всего четыре строки。
Если установленоdbi
интерфейс,Тогда нам нужно еще различатьdbi
интерфейс,Нужно установить lcd_dbi_if
Настройки интерфейса LCD dbi.
Этот параметр доступен только в том случае, еслиlcd_if=1
Действительно только тогда, когда。
Соответствующее значение установки соответствующего значения:
0:L3I1
1:L3I2
2:L4I1
3:L4I2
4:D2LI
Количество бит за такт при отправке данных во всех режимах варьируется в зависимости от формата пикселя.
L3I1
иL3I2
это три Линейный режим(ненужныйDC
ступня),Разница заключается во времени чтения.,То есть нужны ли дополнительные выводы для чтения регистра. Временная диаграмма чтения и записи выглядит следующим образом:
L4I1
иL4I2
Это четыре Линейный режим,То же, что и соглашение о спиинтерфейсе.,Разница в том, что постоянного токиз Контроль, контролируется ли он автоматически,кроме тогоI2иI1из Разница заключается во времени чтения.,То есть нужны ли дополнительные выводы для чтения регистра.
D2LI
это дваdata laneмодель。Отправить командучастьчаспоследовательностьичитатьчаспоследовательностьиL3I1
последовательный,На рисунке ниже показана временная последовательность при отправке данных.,Количество тактов различно для разных форматов пикселей.
DBI
интерфейс Формат пикселей。
0:RGB111
1:RGB444
2:RGB565
3:RGB666
4:RGB888
выбиратьиз Основой является приемный конечный экранDriver IC
из Статус поддержки,пожалуйста, проверьтеDriver IC
Вручную или обратитесь к производителю экрана.。
Тогда вам придется сотрудничатьlcd_pixel_fmt
извыбирать,Например, при выборе RGB565,lcd_pixel_fmt
Также выберите565Формат。
Включите триггер.
te означает (эффект разрыва), что означает разрыв. Из-за различий в чтении и письме происходит разрыв. Функция стопы - синхронизировать чтение и запись. Частота стопы - это частота обновления экрана, поэтому стопа может. Также может использоваться как ножка vsync (ножка вертикальной синхронизации).
0: Запрещенный
1: Триггер по заднему фронту
2: Триггер по нарастающему фронту
Дополнительные инструкции см. в разделе «Экран с ножками».
Выберите режим поведения часов dbi.
0: Автоматическая остановка. Если есть данные, будут часы. Если данные не отправляются, часов не будет.
1: Всегда держите. Часы есть независимо от того, отправляются данные или нет.
Обратите внимание, что приведенные выше параметры относятся к совместимости экрана.
Настройки распознавания последовательности входных данных изображения RGB, действительны только при lcd_if=1.
0:RGB
1:RBG
2:GRB
3:GBR
4:BRG
5:BGR
6:G_1RBG_0
7:G_0RBG_1
8:G_1BRG_0
9:G_0BRG_1
Для формата, отличного от RGB565, используйте значения от 0 до 5.
Описание формата rgb565 выглядит следующим образом:
Формат rgb565 может столкнуться с большими и малыми проблемами с порядком байтов. Платформа Arm и платформа хранения ПК имеют прямой порядок байтов (младшие байты размещаются по младшим адресам, старшие байты размещаются по старшим адресам), но многие экраны SPI по умолчанию используют обратный порядок байтов (Big). Эндиан).
То есть сохраненный порядок байтов не соответствует отправленному порядку байтов.
В это время выберите 6 или ниже, и интерфейс DBI автоматически преобразует прямой порядок байтов в обратный порядок байтов.
Если вы столкнулись с экраном spi, в котором по умолчанию используется прямой порядок байтов, вам нужно выбрать 6 или выше, и интерфейс DBI автоматически вернется в режим прямого порядка байтов.
6 Вышеупомянутый формат объясняется следующим образом:
R — 5 бит, G — 6 бит, B — 5 бит, а затем разделите G на старшие 3 бита (G_1) и младшие 3 бита (G_0). Итак, следующие два заказа:
Количество пикселей по горизонтали на экране дисплея. Обратите внимание: если экран поддерживает горизонтальное и вертикальное вращение, lcd_x и lcd_y также необходимо поменять местами.
Количество строк дисплея. Обратите внимание: если экран поддерживает горизонтальное и вертикальное вращение, lcd_x и lcd_y также необходимо поменять местами.
Используется для установки тактовой частоты интерфейса SPI/DBI в МГц.
Установите частоту обновления экрана в Гц. Если lcd_dbi_te включен, этот параметр значения недействителен.
Использовать ли ШИМ.
Этот параметр определяет, использовать ли ШИМ для управления яркостью подсветки.
Pwm channel used
Этот параметр определяет используемый канал ШИМ.
Lcd backlight PWM Frequency
Этот параметр настраивает частоту сигнала ШИМ в Гц.
Lcd backlight PWM Polarity
Этот параметр настраивает полярность рабочего цикла сигнала ШИМ. Соответствующее значение установки соответствующего значения:
0:active high
1:active low
Lcd backlight PWM
Максимальный предел, выраженный в значениях яркости.
Например, 150 означает, что подсветку можно регулировать только до 150, а значение яркости в диапазоне от 0 до 255 будет линейно отображаться в диапазоне от 0 до 150. Используется для управления максимальной яркостью подсветки и экономии энергопотребления.
Значение подсветки по умолчанию находится в диапазоне от 0 до 255. Чем больше значение, тем ярче.
Определение контакта включения подсветки
Обозначается как контакт постоянного тока при использовании для интерфейса spi.
х представляет число. Если необходимо контролировать несколько контактов gpio, определите lcd_gpio_0, lcd_gpio_1 и т. д.
Выберите идентификатор шины spi Только spi1 поддерживает протокол DBI, поэтому здесь обычно выбирается 1.
Диапазон значений: от 0 до 1.
Выберите формат пикселей для передаваемых данных.
Необязательные значения следующие: Когда вы меняете порядок компонентов RGB, вы также должны соответствующим образом изменить lcd_rgb_order или изменить порядок компонентов RGB драйвера экрана (обычно регистр 3Ah).
Интерфейс DBI поддерживает только RGB32 и RGB16.
Интерфейс SPI поддерживает только RGB16.
enum lcdfb_pixel_format {
LCDFB_FORMAT_ARGB_8888 = 0x00, // MSB A-R-G-B LSB
LCDFB_FORMAT_ABGR_8888 = 0x01,
LCDFB_FORMAT_RGBA_8888 = 0x02,
LCDFB_FORMAT_BGRA_8888 = 0x03,
LCDFB_FORMAT_XRGB_8888 = 0x04,
LCDFB_FORMAT_XBGR_8888 = 0x05,
LCDFB_FORMAT_RGBX_8888 = 0x06,
LCDFB_FORMAT_BGRX_8888 = 0x07,
LCDFB_FORMAT_RGB_888 = 0x08,
LCDFB_FORMAT_BGR_888 = 0x09,
LCDFB_FORMAT_RGB_565 = 0x0a,
LCDFB_FORMAT_BGR_565 = 0x0b,
LCDFB_FORMAT_ARGB_4444 = 0x0c,
LCDFB_FORMAT_ABGR_4444 = 0x0d,
LCDFB_FORMAT_RGBA_4444 = 0x0e,
LCDFB_FORMAT_BGRA_4444 = 0x0f,
LCDFB_FORMAT_ARGB_1555 = 0x10,
LCDFB_FORMAT_ABGR_1555 = 0x11,
LCDFB_FORMAT_RGBA_5551 = 0x12,
LCDFB_FORMAT_BGRA_5551 = 0x13,
};
Отображает количество кадровых буферов. Для плавного отображения обычно равно 2. Его также можно изменить на 1 для экономии памяти.
Некоторые экраны поддерживают передачу данных по двум линиям для ускорения передачи данных. В этом случае необходимо использовать протокол DBI. Типичная конфигурация следующая:
[lcd_fb0]
lcd_used = 1
lcd_driver_name = "kld2844b"
lcd_if = 1
lcd_dbi_if = 4
lcd_data_speed = 60
lcd_spi_bus_num = 1
lcd_x = 320
lcd_y = 240
lcd_pwm_used = 1
lcd_pwm_ch = 4
lcd_pwm_freq = 5000
lcd_pwm_pol = 0
lcd_pixel_fmt = 0
lcd_dbi_fmt = 3
lcd_rgb_order = 0
fb_buffer_num = 2
lcd_backlight = 200
lcd_fps = 60
lcd_dbi_te = 0
lcd_bl_en = port:PB04<1><0><default><1>
lcd_gpio_0 = port:PB02<1><0><default><1>
Если микросхема поддерживает интерфейс DBI, нет необходимости использовать интерфейс SPI. Протокол интерфейса DBI может охватывать все ситуации.
Некоторые микросхемы не поддерживают DBI, поэтому вы можете использовать только интерфейс spi (установив lcd_if). Если вы используете интерфейс spi, у него есть некоторые ограничения.
[lcd_fb0]
lcd_used = 1
lcd_driver_name = "kld2844b"
lcd_if = 0
lcd_data_speed = 60
lcd_spi_bus_num = 1
lcd_x = 320
lcd_y = 240
lcd_pwm_used = 1
lcd_pwm_ch = 4
lcd_pwm_freq = 5000
lcd_pwm_pol = 0
lcd_pixel_fmt = 10
lcd_rgb_order = 0
fb_buffer_num = 2
lcd_backlight = 200
lcd_fps = 60
lcd_dbi_te = 0
lcd_bl_en = port:PB04<1><0><default><1>
lcd_gpio_0 = port:PB02<1><0><default><1>
lcd_spi_dc_pin = port:PA19<1><0><3><1>
te означает (эффект разрыва), что означает разрыв. Это явление разрыва, вызванное асинхронным чтением и записью. Функция стопы — синхронизировать чтение и запись. Частота стопы — это частота обновления экрана. te foot. Ее также можно рассматривать как ножку vsync (ножку вертикальной синхронизации).
[lcd_fb0]
lcd_used = 1
lcd_driver_name = "kld2844b"
lcd_if = 1
lcd_dbi_if = 4
lcd_data_speed = 60
lcd_spi_bus_num = 1
lcd_x = 320
lcd_y = 240
lcd_pwm_used = 1
lcd_pwm_ch = 4
lcd_pwm_freq = 5000
lcd_pwm_pol = 0
lcd_pixel_fmt = 0
lcd_dbi_fmt = 3
lcd_rgb_order = 0
fb_buffer_num = 2
lcd_backlight = 200
lcd_fps = 60
lcd_dbi_te = 1
lcd_bl_en = port:PB04<1><0><default><1>
lcd_gpio_0 = port:PB02<1><0><default><1>
// Преобразовать в альбомную ориентацию
sunxi_lcd_cmd_write(sel, 0x36);
sunxi_lcd_para_write(sel, 0xa0);
Частота обновления экрана ограничена многими аспектами:
Нет необходимости отправлять альфа-канал, когда SPI/DBI отправляет данные, но уровень приложения имеет соответствующий альфа-канал, например, в формате ARGB8888.
В это время аппаратное обеспечение будет автоматически обрабатывать альфа-канал за нас, поэтому, когда lcd_pixel_fmt выбирает формат с альфа-каналом, lcd_dbi_fmt может выбрать rgb666 или rgb888, которые не обязательно должны быть одинаковыми.
Если имеется несколько источников питания, просто используйте lcd_power1, lcd_power2... а затем вызовите интерфейс sunxi_lcd_power_enable в драйвере экрана.
lcd_bl_en, lcd_spi_dc_pin и lcd_gpio_x относятся к типам атрибутов GPIO.
Ниже в качестве примера используется lcd_spi_dc_pin, чтобы конкретно объяснить значение значений параметров атрибутов GPIO:
lcd_spi_dc_pin = port:PA19<1><0><3><1>
Описание контакта: порт: порт < Функция повторного использования >< Потяните вверх и вниз >< способность вождения >< Выходное значение >
Конкретные значения пяти полей в правой части уравнения слева направо следующие:
PA19
:порт,выражатьGPIOТрубкаступня。PA
выражатьPA组Трубкаступня,19
выражать Нет.19根Трубкаступня;Прямо сейчасPA19Трубкаступня。<1>
:Функция повторного использования,Указывает тип мультиплексирования GPIO. 1 означает выбор общей функции GPIO PA19.,0длявхода,1для вывода.<0>
:Потяните вверх и вниз означает встроенное сопротивление. использовать0из, что указывает на высокое состояние внутреннего сопротивления, в случае 1 это подтягивание внутреннего резистора,2 представляет собой понижение внутреннего резистора. Остальные данные недействительны.<3>
:выражатьспособность вождения. 1 — уровень по умолчанию, чем выше номер способности. вождение сильнее, максимум 3.<1>
:выражать Значение выходного уровня по умолчанию。0длянизкий уровень,1для высокого уровня.g_lcd1_config
,Конфигурация аналогична g_lcd0_config),Его серединаlcd_spi_bus_num не может быть одинаковым.Модуль spilcd использует spi, dbi, pwm и другие драйверы.
путь:rtos-hal/hal/source/spilcd/soc/
Конкретные файлы конфигурации дисплея на уровне платы см. kld2844b_config.c
файл конфигурации.
Этот файл имитирует sys_config.fex
Приходить Конфигурация Некоторый Уровень совета Связанныйизресурс,исходный файлсерединанужно определение4общая ситуацияпеременная:g_lcd0_config
、g_lcd1_config
、g_lcd0_config_len
иg_lcd1_config_len
,И имя переменной фиксировано,Невозможно изменить.
Конкретные инструкции заключаются в следующем:
g_lcd0_config
:первый экраниз Конфигурацияпеременная,struct property_t
тип данных。g_lcd1_config
:второй экраниз Конфигурацияпеременная,struct property_t
тип данных。g_lcd0_config_len
иg_lcd1_config_len
соответствуетначальство Два массивапеременнаяиздлина,Просто скопируйте его.struct property_t
тип данных,Используется для определения атрибута информации:
name
,нить。type
,смотретьenum proerty_type
изопределение,Есть целые числа,нить,GPIO,Отдельный контакт и источник питания.union
серединачлен Приходить Назначение。Примеры вышеупомянутых часто используемых типов атрибутов:
Целочисленный тип:
{
.name = "lcd_used",
.type = PROPERTY_INTGER,
.v.value = 1,
},
Нить:
{
.name = "lcd_driver_name",
.type = PROPERTY_STRING,
.v.str = "kld2844b",
},
GPIO:
{
.name = "lcd_spi_dc_pin",
.type = PROPERTY_GPIO,
.v.gpio_list = {
.gpio = GPIOA(19),
.mul_sel = GPIO_DIRECTION_OUTPUT,
.pull = 0,
.drv_level = 3,
.data = 1,
},
},
Значение g_lcd0_config соответствует вышеупомянутому lcd_fb0 в методе sys_config.fex.
Расположение исходного кода драйвера экрана:
rtos-hal/hal/source/spilcd/lcd_fb/panels
strcut __lcd_panel
переменнаяизимя,ки этопеременнаячленname
изимя,этотимядолжени sys_config.fex
середина [lcd_fb0]
(или Уровень совета Конфигурациядокументсерединаg_lcd0_config
)изlcd_driver_name
последовательный。
panel.c
иpanel.h
。существоватьглобальная структурапеременнаяpanel_array
середина Новое Только что добавленоstrcut __lcd_panel
изпеременнаяуказатель。panel.h
середина Новыйstrcut __lcd_panel
иззаявление。и заключен в макросы Приходить。
rtos-hal/hal/source/spilcd/lcd_fb/panels/Kconfig
,Добавить новую конфигурацию,Соответствует третьему пункту, упомянутому в макросе.rtos-hal/hal/source/spilcd/lcd_fb/
путь ВнизизMakefileдокумент。Даватьlcd_fb-objпеременная Новый Только что присоединилсяизисходный файлпереписываться.o
。
g_lcd0_config
Конфигурацияпеременная)подизсвойство
LCD_open_flow
,LCD_close_flow
,LCD_panel_init
,LCD_power_on
ждатьфункция
Процесс работы переключения экрана показан на рисунке ниже.
Среди них LCD_open_flow и LCD_close_flow называются функциями процесса переключения экрана. Эта функция использует LCD_OPEN_FUNC для регистрации функции обратного вызова и ее выполнения. Вы можете зарегистрировать несколько функций, не ограничивая их количество.
Функция: инициализация шагов по открытию экрана.
прототип:
static __s32 LCD_open_flow(__u32 sel)
Часто используемые функции:
static __s32 LCD_open_flow(__u32 sel)
{
LCD_OPEN_FUNC(sel, LCD_power_on,10);
LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
LCD_OPEN_FUNC(sel, lcd_fb_black_screen, 100);
LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
return 0;
}
Как указано выше, инициализация всего процесса открытия экрана состоит из четырех шагов:
LCD_open_flow
Функция будет вызываться только один раз во время инициализации системы и выполняет каждый раз. LCD_OPEN_FUNC
Прямо сейчасда把переписыватьсяиз Зарегистрируйте функцию шага открытия экрана,Функция шага открытия экрана не выполняется немедленно.。LCD_open_flowфункцияиз Контент должен использоваться единообразно LCD_OPEN_FUNC(sel, function, delay_time)
Выполните регистрацию функции, чтобы обеспечить нормальную регистрацию на этапе открытия экрана.
Второй параметр LCD_OPEN_FUNC — это длительность задержки двух шагов до и после, в мс. Обратите внимание, что значение здесь должно быть заполнено в соответствии с правилами руководства по экрану. Случайное заполнение может привести к некорректной инициализации экрана или к сбою. долго включать и выключать экран, что влияет на удобство использования.
Функция: Инициализировать пошаговый процесс выключения экрана.
прототип:
static __s32 LCD_close_flow(__u32 sel)
Часто используемые функции:
static __s32 LCD_close_flow(__u32 sel)
{
LCD_CLOSE_FUNC(sel, LCD_bl_close, 50);
LCD_CLOSE_FUNC(sel, LCD_panel_exit, 10);
LCD_CLOSE_FUNC(sel, LCD_power_off, 10);
return 0;
}
Функция: зарегистрировать функцию шага открытия экрана в процессе открытия экрана. Помните, что это регистрация, а не выполнение!
прототип:
void LCD_OPEN_FUNC(__u32 sel, LCD_FUNC func, __u32 delay)
Описание параметра:
func — это указатель на функцию,Его тип:void (*LCD_FUNC) (__u32 sel)
,Пользовательские функции также должны использовать унифицированную форму. например:
void user_defined_func(__u32 sel)
{
//do something
}
задержка — время задержки после выполнения этого шага, единица времени — миллисекунды.
Это первый шаг в процессе открытия экрана. Обычно в этой функции sunxi_lcd_gpio_set_value используется для управления GPIO, а функция sunxi_lcd_power_enable используется для включения питания.
См. последовательность включения питания в руководстве по экрану.
Это второй шаг процесса открытия экрана. Обычно sunxi_lcd_cmd_write и sunxi_lcd_para_write используются для инициализации регистра экрана.
Пожалуйста, обратитесь к производителю экрана за кодом регистра инициализации или самостоятельно изучите руководство по микросхеме драйвера экрана.
Необходим интерфейс, передающий на экран полностью черные данные, иначе при включении подсветки появится экран-снежинка.
Это включение подсветки, фиксированный вызов.
Это отключает подсветку. Следующие две функции вызываются постоянно:
Это последний шаг в процессе отключения экрана. Обычно в этой функции sunxi_lcd_gpio_set_value используется для управления GPIO, а функция sunxi_lcd_power_enable используется для включения питания.
См. последовательность выключения питания в руководстве по экрану.
функция:sunxi_lcd_delay_ms/sunxi_lcd_delay_us
Функция: функция задержки, соответственно задержка уровня миллисекунды/микросекунды.
прототип:s32 sunxi_lcd_delay_ms(u32 ms); / s32 sunxi_lcd_delay_us(u32 us);
функция:sunxi_lcd_backlight_enable/ sunxi_lcd_backlight_disable
Функция: включение/выключение подсветки, операция lcd_bl_en.
прототип:
void sunxi_lcd_backlight_enable(u32 screen_id);
void sunxi_lcd_backlight_disable(u32 screen_id);
функция:sunxi_lcd_pwm_enable / sunxi_lcd_pwm_disable
Функция: включение/выключение ШИМ-контроллера. При включении ШИМ будет выводить сигнал ШИМ. Соответствует ШИМ, соответствующему lcd_pwm_ch.
прототип:
s32 sunxi_lcd_pwm_enable(u32 screen_id);
s32 sunxi_lcd_pwm_disable(u32 screen_id);
функция:sunxi_lcd_power_enable / sunxi_lcd_power_disable
Функция: включение/выключение питания ЖК-дисплея,действоватьизда Уровень совета Конфигурациядокументвlcd_power/lcd_power1/lcd_power2
。(pwr_idОпределить индекс мощности)。
прототип:
void sunxi_lcd_power_enable(u32 screen_id, u32 pwr_id);
void sunxi_lcd_power_disable(u32 screen_id, u32 pwr_id);
функция:sunxi_lcd_cmd_write
Функция: используйте spi/dbi для отправки команд.
прототип:s32 sunxi_lcd_cmd_write(u32 screen_id, u8 cmd);
функция:sunxi_lcd_para_write
Функция: используйте spi/dbi для отправки параметров.
прототип:s32 sunxi_lcd_para_write(u32 screen_id, u8 para);
функция:sunxi_lcd_gpio_set_value
Функция: PIN-вывод LCD_GPIO выдает высокий или низкий уровень.
прототип:s32 sunxi_lcd_gpio_set_value(u32 screen_id, u32 io_index, u32 value);
Описание параметра:
Используется только тогда, когда GPIO определен как выход.
функция:sunxi_lcd_gpio_set_direction
Функция: установите PIN-код LCD_GPIO в режим ввода или вывода.
прототип:
s32 sunxi_lcd_gpio_set_direction(u32 screen_id, u32 io_index, u32 direction);
Описание параметра:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <hal_cache.h>
#include <hal_mem.h>
#include <hal_log.h>
#include <hal_cmd.h>
#include <hal_lcd_fb.h>
static uint32_t width;
static uint32_t height;
static long int screensize = 0;
static char *fbsmem_start = 0;
static void lcdfb_fb_init(uint32_t yoffset, struct fb_info *p_info)
{
p_info->screen_base = fbsmem_start;
p_info->var.xres = width;
p_info->var.yres = height;
p_info->var.xoffset = 0;
p_info->var.yoffset = yoffset;
}
int show_rgb(unsigned int sel)
{
int i = 0, ret = -1;
struct fb_info fb_info;
int bpp = 4;
unsigned char color[4] = {0xff,0x0,0xff,0x0};
width = bsp_disp_get_screen_width(sel);
height = bsp_disp_get_screen_height(sel);
screensize = width * bpp * height;
fbsmem_start = hal_malloc_coherent(screensize);
hal_log_info("width = %d, height = %d, screensize = %d, fbsmem_start = %x\n",
width, height, screensize, fbsmem_start);
memset(fbsmem_start, 0, screensize);
for (i = 0; i < screensize / bpp; ++i) {
memcpy(fbsmem_start+i*bpp, color, bpp);
}
memset(&fb_info, 0, sizeof(struct fb_info));
lcdfb_fb_init(0, &fb_info);
hal_dcache_clean((unsigned long)fbsmem_start, screensize);
bsp_disp_lcd_set_layer(sel, &fb_info);
hal_free_coherent(fbsmem_start);
return ret;
}
static int cmd_test_spilcd(int argc, char **argv)
{
uint8_t ret;
hal_log_info("Run spilcd hal layer test case\n");
ret = show_rgb(0);
hal_log_info("spilcd test finish\n");
return ret;
}
FINSH_FUNCTION_EXPORT_CMD(cmd_test_spilcd, test_spilcd, spilcd hal APIs tests)
Тестовая команда:
test_spilcd
Результаты испытаний:
1. Если ЖК-дисплей имеет формат пикселей ARGB8888, после выполнения команды отобразится фиолетовая рамка.
2. Если ЖК-дисплей имеет формат пикселей RGB565, после выполнения команды (SPI Соглашение имеет желтую картинку (без РБ). Swap))
Инициализация экрана прошла успешно, общее явление — экран-снежинка. Потому что в драйвере экрана, в LCD_open_flow
серединадобавленlcd_fb_black_screen
иззарегистрироваться,Поэтому в обычных условиях при включении компьютера присутствует подсветка и черный экран.
Обычно конфигурация источника питания или ШИМ настроена неправильно. Обратитесь к соответствующей конфигурации в начале lcd_pwm.
Действия по устранению неполадок:
test_spilcd
,если сможешь Нормальный Цветной экран загорается, что указывает на то, что канал отображения работает нормально, но приложению не удалось правильно отправить изображение через интерфейс. Если тестовый пример не может быть выполнен Нормальный цветной экран, выполните следующие действия.LCD_open_flow
серединаудалитьlcd_fb_black_screen
иззарегистрироваться,После запуска,Если инициализация экрана прошла успешно, он должен находиться в размытом состоянии (это относится к большинству экранов).Вполне возможно, что скорость слишком высокая, см. раздел «Контроль частоты кадров».
По мере отправки данных изображение становится все больше и больше.
Попробуйте изменить lcd_dbi_clk_mode.
экран белый, но подсветка включена
Белый экран вызван тем, что экран не был инициализирован. Необходимо проверить правильность последовательности инициализации экрана или данных инициализации.
Размытие экрана, неуправляемое
Huaping обычно вызван неправильной настройкой экрана после инициализации. addrwin
,или Ошибка последовательности инициализации.
Появляется обратный цвет, цвет ненормальный
Пожалуйста, настройте LVGL LV_COLOR_DEPTH
Параметры 16,LV_COLOR_16_SWAP
для 1. Это вызвано SPI LCD определяется его характеристиками.
бегать test_spilcd
, экран станет синим.
Это связано с активацией экрана RB СВОП, обычно 0x36
Зарегистрировать модификацию
Нормальный дисплей
sunxi_lcd_cmd_write(sel, 0X36);
sunxi_lcd_para_write(sel, 0x00);
Отображение в обратном цвете
sunxi_lcd_cmd_write(sel, 0X36);
sunxi_lcd_para_write(sel, 0x08);
Это связано с LVGL настроен LV_COLOR_DEPTH
для 32, но SPI Конфигурация экрана для 16 бит. Пожалуйста, измените lv_conf.h
address
Функция правильная?sys_config.fex
Разрешение экрана правильное?Отладка ЖК-дисплея на самом деле представляет собой процесс отладки микросхемы передатчика (Allwinner SOC) и микросхемы приемника (ИС драйвера на ЖК-экране):
Прежде всего, необходимо сначала определить, использует ли дисплей интерфейс SPI или интерфейс DBI. Различные интерфейсы имеют разные способы анализа входных данных.
Полное имя интерфейса DBI: Display Bus Serial Interface
, в паспорте дисплея середина обычно указано, что это SPI-интерфейс, поэтому некоторые люди могут ошибочно подумать, что для SPI-экрана можно использовать normal spi
Перейти на прямой привод.
читатьlcd_dbi_if
частьиз Введение может знать,В 3-проводном режиме,Перед отправкой команды имеется 1 бит A0, указывающий, что текущая отправка представляет собой данные.,Еще заказ. А данные, следующие за командой, не имеют бита А0.,Указывает, что SPI необходимо переключаться между 9-битным и 8-битным режимами.,И при чтении данных,Требуется еще большая задержка dummy clock
читать данные,normal spi
Все это трудно или даже невозможно достичь. так normal spi
Можно моделировать только 4 Операции записи строки DBI.
Для процессоров, таких как R128, которые поддерживают интерфейсы DBI, вы можете не понимать SPI. Если вам нужно использовать SPI для управления дисплеем, вы должны установить для дисплея прямой порядок байтов.
Дисплеи SPI обычно поддерживают RGB444, RGB565. и RGB666, RGB444использовать сравнительно редко, поэтому мы обсуждаем только RGB565. и RGB666.
RGB565 представляет цвет точки, состоящей из 2 байтов, то есть R (красный) представлен 5 битами, G (зеленый) представлен 6 битами, а B (синий) представлен 5 битами, как показано на рисунке. следующий рисунок:
Цвет точки в RGB666 состоит из 3 байтов, каждый байт представляет цвет, а младшие 2 бита каждого байта игнорируются, как показано на следующем рисунке:
Потому что эффективность связи дляSPIинтерфейса невысока.,Поэтому рекомендуется использовать дисплей RGB565из,к jlt35031c
Экран дисплея для примера, он же издрайвер чип чипа ST7789
,настраиватьпоказывать Форматиз Путь в том, чтобы 3a
зарегистрироватьсяписать0x55(RGB565
)или 0x66(RGB666)
,существовать R128SDK
в, уже jlt35031c
из Формат связи жестко запрограммирован для 0x55
,lcd_pixel_fmt
Конфигурация Неверный вариант:
sunxi_lcd_cmd_write(sel, 0x3a);
sunxi_lcd_para_write(sel, 0x55);
В программе входные данные 0xff,0x00,0xff,0x00
,дляSPIинтерфейс,Он отправляется байтами. на самом деле,Подпрограмме необходимо каждый раз отправлять только 2 байта.,потому чтодля Отправить вперед и впередизвсе равноизff 00, поэтому проблем не наблюдается.
В соответствии с 565
Для анализа данных мы разделили ff 00
Вы можете получить красный компонент как 0b11111
,То есть 31
,зеленый это0b111000
,То есть 56
,,синий это 0
.Мы эквивалентно преобразуем в RGB888
,иметь:
R = 31/31*255 = 255
G = 56/63*255 = 226
Введите соответствующий цвет в палитру, чтобы получить желтый
потому чтодля DBI
Эффективность связи высока, поэтому ее можно использовать RGB565
или RGB666
,использовать DBI
интерфейс, то есть lcd_if
настраиватьдля1
час,Водитель будет lcd_pixel_fmt
регистр конфигурации в SDK
в kld2844b.c
например, это дисплей издрайвера дисплея也да ST7789
,Но другой экран,Производитель ограничил способы связи при упаковке.,Таким образом, даже экран может использовать чип драйвера интерфейса ДБИиз.,Возможно, DBI нельзя использовать.
sunxi_lcd_cmd_write(sel, 0x3A); /* Interface Pixel Format */
/* 55----RGB565;66---RGB666 */
if (info[sel].lcd_pixel_fmt == LCDFB_FORMAT_RGB_565 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_BGR_565) {
sunxi_lcd_para_write(sel, 0x55);
if (info[sel].lcd_pixel_fmt == LCDFB_FORMAT_RGB_565)
rotate &= 0xf7;
else
rotate |= 0x08;
} else if (info[sel].lcd_pixel_fmt < LCDFB_FORMAT_RGB_888) {
sunxi_lcd_para_write(sel, 0x66);
if (info[sel].lcd_pixel_fmt == LCDFB_FORMAT_BGRA_8888 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_BGRX_8888 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_ABGR_8888 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_XBGR_8888) {
rotate |= 0x08;
}
} else {
sunxi_lcd_para_write(sel, 0x66);
}
для DBI Формат,Он больше не анализируется в виде байтов.,Вместо этого он анализируется с использованием метода «характер из».,для унифицированного,В программном обеспечении указано,RGB565
формат, размер слова составляет 2 байта, что составляет 16 бит, и RGB666
формате размер слова составляет 4 байта, что составляет 32 бита.
для RGB565
Формат, также установлен для 0xff,0x00
。потому чтодля Экран с прямым порядком байтов,Метод хранения чипов имеет прямой порядок байтов.,Местокчипиз DBI модуль автоматически переставит данные, то есть фактически DBI Отправить данныечас,будет отправлен первым0x00
,Отправить еще раз0xff
,То есть красная компонента для0,зеленый компонентдля 0b000111
,это 7,Синий компонент 0x11111
,это 31,Мы также конвертируем в RGB888.
G = 7/63*255 = 28
B= 31/31*255 = 255
Войдите в палитру, чтобы получить синий цвет.
в случае RGB666
,Хотя он занимает 3 байта,Но ни один процессор не выравнивается по 3 байтам.,Значит нужно ввести сразу 4 байта,Затем DBI Аппаратный модуль автоматически отбрасывает 1 байт, а программное обеспечение соглашается отбросить последний байт.
Продолжая использовать процедуру для в качестве примера, процедура вводится 0xff,0x00,0xff,0x00
,для пояснения для удобства,Стандарт для 0xff(1),0x00(1),0xff(2),0x00(2)
,Чтосередина 0x00(2)
будет отброшено,Затем发送顺последовательностьда0xff(2),0x00(1),0xff(1)
,То есть 0xff(2)
это красный компонент,0xff(1)
Это синий компонент, смешанный для получения фиолетового цвета.