Адаптация ЖК-экрана на базе чипа Allwinner D1-H и платформы Tina Linux.
Адаптация ЖК-экрана на базе чипа Allwinner D1-H и платформы Tina Linux.

Linux предоставляет полный набор драйверов экрана, поддерживающих экраны RGB, MIPI DSI, eDP, LVDS, E-INK, а также экраны SPI и IIC с низким разрешением. Конкретная ситуация вождения на экране должна определяться в соответствии с чипом. В этой статье будет объяснен основной метод настройки драйвера экрана путем введения драйвера ЖК-дисплея в ядро ​​D1-H.

ЖК-драйвер

Драйверы дисплея можно разделить на три уровня: уровень драйвера, уровень инфраструктуры и нижний уровень. Нижний уровень подключен к графическому оборудованию и в основном отвечает за преобразование функциональных параметров, настроенных верхним уровнем, в параметры, необходимые аппаратному обеспечению, и настройку их в соответствующие регистры.

Уровень инфраструктуры отображения абстрагирует и инкапсулирует базовый уровень в функциональные модули. Уровень драйвера инкапсулирует внешние функциональные интерфейсы и предоставляет соответствующие узлы устройств и унифицированные интерфейсы пользовательскому пространству через ядро.

существоватьводить слой машины, разделенный на три привода машину,Они фреймбуферпривод машину,displayводить машину,LCD&HDMIводить машину.framebuffer Движимый framebuffer core Стыковка, осознание linux Стандартный фреймбуфер интерфейс. Драйвер дисплея является основным модулем драйвера дисплея. Все интерфейсы предоставляются компанией. display Драйверы предоставляются, в том числе lcd интерфейс.

Конфигурация ЖК-дисплея

U-Boot

Конфигурация U-Boot

для U-Boot Платформа, обычно рекомендуется изменить ее напрямую. config документ,роды

Язык кода:javascript
копировать
lichee/brandy-2.0/u-boot-2018/configs/xxx_defconfig

из которых xxx — это кодовое имя программного обеспечения чипа. Можно найти в BoardConfig.mk Найдите место проживания в документе. Например D1-H чип BoardConfig.mk документ,роды:

Язык кода:javascript
копировать
device/config/chips/d1-h/configs/default/BoardConfig.mk

Однако следует также отметить, что иногда, помимо default документпапка Внутрииметь BoardConfig.mk документ,другойизпроектдокументпапка Внутритакжеиметь BoardConfig.mk документ. В это время вам нужно использовать папку проекта с документами. BoardConfig.mk Конфигурациядокумент。отличный Первыйиспользоватьиздапроектдокументпапкавнутрииз Конфигурациядокумент。

Вот, евб1 папка документа для папки документов проекта, представляет f133-evb1 Эта плата разработки

default — это папка документов по умолчанию. Если документ «Конфигурация приезжать» не найден в папке документов проекта, он будет помещен в папку документов по умолчанию.

мы открываем BoardConfig.mk Конфигурациядокумент

Вы можете видеть, что этот чип использует sun20iw1p1_defconfig Это документ конфигурации U-Boot из config Документ конфигурации включен в папку документов.

открой это,Заднюю часть дисплея SUNXI LOGO DISPLAY можно найти в существующем документе.,Посмотрите эти две части «Конфигурация проживания»:

красная рамкаизда DISP Основные части драйверной части следующие:

Язык кода:javascript
копировать
CONFIG_CMD_SUNXI_BMP=y          # Загрузочный логотип BMP анализатор документов
CONFIG_LZMA=у                   # Загрузочный логотип использовать LZMA Инструменты сжатия и декомпрессии
CONFIG_DISP2_SUNXI=y            # DISP водить машину
CONFIG_HDMI2_DISP2_SUNXI=y      # HDMI DISP водить машину 
CONFIG_AW_PHY=y                 # DISP водить машинуиспользоватьизда Самоисследование Цюаньчжипериферийные устройства

Если вы хотите закрыть U-Boot из LCD DISP Вывод драйвера, можно закомментировать CONFIG_DISP2_SUNXI=y Эта линия.

То же самое касается отключения драйвера HDMI DISP, просто закомментируйте его.

Linux

Конфигурация ядра

бегать make kernel_menuconfig Входить Конфигурация ядра,попытаться найтиприезжать Video support for sunxi

Язык кода:javascript
копировать
Device Drivers > Graphics support > Frame buffer Devices > Video support for sunxi

существоватьпоказыватьводить Самое главное в машине это <*> DISP Driver Support(sunxi-disp2) , после проверки вы можете посмотреть приезжать другие из параметров. Включает привод поддержка машин, отладка интерфейсов LCD Панель выбора. (ЖК-дисплей panels select)

Входить LCD Выбор панели Вы можете посмотреть приезжатьу многих естьприспособление Понятноизпоказыватьэкран Доступно на выбориспользовать。

Конфигурация дерева устройств

Прочее оборудование то же самое,Экранводить машинутакжеиспользовать Понятнодве порцииоборудование Дерево。первая порция Конфигурация Понятнопоказыватьводить адрес машиныиз, часы и другие параметры, расположенные в kernel/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi Вообще говоря, параметр из здесь не требует Исправлять, и по умолчанию используется Вот и все еще одна копия Конфигурация находится в device/config/chips/v853/configs/vision/board.dts Включает в себя два узла конфигурации. Первый из них display Местоиспользоватьизузел,Конфигурация экрана Особенности и функции,еще одинда lcd Местоиспользоватьизузел,Конфигурация Понятно LCD Панель из Двигимый параметры.

Конфигурация очень сложная,Конкретное значение из можно найти в «Linux_LCD_Development Guide.pdf».,Здесь не так много объяснений.

ЖК-драйвер

LCD Экран дисплея отличается от других драйверов, ЖК-дисплей Существует множество типов экранов, богатых интерфейсов и различных параметров экрана. так LCD Экранводить все машины хранятся в отдельных модулях из существующих, приводов. машинудокументроды:

Язык кода:javascript
копировать
lichee/linux-5.4/drivers/video/fbdev/sunxi/disp2/disp/lcd

С точки зрения интерфейса ЖК-дисплей Экран можно разделить на RGB Экран, ЛВДС Экран, МИПИ DSI Экран, I8080 экран, eDP Экран, SPI Экран, ИИК Экран. Вот некоторые часто используемые из них: Экран。

(1) интерфейс RGB

Интерфейс RGBсуществовать Платформу Allwinner еще называют HVинтерфейс (Горизонтальная синхронизация и Вертикальная синхронизация). Иметь Некоторые ЖК-экраны поддерживают расширенные функции, такие как гамма, формат пикселей из настроек и т.д., но RGB Сам протокол не поддерживает передачу данных изображения, кроме данных изображения, поэтому его нельзя передать RGB Выровняйте контакты LCD конфигурация экрана, поэтому я получил один RGB Интерфейс экрана либо не требует команды создания, либо этот экран обеспечит дополнительную ступню из трубки для SoC для настройки, например SPI и I2C ждать. RGB Экраниметьмного форматов,Разная изразрядность,Отличаются тактовыми циклами. В следующей таблице показана разница между разрядностью и периодом такта.

разрядность

количество тактов

Количество цветов и формат

Параллельный\Последовательный 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

сериал

сериал RGB Это премьер-министр для параллельного RGB Например, это не означает, что для отправки данных используется только одна линия. Для отправки данных одного пикселя требуется всего несколько тактов, поэтому так. RGB интерфейс Сразудасериал RGB。

(2) Интерфейс MIPI DSI

