Область применения: настройка параметров ЖК-экрана на платформе Sunxi DE1.0/DE2.0.
Таблица 2-1: Термины, относящиеся к ЖК-дисплею
термин | Объяснение |
---|---|
SUNXI | Серия аппаратных платформ SoC Allwinner |
LCD | Жидкокристаллический дисплей |
MIPI | Mobile Industry Processor Interface |
DSI | Последовательный интерфейс дисплея, последовательный интерфейс дисплея |
I8080 | Интерфейс Intel 8080LCD |
RGB | Это относится к интерфейсу ЖК-дисплея, который передает компоненты RGB без какого-либо кодирования. |
LVDS | Дифференциальная передача сигналов низкого напряжения. Интерфейс ЖК-дисплея, характеризующийся низким напряжением и дифференциальной передачей сигналов. |
Характеристики ЖК-интерфейса:
Поддерживаются основные тактовые частоты, не превышающие 180 МГц. Или два последовательных интерфейса RGB, максимальное разрешение последовательного RGB не превышает 800*480@60.
порт поддерживает разрешение до 1366*768@60.
Теоретически T509 может иметь 4 дисплея, из которых первые два и последние два могут иметь разное разрешение. Разрешение между ними должно быть одинаковым, и они должны быть подключены к одному и тому же ЖК-экрану.
иллюстрировать
В сценарии с несколькими дисплеями вышеуказанные интерфейсы можно свободно сопоставлять, за исключением того, что на основном дисплее необходимо использовать MIPI-DSI.
Навык
Двухканальный интерфейс LVDS имеет всего 20 линий. Его можно разделить на два одноканальных интерфейса LVDS, предполагая, что при выборе одного канала для отображения необходимо выбрать lvds0.
• хранилище исходного кода Linux.
• хранилище исходного кода uboot. В uboot также есть драйверы дисплея и экрана, целью которых является отображение логотипа.
• Хранилище конфигурации dts на уровне платы. Целью является настройка некоторых общих параметров конфигурации ЖК-дисплея через board.dts. Для Linux 4.9 эта конфигурация действует как для ядра, так и для uboot. Для Linux-5.4 обратитесь к следующей статье.
• Для Linux5.4 необходимо настроить дополнительное хранилище конфигурации dts на уровне платы, специфичное для uboot.
• Руководство по эксплуатации экрана. В основном он описывает основную информацию, электрические характеристики экрана и т. д. и запрашивает ее у производителя экрана.
• Руководство по микросхеме драйвера. В основном он описывает подробную информацию об микросхеме экрана. В основном здесь приводится подробное объяснение каждой команды, которое полезно для инициализации и настройки. Обратитесь за этим к производителю экрана.
• На экране появится информация о времени. Пожалуйста, обратитесь к заводскому экрану. Для получения дополнительной информации см. параметры экрана синхронизации, иллюстрированные.
• Код инициализации экрана. , пожалуйста, обратитесь к производителю экрана. Как правило, экраны DSI и I8080 требуют команд инициализации для инициализации экрана.
• Мультиметр. Регулировка экрана не может избежать измерения соответствующих напряжений.
яркий.
Нажмите на настраиваемые свойства для подробного объяснения.
Ядро версии Linux 3.4:
linux3-4/drivers/video/sunxi/disp2/disp/lcd/
Ядро версии Linux 3.10:
linux3-10/drivers/video/sunxi/disp2/disp/lcd/
Ядро Linux версии 4.9 и выше:
linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/
uboot-2014:
brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd
uboot-2018:
brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd
Конфигурация уровня платы, среди которой «модель чипа», например R818, и «название платы», например демонстрационная, замените ее в соответствии с реальной ситуацией.
устройство/конфигурация/чипы/модель чипа/конфигурации/имя платы/board.dts
Конфигурация уровня платы Uboot, используемая для Linux5.4:
устройство/конфигурация/чипы/модель чипа/конфигурации/имя платы/uboot-board.dts
Конфигурация уровня платы ядра, используемая для linux5.4:
устройство/конфигурация/чипы/модель чипа/configs/имя платы/linux-5.4/board.dts
Коды, связанные с ЖК-дисплеем, включены в модуль драйвера disp. Войдите в корневой каталог ядра и выполните команду make ARCH=arm menuconfig или make ARCH=arm64 menuconfig (64-битная платформа), чтобы войти в основной интерфейс конфигурации.
лапша. и выполните следующие действия:
Соответствующие платформы DE1.0: R6 (linux-3.10), R16 (linux-3.4).
Соответствующие платформы DE2.0: кроме R6 и R16.
Рисунок 4-1: Схема конфигурации меню DE1.0
Рисунок 4-2: Схема конфигурации меню DE2.0.
за 40 рэндов Например, конкретный каталог конфигурации: Устройство. Drivers->Graphics support->Support for frame buffer devices->Video Support for sunxi -> DISP Driver Support(sunxi-disp2)。
В расположении исходного кода драйвера экрана он в основном разделен на четыре типа файлов:
Мы можем открыть driver/video/fbdev/sunxi/disp2/disp/lcd/default_panel.c в качестве примера драйвера экрана в конце файла.
struct __lcd_panel default_panel = {
/* panel driver name, must mach the lcd_drv_name in board.dts */
.name = "default_lcd",
.func = {
.cfg_panel_info = LCD_cfg_panel_info,
.cfg_open_flow = LCD_open_flow,
.cfg_close_flow = LCD_close_flow,
}
,
};
Имя элемента глобальной переменной default_panel должно совпадать с именем lcd_driver_name. Это связано с тем, сможет ли драйвер найти указанный файл.
Далее идет инициализация члена func, где в основном реализованы три функции обратного вызова. LCD_cfg_panel_info, LCD_open_flow и LCD_close_flow.
Процесс включения и выключения экрана — это процесс включения и выключения экрана, который представляет собой последовательность включения и последовательность выключения питания в руководстве по экрану или в руководстве по микросхеме драйвера.
Процесс работы переключения экрана показан на рисунке ниже.
Среди них LCD_open_flow и LCD_close_flow называются функциями процесса переключения экрана, а функции в блоке, такие как LCD_power_on, называются пошаговыми функциями переключения экрана.
Для ЖК-экранов, не требующих операций инициализации, таких как lvds-экраны, RGB-экраны и т. д., функции LCD_panel_init и LCD_panel_exit могут быть пустыми.
Рисунок 4-3: Процесс переключения ЖК-экрана
Функция: LCD_open_flow
Функция: Функция LCD_open_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, sunxi_lcd_tcon_enable, 100);
LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
return 0;
}
Как и выше, четырехкратный вызов LCD_OPEN_FUNC регистрирует четыре функции обратного вызова, соответствующие четырем процессам открытия экрана. Сначала зарегистрируйтесь и сначала выполните. Фактически, пользователь сам решает, сколько функций зарегистрировать, если это разумно.
Функция иллюстрировать выполняет операции.
Выключена функция иллюстрировать, если это I8080 Экран I8080 ловить функцию порта, иллюстрировать, если это другие ситуации, такие как i2c Или спи Вы можете увидеть, используя iic/spi Инициализация последовательного интерфейса, также можно использовать GPIO выполнить моделирование.
Как показано ниже, это типичная диаграмма последовательности включения питания в руководстве по экрану. Когда мы пишем драйвер экрана, мы также должны обращать внимание на задержку.
Рисунок 4-4: включение питания
Функция: LCD_OPEN_FUNC
Функция: зарегистрировать функцию шага открытия экрана в процессе открытия экрана. Помните, что это регистрация, а не выполнение!
прототип:
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
}
задержка — время задержки после выполнения этого шага, единица времени — миллисекунды.
Второй параметр LCD_OPEN_FUNC — это длительность задержки двух шагов до и после, в мс. Обратите внимание, что значение здесь должно быть заполнено в соответствии с правилами руководства по экрану. Случайное заполнение может привести к некорректной инициализации экрана или экрана. время переключения истечет.
долго, влияя на пользовательский опыт.
LCD_open_flow соответствует LCD_close_flow, который используется для регистрации функции закрытия экрана. Используйте LCD_CLOSE_FUNC для регистрации функции. Сначала зарегистрируйтесь и сначала выполните. Здесь функция обратного вызова только регистрируется, а не выполняется немедленно.
ХОРОШО.
static s32 LCD_close_flow(u32 sel)
{
/* close lcd backlight, and delay 0ms */
LCD_CLOSE_FUNC(sel, LCD_bl_close, 0);
/* close lcd controller, and delay 0ms */
LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 50);
/* open lcd power, than delay 200ms */
LCD_CLOSE_FUNC(sel, LCD_panel_exit, 100);
/* close lcd power, and delay 500ms */
LCD_CLOSE_FUNC(sel, LCD_power_off, 0);
return 0;
}
На рисунке ниже представлена типичная временная диаграмма отключения экрана.
Рисунок 4-5: выключение питания
Функция: LCD_cfg_panel_info
Функция: настроены расширенные параметры TCON, такие как гамма-функция и функция цветового отображения.
прототип:
static void LCD_cfg_panel_info(__panel_extend_para_t * info)
Расширенные параметры TCON можно настроить только в файле экрана. Определение параметров см. в параметрах, связанных с эффектом отображения.
Если требуется гамма-коррекция или цветовое отображение, установите параметр включения соответствующего модуля равным 1 в board.dts, lcd_gamma_en, lcd_cmap_en и заполните 3 таблицы коэффициентов, lcd_gamma_tbl,
lcd_cmap_tbl, часть кода показана ниже. Примечание: гамма, шаблон предоставляет 18 значений точек перегиба, а затем интерполирует все значения (255). Если вы считаете, что она недостаточно подробна, вы можете добавить ее в соответствующую таблицу.
ребенок. Размер cmap_tbl фиксирован, размер таблицы нельзя уменьшить или увеличить.
Окончательно сгенерированная запись таблицы гаммы состоит из трех значений гаммы, rgb, каждое из которых занимает 8 бит. В представленном на данный момент шаблоне три значения гаммы одинаковы.
static void LCD_cfg_panel_info(struct panel_extend_para *info)
{
u32 i = 0, j = 0;
u32 items;
u8 lcd_gamma_tbl[][2] = {
/* {input value, corrected value} */
{0, 0},
{15, 15},
{30, 30},
{45, 45},
{60, 60},
{75, 75},
{90, 90},
{105, 105},
{120, 120},
{135, 135},
{150, 150},
{165, 165},
{180, 180},
{195, 195},
{210, 210},
{225, 225},
{240, 240},
{255, 255},
};
u32 lcd_cmap_tbl[2][3][4] = {
{
{LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
{LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
{LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
},
{
{LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
{LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
{LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
},
};
items = sizeof(lcd_gamma_tbl) / 2;
for (i = 0; i < items - 1; i++) {
u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
for (j = 0; j < num; j++) {
u32 value = 0;
value =
lcd_gamma_tbl[i][1] +
((lcd_gamma_tbl[i + 1][1] -
lcd_gamma_tbl[i][1]) * j) / num;
info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
(value << 16) + (value << 8) + value;
}
}
info->lcd_gamma_tbl[255] =
(lcd_gamma_tbl[items - 1][1] << 16) +
(lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
}
Файл:sunxi_lcd_delay_ms / sunxi_lcd_delay_us
Функция: функция задержки, соответственно задержка уровня миллисекунды/микросекунды.
прототип:s32 sunxi_lcd_delay_ms(u32 ms) / s32 sunxi_lcd_delay_us(u32 us)
Файл: sunxi_lcd_tcon_enable / sunxi_lcd_tcon_disable
Функция: Включите контроллер ЖК-дисплея и начните обновление ЖК-дисплея. Выключите контроллер ЖК-дисплея и прекратите обновление данных.
прототип:void sunxi_lcd_tcon_enable(u32 screen_id)
void sunxi_lcd_tcon_disable(u32 screen_id)
функция: sunxi_lcd_backlight_enable / sunxi_lcd_backlight_disable
Функция: включение/выключение подсветки с помощью gpio, настроенного lcd_bl в board.dts. См. 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 в board.dts (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_pin_cfg
Функция: Настройка ЖК-IO.
прототип:s32 sunxi_lcd_pin_cfg(u32 screen_id, u32 bon)
иллюстрировать:Конфигурацияlcd данные/клк Дождитесь вывода, соответствующего board.dts. lcdd0-lcdd23/lcddclk/lcdde/lcdhsync/lcdvsync в формате .
Поскольку dsi является выделенным контактом, интерфейсной панели dsi не нужно настраивать этот набор контактов в board.dts, но соответствующие контакты также будут включаться и выключаться в этом функциональном интерфейсе.
Bon: 1: означает включение, 0: означает настройку на отключение состояния.
MIPI DSI экран, большую часть которого необходимо инициализировать с помощью DSI-D0 Канал ЛП модель Инициализировать。поставлятьизловитьротфункцияиллюстрироватьследующее:
Файл: sunxi_lcd_dsi_clk_enable / sunxi_lcd_dsi_clk_disble
Функция: используется только на экране интерфейса dsi. Включает/отключает вывод высокоскоростного тактового сигнала dsi. Его необходимо вызвать во время инициализации.
прототип:s32 sunxi_lcd_dsi_clk_enable(u32 scree_id)
s32 sunxi_lcd_dsi_clk_disable(u32 scree_id)
Функция: sunxi_lcd_dsi_dcs_wr
Функция: операция записи постоянного тока на экран.
прототип:__s32 sunxi_lcd_dsi_dcs_wr(__u32 sel,__u8 cmd,__u8* para_p,__u32 para_num)
параметриллюстрировать:
• cmd: dcs записывает содержимое команды.
• para_p: начальный адрес параметра команды записи dcs.
• para_num: количество параметров для команды записи dcs, в байтах.
Функция: sunxi_lcd_dsi_dcs_wr_2para
Функция: операция записи dcs на экран. Эта команда принимает два параметра.
прототип:__s32 sunxi_lcd_dsi_dcs_wr_2para(__u32 sel,__u8 cmd,__u8 para1,__u8 para2)
параметриллюстрировать:
• cmd: dcs записывает содержимое команды.
• para1: Содержимое первого параметра команды записи dcs.
• para2: Содержимое второго параметра команды записи dcs.
sunxi_dsi_dcs_wr_0para,sunxi_dsi_dcs_wr_1para,sunxi_dsi_dcs_wr_3para,sunxi_dsi_dcs_wr_4para,
Определение sunxi_dsi_dcs_wr_5para аналогично определению dsi_dcs_wr_2para, разница заключается в количестве параметров.
Функция: sunxi_lcd_dsi_dcs_read
Функция: операция чтения dsi.
прототип:s32 sunxi_lcd_dsi_dcs_read(u32 sel, u8 cmd, u8 result, u32 num_p)
параметриллюстрировать:
• sel, отображать идентификатор.
• cmd, регистр для чтения.
• результат: массив, используемый для хранения интерфейса чтения. Пользователь должен убедиться, что имеется достаточно места для сохранения интерфейса чтения.
• num_p, указатель используется для хранения количества считываемых байтов, и пользователь должен убедиться, что это не нулевой указатель.
Драйвер дисплея предоставляет для использования 5 функций интерфейса. следующее:
Функция: sunxi_lcd_cpu_write
Функция: Установить указанный регистр экрана ЦП на указанное значение.
прототип:void sunxi_lcd_cpu_write(__u32 sel, __u32 index, __u32 data)
Содержимое функции:
Void sunxi_lcd_cpu_write(__u32 sel, __u32 index, __u32 data)
{
sunxi_lcd_cpu_write_index(sel, index);
sunxi_lcd_cpu_wirte_data(sel, data);
}
Реализованы две операции записи на шине 8080.
sunxi_lcd_cpu_write_index реализует первую операцию записи. В это время вывод RS PIN (A1) имеет низкий уровень, а содержимое данных шины представляет собой значение индекса параметра.
Sunxi_lcd_cpu_wirte_data реализует вторую операцию записи. В это время вывод RS PIN (A1) имеет высокий уровень, а содержимое данных шины представляет собой значение данных параметра.
Функция: sunxi_lcd_cpu_write_index
Функция: Установить экран ЦП в указанный регистр.
прототип:
void sunxi_lcd_cpu_write_index(__u32 sel,__u32 index)
специфическийиллюстрировать Видетьsunxi_lcd_cpu_write。
Функция: sunxi_lcd_cpu_write_data
Функция: Установите значение регистра экрана ЦП на указанное значение.
прототип:
void Sunxi_lcd_cpu_write_data(__u32 sel, __u32 data);
Функция: tcon0_cpu_rd_24b_data
Функция: операция чтения.
прототип:
s32 tcon0_cpu_rd_24b_data(u32 sel, u32 index, u32 *data, u32 size)
параметриллюстрировать:
• sel: отображать идентификатор.
• индекс: регистр для чтения.
• data: используется для хранения указателя массива интерфейса чтения. Пользователь должен убедиться, что в нем достаточно места для хранения данных.
• размер: количество байтов для чтения.
Функция: sunxi_lcd_gpio_set_value
Функция: PIN-вывод LCD_GPIO выводит высокий или низкий уровень.
прототип:s32 sunxi_lcd_gpio_set_value(u32 screen_id, u32 io_index, u32 value)
параметриллюстрировать:
• io_index = 0: соответствует lcd_gpio_0 в board.dts.
• io_index = 1: соответствует lcd_gpio_1 в board.dts.
• io_index = 2: соответствует lcd_gpio_2 в board.dts.
• io_index = 3: соответствует lcd_gpio_3 в board.dts.
• значение = 0: соответствует низкому уровню выхода ввода-вывода.
• Значение = 1: соответствует высокому уровню выхода ввода-вывода.
Используется только тогда, когда GPIO определен как выход.
Функция: sunxi_lcd_gpio_set_direction
Функция: установите PIN-код LCD_GPIO в режим ввода или вывода.
прототип:
s32 sunxi_lcd_gpio_set_direction(u32 screen_id, u32 io_index, u32 direction);
параметриллюстрировать:
• io_index = 0: соответствует lcd_gpio_0 в board.dts.
• io_index = 1: соответствует lcd_gpio_1 в board.dts.
• io_index = 2: соответствует lcd_gpio_2 в board.dts.
• io_index = 3: соответствует lcd_gpio_3 в board.dts.
• направление = 0: соответствующий ввод-вывод установлен на ввод.
• направление = 1: соответствующий ввод-вывод настроен на выход.
Некоторые экраны необходимо инициализировать. В функции шага открытия экрана, соответствующей функции LCD_panel_init, предусмотрено несколько методов инициализации экрана.
Экран DSI инициализируется через канал DSI-D0. Экран ЦП инициализируется через шину 8080 и использует LCDIO (PD, PH). В этом методе инициализации биты контактов его шины
Определение настройки соответствует экрану ЦП.
Следующие интерфейсы определены и реализованы в lcd_source.c и lcd_source.h, пути которых указаны в декомпозиции драйвера экрана.
Доступ устройства iic/spi к последовательному интерфейсу необходимо зарегистрировать в драйвере экрана.
Используйте аппаратный spi для проверки или передачи IC для инициализации, как показано в следующем фрагменте кода.
Сначала вызовите функцию spi_init для инициализации оборудования spi. Функцию spi_init можно разделить на несколько этапов. Сначала получите мастер в соответствии с фактическим подключением оборудования, выберите spi (если это выбрано в коде).
Если на этом этапе возвращается ошибка о том, что spi настроен неправильно, обратитесь к лицу, отвечающему за драйвер spi. Второй шаг — настройка устройства spi, которое включает максимальную скорость, режим передачи spi и количество бит, содержащихся в каждом слове. Наконец, вызовите spi_setup для завершения.
Отношения между мастером и устройством.
comm_out — это пример передачи spi, а ядром является функция spi_sync_transfer.
static int spi_init(void)
{
int ret = -1;
struct spi_master *master;
master = spi_busnum_to_master(1);
if (!master) {
lcd_fb_wrn("fail to get master\n");
goto OUT
}
spi_device = spi_alloc_device(master);
if (!spi_device) {
lcd_fb_wrn("fail to get spi device\n");
goto OUT;
}
spi_device->bits_per_word = 8;
spi_device->max_speed_hz = 60000000; /*50MHz*/
spi_device->mode = SPI_MODE_0;
ret = spi_setup(spi_device);
if (ret) {
lcd_fb_wrn("Faile to setup spi\n");
goto FREE;
}
lcd_fb_inf("Init spi1:bits_per_word:%d max_speed_hz:%d mode:%d\n",
spi_device->bits_per_word, spi_device->max_speed_hz,
spi_device->mode);
ret = 0;
goto OUT;
FREE:
spi_master_put(master);
kfree(spi_device);
spi_device = NULL;
OUT:
return ret;
}
static int comm_out(unsigned int sel, unsigned char cmd)
{
struct spi_transfer t;
if (!spi_device)
return -1;
DC(sel, 0);
memset(&t, 0, sizeof(struct spi_transfer));
t.tx_buf = &cmd;
t.len = 1;
t.bits_per_word = 8;
t.speed_hz = 24000000;
return spi_sync_transfer(spi_device, &t, 1);
}
Использование аппаратного i2c на ЖК-дисплей& Микросхема адаптера Инициализируйте, инициализируйте i2c Основная функция оборудования — i2c_add_driver, и вам нужно инициализировать структуру его параметров. i2c_driver。
it66121_id содержит имя устройства и индекс шины i2c (i2c0, i2c1...).
it66121_i2c_probe Если вы можете войти в эту функцию, вы можете начать использовать i2c. В сегменте кода глобальной переменной-указателю присваивается только параметр cilent, который понадобится позже.
it66121_match, это таблица соответствия dts. Поскольку вы добавляете драйвер в disp2, таблица соответствия здесь представляет собой таблицу соответствия disp2. Обратите внимание.
Заполните неправильную форму. Функция tv_i2c_detect здесь очень важна. Эта функция вызывается раньше, чем функция зонда. Только после ее успешного вызова можно запустить i2c. Вызов strlcpy означает успех.
normal_i2c Заполнен ли ЖК-дисплей из списка адресов устройства? или Микросхема адаптера Адрес подчиненного устройства и i2c индекс.
Сможете ли вы начать использовать I2C, зависит от того, вызывается ли функция зонда.
Использование i2c_smbus_write_byte_data или i2c_smbus_read_byte_data для чтения и записи может удовлетворить большинство сценариев.
#define IT66121_SLAVE_ADDR 0x4c
#define IT66121_I2C_ID 0
static const struct i2c_device_id it66121_id[] = {
{ "IT66121", IT66121_I2C_ID },
{ /* END OF LIST */ }
};
MODULE_DEVICE_TABLE(i2c, it66121_id);
static int it66121_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
this_client = client;
return 0;
}
static const struct of_device_id it66121_match[] = {
{.compatible = "allwinner,sun8iw10p1-disp",},
{.compatible = "allwinner,sun50i-disp",},
{.compatible = "allwinner,sunxi-disp",},
{},
};
static int tv_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
{
const char *type_name = "IT66121";
if (IT66121_I2C_ID == client->adapter->nr) {
strlcpy(info->type, type_name, 20);
} else
pr_warn("%s:%d wrong i2c id:%d, expect id is :%d\n", __func__, __LINE__,
client->adapter->nr, IT66121_I2C_ID);
return 0;
}
static unsigned short normal_i2c[] = {IT66121_SLAVE_ADDR, I2C_CLIENT_END};
static struct i2c_driver it66121_i2c_driver = {
.class = I2C_CLASS_HWMON,
.id_table = it66121_id,
.probe = it66121_i2c_probe,
.remove = it66121_i2c_remove,
.driver = {
.owner = THIS_MODULE,
.name = "IT66121",
.of_match_table = it66121_match,
},
.detect = tv_i2c_detect,
.address_list = normal_i2c,
};
static void LCD_panel_init(u32 sel)
{
int ret = -1;
ret = i2c_add_driver(&it66121_i2c_driver);
if (ret) {
pr_warn("Add it66121_i2c_driver fail!\n");
return;
}
//start init chip with i2c
}
void it6612_twi_write_byte(it6612_reg_set* reg)
{
u8 rdata = 0;
u8 tmp = 0;
rdata = i2c_smbus_read_byte_data(this_client, reg->offset);
tmp = (rdata & (~reg->mask))|(reg->mask®->value);
i2c_smbus_write_byte_data(this_client, reg->offset, tmp);
}
Шаги по написанию драйверов экрана в U-boot такие же, как и для ядра, и файлы пути к коду организованы таким же образом. Вот на что нужно обратить внимание.
1. Чтобы ускорить отображение U-boot, между несколькими функциями, открывающими экран, применяется асинхронный вызов. Принцип состоит в том, чтобы использовать прерывание таймера для регулярного вызова функции открытия экрана, поэтому в данном случае используется платформа bootGUI. загружается и
Это не означает, что открытие экрана завершено, но когда вы увидите открытый ЖК-дисплей, завершите печать.
Предложение: Чтобы максимально использовать преимущества асинхронных вызовов, укажите необходимую задержку при регистрации обратного вызова. Например, задержка в 10 мс, указанная ниже, использует асинхронный обратный вызов по таймеру. В течение этих 10 мс uboot.
Вы можете сделать и другие вещи для достижения цели асинхронного вызова.
LCD_OPEN_FUNC(sel, LCD_power_on,10);
2. Функцию sunxi_lcd_power_enable и sunxi_lcd_pin_cfg нельзя вызывать вне LCD_power_on, иначе uboot будет ненормальным.
Строго говоря, его можно вызвать только в первой функции обратного вызова, зарегистрированной в LCD_OPEN_FUNC.
Ниже представлена платформа Quanzhi RGB. И пример конфигурации, как отображать lcd0 под каждым атрибутом.
Интерфейс RGB также называется интерфейсом HV (горизонтальная синхронизация и вертикальная синхронизация) на платформе Allwinner.
Для инициализации экрана RGB:
Некоторые ЖК-экраны поддерживают расширенные функции, такие как настройка гаммы, формата пикселей и т. д., но сам протокол RGB не поддерживает передачу других данных, кроме данных изображения, поэтому ЖК-экран нельзя настроить через контакты RGB.
Таким образом, если вы получаете экран интерфейса RGB, вам либо не нужна команда инициализации, либо на экране будут предусмотрены дополнительные контакты для настройки SoC, такие как SPI и I2C.
Рисунок 4-6: Контакты RGB
Для получения информации о конкретных выводах SoC и функциях (функции мультиплексирования выводов) вышеуказанных выводов см. таблицу мультиплексирования выводов. Названия функций мультиплексирования выводов обычно начинаются с «LCDX_», где X — число.
Количество выводов данных не обязательно равно 24. RGB подразделяется на несколько интерфейсов, которые выбираются установкой lcd_hv_if.
Таблица 4-1: Классификация интерфейсов RGB
разрядность | тактовый цикл | Подсчитайте количество и формат цвета |
---|---|---|
24 bits | 1 cycle | 16.7M colors, RGB888 |
18 bits | 1 cycle | 262K colors, RGB666 |
16 bits | 1 cycle | 65K colors, RGB565 |
6 bits | 3 cycles | 262K colors, RGB666 |
6 bits | 3 cycles | 65K colors, RGB565 |
иллюстрировать
тактовый циклномеризм означает: сколько тактовых нужно для одного пикселя цикл был отправлен и значит из.
когдатактовый цикл1 Когда мы называем это RGB Порт ловить — это параллельный порт, а в других случаях — последовательный порт. Более общий принцип заключается в том, что требуется несколько тактов. цикл может отправить только один пиксель, изловить порт является последовательным
интерфейс.
Как определить, поддерживается ли 24-битная версия изразрядность, проще всего использовать pinmux Подсчитайте количество выводов данных в таблице, если их 24. Рут поддерживает 24бит, если есть только 18 Рут поддерживает 18бит.
Аппаратное подключение
Для параллельного RGB изловитьрот, когда разрядность меньше 24 час,Аппаратное подключение должно выбрать подключение ловителя каждой массы в верхнем положении и отказаться от нижнего положения.,Причиной этого является потеря меньшего количества цвета.
Для последовательного RGB ловитьрот,Аппаратное подключение Можно ссылатьсяRGB и I8080 синхронизация на схеме конфигурации контактов RGB Эти колонны.
Интерфейс RGB имеет два метода синхронизации. По опыту попробуйте использовать второй метод. Убедитесь, что контакт DE подключен к оборудованию.
Когда мы настраиваем параллельный RGB интерфейса, нет необходимости различать 24 и 24 в конфигурации. немного, 18 битовая сумма 16 Бит, разрядность которого наибольшая, является опорным выводом. mux Таблица ЖК-дисплея экрансамподдерживаетсяразрядность СравниватьSoC поддерживается
Если у вас меньшая разрядность, конечно, вы можете выбрать только ту, у которой меньше из.
Поскольку он не требует инициализации, с интерфейсом RGB возникает очень мало проблем. Сосредоточьтесь на рациональности синхронизации ЖК-дисплея, то есть рациональности атрибутов lcd_ht, lcd_hspw, lcd_hbp, lcd_vt, lcd_vspw и lcd_vbp.
секс.
Ниже приведен типичный пример конфигурации board.dts с параллельным интерфейсом RGB, в котором пустые строки используются для разделения конфигурации на несколько частей.
RGB-экран
параметр.
&lcd0 {
/* part 1 */
lcd_used = <1>;
lcd_driver_name = "default_lcd";
/* part 2 */
lcd_if = <0>;
lcd_hv_if = <0>;
/* part 3 */
lcd_width = <150>;
lcd_height = <94>;
lcd_x = <800>;
lcd_y = <480>;
lcd_dclk_freq = <33>;
lcd_hbp = <46>;
lcd_ht = <1055>;
lcd_hspw = <0>;
lcd_vbp = <23>;
lcd_vt = <525>;
lcd_vspw = <0>;
/* part 4 */
lcd_backlight = <50>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <8>;
lcd_pwm_freq = <10000>;
lcd_pwm_pol = <1>;
lcd_bl_en = <&pio PD 27 1 0 3 1>;
lcd_bright_curve_en = <0>;
/* part 5 */
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_gamma_en = <0>;
lcd_cmap_en = <0>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
/* part 6 */
lcd_power = "vcc-lcd";
lcd_pin_power = "vcc-pd";
pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;
};
4.3.4 Типичная конфигурация последовательного интерфейса RGB
СерийныйRGB да Взаимно Для параллельного RGB Это не означает, что он использует только одну линию для отправки данных, поскольку он использует несколько тактовых строк. цикл может отправить один пиксель из данных, затем этот изRGB ловитьрот Сразуда СерийныйRGB。
То же самое с параллельным RGB Как и ловить, конфигурация не требует и не может отражать конкретный СерийныйRGB. ловитьрот, нужно сделать из это поставить Аппаратное подключениеверно。
поддатипичный СерийныйRGB интерфейсная плата.dts Пример конфигурации, в нем всего 8 Нижний колонтитул корневых данных, в котором используются пустые строки для разделения конфигурации на несколько частей.
Навык Здесь следует отметить, что для этого интерфейса SoC Для выпуска одного требуется в общей сложности три цикла.pixel,Поэтому, когда мы настраиваем время из,нужно быть удовлетвореннымlcd_dclk_freq3=lcd_htlcd_vt60,или
lcd_dclk_freq=lcd_ht3lcd_vt60Или3 раз lcd_htor или 3 раза lcd_dclk_freq.
иллюстрировать
Микросхема драйвера ЖК-дисплея в приведенном ниже примере — stv7789v, которую необходимо инициализировать. Инициализированный протокол интерфейса — SPI, поэтому в драйвере используется еще несколько конфигураций контактов SPI для имитации протокола SPI, поэтому вот конфигурации.
функция gpio.
&lcd0 {
/* part 1 */
lcd_used = <1>;
lcd_driver_name = "st7789v";
/* part 2 */
lcd_if = <0>;
lcd_hv_if = <8>;
/* part 3 */
lcd_x = <240>;
lcd_y = <320>;
lcd_width = <108>;
lcd_height = <64>;
lcd_dclk_freq = <19>;
lcd_hbp = <120>;
;10 + 20 + 10 + 240*3 = 760 real set 1000
lcd_ht = <850>;
lcd_hspw = <2>;
lcd_vbp = <13>;
lcd_vt = <373>;
lcd_vspw = <2>;
/* part 4 */
lcd_backlight = <50>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <8>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_bl_en = <&pio PB 1 1 0 3 1>;
lcd_bright_curve_en = <1>;
/* part 5 */
lcd_frm = <1>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
lcd_hv_srgb_seq = <0>;
lcd_io_phase = <0x0000>;
lcd_gamma_en = <0>;
lcd_cmap_en = <0>;
lcd_rb_swap = <0>;
/* part 6 */
lcd_power = "vcc-lcd";
lcd_pin_power = "vcc-pd";
/*reset */
lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
/* cs */
lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
/*sda */
lcd_gpio_2 = <&pio PD 13 1 0 3 0>;
/*sck */
lcd_gpio_3 = <&pio PD 12 1 0 3 0>;
pinctrl-0 = <&rgb8_pins_a>;
pinctrl-1 = <&rgb8_pins_b>;
};
MIPI-DSI, мгновенная мобильность Промышленный интерфейс процессора Последовательный интерфейс дисплея, процессор индустрии мобильной связи ловить порт последовательного интерфейса дисплея.
Пользователям необходимо знать:
• Non-burst mode with sync pulses
• Non Burst mode with sync Events
• Пакетный режим. Простое понимание состоит в том, что эффективный коэффициент передачи данных выше и эффективность передачи выше.
MIPI-DSI Выводы встречаются в большинстве микросхем. посвящён, в board.dtsi Не внутринуждаться Конфигурация,Пока оборудование подключеноловить Это нормально ХОРОШО.
Однако контакты DSI некоторых микросхем не выделены и повторно используются с контактами других функций. В этом случае необходимо настроить pinctrl-0 и pinctrl-1.
Выводы mipi-dsi являются дифференциальными и разделены на два типа выводов: один — тактовый, а другой — вывод данных. Количество выводов данных является переменным, а единица измерения — полоса. две линии.
Вообще говоря,ЖК-дисплей. экраниллюстрироватьвнутри книгиизобъяснятьпереулок Число относится к количеству контактов данных, исключая контакты тактирования. Например, определенное 4 lane MIPI-DSI Экран имеет общую площадь (4+1)*2 фута.
Как правило, модуль MIPI-DSI питается от источника питания. Его можно рассматривать как питание на выводах или питание модуля. Разные микросхемы могут иметь разные требования к напряжению для этого источника питания. После определения модели микросхемы требования к напряжению. источник питания
Если напряжение этой цепи будет изменено без разрешения, модуль может выйти из строя.
Рисунок 4-7: контактный мультиплексор
1. Ограничение разрешения. Есть переулок Ограничение скорости, мы можем получить максимальный предел разрешения, формула расчета следующая, при условии, что полоса_скорости Не более, чем указанная выше микросхема Спецификация Регулированиеизскорость,Так что теоретически это последствия,
Пожалуйста, проверьте характеристики микросхемы.
lane_speed=lcd_vt * lcd_ht * fps * bit_per_pixel / lane_num / 1e9
• Единица измерения: Гбит/с.
• fps: ожидаемая частота обновления, которую можно узнать из руководства к экрану, обычно составляет 60. Пожалуйста, смотрите lcd_dclk_freq.
• bit_per_pixel: количество битов, содержащихся в каждом пикселе, обычно 24 или 18, устанавливается через lcd_dsi_format.
• Lane_num: номер полосы, установленный lcd_dsi_lane.
• 1e9:1000000000 записано в экспоненциальной записи.
Использовать очень медленную память DDR и при этом хотеть выбрать экран с высоким разрешением явно нереально.
IC。
С помощью осциллографа измерьте тактовый сигнал MIPI-DSI, чтобы определить, соответствует ли его частота потребностям экрана.
Во-первых, мы можем вычислить частоту теоретического сигнала CLK по заданной частоте пикселя и номеру полосы следующим образом:
Freq_dsi_clk = (Dclk * colordepth * 3 / lane ) / 2
Большинство экранов MIPI-DSI настроены в видеорежиме.
Ниже приведен типичный пример конфигурации board.dts для видеорежима MIPI-DSI, в котором пустые строки используются для разделения конфигурации на несколько частей.
&lcd0 {
/* part 1 */
lcd_used = <1>;
lcd_driver_name = "k101im2qa04";
/* part 2 */
lcd_if = <4>;
lcd_dsi_if = <0>;
/* part 3 */
lcd_x = <800>;
lcd_y = <1280>;
lcd_width = <135>;
lcd_height = <216>;
lcd_dclk_freq = <68>;
lcd_hbp = <36>;
lcd_ht = <854>;
lcd_hspw = <18>;
lcd_vbp = <12>;
lcd_vt = <1320>;
lcd_vspw = <4>;
/* part 4 */
lcd_backlight = <50>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_bl_en = <&pio PB 8 1 0 3 1>;
lcd_bright_curve_en = <0>;
/* part 5 */
lcd_dsi_lane = <4>;
lcd_dsi_format = <0>;
lcd_dsi_te = <0>;
/* part 6 */
lcd_frm = <0>;
lcd_gamma_en = <0>;
lcd_cmap_en = <0>;
/* part 7 */
lcd_pin_power = "dcdc1";
lcd_pin_power1 = "eldo3";
lcd_power = "dc1sw";
lcd_gpio_0 = <&pio PD 22 1 0 3 1>;
pinctrl-0 = <&dsi4lane_pins_a>;
pinctrl-1 = <&dsi4lane_pins_b>;
};
По уровню разрешения его обычно разделяют на несколько режимов настройки. 1080p Разрешение и ниже: нужно только установить lcd_dsi_if Для управления просто ХОРОШО.Команда mode Как правило, это экран низкого разрешения и видео mode
А серийный режим предназначен для высокого разрешения. Если разрешение достигает 2к, требуются дополнительные настройки.
Экрану с разрешением 2К или выше фактически требуется до 8 полос данных для нормального отображения, из которых четыре полосы отправляют нечетные пиксели в изображении, а другое изображение отправляет нечетные пиксели.
иллюстрировать
Обратите внимание, что только некоторые микросхемы поддерживают сверхвысокое разрешение. Подробности см. в части MIPI-DSI спецификаций чипа.
Ниже приведен пример конфигурации Board.dts MIPI-DSI с высоким и сверхвысоким разрешением (более 2 КБ), в котором пустые строки используются для разделения конфигурации на несколько частей.
иллюстрировать lcd_dsi_lane Все еще ставлю 4 переулок Причина в том, что это установка dsi переулок Количество: для этого экрана требуется два dsi. В сумме получается 8 переулок。
В настоящее время три параметра lcd_tcon_mode, lcd_dsi_port_num и lcd_tcon_en_odd_even_div должны быть специально установлены. Нажмите, чтобы просмотреть конкретное значение. Если это экран с разрешением 1080p и ниже (используйте только).
4lane или ниже), то эти три конфигурации по умолчанию равны 0 Вот и все. 6. Шестая часть показывает настройки части эффектов. 7.седьмойчасть,да Приколотьиисточник питанияконфигурация.Пожалуйста, следуйте принципиальной схеме Конфигурация。Пожалуйста, посмотритеисточник питанияи Приколотьпараметр.
&lcd0 {
/* part 1 */
lcd_used = <1>;
lcd_driver_name = "lq101r1sx03";
/* part 2 */
lcd_if = <4>;
lcd_dsi_if = <0>;
/* part 3 */
lcd_x = <2560>;
lcd_y = <1600>;
lcd_width = <216>;
lcd_height = <135>;
lcd_dclk_freq = <268>;
lcd_hbp = <80>;
lcd_ht = <2720>;
lcd_hspw = <32>;
lcd_vbp = <37>;
lcd_vt = <1646>;
lcd_vspw = <6>;
/* part 4 */
lcd_backlight = <50>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_bl_en = <&pio PH 10 1 0 3 1>;
/* part 5 */
lcd_dsi_lane = <4>;
lcd_dsi_format = <0>;
lcd_dsi_te = <0>;
lcd_dsi_port_num = <1>;
lcd_tcon_mode = <4>;
lcd_tcon_en_odd_even_div = <1>;
/* part 6 */
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
/* part 7 */
lcd_power = "vcc18-lcd";
lcd_power1 = "vcc33-lcd";
lcd_pin_power = "vcc-pd";
lcd_gpio_0 = <&pio PH 11 1 0 3 1>;
lcd_gpio_1 = <&pio PH 12 1 0 3 1>;
};
Экран DSI в командном режиме аналогичен интерфейсу I8080. Внутри экрана имеется ОЗУ для буферизации и обработки изображений. В этом случае обычно необходимо использовать вывод te экрана для запуска прерывания вертикальной синхронизации, поэтому он отличается. от других типов DSI.
Отличие от экрана в том, что здесь необходимо установить вывод lcd_vsync. Вывод te экрана подключен к lcd_vsync, а lcd_dsi_te установлен в значение 1.
Настройка контакта te очень важна. Вообще говоря, если на экране есть контакт te, его необходимо подключить. В противном случае экран будет разрываться при отображении динамических изображений, и программное обеспечение не сможет решить эту проблему, что напрямую приведет к повреждению. последнее оборудование невозможно производить серийно.
фрукты.
Здесь мы перечисляем только ключевые отличия от видеорежима MIPI-DSI. Дополнительную информацию см. в предыдущем разделе.
&lcd0 {
/* part 1 */
lcd_used = <1>;
lcd_driver_name = "h245qbn02";
/* part 2 */
lcd_if = <4>;
lcd_dsi_if = <1>;
/* part 3 */
lcd_x = <240>;
lcd_y = <432>;
lcd_width = <52>;
lcd_height = <52>;
lcd_dclk_freq = <18>;
lcd_hbp = <96>;
lcd_ht = <480>;
lcd_hspw = <2>;
lcd_vbp = <21>;
lcd_vt = <514>;
lcd_vspw = <2>;
/* part 4 */
lcd_backlight = <100>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_bright_curve_en = <0>;
lcd_bl_en = <&pio PB 3 1 0 3 1>;
/* part 5 */
lcd_dsi_lane = <1>;
lcd_dsi_format = <0>;
lcd_dsi_te = <1>;
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_gamma_en = <0>;
lcd_cmap_en = <0>;
/* part 7 */
lcd_power = "axp233_dc1sw"
lcd_power1 = "axp233_eldo1"
lcd_gpio_0 = <&pio PB 2 1 0 3 0>;
lcd_vsync = <&pio PD 21 2 0 3 0>;
};
Фактическая сцена представляет собой два физических экрана, каждый экран имеет разрешение 1080p, и каждый экран имеет 4 экрана. переулок, требование состоит в том, чтобы на каждом из двух экранов отображалось изображение кадра из левой и правой половины, в зависимости от соотношения сторон, а также горизонтального и вертикального экрана и DE. коэффициенты мощности обработки,
Одного DE+ одного tcon+ двух DSI уже недостаточно. Для управления одним dsi необходимо использовать два tcon, но два дисплея должны быть синхронизированы, что требует использования режима синхронизации двух tcon.
Включение и выключение.
иллюстрировать
Примечание. Лишь немногие микросхемы поддерживают этот режим.
&lcd0 {
lcd_used = <1>;
lcd_driver_name = "lpm025m475a";
;lcd_bl_0_percent = <0>;
;lcd_bl_40_percent = <23>;
;lcd_bl_100_percent = <100>;
lcd_backlight = <50>;
lcd_if = <4>;
lcd_x = <1080>;
lcd_y = <1920>;
lcd_width = <31>;
lcd_height = <56>;
lcd_dclk_freq = <141>;
lcd_pwm_used = <0>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <20000>;
lcd_pwm_pol = <0>;
lcd_pwm_max_limit = <255>;
lcd_hbp = <100>;
lcd_ht = <1212>;
lcd_hspw = <5>;
lcd_vbp = <8>;
lcd_vt = <1936>;
lcd_vspw = <2>;
lcd_dsi_if = <0>;
lcd_dsi_lane = <4>;
lcd_dsi_format = <0>;
lcd_dsi_te = <0>;
lcd_dsi_eotp = <0>;
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
lcd_dsi_port_num = <0>;
lcd_tcon_mode = <3>;
lcd_slave_stop_pos = <0>;
lcd_sync_pixel_num = <0>;
lcd_sync_line_num = <0>;
};
&lcd1 {
lcd_used = <1>;
lcd_driver_name = "lpm025m475a";
;lcd_bl_0_percent = <0>;
;lcd_bl_40_percent = <23>;
;lcd_bl_100_percent = <100>;
lcd_backlight = <50>;
lcd_if = <4>;
lcd_x = <1080>;
lcd_y = <1920>;
lcd_width = <31>;
lcd_height = <56>;
lcd_dclk_freq = <141>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <20000>;
lcd_pwm_pol = <0>;
lcd_pwm_max_limit = <255>;
lcd_hbp = <100>;
lcd_ht = <1212>;
lcd_hspw = <5>;
lcd_vbp = <8>;
lcd_vt = <1936>;
lcd_vspw = <2>;
lcd_dsi_if = <0>;
lcd_dsi_lane = <4>;
lcd_dsi_format = <0>;
lcd_dsi_te = <0>;
lcd_dsi_eotp = <0>;
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
lcd_dsi_port_num = <0>;
lcd_tcon_mode = <1>;
lcd_tcon_slave_num = <0>;
lcd_slave_stop_pos = <0>;
lcd_sync_pixel_num = <0>;
lcd_sync_line_num = <0>;
lcd_bl_en = <&pio PH 10 1 0 3 1>;
lcd_power = "vcc-dsi";
lcd_power1 = "vcc18-lcd";
lcd_power2 = "vcc33-lcd";
lcd_gpio_0 = <&pio PH 8 1 0 3 1>;
lcd_gpio_1 = <&pio PH 11 1 0 3 1>;
lcd_gpio_2 = <&pio PH 12 1 0 3 1>;
lcd_pin_power = "vcc-ph"
};
Экран интерфейса Intel 8080 (также известный как интерфейс MCU) — это очень старый протокол, который обычно используется на экранах с очень маленьким разрешением.
Сигнальная линия:
• Сигнал выбора чипа CS, определяет, работает ли чип.
• Сигнал выбора регистра RS, низкий уровень означает выбор индексного регистра или регистра состояния, высокий уровень означает выбор регистра управления. В реальных сценариях он обычно подключается к выводу LCD_DE (вывод разрешения данных) SoC.
• Сигнал различения команды данных /WR (низкий уровень означает запись данных), который представляет собой тактовый сигнал записи, обычно подключаемый к выводу LCD_CLK SoC.
• Сигнал чтения данных /RD (низкий уровень означает чтение данных), который является тактовым сигналом чтения, обычно подключается к выводу LCD_HSYNC SoC.
• RESET Сбросьте ЖК-дисплей (для сброса используйте фиксированную серию команд 0 1 0).
• Шина данных данных для двунаправленной передачи.
I8080 По данным из разрядностиловить есть 8/9/16/18, даже какая опорная нога, даже разрядность одинаковая, даже из Приколоть разная, также учитывайте из-фактор - RGB Формат.
Из мануала: разрядность экрана, количество цветов, см. RGB. и I8080 Приколоть схему конфигурации Аппаратного подключение。
Ниже приведен типичный RGB565. из,разрядностьдля8 Биты I8080 board.dts экрана интерфейса Пример конфигурации
1. Первая часть определяет, используется ли конфигурация и какой драйвер экрана использовать. lcd_driver_name определяет, какой драйвер экрана использовать для инициализации.
2. Во второй части решено, что конфигурация представляет собой интерфейс I8080 и формат RGB565 8 бит/2 цикла.
Навык Почему он называется 8bit/2cycle? RGB565 Ну во-первых, его формат RGB565, то есть один пиксель 16битный, а потом 8битный. изразрядность, нужно два тактовых Для отправки одного пикселя требуется цикл, поэтому
Называется 2 цикл.
I8080 Схема конфигурации контактов, определяемая I8080 изразрядность,Формат пикселей (кол-во цветов),Определите по таблице, какой Приколоть нужно соединить. Пожалуйста, посмотрите источник питания.
&pio {
I8080_8bit_pins_a: I8080_8bit@0 {
allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,function = "I8080_8bit";
allwinner,muxsel = <2>;
allwinner,drive = <3>;
allwinner,pull = <0>;
};
I8080_8bit_pins_b: I8080_8bit@1 {
allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,function = "I8080_8bit_suspend";
allwinner,muxsel = <7>;
allwinner,drive = <3>;
allwinner,pull = <0>;
};
};
&lcd0 {
/* part 1 */
lcd_used = <1>;
lcd_driver_name = "s2003t46g";
/* part 2 */
lcd_if = <1>;
lcd_cpu_if = <14>;
/* part 3 */
lcd_x = <240>;
lcd_y = <320>;
lcd_width = <108>;
lcd_height = <64>;
lcd_dclk_freq = <16>;
lcd_hbp = <20>;
lcd_ht = <298>;
lcd_hspw = <10>;
lcd_vbp = <8>;
lcd_vt = <336>;
lcd_vspw = <4>;
/* part 4 */
lcd_pwm_used = <1>;
lcd_pwm_ch = <8>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_bright_curve_en = <1>;
/* part 5 */
lcd_cpu_mode = <1>;
lcd_cpu_te = <1>;
/* part 6 */
lcd_frm = <1>;
lcd_gamma_en = <0>;
lcd_cmap_en = <0>;
lcd_rb_swap = <0>;
/* part 7 */
lcd_power = "vcc-lcd";
lcd_pin_power = "vcc-pd";
;reset pin
lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
;cs pin
lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
pinctrl-0 = <&I8080_8bit_pins_a>;
pinctrl-1 = <&I8080_8bit_pins_a>;
};
LVDS Это низковольтная дифференциальная сигнализация — это интерфейс дифференциальной сигнализации низкого напряжения.
Для интерфейса LVDS контакты lvds, соответствующие lcd0, и контакты lvds, соответствующие lcd1, фиксированы и различны.
из-за лвд Протокол не имеет возможности передавать данные. Как правило, экран не требует никакой инициализации, необходимо инициализировать только SoC. конец Вот и все.Так вот изlcd_driver_name Это по-прежнему "default_lcd", конечно, можно.
Специальная оптимизация выполняется для задержки запуска инициализации.
Ниже приведен типичный сингл link lvds экранная доска.dts Пример конфигурация, где пустые строки используются для разделения конфигурации на несколько частей.
Всего двадцать контактов PD19 выполняют функции контактов lvds (функция 3). Конечно, время экрана также необходимо изменить в соответствии с экраном.
&lcd0 {
/* part 1 */
lcd_used = 1
lcd_driver_name = "default_lcd";
/* part 2 */
lcd_if = 3
lcd_lvds_if = 0
/* part 3 */
lcd_x = 1280
lcd_y = 800
lcd_width = 150
lcd_height = 94
lcd_dclk_freq = 70
lcd_hbp = 20
lcd_ht = 1418
lcd_hspw = 10
lcd_vbp = 10
lcd_vt = 814
lcd_vspw = 5
/* part 4 */
lcd_pwm_used = 1
lcd_pwm_ch = 0
lcd_pwm_freq = 50000
lcd_pwm_pol = 0
lcd_pwm_max_limit = 255
lcd_backlight = 50
lcd_bright_curve_en = 0
lcd_bl_en = <&pio PD 21 1 0 3 1>;
/* part 5 */
lcd_lvds_colordepth = 1
lcd_lvds_mode = 0
/* part 6 */
lcd_frm = 1
lcd_hv_clk_phase = 0
lcd_hv_sync_polarity= 0
lcd_gamma_en = 0
lcd_cmap_en = 0
/* part 7 */
lcd_power = "vcc-lcd"
pinctrl-0 = <&lvds0_pins_a>;
pinctrl-1 = <&lvds0_pins_b>;
};
4.6.3 Типичная двухканальная конфигурация LVDS
Если экран Dual Link:
Сценарий 1, физическое подключение экрана, 8 data lane,SoC к каждому 4 переулок Перенесите половину пикселей, нечетные или четные пиксели.
&lcd1 {
lcd_used = <1>;
lcd_driver_name = "bp101wx1";
lcd_backlight = <50>;
lcd_if = <3>;
lcd_x = <2560>;
lcd_y = <800>;
lcd_width = <150>;
lcd_height = <94>;
lcd_dclk_freq = <138>;
lcd_pwm_used = <0>;
lcd_pwm_ch = <2>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_hbp = <40>;
lcd_ht = <2836>;
lcd_hspw = <20>;
lcd_vbp = <10>;
lcd_vt = <814>;
lcd_vspw = <5>;
lcd_lvds_if = <1>;
lcd_lvds_colordepth = <0>;
lcd_lvds_mode = <0>;
lcd_frm = <0>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
lcd_fsync_en = <0>;
lcd_fsync_act_time = <1000>;
lcd_fsync_dis_time = <1000>;
lcd_fsync_pol = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
lcd_bl_en = <&pio PJ 27 1 0 3 1>;
lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
lcd_pin_power = "bldo5";
lcd_power = "dc1sw";
pinctrl-0 = <&lcd1_lvds2link_pins_a>;
pinctrl-1 = <&lcd1_lvds2link_pins_b>;
};
Сценарий 2 (частичный IC Поддержка), физически подключите два экрана, каждый экран имеет 4 переулок, оба экрана одинаковой модели, разрешения и синхронизации То же, в настоящее время некоторые микросхемы Поддерживает отправку всех пикселей на каждый экран для достижения
Двойной дисплей (двойное отображение сигнала). Обратите внимание, что в настоящее время время ЖК-дисплея соответствует времени одного экрана, а lcd_lvds_if равно 2.
lcd1: lcd1@01c0c001 {
lcd_used = <1>;
lcd_driver_name = "bp101wx1";
lcd_backlight = <50>;
lcd_if = <3>;
lcd_x = <1280>;
lcd_y = <800>;
lcd_width = <150>;
lcd_height = <94>;
lcd_dclk_freq = <70>;
lcd_pwm_used = <0>;
lcd_pwm_ch = <2>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_hbp = <20>;
lcd_ht = <1418>;
lcd_hspw = <10>;
lcd_vbp = <10>;
lcd_vt = <814>;
lcd_vspw = <5>;
lcd_lvds_if = <2>;
lcd_lvds_colordepth = <0>;
lcd_lvds_mode = <0>;
lcd_frm = <0>;
lcd_hv_clk_phase = <0>;
lcd_hv_sync_polarity= <0>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
lcd_fsync_en = <0>;
lcd_fsync_act_time = <1000>;
lcd_fsync_dis_time = <1000>;
lcd_fsync_pol = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
lcd_bl_en = <&pio PJ 27 1 0 3 1>;
lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
lcd_pin_power = "bldo5";
lcd_power = "dc1sw";
pinctrl-0 = <&lcd1_lvds2link_pins_a>;
pinctrl-1 = <&lcd1_lvds2link_pins_a>;
};
Рисунок 4-8: контактный мультиплексор
В целях стандартизации и по другим причинам некоторые платформы помещают конфигурацию в board.dtsi. осознал в. иллюстрировать Изменить board.dtsi меры предосторожности.
Настройка RGB-экранилиLVDS Теперь нет необходимости в сложных определениях, нет необходимости знать, какие пины нужно настроить, и нет необходимости в узле lcd0_suspend. где имя rgb24_pins_a
После определения вы можете использовать его напрямую. Как правило, конфигурации, доступные непосредственно для ЖК-экранов, будут указаны в комментариях. Вы можете использовать платформу-pinctrl в каталоге ядра Arch/arm/boot/dts или Arch/arm64/boot/. текст dts.
Найдите его в файле.
пример:
pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//впадать в спячкучасждатьизопределение,io_disable
Конечно, вы также можете настроить набор ножек и записать его в board.dtsi. середина,Пока имя не требуетсяи Существующее имя дублируется ХОРОШО.
В целях стандартизации мы будем поддерживать одинаковые имена на всех платформах, где суффикс a означает, что вывод включен, а b означает, что io_disable используется при выключении устройства.
В настоящее время доступны следующие определения контактов:
Таблица 4-2: Таблица названий контактов дисплея
Имя контакта | описывать |
---|---|
rgb24_pins_a и rgb24_pins_b | RGB-экранловитьрот,А разрядность данных 24,RGB888 |
rgb18_pins_a и rgb18_pins_b | RGB-экранловитьрот,А разрядность данных 16,RGB666 |
lvds0_pins_a и lvds0_pins_b | Определение контактов 0 одноканального интерфейса LVDS (основной дисплей lcd0) |
lvds1_pins_a и lvds1_pins_b | Одноканальный интерфейс LVDS, определение контактов 1 (основной дисплей lcd0) |
lvds2link_pins_a и lvds2link_pins_b | Определение контактов двухканального интерфейса LVDS (основной дисплей lcd0) |
lvds2_pins_a и lvds2_pins_b | Определение контактов 0 одноканального интерфейса LVDS (основной дисплей lcd1) |
lvds3_pins_a и lvds3_pins_b | Определение контактов одноканального интерфейса LVDS (основной дисплей lcd1) |
lcd1_lvds2link_pins_a и lcd1_lvds2link_pins_b | Определение контактов двухканального интерфейса LVDS (основной дисплей lcd1) |
dsi4lane_pins_a и dsi4lane_pins_b | Определение контакта интерфейса экрана DSI, 4 полосы, только если это другой номер полосы |
Нет необходимости обращать внимание на определение источника питания в старом SDK. Вы можете напрямую присвоить строку псевдонима axp такому атрибуту, как lcd_power. Однако в новом SDK, если вам нужно использовать определенный источник питания, вы можете это сделать. сначала должен
Он определен в узле disp, а строка, используемая в части lcd, должна соответствовать строке, определенной в disp. Например, следующий пример:
disp: disp@01000000 {
disp_init_enable = <1>;
disp_mode = <0>;
/* VCC-LCD */
dc1sw-supply = <®_sw>;
/* VCC-LVDS and VCC-HDMI */
bldo1-supply = <®_bldo1>;
/* VCC-TV */
cldo4-supply = <®_cldo4>;
};
Среди них «-поставка» дазафиксированныйиз,Строка перед ней произвольная из,Однако рекомендуется использовать осмысленныеизимя。И позадиизкартина<®_sw> тогда это должно быть в board.dtsi регулятор0 найден в узле.
Затем в узле lcd0, если вы хотите использовать reg_sw, просто напишите его следующим образом: dc1sw соответствует dc1sw-supply.
lcd_power=”dc1sw”
Поскольку в u-boot также есть драйвер axp и драйвер дисплея, они считывают ту же конфигурацию, что и ядро. Для совместимости друг с другом существуют следующие ограничения при именовании.
В u-boot 2018 драйвер axp распознает только имена, определенные из чипа axp, например bldo1, поэтому при присвоении имени xxxsupply лучше всего называть его в соответствии с определением чипа axp.
board.dtsi может содержать только lcd0, но не lcd1, или только tv0, но не tv1. Если вы хотите добавить его сейчас, вам нужно обратиться к соответствующей платформе в каталоге ядра Arch/arm/boot/dts или Arch/. Arm64/загрузка/dts.
.dtsi-файл. Самое критичное — строка адресов после @ должна соответствовать определению в ядре, например:
lcd1: lcd1@01c0c000
Имя драйвера ЖК-экрана (строка) должно соответствовать имени драйвера экрана.
Название модели ЖК-экрана (необязательно) можно использовать в одном и том же драйвере экрана для дальнейшего различения разных экранов.
Lcd Interface
Соответствующее значение установки соответствующего значения:
0:HV RGBловитьрот
1:CPU/I80ловитьрот
2:Reserved
3:LVDSловитьрот
4:DSIловитьрот
Lcd HV panel Interface
Этот параметр действителен только в том случае, если lcd_if=0. Определите несколько типов интерфейса на экране синхронизации RGB.
Соответствующее значение установки соответствующего значения:
0:Parallel RGB
8:Serial RGB
10:Dummy RGB
11:RGB Dummy
12:Serial YUV (CCIR656)
Lcd HV panel Clock Phase
Этот параметр действителен только в том случае, если lcd_if=0. Определите фазовое соотношение между часами и данными экрана синхронизации RGB. Всего для регулировки доступны 4 фазы.
Соответствующее значение установки соответствующего значения:
0: 0 degree
1: 90 degree
2: 180 degree
3: 270 degree
Lcd HV panel Sync signals Polarity
Этот параметр доступен только при lcd_if=0. Это действительно только тогда, когда. ОпределитьRGB hsync для синхронизации экрана и вертикальная синхронизация изстолбсекс.
Соответствующее значение установки соответствующего значения:
0:vsync active low,hsync active low
1:vsync active high,hsync active low
2:vsync active low,hsync active high
3:vsync active high,hsync active high
Lcd HV panel Serial RGB output Sequence
Этот параметр доступен только при lcd_if=0. И lcd_hv_if=8 (последовательный RGB) действителен.
Определите порядок вывода RGB для нечетных строк:
0: Odd lines R-G-B; Even line R-G-B
1: Odd lines B-R-G; Even line R-G-B
2: Odd lines G-B-R; Even line R-G-B
4: Odd lines R-G-B; Even line B-R-G
5: Odd lines B-R-G; Even line B-R-G
6: Odd lines G-B-R; Even line B-R-G
8: Odd lines R-G-B; Even line B-R-G
9: Odd lines B-R-G; Even line G-B-R
10: Odd lines G-B-R; Even line G-B-R
Lcd HV panel Serial YUV output Sequence
Этот параметр доступен только при lcd_if=0. И lcd_hv_if=12 (последовательный YUV) действителен.
Определите выходной формат YUV:
0:YUYV
1:YVYU
2:UYVY
3:VYUY
Lcd HV panel Serial YUV F line Delay
Этот параметр доступен только при lcd_if=0. И lcd_hv_if=12 (последовательный YUV) действителен.
Определите количество строк, в которых F задерживается относительно допустимых строк при кодировании CCIR656:
0:F toggle right after active video line
1:Delay 2 lines (CCIR PAL)
2:Delay 3 lines (CCIR NTSC)
Lcd CPU panel Interface
Этот параметр доступен только при lcd_if=1. Это действительно только тогда, когда Чтобы узнать конкретное время, обратитесь к RGB. и I8080 ЦП на схеме конфигурации контактов Эти колонны.
Соответствующее значение установки соответствующего значения:
0:18bit/1cycle (RGB666)
2: 16bit/3cycle (RGB666)
4:16bit/2cycle (RGB666)
6:16bit/2cycle (RGB666)
8:16bit/1cycle (RGB565)
10:9bit/1cycle (RGB666)
12:8bit/3cycle (RGB666)
14:8bit/2cycle (RGB565)
Lcd CPU panel tear effect
Соответствующее значение установки соответствующего значения заключается в том, что при значении 0 интервал обновления составляет lcd_ht × lcd_vt, при значении 1 или 2 интервал обновления составляет два импульса te:
Lcd CPU panel tear effect
Соответствующее значение установки соответствующего значения заключается в том, что при значении 0 интервал обновления составляет lcd_ht × lcd_vt, при значении 1 или 2 интервал обновления составляет два импульса te:
0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge
Lcd LVDS panel Interface
Соответствующее значение установки соответствующего значения:
0:Single Link( 1 clock pair+3/4 data pair)
1:Dual Link(8 data пер, на каждые 4переулокловить влияет половина пикселей, нечетные пиксели и четные пиксели)
2: Dual Link (Каждый4переулокловитьполучить всекартинабелый,Обычно используется в физическом двойном экране.,И оба экрана одинаковые)
lcd_lvds_if равно 2 Сценарий состоит в том, чтобы соединить два одинаковых экрана, а затем на этих двух экранах будет отображаться одно и то же содержимое. Другое время Вам нужно заполнить время только одного экрана Вот и все.
Lcd LVDS panel color depth
Соответствующее значение установки соответствующего значения:
0:8bit per color(4 data pair)
1:6bit per color(3 data pair)
5.1.14 lcd_lvds_mode
Lcd LVDS Mode
Этот параметр действителен только в том случае, если lcd_lvds_bitwidth=0.
Соответствующее значение установки соответствующего значения (см. рисунок ниже):
0:NS mode
1:JEIDA mode
Рисунок 5-1: режим lvds
Lcd MIPI DSI panel Interface
Этот параметр действителен только в том случае, если lcd_if=4. Определите два типа экранов MIPI DSI.
Соответствующее значение установки соответствующего значения:
0:Video mode
1:Command mode
2:video burst mode
Примечание. ЖК-экран в режиме «Видео» обновляет экран в реальном времени и имеет определение параметров синхронизации, таких как ht и hbp; экран в командном режиме имеет буфер отображения на экране и обычно имеет вывод TE;
Lcd MIPI DSI panel Data Lane number
Этот параметр действителен только в том случае, если lcd_if=4.
Соответствующее значение установки соответствующего значения:
1:1 data lane
2:2 data lane
3:3 data lane
4:4 data lane
Lcd MIPI DSI panel Data Pixel Format
Этот параметр действителен только в том случае, если lcd_if=4.
Соответствующее значение установки соответствующего значения:
0:Package Pixel Stream, 24bit RGB
1:Loosely Package Pixel Stream, 18bit RGB
2:Package Pixel Stream, 18bit RGB
3:Package Pixel Stream, 16bit RGB
Lcd MIPI DSI panel Tear Effect
Этот параметр действителен только в том случае, если lcd_if=4.
Соответствующее значение установки соответствующего значения:
0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge
Примечание. Установите значение 0. Когда интервал обновления экрана равен lcd_ht. × ЖК_ВТ; установлено значение 1 или 2 Когда интервал обновления экрана составляет два тепульс。
Функция этого заключается в отправке сигнала со стороны экрана на конец SoC для сигнала синхронизации. Если эта переменная включена, внутреннее прерывание дисплея SoC будет запускаться этим внешним контактом.
Количество портов экрана DSI
Этот параметр действителен только в том случае, если lcd_if=4.
Соответствующее значение установки соответствующего значения:
0: порт
1: Два порта
Одной из функций этой опции является то, что один ЖК-дисплей Экран 8 переулок Когда, если нужно инициализировать только один из драйверов IC, то эта настройка равна 1, если два драйвера IC Все инициализированы, здесь установлено значение 0. и используйте lcd_source.c Определенная функция для инициализации.
Режим Ткон
Этот параметр действителен только в том случае, если lcd_if=4.
Соответствующее значение установки соответствующего значения:
0:normal mode
1:tcon master режим (первая синхронизация данных)
2::tcon master режим (синхронизируется каждый кадр)
3:tcon slave режим (зависит от мастера режим для запуска)
4:one tcon driver two dsi(8переулок)
5.1.21 lcd_slave_tcon_num
Серийный номер ведомого Tcon
Этот параметр доступен только при lcd_if=4. время и lcd_tcon_mode равен 1 или 2 эффективен. Раньше говорил мастеру tcon в режиме, из tcon Какой серийный номер у.
Соответствующее значение установки соответствующего значения:
0:tcon_lcd0
1:tcon_lcd1
Этот параметр доступен только при lcd_if=4. и lcd_tcon_mode=4 Это действительно только тогда, когда.
Соответствующее значение установки соответствующего значения:
0: tcon делит кадр изображения на левую и правую половины и отправляет его в Два DSI-модуль
1: tcon отправляет кадр изображения в Два отдельно. DSI-модуль
Этот параметр доступен только при lcd_if=4. и lcd_tcon_mode равно 2 или 3 Это действительно только тогда, когда.
Установите начальный пиксель синхронизации из tcon.
Целое число: не более lcd_ht
Этот параметр доступен только при lcd_if=4. и lcd_tcon_mode равно 2 или 3 Это действительно только тогда, когда.
Установить синхронизацию из tcon изначинать ХОРОШО.
Целое число: не более lcd_vt
Режим ЦП ЖК-дисплея, управление.
Соответствующее значение установки соответствующего значения заключается в том, что при значении 0 интервал обновления составляет lcd_ht × lcd_vt, при значении 1 или 2 интервал обновления составляет два импульса te:
0: Автоматическое прерывание по времени, внутреннее посредством сигнала гашения поля.
1: Прерывание инициируется на основании данных счетчика блоков или внешних текурок.
ЖК-дисплей включает функцию fsync, которая используется для запуска датчика для вывода изображений для синхронизации. Некоторые микросхемы поддерживают ее.
0:disable
1:enable
Функция fsync ЖК-дисплея, эффективная продолжительность времени уровня, единица измерения: количество тактовых импульсов пикселей.
0~lcd_ht-1
Функция fsync ЖК-дисплея, длительность недопустимого уровня, единица измерения: количество тактовых импульсов пикселей.
0~lcd_ht-1
Функция fsync ЖК-дисплея соответствует допустимому уровню пола.
0: эффективный уровень низкий.
1: эффективный уровень высок
Следующие параметры очень важны для настройки экрана и определяют время отправки данных отправляющей стороной (SoC). Поскольку он предполагает отладку отправителя и получателя, кроме разрешения и размера, остальные значения не являются абсолютно неправильными.
Да, два экрана с одинаковым разрешением и одинаковым интерфейсом могут иметь разные значения.
Способы его получения следующие:
Рисунок 5-2: lcd_info1
Рисунок 5-3: lcd_info2
Среди них DMT относится к «VESA и отраслевым стандартам и рекомендациям по синхронизации мониторов компьютеров (DMT)». Загрузите стандарт, который содержит различные часто используемые разрешения.
время. CVT относится к «Стандарту согласованной синхронизации видео (CVT) VESA», который предоставляет общую формулу для расчета времени указанного разрешения, частоты обновления и других параметров.
Вы можете скачать этот лист Excel для расчета генератора синхронизации видео VESA.
Из следующих двух формул нам не нужно задавать параметры lcd_hfp и lcd_vfp, поскольку драйвер автоматически вычислит lcd_hfp и lcd_vfp на основе нескольких других известных параметров.
lcd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp
lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp
Количество пикселей дисплея по горизонтали, которое соответствует ширине разрешения экрана.
Количество вертикальных линий на экране дисплея, что соответствует самому высокому разрешению экрана.
Horizontal Total time
Относится к общему количеству циклов dclk подряд. Смотрите картинку ниже:
Рисунок 5-4: ЖК-дисплей
Horizontal Back Porch
Это относится к количеству циклов dclk между действительными строками, началом сигнала синхронизации строк (hsync) и началом действительных данных, включая область сигнала синхронизации. См. рисунок выше. Обратите внимание, что сегмент hspw включен.
иллюстрировать Он включает в себя hspw сегмент, то есть lcd_hbp= фактическое hbp+ настоящий hspw
5.2.5 lcd_hspw
Horizontal Sync Pulse Width
Относится к ширине сигнала горизонтальной синхронизации. Единицей измерения является время 1 dclk (то есть время 1 цикла данных). См. картинку выше.
Vertical Total time
Относится к общему количеству строк в поле. Смотрите картинку ниже:
Рисунок 5-5: ЖК-телевизор
Vertical Back Porch
Относится к количеству строк между началом сигнала синхронизации поля (vsync) и началом действительной строки данных, включая область сигнала синхронизации поля.
иллюстрировать
Он содержит сегмент vspw, то есть lcd_vbp=actual vbp+actual vspw.
Vertical Sync Pulse Width
Относится к ширине сигнала синхронизации поля. Единица ХОРОШО. См. рисунок выше.
Dot Clock Frequency
Частота передачи пикселей передачи. Единица измерения — МГц.
fps = (lcd_dclk_freq×1000×1000) / (ht×vt)。
Это значение рассчитывается по следующей формуле:
lcd_dclk_freq=lcd_htlcd_vtfps
Уведомление:
lcd_dclk_freq * cycles = lcd_ht*lcd_vt*fps
или
lcd_dclk_freq = lcd_ht*cycles*lcd_vt*fps
Width of lcd panel in mm
этотпараметрописыватьlcd Физическая ширина экрана, мм. Используется для расчета dpi.
height of lcd panel in mm
этотпараметрописыватьlcd Физическая высота экрана, мм. Используется для расчета dpi.
В настоящее время широко используется регулировка подсветки с помощью ШИМ. Принцип заключается в использовании эффекта высокочастотного мерцания, создаваемого импульсными переключателями ШИМ, для обмана человеческого глаза и регулировки яркости путем регулировки рабочего цикла.
Использовать ли ШИМ.
Этот параметр определяет, использовать ли ШИМ для управления яркостью подсветки.
Pwm channel used
Этот параметр определяет используемый канал ШИМ. Здесь он относится к тому, какой канал ШИМ используется SoC. Это можно узнать, посмотрев на схему подключения.
Lcd backlight PWM Frequency
Этот параметр настраивает частоту сигнала ШИМ в Гц.
иллюстрировать Частота не должна быть слишком низкой, иначе будет легко заметить мерцание, а частота не должна быть слишком высокой, иначе эффект регулировки подсветки будет плохим. В некоторых руководствах по экранам указывается разрешенный ШИМ. Диапазон частот. Следуйте инструкциям на экране, чтобы установить фиксированный диапазон. Легко увидеть мерцание при низкой яркости, что является нормальным явлением. В настоящее время известно использование ШИМ. То же самое касается и подсветки.
Lcd backlight PWM Polarity
Этот параметр настраивает ШИМ. Сигнализ Оккупированный Сравниватьизстолбсекс.Соответствующее значение установки соответствующего значения:
0:active high
1:active low
Максимальный предел ШИМ подсветки ЖК-дисплея, выраженный в значении яркости
Например, 150 означает, что подсветку можно регулировать только до 150, а значение яркости в диапазоне 0–255 будет линейно отображаться в диапазоне 0–150. Используется для управления максимальной яркостью подсветки и экономии энергопотребления.
Контакт включения подсветки,Не обязательно,Проверьте принципиальную схему, чтобы увидеть, есть ли она,Используется для включения и отключения цепи подсветки и напряжения.
Пример: lcd_bl_en = port:PD24<1><2><1>
Значение: Включите подсветку ЖК-дисплея, когда PD24 выдает высокий уровень, потяните его вниз, по умолчанию — высокий уровень;
• Первая угловая скобка: назначение функции 1 – выход;
• Вторая угловая скобка: встроенный резистор; если используется 0, это означает, что внутренний резистор находится в состоянии с высоким импедансом, если это 1, это означает, что внутренний резистор подтягивается, а если это 2, это означает, что внутренний резистор тянет вниз. Использование значения по умолчанию представляет состояние по умолчанию, то есть резистор включен.
тянуть. Остальные данные недействительны.
• Третья угловая скобка: способность управлять столом по умолчанию — уровень 1;
• Четвертая угловая скобка: уровень 0 — низкий уровень, 1 — высокий уровень.
Драйвер экрана должен вызывать соответствующий интерфейс для управления включением и выключением.
иллюстрировать
Вообще говоря, включен высокий уровень. Исходя из этого, рекомендуется установить внутреннее сопротивление на понижение, чтобы предотвратить повышение, вызванное аппаратными средствами, что приводит к преждевременному включению подсветки. Пожалуйста, укажите уровень по умолчанию как высокий, как показал uboot.
Градусный дисплей, плавный и без мерцания.
Значение отображения подсветки, n (0–100).
Эта функция предназначена для ЖК-дисплеев с нелинейной яркостью. экраниз,Отрегулируйте изменения яркости в соответствии с конфигурацией метода кривой яркости.,чтобы сделать изменение яркости более линейным.
Например, lcd_bl_50_percent = 60 означает, что значение яркости 50% корректируется до 60%, то есть яркость увеличивается на 10% по сравнению с исходным значением.
иллюстрировать
Неправильная модификация этого свойства может привести к ухудшению эффекта регулировки подсветки.
Значение подсветки по умолчанию: 0–255.
Этот атрибут определяет яркость на этапе отображения логотипа в uboot. При входе в ядро считывается сохраненная конфигурация для определения яркости.
иллюстрировать
На этапе отображения логотипа обычно требуется относительно яркая яркость, что практикуется в отрасли.
Lcd Frame Rate Modulator
FRM призван решить проблему глубины цвета, вызванную уменьшением PIN-кода.
этотиндивидуальныйпараметр Соответствующее значение установки соответствующего значения:
0:RGB888 -- RGB888 direct
1:RGB888 -- RGB666 dither
2:RGB888 -- RGB565 dither
Формат пикселей некоторых ЖК-экранов имеет глубину цвета 18 бит (RGB666) или глубину цвета 16 бит (RGB565). Рекомендуется включить функцию FRM и компенсировать глубину цвета с помощью дизеринга, чтобы отображение достигало 24. -битовая глубина цвета (RGB888)
изэффектфрукты.Как показано ниже,Изображение вышедаглубина цветадляRGB66 ЖК-дисплей экран, на рисунке ниже показано открытие дизеринга После отображения откройте дизеринг Окончательный цветовой градиент слишком сглажен.
Рисунок 5-6: lcd_frm открыт
Рисунок 5-7: Закрытие lcd_frm
Lcd Gamma Correction Enable
Соответствующее значение установки соответствующего значения:
0: Закрытие функции коррекции LcdizGamma
1: Функция коррекции LcdizGamma включена.
Если установлено значение 1, lcd_gamma_tbl[256] необходимо назначить в драйвере экрана.
Lcd Color Map Enable
Соответствующее значение установки соответствующего значения:
0: Закрытие функции отображения цветов ЖК-дисплея
1: функция отображения цветов ЖК-дисплея включена.
Если установлено значение 1, таблице цветов ЖК-дисплея необходимо назначить lcd_cmap_tbl [2][3][4].
Каждый пиксель имеет три единицы: R, G и B. Каждые четыре пикселя представляют собой выборку, всего 12 вариантов. Первое измерение массива представляет нечетные и четные строки, второе измерение представляет RGB пикселя, а третье измерение представляет номер пикселя.
Содержимое представляет содержимое, сопоставленное с местоположением.
LCD CMAP Это функция вывода отображения пикселей. Только пиксели имеют особое расположение ЖК-дисплея. Экран необходимо настроить.
LCD CMAP определяет 4 пикселя в каждой строке как общую единицу, и каждый пиксель делится на 3 маленьких единицы: R, G и B, всего 12 маленьких единиц. Определите отношение отображения через lcd_cmap_tbl, и каждая небольшая единица вывода может быть
Он предназначен для сопоставления с одним из 12 небольших подразделений.
__u32 lcd_cmap_tbl[2][3][4] = {
{
{LCD_CMAP_G0,LCD_CMAP_B1,LCD_CMAP_G2,LCD_CMAP_B3},
{LCD_CMAP_B0,LCD_CMAP_R1,LCD_CMAP_B2,LCD_CMAP_R3},
{LCD_CMAP_R0,LCD_CMAP_G1,LCD_CMAP_R2,LCD_CMAP_G3},
},
{
{LCD_CMAP_B3,LCD_CMAP_G2,LCD_CMAP_B1,LCD_CMAP_G0},
{LCD_CMAP_R3,LCD_CMAP_B2,LCD_CMAP_R1,LCD_CMAP_B0},
{LCD_CMAP_G3,LCD_CMAP_R2,LCD_CMAP_G1,LCD_CMAP_R0},
},
};
Как указано выше, три верхние строки представляют расположение пикселей строк с нечетными номерами, а три нижние строки представляют расположение пикселей строк с четными номерами.
Каждые четыре пикселя представляют собой единицу измерения, первый столбец представляет первую карту пикселей каждых четырех пикселей, второй столбец представляет вторую карту пикселей каждых четырех пикселей и так далее.
Как определено выше, формат вывода пикселей показан на рисунке ниже.
Рисунок 5-8: cmap
Замените компонент R и компонент B в RGB модуля tcon.
0: без изменений
1: Заменить RмассаиBмасса
Если необходимо использовать определенный источник питания, он должен быть определен в узле [disp], а строка, используемая в части [lcd], должна соответствовать строке, определенной в disp. Например, следующий пример:
disp: disp@01000000 {
disp_init_enable = <1>;
disp_mode = <0>;
/* VCC-LCD */
dc1sw-supply = <®_sw>;
/* VCC-LVDS and VCC-HDMI */
bldo1-supply = <®_bldo1>;
/* VCC-TV */
cldo4-supply = <®_cldo4>;
};
Где -предложение фиксировано из,Строка перед -supply является произвольной.,Однако рекомендуется использовать осмысленныеизимя。существовать=позжеизкартина<®_sw>тогда это должно быть в board.dtsi регулятор0найден в узле.
Затем в узле lcd0, если вы хотите использовать reg_sw, просто напишите его следующим образом: dc1sw соответствует dc1sw-supply.
lcd_power=”dc1sw”
Поскольку u-boot также имеет драйвер axp, драйвер дисплея и ядро, все они считывают одну и ту же конфигурацию. Чтобы быть совместимыми друг с другом, при именовании существуют следующие ограничения:
В u-boot 2018 драйвер axp распознает только имена, определенные из чипа axp, например bldo1, поэтому при присвоении имени xxxsupply лучше всего называть его в соответствии с определением чипа axp.
Видетьвыше Обзормеры предосторожности.
Пример: lcd_power = «vcc-lcd»
Настройка регулятора изName. После настройки Драйвер экрана должен вызывать соответствующий интерфейс для управления включением и выключением.
Уведомление:Если необходимо несколько источников питания Открыть,Затем определите lcd_power1,lcd_power2 ждать.
Использование lcd_power такое же. Разница в том, что после того, как пользователь устанавливает его, нет необходимости использовать его в драйвере экрана. Вместо этого платформа драйвера включает его перед драйвером экрана и отключает после драйвера экрана.
Пример: lcd_pin_power = «vcc-pd»
Уведомление:Если вам нужно несколько групп,Затем добавьте lcd_pin_power1,lcd_pin_power2 ждать.кроме lcddx Кроме того, питание здесь может быть еще и ШИМ. Питание соответствующего вывода.
Пример: lcd_gpio_0 = port:PD25<0><0><default><0>
Значение: контакт lcd_gpio_0 — PD25.
• Первая угловая скобка: назначение функции: 0 – вход, 1 – выход.
• Вторая угловая скобка: встроенный резистор; если используется 0, это означает, что внутренний резистор находится в состоянии с высоким импедансом, если это 1, это означает, что внутренний резистор подтягивается, а если это 2, это означает, что внутренний резистор тянет вниз. Использование значения по умолчанию представляет состояние по умолчанию, то есть резистор включен.
тянуть. Остальные данные недействительны.
• Третья угловая скобка: способность управлять столом по умолчанию — уровень 1;。
• Четвертая угловая скобка: указывает значение по умолчанию, то есть при установке на выход уровень вывода контакта: 0 — низкий уровень, 1 — высокий уровень.
Необходимо вызвать ответный порт «изловить» в драйвере экрана, чтобы подтянуть и опустить из управления. См. функцию управления «Приколоть» иллюстрировать
Уведомление:Если есть несколькоgpio Если выводом необходимо управлять, определите lcd_gpio_0, lcd_gpio_1. ждать.
Пример: ЖКД0 = port:PD00<3><0>
Значение: этот вывод lcdd0, а именно PD0, настроен как выход LVDS.
• Первая угловая скобка: назначение функции; 0 — вход, 1 — выход, 2 — выход ЖК-дисплея, 3 — выход интерфейса LVDS и 7 — отключение.
• Вторая угловая скобка: встроенный резистор; если используется 0, это означает, что внутренний резистор находится в состоянии с высоким импедансом, если это 1, это означает, что внутренний резистор подтягивается, а если это 2, это означает, что внутренний резистор тянет вниз. Использование значения по умолчанию представляет состояние по умолчанию, то есть резистор включен.
тянуть. Остальные данные недействительны.
• Третья угловая скобка: способность управлять столом по умолчанию — уровень 1;。
• Четвертая угловая скобка: указывает значение по умолчанию, то есть при установке на выход уровень вывода контакта: 0 — низкий уровень, 1 — высокий уровень.
Конфигурация PIN-кода ЖК-дисплея следующая:
LCD для ВН RGB-экран,CPU/I80 экране, соответствующий ввод-вывод должен быть определен Рот для ЖК-дисплея вывод (если 0 вывод, первая угловая скобка равна 2, если она равна 1; вывод, первая угловая скобка — 3).
Для получения информации о конкретном соответствии ввода-вывода обратитесь к руководству пользователя по настройке.
Все вводы-выводы PIN-кода ЖК-дисплея можно отменить с помощью комментариев, и драйвер дисплея не инициализирует вводы-выводы комментариев.
Драйвер экрана должен вызывать соответствующий интерфейс для управления включением и выключением.
Уведомление:Нетда Это должно называтьсяlcdd0 Если вы измените это имя на другое, это не окажет никакого влияния на драйвер. Это просто для удобства запоминания.
При настройке узла lcd0, когда вам нужно настроить повторное использование контактов, вам нужно только назначить pinctrl-0 и pinctrl-1. Вы можете использовать контакты, определенные заранее, или вы можете использовать свои собственные контакты, определенные заранее.
Чтобы найти его в каталоге ядра Arch/arm/boot/dtsiliarch/arm64/boot/dts: Platform-pinctrl.dtsi Найдите определение в .
пример:
pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//впадать в спячкучасждатьизопределение,io_disable
Таблица 5-1: Определите это заранее контакта
Имя контакта | описывать |
---|---|
rgb24_pins_a и rgb24_pins_b | RGB-экранловитьрот,А разрядность данных 24,RGB888 |
rgb18_pins_a и rgb18_pins_b | RGB-экранловитьрот,А разрядность данных 16,RGB666 |
lvds0_pins_a и lvds0_pins_b | Определение контактов 0 одноканального интерфейса LVDS (основной дисплей lcd0) |
lvds1_pins_a и lvds1_pins_b | Single link LVDS Интерфейс 1 Определение контактов (основной дисплей lcd0) |
lvds2link_pins_a и lvds2link_pins_b | Определение контактов двухканального интерфейса LVDS (основной дисплей lcd0) |
lvds2_pins_a и lvds2_pins_b | Определение контактов 0 одноканального интерфейса LVDS (основной дисплей lcd1) |
lvds3_pins_a и lvds3_pins_b | Определение контактов одноканального интерфейса LVDS (основной дисплей lcd1) |
lcd1_lvds2link_pins_a и lcd1_lvds2link_pins_b | Определение контактов двухканального интерфейса LVDS (основной дисплей lcd1) |
dsi4lane_pins_a и dsi4lane_pins_b | Определение контактов интерфейса 4-полосного экрана DSI |
Персонализируйте набор ножек
Запишите его в board.dtsi, если имя не повторяет существующее имя, сначала определите, принадлежит ли контакт, который вам нужно использовать, к большому домену процессора или к маленькому домену процессора, и используйте это, чтобы определить, нужно ли определение контакта для размещения в пио (большой процессор
домен) или под r_pio (домен небольшого процессора).
пример:
&pio {
I8080_8bit_pins_a: I8080_8bit@0 {
allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,function = "I8080_8bit";
allwinner,muxsel = <2>;
allwinner,drive = <3>;
allwinner,pull = <0>;
};
I8080_8bit_pins_b: I8080_8bit@1 {
allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
PD19", "PD20", "PD21";
allwinner,function = "I8080_8bit_suspend";
allwinner,muxsel = <7>;
allwinner,drive = <3>;
allwinner,pull = <0>;
};
};
• булавки, специальные булавки.
• pname,Имя контакта,Бери все, что хочешь。
• функция, имя функции вывода, выберите ее случайно.
• Muxsel, выбор функции контакта. Выберите соответствующую функцию в соответствии со спецификацией порта.
• диск, емкость диска. Чем больше значение, тем больше емкость диска.
• тянуть, тянуть вверх и вниз, использовать 0 Если да, отметьте состояние высокого сопротивления внутреннего сопротивления, если оно равно 1 Затем внутренний резистор подтягивается, 2 Это означает, что внутренний резистор тянет вниз. Использовать по умолчанию означает состояние по умолчанию, то есть резистортянуть。Другие номера
Данные недействительны.
В целях стандартизации мы будем поддерживать согласованные имена на всех платформах, где суффикс a означает включение контакта, а суффикс b — io_disable, когда устройство выключено.
иногда,Вам необходимо использовать два разных набора функций из Приколоть.,Вот и все можно определить следующим образом.
pinctrl-0 = <&rgb24_pins_a>, <&xxx_pins_a>;
pinctrl-1 = <&rgb24_pins_b>, <&xxx_pins_b>;//впадать в спячкучасждатьизопределение,io_disable
5.6 Функция автоматического восстановления обнаружения статического электричества ESD
Эта функция реализована в ветках продуктов sunxi linux4.9 и linux 3.10. Если вам нужна эта функция, вам необходимо выполнить следующие шаги.
Сначала откройте следующую конфигурацию ядра:
Рисунок 5-9: Конфигурация ядра ESD
Измените драйвер экрана и реализуйте три функции обратного вызова:
В следующем примере добавьте функцию обратного вызова, связанную с ESD, на экран he0801a068. (linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/he0801a068.c).
Рисунок 5-10: Добавлена функция драйвера экрана ESD
Прототип функции esd_check:
S32 esd_check(u32 sel)
Функция: предоставление обратной связи верхнему уровню о состоянии текущего экрана.
Возвращаемое значение: Если экран нормальный, верните 0, если нет, верните не 0;
sel:показыватьиндекс.
Поскольку существует множество типов экранных интерфейсов, разные экраны определяют разные состояния. Вообще говоря, внутренняя информация (идентификатор) экрана считывается через интерфейс драйвера. или Другие регистры),Если сбор данных нормальный, считается, что экран в порядке.,теряться
Если это не удается, экран считается ненормальным. Например, следующий метод для экрана DSI:
Рисунок 5-11: Реализация функции драйвера экрана ESD
Кроме того, в нормальных условиях команда 0x0A (получить режим питания) будет считываться через интерфейс dsi, чтобы определить, является ли экран нормальным.
sunxi_lcd_dsi_dcs_read(sel, 0x0A, result, &num)
Рисунок 5-12: Регистр состояния ESD MIPI
reset_panel функцияпрототип:
s32 reset_panel(u32 sel)
Функция: операция сброса, необходимая в случае неисправности экрана.
Возвращаемое значение: 0, если сброс выполнен успешно, не равно 0, если сброс не выполнен.
sel:показыватьиндекс.
Инициализация каждого экрана различна.,Последовательность действий другая,общийиз Приходитьобъяснять Сразудаосуществлятьчастьиливесьизэкран Внутри драйвераизclose_flow японскийopen_flow Определенная функция обратного вызова. Гибко написано в соответствии с реальной ситуацией
эта функция.
Стоит отметить, что на некоторых экранах dsi команды sunxi_lcd_dsi_clk_disable (отключение высокоскоростных часов dsi) и sunxi_lcd_dsi_clk_enable (включение высокоскоростных часов) должны быть выполнены хотя бы один раз, в противном случае это может привести к
Функция чтения dsi ненормальна.
На следующем рисунке показан пример функции сброса:
Рисунок 5-13: Функция сброса ESD 1
Прототип функции set_esd_info:
s32 set_esd_info(struct disp_lcd_esd_info *p_info)
Функция: Управляйте конкретным поведением обнаружения ESD. Например, как часто выполнять обнаружение, уровень сброса и место вызова функции обнаружения.
Возвращаемое значение: Возвращает 0 в случае успешной установки, в противном случае — не 0.
p_info: структура поведения ESD, которую необходимо установить.
Пример: Как показано на рисунке ниже, прерывание дисплея обнаруживается каждые 60 раз (вызывается функция esd_check, если частота кадров дисплея 60 кадров в секунду, то это происходит раз в секунду), а затем оно будет выполняться в прерывании дисплея. функция обработки
Функция обнаружения, член esd_check_func_pos определяет место вызова функции esd_check. Если оно равно 0, функция обнаружения выполняется вне прерывания. Причиной использования этой опции является отображение ресурса прерывания (местоположения прерывания).
Время обработки) является очень ценным ресурсом и зависит от частоты кадров дисплея. Уровень на картинке ниже 1 Указывает на сброс Allwinner SoC. ЖК-дисплей Связанные модули и reset_panel Операции внутри, уровень 0 выражается, когда
Выполняйте операции только внутри reset_panel.
Рисунок 5-14: Функция информации о настройках ESD
Текущую информацию ESD можно получить через cat /sys/class/disp/disp/attr/sys.
screen 0:
de_rate 594000000 hz, ref_fps:60
mgr0: 2560x1600 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] unblank err[0]
force_sync[0]
dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
capture: dis req[0] runing[0] done[0,0]
lcd output(enable) backlight( 50) fps:60.9 esd level(1) freq(300) pos(1)
reset(244) 2560x1600
err:0 skip:0 skip T.O:50 irq:73424 vsync:0 vsync_skip:0
BUF en ch[1] lyr[0] z[0] prem[N] fbd[N] a[globl 255] fmt[ 0] fb
[2560,1600;2560,1600;2560,1600] crop[ 0, 0,2560,1600] frame[ 0, 0,2560,1600]
addr[98100000,00000000,00000000] right[00000000,00000000,00000000] flags[0x00] trd[0,0]
depth[ 0]
acquire: 0, 25.5 fps
release: 0, 25.5 fps
display: 0, 25.5 fps
esd level(1) freq(300) pos(1) reset(244)
Значение esd levele, freq и pos см. в объяснении прототипа функции set_esd_info выше.
Число после сброса указывает, сколько раз экран был сброшен (то есть сколько раз экран был успешно обнаружен и сброшен после того, как ESD вызвал зависание экрана).
Проблемы, с которыми вы можете столкнуться при использовании этой функции.
dsi_basic_cfg, значение регистра, указанное в красном поле, как показано на рисунке ниже. Этот регистр представляет собой значение деления тактовой частоты режима Lp. Вообще говоря, чем меньше значение, тем выше скорость LP. Попробуйте изменить его на меньшее. значение, чтобы увидеть, застревает ли он по-прежнему.
жить.
Рисунок 5-15: Значение делителя тактовой частоты в режиме Lp
После запуска системы вы можете прочитать некоторую информацию из sysfs для помощи в отладке.
Очевидно, что будет неудобно, если вы будете отлаживать ЖК-экран на Android. Время компиляции Android и прошивки Android слишком велико. Каждый раз, когда вы модифицируете ядро, проверка может занять 10 минут, что слишком неэффективно.
Если он низкий, можно воспользоваться следующими методами:
build.sh под Упаковать это просто ХОРОШО Потому что Linux. Ядро намного меньше, компилируется быстрее и его легче отлаживать.
показывать Выключите драйвер,Сосредоточьтесь на отладке ядра ЖК-дисплей После настройки драйвера я пересадил его в uboot. Еще одно преимущество этого подхода в том, что я могу очень удобно модифицировать ЖК-дисплей. timing Не нужно перезаписывать прошивку. то есть
Используйте команду fdt команды uboot для изменения дерева устройств. Например:
fdt set lcd0 lcd_hbp <40>
Дополнительные команды см. в справке fdt.
Как отключить отображение uboot? Обычно в файле inlcude/configs/platform.h по пути к исходному коду uboot закомментируйте CONFIG_SUNXI_MODULE_DISPLAY. Если это uboot 2018, закомментируйте его.
Удалите CONFIG_DISP2_SUNXI в configs/platform_defconfig.
Следующая информация является наиболее важной из всех.
cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 297000000 hz, ref_fps:60
mgr0: 1280x800 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0]
unblank direct_show[false]
lcd output backlight( 50) fps:60.9 1280x 800
err:0 skip:31 irq:1942 vsync:0 vsync_skip:0
BUF enable ch[1] lyr[0] z[0] prem[N] a[globl 255] fmt[ 8] fb[1280, 800;1280,
800;1280, 800] crop[ 0, 0,1280, 800] frame[ 0, 0,1280, 800] addr[ 0,
0, 0] flags[0x 0] trd[0,0]
lcd output
Указывает, что текущий интерфейс дисплея — ЖК-выход.
1280x800
Указывает текущее разрешение ЖК-дисплея, которое совпадает с настройкой lcd0 в board.dts.
ref_fps:60
Это теоретическое значение, рассчитанное на основе времени, которое вы заполнили в lcd0 файла board.dts.
fps:60.9
Следующие значения представляют собой статистику в реальном времени. Обычно они должны быть около 60 (ожидаемый кадр в секунду). Если разница слишком велика, это ненормально. Еще раз проверьте синхронизацию экрана и наличие последовательности инициализации экранного драйвера. позвонили.
irq:1942
Это количество прерываний вертикальной синхронизации. Каждое приращение, равное 1, соответствует обновлению кадра. Обычно оно составляет 60 (ожидаемых кадров в секунду) раз в секунду. Если изменений нет, это ненормально.
BUF
Начало указывает на информацию о слое, строку BUF Представляет слой, если BUF Если ни один из них не появится, то это будет черный экран, но это не имеет никакого отношения к самому драйверу экрана. Следует проверить уровень приложения.amp; Каркасный слой.
err:0
Это означает пропущенные цифры,Если число большое и постоянно меняется,экран Занавес будет усыпан цветами или даже полностью черным.,все красныеждать.
skip:31
Это количество пропусков кадров. Если это значение велико и постоянно меняется, могут быть задержки. Если это число отличается от irq. позжеиз Цифры те же самые,иллюстрировать скачки в каждом кадре,Будет темно (с подсветкой).
Чтобы проверить, включен ли определенный источник питания axp, вы можете использовать следующую команду. Конечно, это только для программного обеспечения, а реальные измерения следует проводить мультиметром.
cat /sys/class/regulator/dump
pmu1736_ldoio2 : disabled 0 700000 supply_name:
pmu1736_ldoio1 : disabled 0 700000 supply_name:
pmu1736_dc1sw : enabled 1 3300000 supply_name: vcc-lcd
pmu1736_cpus : enabled 0 900000 supply_name:
pmu1736_cldo4 : disabled 0 700000 supply_name:
pmu1736_cldo3 : disabled 0 700000 supply_name:
pmu1736_cldo2 : enabled 1 3300000 supply_name: vcc-pf
pmu1736_cldo1 : disabled 0 700000 supply_name:
pmu1736_bldo5 : enabled 2 1800000 supply_name: vcc-cpvin vcc-pc
pmu1736_bldo4 : disabled 0 700000 supply_name:
pmu1736_bldo3 : disabled 0 700000 supply_name:
pmu1736_bldo2 : disabled 0 700000 supply_name:
pmu1736_bldo1 : disabled 0 700000 supply_name:
pmu1736_aldo5 : enabled 0 2500000 supply_name:
pmu1736_aldo4 : enabled 0 3300000 supply_name:
pmu1736_aldo3 : enabled 1 1800000 supply_name: avcc
pmu1736_aldo2 : enabled 0 1800000 supply_name:
pmu1736_aldo1 : disabled 0 700000 supply_name:
pmu1736_rtc : enabled 0 1800000 supply_name:
pmu1736_dcdc6 : disabled 0 500000 supply_name:
pmu1736_dcdc5 : enabled 0 1480000 supply_name:
pmu1736_dcdc4 : enabled 1 900000 supply_name: vdd-sys
pmu1736_dcdc3 : enabled 0 900000 supply_name:
pmu1736_dcdc2 : enabled 0 1160000 supply_name:
pmu1736_dcdc1 : enabled 4 3300000 supply_name: vcc-emmc vcc-io vcc-io vcc-io
6.4 Просмотр информации о ШИМ
Целью ШИМ здесь является обеспечение мощности подсветки.
cat /sys/kernel/debug/pwm
platform/7020c00.s_pwm, 1 PWM device
pwm-0 ((null) ): period: 0 ns duty: 0 ns polarity: normal
platform/300a000.pwm, 2 PWM devices
pwm-0 (lcd ): requested enabled period: 20000 ns duty: 3984 ns polarity:
normal
pwm-1 ((null) ): period: 0 ns duty: 0 ns polarity: normal
«Запрошенное включено» выше означает, что оно было запрошено и включено, а ЖК-дисплей в скобках означает, что оно было запрошено lcd.
cat /sys/kernel/debug/pinctrl/pio/pinmux-pins
pin 227 (PH3): twi1 (GPIO UNCLAIMED) function io_disabled group PH3
pin 228 (PH4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 229 (PH5): (MUX UNCLAIMED) pio:229
pin 230 (PH6): (MUX UNCLAIMED) pio:230
pin 231 (PH7): (MUX UNCLAIMED) pio:231
Из приведенной выше информации мы знаем, что входы/выходы PH5 и PH6 применяются как обычные функции GPIO, а PH3 – как twi1.
cat /sys/kernel/debug/clk/clk_summary
Эта команда может увидеть, какие часы включены и какова частота.
С дисплеем связаны tcon, pll_video, mipi. ждатьждать.
cat /sys/kernel/debug/clk/clk_summary | grep tcon
cat /sys/kernel/debug/clk/clk_summary | grep pll_video
cat /sys/kernel/debug/clk/clk_summary | grep mipi
Отображение представляет собой целую ссылку. Если в какой-либо из ссылок посередине есть ошибка, конечная производительность будет ненормальной. Существует несколько возможностей ненормального отображения изображения.
причина:
Существует простой способ сделать предварительное заключение. Модули интерфейса (tcon и dsi и т. д.) могут выводить некоторые встроенные шаблоны (например, цветные полосы, изображения в оттенках серого, изображения в виде шахматной доски и т. д.), когда интерфейс выводит их. встроенные шаблоны,
время,Если оно отображается в это время, это будет ненормально.,этотиллюстрировать Понятно:
Как отобразить встроенный шаблон:
В ядре Linux-4.9 и выше в sysfs disp есть атрибут, которым можно напрямую управлять и отображать:
echo X > /sys/class/disp/disp/attr/colorbar
Вышеуказанная операция предназначена для отображения цветовой панели, где X может принимать значения от 0 до 8, а соответствующее значение показано на рисунке ниже:
Рисунок 6-1: цветовая полоса
Если имеется несколько устройств отображения и вы хотите, чтобы второе устройство отображения отображало цветную полосу, сначала выполните следующие действия:
echo 1 > /sys/class/disp/disp/attr/disp
Затем снова выполните вышеуказанные операции.
Если такого атрибута нет, регистром можно управлять напрямую, то есть работать с младшими 3 битами смещения 040 регистра tcon.
В Linux откройте cd /sys/class/sunxi_dump, затем:
echo 0x06511040 > dump;cat dump
Это напечатает значение текущего регистра смещения 040 tcon, а затем изменит младшие 3 бита на основе приведенного выше значения на значение, указанное на рисунке выше. Пример метода модификации:
echo 0x06511040 0x800001f1 > write
Обратите внимание, что базовый адрес tcon не обязательно равен 0x06511000. Он различается на разных платформах. Чтобы получить базовый адрес tcon, обратитесь к документации SoC.
показывать Произошло исключениевремя,Есть три возможности:
грамматика:
echo экрануказатель акта> /sys/class/disp/disp/attr/disp
echo путь/bmpискусствопредмет> /sys/class/disp/disp/attr/capture_dump
первое эхо Функция состоит в том, чтобы определить, какой дисплей захвачен, «Индекс экрана». Необязательное значение: 0. или1。
Вторая функция echo предназначена для создания bmp-файла снимка экрана, чтобы гарантировать, что «путь» доступен для записи и имеет оставшееся место.
например:
echo 0 > /sys/class/disp/disp/attr/disp
echo /data/xx.bmp > /sys/class/disp/disp/attr/capture_dump
Это создаст снимок экрана 0 в формате BMP в каталоге /data, имя файла — xx.bmp.
Помимо bmp, он также поддерживает сохранение необработанных данных, включая цветовые пространства RGB и YUV. Они различаются суффиксами.
следующее:
# Перехват цветового пространства yuv420p из необработанных данных.
echo /data/xx.yuv420_p > /sys/class/disp/disp/attr/capture_dump
# Перехват цветового пространства yuv420_sp_uvuv из необработанных данных.
echo /data/xx.yuv420_sp_uvuv > /sys/class/disp/disp/attr/capture_dump
# Перехватите необработанные данные цветового пространства yuv420_sp_vuvu.
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# Перехватите необработанные данные цветового пространства yuv420_sp_vuvu.
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# Перехватить цветовое пространство argb8888 из необработанных данных.
echo /data/xx.argb8888 > /sys/class/disp/disp/attr/capture_dump
# Перехват цветового пространства abgr8888 из необработанных данных.
echo /data/xx.abgr8888 > /sys/class/disp/disp/attr/capture_dump
# Перехват цветового пространства rgb888 из необработанных данных.
echo /data/xx.rgb888 > /sys/class/disp/disp/attr/capture_dump
# Перехват цветового пространства bgr888 из необработанных данных.
echo /data/xx.bgr888 > /sys/class/disp/disp/attr/capture_dump
# Перехват цветового пространства rgba8888 из необработанных данных.
echo /data/xx.rgba8888 > /sys/class/disp/disp/attr/capture_dump
# Перехват цветового пространства bgra8888 из необработанных данных.
echo /data/xx.bgra8888 > /sys/class/disp/disp/attr/capture_dump
Уведомление:этотиндивидуальный Функция есть толькоlinux-4.9 Только последующие ядра поддерживают эту функцию.
Обобщая прошлый опыт, можно сказать, что большинство нарушений отображения экрана вызвано необоснованным временем включения и выключения питания.
См. временные параметры экрана, иллюстрирующие поломку драйвера экрана.
Проблема с производительностью: Полностью черный экран без подсветки.
Есть две возможности:
Черный экран с подсветкой может быть вызван различными причинами. Чтобы проверить, выполните следующие действия:
Colorbar, подтвердите, может ли экран отображаться нормально.
vcc18-dsi ждать.
Экран DSI, конфигурация записана как LVDS.
Разделяется на несколько типов:
Скорее всего, это связано с нестабильным напряжением цепи подсветки. Проверьте напряжение.
Время заполнения board.dts необоснованно.
Если экран поляризован, он не будет работать, если вам нужно выключить телефон, отложить его в сторону, а затем снова включить.
Формат пикселей некоторых ЖК-экранов имеет глубину цвета 18 бит (RGB666) или глубину цвета 16 бит (RGB565). Рекомендуется включить функцию FRM и компенсировать глубину цвета с помощью дизеринга, чтобы отображение достигало 24. -битовая глубина цвета (RGB888)
изэффектфрукты.Как показано ниже,Изображение вышедаглубина цветадляRGB66 ЖК-дисплей экран, на рисунке ниже показано открытие дизеринга После отображения откройте дизеринг Окончательный цветовой градиент слишком сглажен.
Установка атрибута lcd_frm [lcd0] может улучшить это явление. См. объяснение lcd_frm.
7.6 Подсветка слишком яркая или слишком темная
Пожалуйста, обратите внимание на параметр «Взаимно выключена подсветка».
7.7. Тестовый экран работает ненормально после перезапуска после выключения питания.
Первая причина размытия экрана заключается в том, что частота кадров слишком высока и превышает лимит экрана:
Ненормальное значение FPS — это очень серьезная проблема, связанная со стабильностью всей операционной системы. Если частота кадров слишком высока, это приведет к увеличению пропускной способности системы и ненормальному процессу отображения. также приводит к тому, что ЖК-экран становится размытым и нестабильным, что может легко привести к
Если ЖК-экран поврежден, а частота кадров слишком низкая, взаимодействие с пользователем будет плохим.
lcd_dclk_freq*num_of_pixel_clk=lcd_ht*lcd_vt*fps /1e9
Среди них num_of_pixel_clk Обычно 1, что означает, что для отправки одного пикселя требуется изтактовый цикл1 A, микроконтроллер низкого разрешения и последовательные интерфейсы обычно требуют 2 до 3 индивидуальныйтактовый Для отправки одного пикселя требуется цикл.
Если вышеуказанное заполнение верно, вы можете подтвердить информацию о частоте нескольких основных часов, проверив раздел «Просмотр информации о часах», и отправить эту информацию и board.dts мейнтейнеру для дальнейшего анализа.
Есть и другой способ записи, например получается так:
lcdclk = port:PD18<2><0><2><default>
Можно изменить на:
lcdclk = port:PD18<2><0><3><default>
Что такое явление поляризации жидких кристаллов: на самом деле это диэлектрическая поляризация жидких кристаллов. Под действием внешнего электрического поля внутри диэлектрика вдоль направления электрического поля возникает индуцированный дипольный момент. Явление появления в электролите поляризованных зарядов называется диэлектриком.
поляризации.
С точки зрения непрофессионала, при подаче определенного напряжения на ЖК-панель накапливается большое количество зарядов. Когда напряжение исчезает, эти накопленные заряды высвобождаются. Однако из-за диэлектрического эффекта эти накопленные заряды не высвобождаются. немедленно.
Потеря этих инертных зарядов, которые не исчезнут сразу, вызывает остаточный постоянный ток в жидком кристалле и формирует явление поляризации.
Несколько распространенных явлений поляризации жидких кристаллов
Феномен.
Для устранения явления поляризации и остаточного изображения на ЖК-экране существуют следующие меры противодействия.
Он определяется Сяолаем и используется для отображения различных оттенков серого, то есть для достижения цветного отображения ГАММА. Гамма-напряжение используется для управления серой шкалой дисплея. Обычно оно делится на уровни G0–G14.
Разница между напряжением и напряжением Vcom приводит к разным углам поворота жидкого кристалла, что приводит к разнице в яркости. Наилучшая ситуация для напряжения Vcom — между G0 и G14, поэтому наилучшее мерцание ЖК-экрана.
хороший.
Чтобы отрегулировать напряжение VCOM, если вывод экрана имеет вывод VCOM, напрямую отрегулируйте соответствующую схему. Если микросхема драйвера экрана предоставляет интерфейс регистра, размер можно регулировать через интерфейс регистра.
Последовательность вызывает проблему, например, питание не отключается или задержка недостаточна.
Отладка ЖК-дисплея на самом деле представляет собой процесс отладки передающего чипа (Allwinner SoC) и принимающего чипа (ИС драйвера на ЖК-экране):