МИПИ-ДСИ, то есть Mobile Industry Processor Interface Display Serial Интерфейс, процессор для индустрии мобильной связи, интерфейс дисплея, интерфейс. МИПИ иметь 2 режим:

  1. Command Режим, аналогичный интерфейсу MPU, требует для буферизации ICВнутрииметьGRAM.
  2. Video режим. похожий RGB интерфейс,безиметь ГРАМ, тебе нужно продолжать panel Сбросить данные. в video mode Разделен на три подразделения mode:
    1. Non-burst mode with sync pulses
    2. Non Burst mode with sync Events
    3. Burst режим. Простое понимание состоит в том, что эффективный коэффициент передачи данных выше и эффективность передачи выше.

MIPI-DSI Дифференциал трубки ноги разделен на два типа трубок: одна — ступня часовой трубки, другая — ступня трубки данных. Количество управления данными является переменным, а единица измерения lane ,lane Также относится к паре дифференциальных штифтов, каждый из которых lane На самом деле содержит две строки. Вообще говоря LCD В инструкции к экрану написано из lane Число относится к количеству ступняиз ламп передачи данных и не включает ступня из тактовых ламп. Например, кто-то 4 lane MIPI-DSI Общее количество экранов есть (4+1)*2 Корневые ножки.

(3) Экран LVDS

LVDS означает низковольтную дифференциальную сигнализацию, которая представляет собой интерфейс дифференциальной сигнализации низкого напряжения.

потому что LVDS Он не имеет возможности передавать данные изображения. В общем, экран не нуждается в какой-либо инициации, только в инициации. SoC Просто покончи с этим.

(4) экран I8080

Intel 8080 Экран интерфейса (также известный как MCU интерфейс)очень старыйизпротокол,Общее использованиесуществоватьразрешение маленькоеизна экране。

Трубкаступняизконтрольступняиметь6добрый:

  1. CS Сигнал выбора чипа определяет, работает ли чип.
  2. RS Сигнал выбора регистра, низкий уровень указывает на выбор index или status Регистр, высокий уровень означает выбор регистра управления. В реальных сценариях он обычно подключается к SoCизLCD_DEступня (включение данных ступня).
  3. WR (Низкий уровень означает запись данных) Команды данных различают сигналы, То есть Запись тактового сигнала, обычно подключаем SoC из LCD_CLK ступня
  4. RD (Низкий уровень указывает на чтение данных) Сигнал чтения данных, То есть Прочитать тактовый сигнал, в общем подключить SoC из LCD_HSYNC ступня
  5. RESET Сброс ЖК-дисплея (для сброса используйте фиксированную серию команд 0 1 0)
  6. Data Это двусторонний путь передачи данных

I8080 в соответствии сизданныеразрядностьинтерфейсиметь 9.08.16.18, ещё какая ступня ссылка, Прямо Сейчас это то же самое, что и разрядность, и даже изтубная ступня тоже должна учитываться. RGB Формат.

  1. RGB565, всего имеется 65K так много цветов
  2. RGB666, всего имеется 262K Так много цветов
  3. 9бит фиксировано до 262К

(5) Экран SPI

SPI LCD это использовать SPI По шине передаются данные изображения, которые появляются только при очень низком разрешении. Вообще говоря, перед открытием экрана требуется инициация. СПИ LCD Экран вообще не используется DISP Приходитьводить машину Экран,использоватьнезависимыйизводить машину Вот и все. Например FBTFT водить машину.

Ядро Linux адаптируется к ЖК-экрану

Шаги по адаптации к ЖК-экрану
  1. Убедитесь, что в полном каталоге отображается рамкаиз Конфигурация. включить ядроиметь
  2. Заранее подготовьте следующую информацию:
    1. экранруководство. В основном экран описание Основную информацию, электрические характеристики и т. д. уточняйте у производителя экрана.
    2. Driver IC руководство. В основном экран описания IC из Подробности. Основная цель здесь — подробно объяснить каждую команду, настроить ее для нас и запросить ее у фабрики экранов.
    3. информация о времени экрана. Пожалуйста, обратитесь к производителю экрана.
    4. Код инициализации экрана можно узнать у производителя экрана. Обычно DSI и I8080 Экран и т. д. требуют команд инициализации для инициализации экрана.
    5. мультиметр. Регулировка экрана не может избежать измерения соответствующих напряжений.
  3. На шаге 2 производитель экрана предоставляет информацию, определяет тип экрана, а затем выбирает экран того же типа. машинакак шаблон для экрана привода машинудобавить вилипрямойсуществоватьвыше Исправлять。
  4. Исправлятьэкранводить машинув каталогеиз panel.c и панель.ч. существующая глобальная структурная переменная panel_array Новое в только что добавленном strcut __lcd_panel из Указатель переменной. панель.h Добавлено в strcut __lcd_panel из заявления.
  5. ИсправлятьMakefile。существоватьlcdэкранводить машинакаталогиз Предыдущий уровеньиз Makefile документсерединаизdisp-objsНовое в только что добавленномэкранводить машину.o
  6. Исправлять board.dts серединаиз lcd0 узел.
  7. Скомпилировать тест

Отключите U-Boot, чтобы ускорить отладку.

Прежде чем адаптироваться к экрану, мы можем сначала закрыть Uboot из Экранводить машину,бронировать Kernel изводить машину Легко отлаживать

Иди первым Uboot Конфигурациядокументпапка Исправлять Конфигурациядокументзакрытие Экранводить машину.

Язык кода:javascript
копировать
brandy/brandy-2.0/u-boot-2018/configs/sun8iw21p1_defconfig

Закомментирован CONFIG_DISP2_SUNXI=y

Адаптация к экрану RGB

Ниже приводится краткое описание того, как пересадить RGB Экран,использоватьиз Совет по развитиюда V853 Плата разработки, модель экрана [D500T7009VC], это RGB Экран не требует инициализации. Используйте 40-контактный разъем Кабель, RGB666 Подключите макетную плату (как видите, макетная плата из RGB LCD иметь линию полета, информация о линии полета описана в следующем тексте)

потому чтоэтот RGB Экран не нуждается в инициализации, поэтому используйте его напрямую. default_lcd Просто езжай на нем, в kernel Внутри default_lcd включено по умолчанию, поэтому просто Исправитьоборудование дерева Вот и все。

Аппаратное подключение

Аппаратное Подключение Например, принципиальная схема LCD Экранное руководство показывает:

Посмотреть приезжать можно, производитель экрана предоставляет инструкцию. 31 ноги DISP ноги, по умолчанию LOW Режим То естьзакрытие показать выход. На стороне платы разработки LCD Разъем экрана DISP ноги свисали из. Если вы не пролетите по линии, экранзакрытие отобразит результат без отображения. Но это не обязательно DISP Контроль сигнала. Зависит от экрана.

Конфигурация дерева устройств

Во-первых, мы pio узел Внутри Увеличивать rgb18_pin как LCD Экраниз Pin Привязка.

Язык кода:javascript
копировать
&pio {
    rgb18_pins_a: rgb18@0 {
        allwinner,pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,pname = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,function = "lcd";
        allwinner,muxsel = <2>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
    };

    rgb18_pins_b: rgb18@1 {
        allwinner,pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,pname = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,function = "rgb18_suspend";
        allwinner,muxsel = <0xf>;
        allwinner,drive = <1>;
        allwinner,pull = <0>;
    };
};

а затем измените узел lcd0. Здесь Воля разделена на несколько частей, которые будут выделены ниже. Кроме того, к наиболее важным пунктам добавлены комментарии.

Язык кода:javascript
копировать
&lcd0 {
    lcd_used            = <1>;            # включить ЖК-дисплей

    lcd_driver_name     = "default_lcd";  # использовать default_lcd водить машину
    lcd_if              = <0>;            # 0:rgb 4:dsi

    # Part 1
    lcd_x               = <800>;          # ширина
    lcd_y               = <480>;          # высокий
    lcd_width           = <108>;          # Экранфизикаширина,единица mm
    lcd_height          = <65>;           # Экранфизикавысокий,единица mm

    # Part 2
    lcd_pwm_used        = <1>;            # Включить подсветку PWM
    lcd_pwm_ch          = <9>;            # использовать PWM ряд 9 
    lcd_pwm_freq        = <50000>;        # PWM Частота, ед. Hz
    lcd_pwm_pol         = <0>;            # подсветка PWM из полярности
    lcd_pwm_max_limit   = <255>;          # подсветка PWM измаксимальное значение(<=255)

    # Part 3
    lcd_dclk_freq       = <24>;           # Экранные часы, шт. MHz
    lcd_ht              = <816>;          # hsync total cycle(pixel)
    lcd_hbp             = <12>;           # hsync back porch(pixel) + hsync plus width(pixel);
    lcd_hspw            = <4>;            # hsync plus width(pixel)
    lcd_vt              = <496>;          # vsync total cycle(line)
    lcd_vbp             = <12>;           # vsync back porch(line) + vysnc plus width(line)
    lcd_vspw            = <4>;            # vsync plus width(pixel)

    # Part 4
    lcd_lvds_if         = <0>;
    lcd_lvds_colordepth = <1>;           
    lcd_lvds_mode       = <0>;
    lcd_frm             = <0>;            # 0:закрытие; 1: включить сглаживание rgb666; 2: включить сглаживание rgb656.
    lcd_io_phase        = <0x0000>;
    lcd_gamma_en        = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en         = <0>;
    deu_mode            = <0>;
    lcdgamma4iep        = <22>;
    smart_color         = <90>;

    # Part 5
    pinctrl-0 = <&rgb18_pins_a>;
    pinctrl-1 = <&rgb18_pins_b>;
};

Part 1

существуют в этой части,наснастраивать Понятно Экраниз Пиксельширина、высокий,физикаширина、высокий,Эти данные можно запросить в руководстве по данным, предоставленном производителем экрана. иметь десятичную точку из может следовать принципу округления.

Part 2

В этой части мы настраиваем LCD Экранизподсветка Связанные свойства,использовать PWM Подсветка обеспечивает динамическую регулировку подсветки, что можно увидеть на принципиальной схеме. LCD-PWM использоватьизда PWM9, так что настройте lcd_pwm_ch = <9>;

Part 3

Эта часть очень важная часть, можно ли ее осветить? LCD От этой части зависит экран.

Мы открываем Экран мануала, ищем эту часть введения времени прибытия.

(1)DCLK

сначала это DCLK, показанный здесь DCLK значение 25. Следует отметить, что из-за того, что если задать напрямую lcd_dclk_freq = <25>; приведет к тому, что фактическая частота станет 48 МГц. Это потому, что когда DCLK частота меньше 48MHz когда его частота составляет от 288MHz из Главные часы, разделенные на фактическую частоту прибытия. и 25MHz Невозможно полностью разделить, что приводит к использованию следующей точки частоты. 48M, что приводит к разгону экрана.

Вот краткое объяснение метода расчета коэффициента частотного деления и перемещения по частоте:

существовать Включение питаниячас,еслииспользоватьизда RGB Экран,нас Вы можете посмотреть приезжатьтакизвыход:

Язык кода:javascript
копировать
disp 0, clk: pll(144000000),clk(144000000),dclk(24000000) dsi_rate(144000000)
     clk real:pll(288000000),clk(288000000),dclk(48000000) dsi_rate(0)

Действительный LCD передано PLL часделение часовпридетсяприезжатьиз。Местоксуществовать Здесь будет рассчитываться разделение частот.из Значение деления частоты。использовать dclk(24000000)из 24MHz Умножить на коэффициент умножения 6, получи pll(144000000) составляет 144 МГц, используйте pll(144000000) Перейдите, чтобы подать заявку на ближайшие часы, подайте заявку здесь для прибытия. real:pll(288000000) То есть 288 МГц. Используйте в это время (int)(real:pll / pll) Вот и все Получить коэффициент деления частоты. потому что что не выполняет операции с плавающей запятой, и результат будет округлен в меньшую сторону. Например, здесь коэффициент разделения частот равен 288MHz / 144MHz = 2。использовать Коэффициент деления частоты Умножить на коэффициент умножения Вот и всепридетсяприезжать 288MHz Фактический результат деления частоты, вот 288MHz / (2 * 6) = 24MHz В самый раз.

Если мы установим его на 25 МГц, согласно приведенному выше расчету коэффициент деления частоты составит 1,288 МГц / (1 * 6) = 48 МГц.

потому что Display Фреймворкам не просто нужна поддержка RGB Дисплей также должен поддерживать MIPI-DSI,LVDS и т. д. интерфейсиз дисплея,иидругойиздиапазон частот Местоиспользоватьиз Коэффициент умножения частотытакжедадругойиз,Следовательно, коэффициент умножения частоты не может быть произвольным.

Здесь лучше всего выбрать тот, который наиболее близок к DCLK Просто цените.

1

2

3

4

5

6

7

48MHz

24MHz

16MHz

12MHz

8MHz

6MHz

4MHz

идля 48MHz Выше Экран,потому чтоиспользовать Понятнодругойизчасколоколисточник,Его частотное деление более точное,Нет необходимости настраивать по этому методу.

(2)HT(Hsync Total)

По мануалу ХТ. иззначение 816, это значение изменять не нужно. Просто заполните его.

(3)HBP(Hsync Back Porch)

Согласно мануалу, HBP Значение 8. Но потому что чтоQuanzhi Platformиз HBP смысл это HBP + HSPW, поэтому вам нужно добавить HSPW значение заполняется. Вот 8 + 4 = 12

(4)HSPW(Hsync Plus Width)

По мануалу HSPW. иззначение 4. Это значение изменять не нужно. Просто заполните его.

(5)VT(Vsync Total)

По мануалу ХТ. иззначение 496, это значение изменять не нужно. Просто заполните его.

(6)VBP(Vsync Back Porch)

По мануалу ВБП Значение 8. Но потому что чтоQuanzhi Platformиз VBP смысл это VBP + VSPW, поэтому нужно добавить VSPW значение заполняется. Вот 8 + 4 = 12

(7)VSPW(Vsync Plus Width)

По мануалу ВСПВ иззначение 4. Это значение изменять не нужно. Просто заполните его.

Вы можете видеть, что в руководстве также предусмотрено HFP(Hsync Front Porch)и VFP(Vsync Front Подъезд) из стоимости. Это значение не нужно заполнять, поскольку привод машину можно рассчитать, чтобы получить фактическое значение.

Part 4

Эта часть LCD Расширенная функциональность экрана, в том числе LCD Различные функции Экраниз можно настроить, обратившись к руководству Внутри.

Part 5

Эта часть Pin из привязки, привязка выше создает из двух RGB узел. GPIO и Pin Пожалуйста, обратитесь к информации, связанной с привязкой:【GPIO - V853

Проверка водителя

ненужныйинициализацияиз RGB ЖК-драйвер относительно прост, посмотрите Видео support for sunxi Вот и все

Язык кода:javascript
копировать
Device Drivers > Graphics support > Frame buffer Devices > Video support for sunxi

тестовый экран

Сначала скомпилируйте и упакуйте. Сжечь систему.

Первый ls команда печати /dev/ Проверьте каталог и посмотрите, не появляется ли хата. fb0 этот узел

Вы можете посмотреть приезжатьздесьиметь fb0` Затем приступаем к самой простой проверке узла.

Язык кода:javascript
копировать
cat /dev/urandom > /dev/fb0

Этот тест обязательно покажет cat: write error: No space left on device , это нормальная ситуация, потому что FB0 Ее можно сравнить с видеопамятью. Видеопамять имеет фиксированный размер и может быть использована. Когда видеопамять заполнена, будет сообщено об ошибке. No space left on устройство. Если эта ошибка не появляется при выполнении этой строки команды, внизу может отображаться надпись водить. машину Конфигурацияиметьвопрос。

Вы также можете использовать тестирование цветных полос.

Язык кода:javascript
копировать
echo 8 > /sys/class/disp/disp/attr/colorbar

также Можетиспользовать,Получить информацию о слое Screeniz,Частота кадров и т. д.

Язык кода:javascript
копировать
cat /sys/class/disp/disp/attr/sys
Адаптация к экрану инициализации RGB + SPI

иметьнекоторый RGB требуется экран SPI провести инициализацию, установить Экраниз ГАММА, яркость, режим работы и т.д. Необходимо использовать перед открытием экрана SPI отправлятьданныеинициализация Экраниззарегистрироваться,Сноваиспользовать RGB Сделать изображения извыход.

приспособлениевпередиз Подготовить

Примером платы разработки здесь является плата, участвующая в этом соревновании. 【YuzukiRuler Pro портативная маленькая линейка для Linux】,Что Аппаратное подключение выглядит так:

здесьиспользоватьиз Экранда 【TL032FWV01-I1440A】Драйвер ST7701s, я спросил у производителя и получил три информации.

lcd.h

Существующий документ определяет некоторую временную информацию Экраниз.

TL032FWV01-I1440A_specification(3).pdf

существоватьэтотдокументсередина,Определите длину, ширину и высоту Экраниз.,разрешение и т. д.

TL032FWV01-I1440A_ST7701S(SPI9bit+RGB16bit)G2.2_V1.0(1).INI

Это определено в документе SPI Информация о сроках инициализации здесь W_C Представляет команду записи W_D Представляет данные записи. Delay Обозначает задержку.

Написать драйвер

хочуводить машинунуждатьсяинициализацияиз Экран,Сразунуждатьсяиспользовать Экранводить машину Понятно。Экранводить машинуродык下документпапка Внутри

Язык кода:javascript
копировать
lichee/linux-5.4/drivers/video/fbdev/sunxi/disp2/disp/lcd

Начните с готового привода машины

потому чтода RGB + SPI из Экран,Можетприезжать Экранводить Найдите готовую копию такого же привода в машине. машину Способизводить машинудокумент Приходить Исправлять,здесьнасиспользоватьизда st7789v.c водить машину,Проверятьводить машину Ты знаешь его?использоватьизда spi Режим вождения

Бетон из SPI Коммуникация из методаэто использовать симуляцию функции SPI из Сроки.ибезиметьдействительныйиспользовать SPI периферийные устройства。такизвыгодада Можетиспользоватьпроизвольный GPIO вестиступня,иинициализация Заканчивать Вот и всевыпуск GPIO。

Первый Первый. Чтобы облегчить различие, мы копируем копию драйвера st7789v, переименованного в TL032FWV01.

ии Пучокводить машину Внутрииз st7789v Изменить все на TL032FWV01

Не забудьте первый документ «Исправлять».

Настроить драйвер экрана

Первая часть LCD_cfg_panel_info Эта часть вообще не требует Исправлять, продолжайте Вот и все

Вторая часть LCD Что касается включения и выключения питания, по умолчанию используется Вот. и все

часть третьяда Экранвключатьзакрытиеиподсветка Связанный,Для этого Экрана также не требуется Исправлять

Четвертая часть программное моделирование SPI отчасти, надо здесь сравнить ST7701s Технический паспорт изменен на ST7701s из SPI Сроки.

ST7701s SPI Частота ниже и соответствует режимам восходящего и нисходящего триггера.

Язык кода:javascript
копировать
//three line 9bit mode
static void TL032FWV01_spi_write_cmd(u32 value)
{
    int i;
    spi_cs_0;
    spi_sdi_0;
    spi_scl_0;
    sunxi_lcd_delay_us(10);
    spi_scl_1;
    for (i = 0; i < 8; i++) {
        sunxi_lcd_delay_us(10);
        if (value & 0x80)
            spi_sdi_1;
        else
            spi_sdi_0;
        spi_scl_0;
        sunxi_lcd_delay_us(10);
        spi_scl_1;
        value <<= 1;
    }
    sunxi_lcd_delay_us(10);
    spi_cs_1;
}

static void TL032FWV01_spi_write_data(u32 value)
{
    int i;
    spi_cs_0;
    spi_sdi_1;
    spi_scl_0;
    sunxi_lcd_delay_us(10);
    spi_scl_1;
    for (i = 0; i < 8; i++) {
        sunxi_lcd_delay_us(10);
        if (value & 0x80)
            spi_sdi_1;
        else
            spi_sdi_0;
        value <<= 1;
        sunxi_lcd_delay_us(10);
        spi_scl_0;
        spi_scl_1;
    }
    sunxi_lcd_delay_us(10);
    spi_cs_1;
}

кроме тогоздесьиз SPI Операции определенысуществоватьводить машина Голова,из которых sunxi_lcd_gpio_set_value Средний, 1, 2, 3 Приходитьсоборудование Деревоиз lcd_gpio_1,lcd_gpio_2,lcd_gpio_3。

Например:Конфигурация дерева устройств Понятно lcd_gpio_1 = <&pio PG 13 GPIO_ACTIVE_HIGH>;Указывает на включение питаниячасPG13 По умолчанию для вывода установлен высокий уровень, и его можно использовать в драйвере экрана. sunxi_lcd_gpio_set_value(0, 1, 1) Воля PG13 для вывода установлен высокий уровень, sunxi_lcd_gpio_set_value(0, 1, 0) Воля PG13 штифт установлен низко.

Пятая часть — функция переключения экрана.,Оказывается, функция переключения экрана включает в себя чтение информации о экране.,здесьнасненужныйчитать информацию Местокпрямойудалить Вот и все. открытый экран init частичный вызов SPI инициализация Экранпараметр Вот и все。

Язык кода:javascript
копировать
static void LCD_panel_init(u32 sel)
{
    lcd_panel_TL032FWV01_init();
    return;
}

static void LCD_panel_exit(u32 sel)
{
    return;
}

Далее самая важная часть,Экранинициализацияпараметрчасть。эта частьиспользовать SPI Для создания экрана откройте код инициализации, предоставленный производителем экрана, переписка один-к-одному. и все。

Язык кода:javascript
копировать
static void lcd_panel_TL032FWV01_init(void)
{
    sunxi_lcd_delay_ms(100);

    TL032FWV01_spi_write_cmd(0xFF);
    TL032FWV01_spi_write_data(0x77);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x13);

    TL032FWV01_spi_write_cmd(0xEF);
    TL032FWV01_spi_write_data(0x08);

    TL032FWV01_spi_write_cmd(0xFF);
    TL032FWV01_spi_write_data(0x77);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x10);

    TL032FWV01_spi_write_cmd(0xC0);
    TL032FWV01_spi_write_data(0xE5);
    TL032FWV01_spi_write_data(0x02);

    TL032FWV01_spi_write_cmd(0xC1);
    TL032FWV01_spi_write_data(0x0C);
    TL032FWV01_spi_write_data(0x0A);

    TL032FWV01_spi_write_cmd(0xC2);
    TL032FWV01_spi_write_data(0x07);
    TL032FWV01_spi_write_data(0x0F);

    TL032FWV01_spi_write_cmd(0xC3);
    TL032FWV01_spi_write_data(0x02);

    TL032FWV01_spi_write_cmd(0xCD);
    TL032FWV01_spi_write_data(0x08);

    TL032FWV01_spi_write_cmd(0xB0);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x08);
    TL032FWV01_spi_write_data(0x51);
    TL032FWV01_spi_write_data(0x0D);
    TL032FWV01_spi_write_data(0xCE);
    TL032FWV01_spi_write_data(0x06);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x08);
    TL032FWV01_spi_write_data(0x08);
    TL032FWV01_spi_write_data(0x1D);
    TL032FWV01_spi_write_data(0x02);
    TL032FWV01_spi_write_data(0xD0);
    TL032FWV01_spi_write_data(0x0F);
    TL032FWV01_spi_write_data(0x6F);
    TL032FWV01_spi_write_data(0x36);
    TL032FWV01_spi_write_data(0x3F);

    TL032FWV01_spi_write_cmd(0xB1);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x10);
    TL032FWV01_spi_write_data(0x4F);
    TL032FWV01_spi_write_data(0x0C);
    TL032FWV01_spi_write_data(0x11);
    TL032FWV01_spi_write_data(0x05);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x07);
    TL032FWV01_spi_write_data(0x07);
    TL032FWV01_spi_write_data(0x1F);
    TL032FWV01_spi_write_data(0x05);
    TL032FWV01_spi_write_data(0xD3);
    TL032FWV01_spi_write_data(0x11);
    TL032FWV01_spi_write_data(0x6E);
    TL032FWV01_spi_write_data(0x34);
    TL032FWV01_spi_write_data(0x3F);

    TL032FWV01_spi_write_cmd(0xFF);
    TL032FWV01_spi_write_data(0x77);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x11);

    TL032FWV01_spi_write_cmd(0xB0);
    TL032FWV01_spi_write_data(0x4D);

    TL032FWV01_spi_write_cmd(0xB1);
    TL032FWV01_spi_write_data(0x1C);

    TL032FWV01_spi_write_cmd(0xB2);
    TL032FWV01_spi_write_data(0x87);

    TL032FWV01_spi_write_cmd(0xB3);
    TL032FWV01_spi_write_data(0x80);

    TL032FWV01_spi_write_cmd(0xB5);
    TL032FWV01_spi_write_data(0x47);

    TL032FWV01_spi_write_cmd(0xB7);
    TL032FWV01_spi_write_data(0x85);

    TL032FWV01_spi_write_cmd(0xB8);
    TL032FWV01_spi_write_data(0x21);

    TL032FWV01_spi_write_cmd(0xB9);
    TL032FWV01_spi_write_data(0x10);

    TL032FWV01_spi_write_cmd(0xC1);
    TL032FWV01_spi_write_data(0x78);

    TL032FWV01_spi_write_cmd(0xC2);
    TL032FWV01_spi_write_data(0x78);

    TL032FWV01_spi_write_cmd(0xD0);
    TL032FWV01_spi_write_data(0x88);

    sunxi_lcd_delay_ms(100);

    TL032FWV01_spi_write_cmd(0xE0);
    TL032FWV01_spi_write_data(0x80);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x02);

    TL032FWV01_spi_write_cmd(0xE1);
    TL032FWV01_spi_write_data(0x04);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x05);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x60);
    TL032FWV01_spi_write_data(0x60);

    TL032FWV01_spi_write_cmd(0xE2);
    TL032FWV01_spi_write_data(0x30);
    TL032FWV01_spi_write_data(0x30);
    TL032FWV01_spi_write_data(0x60);
    TL032FWV01_spi_write_data(0x60);
    TL032FWV01_spi_write_data(0x3C);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x3D);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);

    TL032FWV01_spi_write_cmd(0xE3);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x33);
    TL032FWV01_spi_write_data(0x33);

    TL032FWV01_spi_write_cmd(0xE4);
    TL032FWV01_spi_write_data(0x44);
    TL032FWV01_spi_write_data(0x44);

    TL032FWV01_spi_write_cmd(0xE5);
    TL032FWV01_spi_write_data(0x06);
    TL032FWV01_spi_write_data(0x3E);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x08);
    TL032FWV01_spi_write_data(0x40);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x0A);
    TL032FWV01_spi_write_data(0x42);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x0C);
    TL032FWV01_spi_write_data(0x44);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);

    TL032FWV01_spi_write_cmd(0xE6);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x33);
    TL032FWV01_spi_write_data(0x33);

    TL032FWV01_spi_write_cmd(0xE7);
    TL032FWV01_spi_write_data(0x44);
    TL032FWV01_spi_write_data(0x44);

    TL032FWV01_spi_write_cmd(0xE8);
    TL032FWV01_spi_write_data(0x07);
    TL032FWV01_spi_write_data(0x3F);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x09);
    TL032FWV01_spi_write_data(0x41);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x0B);
    TL032FWV01_spi_write_data(0x43);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0x0D);
    TL032FWV01_spi_write_data(0x45);
    TL032FWV01_spi_write_data(0xA0);
    TL032FWV01_spi_write_data(0xA0);

    TL032FWV01_spi_write_cmd(0xEB);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x4E);
    TL032FWV01_spi_write_data(0x4E);
    TL032FWV01_spi_write_data(0xEE);
    TL032FWV01_spi_write_data(0x44);
    TL032FWV01_spi_write_data(0x00);

    TL032FWV01_spi_write_cmd(0xED);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0x04);
    TL032FWV01_spi_write_data(0x56);
    TL032FWV01_spi_write_data(0x72);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0x27);
    TL032FWV01_spi_write_data(0x65);
    TL032FWV01_spi_write_data(0x40);
    TL032FWV01_spi_write_data(0xFF);
    TL032FWV01_spi_write_data(0xFF);

    TL032FWV01_spi_write_cmd(0xEF);
    TL032FWV01_spi_write_data(0x10);
    TL032FWV01_spi_write_data(0x0D);
    TL032FWV01_spi_write_data(0x04);
    TL032FWV01_spi_write_data(0x08);
    TL032FWV01_spi_write_data(0x3F);
    TL032FWV01_spi_write_data(0x1F);

    TL032FWV01_spi_write_cmd(0xFF);
    TL032FWV01_spi_write_data(0x77);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x13);

    TL032FWV01_spi_write_cmd(0xE8);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x0E);

    TL032FWV01_spi_write_cmd(0xFF);
    TL032FWV01_spi_write_data(0x77);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);

    TL032FWV01_spi_write_cmd(0x11);

    sunxi_lcd_delay_ms(120);

    TL032FWV01_spi_write_cmd(0xFF);
    TL032FWV01_spi_write_data(0x77);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x13);

    TL032FWV01_spi_write_cmd(0xE8);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x0C);

    sunxi_lcd_delay_ms(10);

    TL032FWV01_spi_write_cmd(0xE8);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);

    TL032FWV01_spi_write_cmd(0xFF);
    TL032FWV01_spi_write_data(0x77);
    TL032FWV01_spi_write_data(0x01);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);
    TL032FWV01_spi_write_data(0x00);

    TL032FWV01_spi_write_cmd(0x3A);
    TL032FWV01_spi_write_data(0x66);

    TL032FWV01_spi_write_cmd(0x36);
    TL032FWV01_spi_write_data(0x00);

    TL032FWV01_spi_write_cmd(0x35);
    TL032FWV01_spi_write_data(0x00);

    TL032FWV01_spi_write_cmd(0x29);
    return;
}

последняя часть,Определяет собственную информацию о работе пользователя,Существовать можно здесь Увеличивать пользовательские настройки в работе,Здесь нет операции «have», поэтому оставьте это поле пустым.,При этом структура Исправлять Внутри соответствует операции из Вот и все.

добавить в Экранводить машинуприезжать Внутриядерныйсередина

Экранводить машину Исправлять Заканчивать Понятно,сейчассуществоватьнуждаться Пучок Экранводить машинудобавить вприезжать Внутриядерныйсередина。

голова Первыйсуществовать Экранводить машинудокументпапка Внутрипопытаться найтиприезжать Kconfig документ

Отредактируйте этот документ и добавьте Экраниз Индекс. Имя конфигурации — LCD_SUPPORT_TL032FWV01.

Язык кода:javascript
копировать
config LCD_SUPPORT_TL032FWV01
    bool "LCD support TL032FWV01 panel"
    default n
    ---help---
        If you want to support TL032FWV01 panel for display driver, select it.

такой жечассуществоватьтакой жедокументпапка Внутрипопытаться найтиприезжать panel.c и panel.h Два документа,Исправлять panel.c Добавьте указатель экрана. и использовать ifdef Макрос, чтобы убедиться, что компилировать этот Экранизводить можно только тогда, когда включен этот Экраниз. Указатель из утверждения находится в заголовке документа «Исправление» только что, и утверждение необходимо подтвердить. panel.c Соответствуют ли китайские имена и з?

Язык кода:javascript
копировать
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
    &TL032FWV01_panel,
#endif    

Заголовок документа также единообразен и ссылается на структуру

Язык кода:javascript
копировать
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
extern struct __lcd_panel TL032FWV01_panel;
#endif

большинствопосле, чтобы Экранпанельводить машинаиз Клип последнего слоя, найти приезжать Makefile Добавьте параметры компиляции драйверов.

Язык кода:javascript
копировать
disp-$(CONFIG_LCD_SUPPORT_TL032FWV01) += lcd/TL032FWV01.o

На этом этапе в ядро ​​приложения «Приехать Внутри» был добавлен «Экранпривод машины».

Конфигурация ядра

make kernel_menuconfig после, чтобы Device Drivers > Graphics support > Frame buffer Devices > Video support for sunxi > LCD panels select попытаться найтиприезжать Экран,Проверьте Вот и все。

Можетсуществоватькомпилироватьизчасждать Проверятьводить машинуданетодеялокомпилироватьначальство Понятно

Настроить дерево устройств

Во-первых, мы pio узел Внутри Увеличивать rgb18_pins как LCD Экраниз Pin Привязка.

Язык кода:javascript
копировать
rgb18_pins_a: rgb18@0 {
    pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", \
        "PD6", "PD7", "PD8", "PD9", "PD10", "PD11", \
        "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", \
        "PD18", "PD19", "PD20", "PD21";
    function = "lcd0";
    drive-strength = <30>;
    bias-disable;
};

rgb18_pins_b: rgb18@1 {
    pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", \
        "PD6", "PD7", "PD8", "PD9", "PD10", "PD11", \
        "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", \
        "PD18", "PD19", "PD20", "PD21";
    function = "io_disabled";
    bias-disable;
};

Дерево оборудования аналогично из. Заполните из в соответствии с параметрами, указанными производителем экрана. и все。lcd_driver_name Помните, прежде чем вести машинусерединаиз .name="TL032FWV01" такой же.

тестовый экран

Нечего сказать, я просто сиял сам по себе.

Адаптация к экрану MIPI DSI

MIPI DSI Приспособление экрана относительно простое, так как необходимо только задать временные параметры инициализации Вот и все. Но частично MIPI Экран включает в себя дополнительные функции, такие как OLED Экранизподсветка Регулировка и т.д.,нуждатьсясуществоватьводить Реализуйте связанные функции в машине. Я не буду здесь слишком подробно рассказывать об этих операциях, просто зажгите Экран Вот и все。

Совет по развитиюиспользоватьизда【на основе D1s из Обходной роутер с экраном Yuzuki RV Router】,Экраниспользоватьизда【D310T9362V1】,2 lane MIPI DSI,Аппаратное подключениеследующее:

приспособлениевпередиз Подготовить

Аналогичным образом запросите информацию у производителя экрана. На этот раз предоставлена ​​следующая информация:

Один лист данных и один код инициализации экрана.

паспорт существования,нас Может Знатьэтот Экраниспользоватьизда ST7701s Чип драйвера, разрешение 800x320.

В коде инициализации экрана MIPI изчаспоследовательность,Экраниз Яркость,ГАММА и другая информация.

Написать драйвер

То же самое, на этот раз MIPI DSI экран, просто используйте ST7701s.c Этот привод машину Исправлять Вот и все。копироватьодна порцияводить машинудокументпапка,Изменить имя d310t9362v1 и заменить глобально st7701s приезжать d310t9362v1。

Затем измените исходный код и отредактируйте d310t9362v1.c документ, исходный код Исправлять, здесь мы описываем только ту часть, которая требует Исправлять Вот, остальные части не Исправлять Вот и все。

(1) Переключить часть экрана

Здесь установите Вот в соответствии с временной последовательностью переключателя «Экран», указанной в технических характеристиках. и все,ST7701s изводить машину медленно открывает экран,Требуется соответствующая задержка увеличения.

Язык кода:javascript
копировать
static s32 lcd_open_flow(u32 sel)
{
    LCD_OPEN_FUNC(sel, lcd_power_on, 10);
    LCD_OPEN_FUNC(sel, lcd_panel_init, 120);
    LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 120);
    LCD_OPEN_FUNC(sel, lcd_bl_open, 0);
    return 0;
}

static s32 lcd_close_flow(u32 sel)
{
    LCD_CLOSE_FUNC(sel, lcd_bl_close, 0);
    LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 0);
    LCD_CLOSE_FUNC(sel, lcd_panel_exit, 200);
    LCD_CLOSE_FUNC(sel, lcd_power_off, 500);
    return 0;
}

static void lcd_power_on(u32 sel)
{
    sunxi_lcd_pin_cfg(sel, 1);
    sunxi_lcd_delay_ms(50);
    panel_reset(sel, 1);
    sunxi_lcd_delay_ms(5);
    panel_reset(sel, 0);
    sunxi_lcd_delay_ms(10);
    panel_reset(sel, 1);
    sunxi_lcd_delay_ms(120);
}

static void lcd_power_off(u32 sel)
{
    sunxi_lcd_pin_cfg(sel, 0);
    sunxi_lcd_delay_ms(20);
    panel_reset(sel, 0);
    sunxi_lcd_delay_ms(5);
}

(2) Часть инициализации экрана

Это тоже самая важная часть,голова Первыйопределениедва Экранинициализациясерединабезиметьиспользоватьизценитькак Флаговый битиспользовать,REGFLAG_DELAY и REGFLAG_END_OF_TABLE 。

Затем составьте таблицу инициализации в соответствии с параметрами инициализации, предоставленными производителем экрана.

Здесь необходимы некоторые преобразования,Не могу вставить как раньше,Необходимо разделить каждую команду записи (или задержку) как,ииэкран Предоставлено на заводеиз Заказ Переписка один на один Вот и все.Особые методы письмаследующее:

(1) Запись команд без данных

Язык кода:javascript
копировать
{DSICMDCMD,0x01},  -----> {0x01, 1, {0x00}},

(2) Команды записи с наличием данных

Язык кода:javascript
копировать
{DSICMD_CMD,0xFF}, 
{DSICMD_DATA,0x77},  
{DSICMD_DATA,0x01},  
{DSICMD_DATA,0x00}, -----> {0xFF, 5, {0x77, 0x01, 0x00, 0x00, 0x11}},
{DSICMD_DATA,0x00},  
{DSICMD_DATA,0x11}, 

из них означает:

Язык кода:javascript
копировать
{0xFF,    5,        {0x77,       0x01, 0x00, 0x00, 0x11}},
^ командный адрес ^ Количество данных  ^ первые данные  ^ вторые данные ....

(3) Задержка

Язык кода:javascript
копировать
{CMDDELAY_MS,120}, -----> {REGFLAG_DELAY, REGFLAG_DELAY, {120}},

Таблица завершенной инициализации преобразования выглядит следующим образом:

Язык кода:javascript
копировать
static struct LCM_setting_table lcm_initialization_setting[] = {
    {0x01, 1, {0x00} },
    {REGFLAG_DELAY, REGFLAG_DELAY, {120} },

    {0x11, 1, {0x00} },
    {REGFLAG_DELAY, REGFLAG_DELAY, {120} },

    {0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x11} },
    {0xd1, 1, {0x11} },
    {0x55, 1, {0xb0} },

    {0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x10} },
    {0xc0, 2, {0x63, 0x00} }, // SCNL = (0x63 + 1) * 8 = 800
    {0xc1, 2, {0x09, 0x02} }, // VFB=0x09  VBF=0x02
    {0xc2, 2, {0x37, 0x08} }, // PCLK= 512 + (0x08 * 16) = 640

    {0xc7, 1, {0x00} }, // x-dir  rotate 0 : 0x00     rotate 180 :0x04

    {0xcc, 1, {0x38} },

    {0xb0, 16, {0x00, 0x11, 0x19, 0x0c, 0x10, 0x06, 0x07, 0x0a, 0x09, 0x22,
           0x04, 0x10, 0x0e, 0x28, 0x30, 0x1c} },

    {0xb1, 16, {0x00, 0x12, 0x19, 0x0d, 0x10, 0x04, 0x06, 0x07, 0x08, 0x23,
            0x04, 0x12, 0x11, 0x28, 0x30, 0x1c} },

    {0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x11} }, //  enable  bk fun of  command 2  BK1
    {0xb0, 1, {0x4d} },
    {0xb1, 1, {0x5b} }, // 0x56  0x4a  0x5b
    {0xb2, 1, {0x07} },
    {0xb3, 1, {0x80} },
    {0xb5, 1, {0x47} },
    {0xb7, 1, {0x8a} },
    {0xb8, 1, {0x21} },
    {0xc1, 1, {0x78} },
    {0xc2, 1, {0x78} },
    {0xd0, 1, {0x88} },
    {REGFLAG_DELAY, REGFLAG_DELAY, {100} },

    {0xe0, 3, {0x00, 0x00, 0x02} },
    {0xe1, 11, {0x01, 0xa0, 0x03, 0xa0, 0x02, 0xa0, 0x04, 0xa0, 0x00, 0x44,
            0x44} },
    {0xe2, 12, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00} },
    {0xe3, 4, {0x00, 0x00, 0x33, 0x33} },
    {0xe4, 2, {0x44, 0x44} },
    {0xe5, 16, {0x01, 0x26, 0xa0, 0xa0, 0x03, 0x28, 0xa0, 0xa0, 0x05, 0x2a,
            0xa0, 0xa0, 0x07, 0x2c, 0xa0, 0xa0} },
    {0xe6, 4, {0x00, 0x00, 0x33, 0x33} },
    {0xe7, 2, {0x44, 0x44} },
    {0xe8, 16, {0x02, 0x26, 0xa0, 0xa0, 0x04, 0x28, 0xa0, 0xa0, 0x06, 0x2a,
            0xa0, 0xa0, 0x08, 0x2c, 0xa0, 0xa0} },
    {0xeb, 7, {0x00, 0x01, 0xe4, 0xe4, 0x44, 0x00, 0x40} },
    {0xed, 16, {0xff, 0xf7, 0x65, 0x4f, 0x0b, 0xa1, 0xcf, 0xff, 0xff, 0xfc,
            0x1a, 0xb0, 0xf4, 0x56, 0x7f, 0xff} },

    {0xff, 5, {0x77, 0x01, 0x00, 0x00, 0x00} },
    {0x36, 1, {0x00} }, // U&D  Y-DIR  rotate 0: 0x00 : rotate 180 :0x10
    {0x3a, 1, {0x55} },
    {0x29, 1, {0x00} },
    {REGFLAG_END_OF_TABLE, REGFLAG_END_OF_TABLE, {} }
};

(3) Инициализация экрана и часть выхода

Эта часть не требует «Исправлять», по умолчанию используется «Вот и все».

(4) Часть определения экрана

Эта часть определяет действия пользователя Screeniz, имена Screeniz и т. д.

Воля Экранводить машинудобавить вприезжать Внутриядерныйсередина

и Извпередиз Такой же,редактировать Экранводить машинудокументпапка Внутрииз Kconfig документ,добавить в Индекс

Язык кода:javascript
копировать
config LCD_SUPPORT_D310T9362V1
    bool "LCD support D310T9362V1 panel"
    default n
    ---help---
        If you want to support D310T9362V1 panel for display driver, select it.

Затем отредактируйте Panel.c, добавьте структуру в ту же директорию.

Язык кода:javascript
копировать
#ifdef CONFIG_LCD_SUPPORT_D310T9362V1
    &d310t9362v1_panel,
#endif

редактироватьтакой жев каталогеиз panel.h Добавить структуру

Язык кода:javascript
копировать
#ifdef CONFIG_LCD_SUPPORT_D310T9362V1
extern struct __lcd_panel d310t9362v1_panel;
#endif

приезжатьначальство一级目录середина,попытаться найтиприезжать Makefile документ,Увеличиватькомпилироватьэлемент

Язык кода:javascript
копировать
disp-$(CONFIG_LCD_SUPPORT_D310T9362V1) += lcd/d310t9362v1.o

Конфигурация ядра

make kernel_menuconfig после, чтобы Device Drivers > Graphics support > Frame buffer Devices > Video support for sunxi > LCD panels select попытаться найтиприезжать Экран,Проверьте Вот и все。

Проверятьназадкомпилировать Вы можете посмотреть приезжатьводить машинуодеялокомпилировать Понятно

Настроить дерево устройств

Во-первых, мы pio узел Внутри Увеличивать dsi2lane_pins как LCD Экраниз Pin Привязка.

Язык кода:javascript
копировать
dsi2lane_pins_a: dsi2lane@0 {
    pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5";
    function = "dsi";
    drive-strength = <30>;
    bias-disable;
};

dsi2lane_pins_b: dsi2lane@1 {
    pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5";
    function = "io_disabled";
    bias-disable;
};

Дерево оборудования аналогично из. Заполните из в соответствии с параметрами, указанными производителем экрана. и все。lcd_driver_name Помните, прежде чем вести машинусерединаиз .name="d310t9362v1" такой же.

Язык кода:javascript
копировать
&lcd0 {
    lcd_used            = <1>;

    lcd_driver_name     = "d310t9362v1";
    lcd_backlight       = <50>;
    lcd_if              = <4>;

    lcd_x               = <480>;
    lcd_y               = <800>;
    lcd_width           = <40>;
    lcd_height          = <67>;

    lcd_pwm_used        = <1>;
    lcd_pwm_ch          = <2>;
    lcd_pwm_freq        = <1000>;
    lcd_pwm_pol         = <0>;
    lcd_pwm_max_limit   = <255>;

    lcd_dclk_freq       = <34>;
    lcd_hbp             = <120>;
    lcd_ht              = <624>;
    lcd_hspw            = <48>;
    lcd_vbp             = <28>;
    lcd_vt              = <908>;
    lcd_vspw            = <12>;

    lcd_dsi_if          = <0>;
    lcd_dsi_lane        = <2>;

    deu_mode            = <0>;
    lcdgamma4iep        = <22>;
    smart_color         = <90>;

    lcd_gpio_0 =  <&pio PD 9 GPIO_ACTIVE_HIGH>;
    pinctrl-0 = <&dsi2lane_pins_a>;
    pinctrl-1 = <&dsi2lane_pins_b>;
};

тестовый экран

Включение питание горит, вот как Вывести командную строку на экран。

Пересадка драйвера экрана U-Boot

для U-Boot, требуется Screendrive машину возит Исправлять. Сюда мы пересадили вышеописанное из【TL032FWV01】Экранпривод машинакак пример, показывающий, как портировать Linux изводить машинуприезжать U-Boot Внутри。голова Первыйпопытаться найтиприезжать Экранводить Путь машиныиз:

Язык кода:javascript
копировать
brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd

нас Первый Пучоксуществовать Linux Внутритест OK изводить машинукопироватьприезжать U-Boot в каталоге драйвера экрана.

Модификация исходного кода драйвера

попытаться найтиприезжать Экранводить машинуголовадокумент TL032FWV01.h Пучок

Язык кода:javascript
копировать
extern struct __lcd_panel_t TL032FWV01_panel;

Изменить на

Язык кода:javascript
копировать
extern __lcd_panel_t TL032FWV01_panel;

Дополнительный документ TL032FWV01.c Bundle

Язык кода:javascript
копировать
static void LCD_cfg_panel_info(struct panel_extend_para *info)

Изменить на

Язык кода:javascript
копировать
static void LCD_cfg_panel_info(panel_extend_para *info)

попытаться найтиприезжатьисточникдокументконец,Пучок

Язык кода:javascript
копировать
struct __lcd_panel TL032FWV01_panel = {

Изменить на

Язык кода:javascript
копировать
__lcd_panel_t TL032FWV01_panel = {
Добавить индекс U-Boot

Открыть Экранводить машина В том же каталогеиз Kconfig, добавить индекс

Язык кода:javascript
копировать
config LCD_SUPPORT_TL032FWV01
    bool "LCD support TL032FWV01 panel"
    default n
    ---help---
        If you want to support TL032FWV01 panel for display driver, select it.

Найти жильеиз в том же каталоге panel.c Добавьте структуру.

Язык кода:javascript
копировать
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
    &TL032FWV01_panel,
#endif    

Найти жильеиз в том же каталоге panel.h Увеличить указатель.

Язык кода:javascript
копировать
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
extern __lcd_panel_t TL032FWV01_panel;
#endif

вперед往начальство一级目录,попытаться найтиприезжать Makefile Добавьте параметры компиляции.

Язык кода:javascript
копировать
disp-$(CONFIG_LCD_SUPPORT_TL032FWV01) += lcd/TL032FWV01.o
Включить драйвер экрана

попытаться найтиприезжать U-Boot Местоиспользоватьиз defconfig документ,Увеличиватьодна линия

Язык кода:javascript
копировать
CONFIG_LCD_SUPPORT_TL032FWV01=y
Настройка дерева устройств U-Boot

Открытая переписка по проекту uboot-board.dts Воляоборудование дерево заменено на Linux То же, что из Вот и все。

Скомпилировать тест

Использовать команду muboot компилировать U-Boot,Можетсуществоватькомпилироватьизчасждать看приезжатькомпилировать Заканчивать Понятно。

Загрузочный логотип

Загрузочный логотип сделан из UBOOT поддержка предоставляется, поэтому требуется конфигурация UBOOT изпоказыватьэкранводить машину.

существовать这Извперед,Иди первым Uboot Проверьте, включен ли Экранпривод машину.

Язык кода:javascript
копировать
brandy-2.0/u-boot-2018/configs/sun8iw21p1_defconfig

Пучок CONFIG_DISP2_SUNXI=y Раскомментировать

тогда лайк Kernel То же, модифицированное Uboot изоборудование Дерево Вот и все。

Язык кода:javascript
копировать
device/config/chips/v853/configs/vision/uboot-board.dts
Язык кода:javascript
копировать
&pio {
    rgb18_pins_a: rgb18@0 {
        allwinner,pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,pname = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,function = "lcd";
        allwinner,muxsel = <2>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
    };

    rgb18_pins_b: rgb18@1 {
        allwinner,pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,pname = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", \
        "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PD16", "PD17", "PD18", "PD19", \
        "PD20", "PD21";
        allwinner,function = "rgb18_suspend";
        allwinner,muxsel = <0xf>;
        allwinner,drive = <1>;
        allwinner,pull = <0>;
    };
};

&lcd0 {
    lcd_used            = <1>;

    lcd_driver_name     = "default_lcd";
    lcd_if              = <0>;
    lcd_x               = <800>;
    lcd_y               = <480>;
    lcd_width           = <108>;
    lcd_height          = <64>;
    lcd_dclk_freq       = <24>;

    lcd_pwm_used        = <1>;
    lcd_pwm_ch          = <9>;
    lcd_pwm_freq        = <50000>;
    lcd_pwm_pol         = <0>;
    lcd_pwm_max_limit   = <255>;

    lcd_ht              = <816>;
    lcd_hbp             = <12>;
    lcd_hspw            = <4>;
    lcd_vt              = <496>;
    lcd_vbp             = <12>;
    lcd_vspw            = <4>;

    lcd_lvds_if         = <0>;
    lcd_lvds_colordepth = <1>;
    lcd_lvds_mode       = <0>;
    lcd_frm             = <0>;
    lcd_io_phase        = <0x0000>;
    lcd_gamma_en        = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en         = <0>;

    deu_mode            = <0>;
    lcdgamma4iep        = <22>;
    smart_color         = <90>;
    pinctrl-0 = <&rgb18_pins_a>;
    pinctrl-1 = <&rgb18_pins_b>;
};
заменять Загрузочный логотип документ

Если вы хотите Исправить Загрузочный логотип, вы можете Исправить следующий путь и документ с изображением.

Язык кода:javascript
копировать
device/config/chips/d1-h/configs/nezha/configs

Уведомление,Картинки не должны быть слишком большими,Слишком большие изображения могут вызвать медленную загрузку. А картинка нужна в формате BMP, глубина 24 бита

Упаковать и сжечь и все, заменить bootlogo ненужныйкомпилировать

Вывести командную строку на экран

Эта часть только 5.4 Внутриядерный Можетиспользовать,4.9 Внутриядро не применимо

Linux Принесите свой собственный FBCON водить машину,Может Вывести командную строку на экранкакмаленький компьютериспользовать。

Настройте параметры ядра

голова Первый make kernel_menuconfig Проверьте следующие конфигурации

(1) Выберите устройство телетайпа.

Язык кода:javascript
копировать
Device Drivers > Character devices
    [*]   Virtual terminal

(2) Включить ФБКОН

Язык кода:javascript
копировать
Device Drivers > Graphics support > Console display driver support
    [*] VGA text console
    [*] Framebuffer Console support

(3) Настройте вывод консоли запуска.

Откройте папку документов проекта Внутрииз. env.cfg существовать console=${console} Присоединяйтесь раньше console=tty0, соответствующий самому себе setargs,mmc Начните использовать setargs_mmc ,nand Начните использовать setargs_nand и так далее.

Вот и все Включение питание показать командную строку

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose