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 Платформа, обычно рекомендуется изменить ее напрямую. config документ,роды
lichee/brandy-2.0/u-boot-2018/configs/xxx_defconfig
из которых xxx — это кодовое имя программного обеспечения чипа. Можно найти в BoardConfig.mk Найдите место проживания в документе. Например D1-H чип BoardConfig.mk документ,роды:
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 Основные части драйверной части следующие:
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, просто закомментируйте его.
Конфигурация ядра
бегать make kernel_menuconfig Входить Конфигурация ядра,попытаться найтиприезжать Video support for sunxi
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 Экранводить все машины хранятся в отдельных модулях из существующих, приводов. машинудокументроды:
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 режим:
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добрый:
I8080 в соответствии сизданныеразрядностьинтерфейсиметь 9.08.16.18, ещё какая ступня ссылка, Прямо Сейчас это то же самое, что и разрядность, и даже изтубная ступня тоже должна учитываться. RGB Формат.
(5) Экран SPI
SPI LCD это использовать SPI По шине передаются данные изображения, которые появляются только при очень низком разрешении. Вообще говоря, перед открытием экрана требуется инициация. СПИ LCD Экран вообще не используется DISP Приходитьводить машину Экран,использоватьнезависимыйизводить машину Вот и все. Например FBTFT водить машину.
Отключите U-Boot, чтобы ускорить отладку.
Прежде чем адаптироваться к экрану, мы можем сначала закрыть Uboot из Экранводить машину,бронировать Kernel изводить машину Легко отлаживать
Иди первым Uboot Конфигурациядокументпапка Исправлять Конфигурациядокументзакрытие Экранводить машину.
brandy/brandy-2.0/u-boot-2018/configs/sun8iw21p1_defconfig
Закомментирован CONFIG_DISP2_SUNXI=y
Ниже приводится краткое описание того, как пересадить 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 Привязка.
&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. Здесь Воля разделена на несколько частей, которые будут выделены ниже. Кроме того, к наиболее важным пунктам добавлены комментарии.
&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 Экран,нас Вы можете посмотреть приезжатьтакизвыход:
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 Вот и все
Device Drivers > Graphics support > Frame buffer Devices > Video support for sunxi
тестовый экран
Сначала скомпилируйте и упакуйте. Сжечь систему.
Первый ls команда печати /dev/ Проверьте каталог и посмотрите, не появляется ли хата. fb0 этот узел
Вы можете посмотреть приезжатьздесьиметь fb0` Затем приступаем к самой простой проверке узла.
cat /dev/urandom > /dev/fb0
Этот тест обязательно покажет cat: write error: No space left on device , это нормальная ситуация, потому что FB0 Ее можно сравнить с видеопамятью. Видеопамять имеет фиксированный размер и может быть использована. Когда видеопамять заполнена, будет сообщено об ошибке. No space left on устройство. Если эта ошибка не появляется при выполнении этой строки команды, внизу может отображаться надпись водить. машину Конфигурацияиметьвопрос。
Вы также можете использовать тестирование цветных полос.
echo 8 > /sys/class/disp/disp/attr/colorbar
также Можетиспользовать,Получить информацию о слое Screeniz,Частота кадров и т. д.
cat /sys/class/disp/disp/attr/sys
иметьнекоторый 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 Обозначает задержку.
Написать драйвер
хочуводить машинунуждатьсяинициализацияиз Экран,Сразунуждатьсяиспользовать Экранводить машину Понятно。Экранводить машинуродык下документпапка Внутри
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 Частота ниже и соответствует режимам восходящего и нисходящего триггера.
//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 инициализация Экранпараметр Вот и все。
static void LCD_panel_init(u32 sel)
{
lcd_panel_TL032FWV01_init();
return;
}
static void LCD_panel_exit(u32 sel)
{
return;
}
Далее самая важная часть,Экранинициализацияпараметрчасть。эта частьиспользовать SPI Для создания экрана откройте код инициализации, предоставленный производителем экрана, переписка один-к-одному. и все。
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.
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 Соответствуют ли китайские имена и з?
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
&TL032FWV01_panel,
#endif
Заголовок документа также единообразен и ссылается на структуру
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
extern struct __lcd_panel TL032FWV01_panel;
#endif
большинствопосле, чтобы Экранпанельводить машинаиз Клип последнего слоя, найти приезжать Makefile Добавьте параметры компиляции драйверов.
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 Привязка.
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 Экран включает в себя дополнительные функции, такие как OLED Экранизподсветка Регулировка и т.д.,нуждатьсясуществоватьводить Реализуйте связанные функции в машине. Я не буду здесь слишком подробно рассказывать об этих операциях, просто зажгите Экран Вот и все。
Совет по развитиюиспользоватьизда【на основе D1s из Обходной роутер с экраном Yuzuki RV Router】,Экраниспользоватьизда【D310T9362V1】,2 lane MIPI DSI,Аппаратное подключениеследующее:
приспособлениевпередиз Подготовить
Аналогичным образом запросите информацию у производителя экрана. На этот раз предоставлена следующая информация:
Один лист данных и один код инициализации экрана.
паспорт существования,нас Может Знатьэтот Экраниспользоватьизда ST7701s Чип драйвера, разрешение 800x320.
В коде инициализации экрана MIPI изчаспоследовательность,Экраниз Яркость,ГАММА и другая информация.
Написать драйвер
То же самое, на этот раз MIPI DSI экран, просто используйте ST7701s.c Этот привод машину Исправлять Вот и все。копироватьодна порцияводить машинудокументпапка,Изменить имя d310t9362v1 и заменить глобально st7701s приезжать d310t9362v1。
Затем измените исходный код и отредактируйте d310t9362v1.c документ, исходный код Исправлять, здесь мы описываем только ту часть, которая требует Исправлять Вот, остальные части не Исправлять Вот и все。
(1) Переключить часть экрана
Здесь установите Вот в соответствии с временной последовательностью переключателя «Экран», указанной в технических характеристиках. и все,ST7701s изводить машину медленно открывает экран,Требуется соответствующая задержка увеличения.
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) Запись команд без данных
{DSICMDCMD,0x01}, -----> {0x01, 1, {0x00}},
(2) Команды записи с наличием данных
{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},
из них означает:
{0xFF, 5, {0x77, 0x01, 0x00, 0x00, 0x11}},
^ командный адрес ^ Количество данных ^ первые данные ^ вторые данные ....
(3) Задержка
{CMDDELAY_MS,120}, -----> {REGFLAG_DELAY, REGFLAG_DELAY, {120}},
Таблица завершенной инициализации преобразования выглядит следующим образом:
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 документ,добавить в Индекс
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, добавьте структуру в ту же директорию.
#ifdef CONFIG_LCD_SUPPORT_D310T9362V1
&d310t9362v1_panel,
#endif
редактироватьтакой жев каталогеиз panel.h Добавить структуру
#ifdef CONFIG_LCD_SUPPORT_D310T9362V1
extern struct __lcd_panel d310t9362v1_panel;
#endif
приезжатьначальство一级目录середина,попытаться найтиприезжать Makefile документ,Увеличиватькомпилироватьэлемент
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 Привязка.
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" такой же.
&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, требуется Screendrive машину возит Исправлять. Сюда мы пересадили вышеописанное из【TL032FWV01】Экранпривод машинакак пример, показывающий, как портировать Linux изводить машинуприезжать U-Boot Внутри。голова Первыйпопытаться найтиприезжать Экранводить Путь машиныиз:
brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd
нас Первый Пучоксуществовать Linux Внутритест OK изводить машинукопироватьприезжать U-Boot в каталоге драйвера экрана.
попытаться найтиприезжать Экранводить машинуголовадокумент TL032FWV01.h Пучок
extern struct __lcd_panel_t TL032FWV01_panel;
Изменить на
extern __lcd_panel_t TL032FWV01_panel;
Дополнительный документ TL032FWV01.c Bundle
static void LCD_cfg_panel_info(struct panel_extend_para *info)
Изменить на
static void LCD_cfg_panel_info(panel_extend_para *info)
попытаться найтиприезжатьисточникдокументконец,Пучок
struct __lcd_panel TL032FWV01_panel = {
Изменить на
__lcd_panel_t TL032FWV01_panel = {
Открыть Экранводить машина В том же каталогеиз Kconfig, добавить индекс
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 Добавьте структуру.
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
&TL032FWV01_panel,
#endif
Найти жильеиз в том же каталоге panel.h Увеличить указатель.
#ifdef CONFIG_LCD_SUPPORT_TL032FWV01
extern __lcd_panel_t TL032FWV01_panel;
#endif
вперед往начальство一级目录,попытаться найтиприезжать Makefile Добавьте параметры компиляции.
disp-$(CONFIG_LCD_SUPPORT_TL032FWV01) += lcd/TL032FWV01.o
попытаться найтиприезжать U-Boot Местоиспользоватьиз defconfig документ,Увеличиватьодна линия
CONFIG_LCD_SUPPORT_TL032FWV01=y
Открытая переписка по проекту uboot-board.dts Воляоборудование дерево заменено на Linux То же, что из Вот и все。
Использовать команду muboot компилировать U-Boot,Можетсуществоватькомпилироватьизчасждать看приезжатькомпилировать Заканчивать Понятно。
Загрузочный логотип сделан из UBOOT поддержка предоставляется, поэтому требуется конфигурация UBOOT изпоказыватьэкранводить машину.
существовать这Извперед,Иди первым Uboot Проверьте, включен ли Экранпривод машину.
brandy-2.0/u-boot-2018/configs/sun8iw21p1_defconfig
Пучок CONFIG_DISP2_SUNXI=y Раскомментировать
тогда лайк Kernel То же, модифицированное Uboot изоборудование Дерево Вот и все。
device/config/chips/v853/configs/vision/uboot-board.dts
&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>;
};
Если вы хотите Исправить Загрузочный логотип, вы можете Исправить следующий путь и документ с изображением.
device/config/chips/d1-h/configs/nezha/configs
Уведомление,Картинки не должны быть слишком большими,Слишком большие изображения могут вызвать медленную загрузку. А картинка нужна в формате BMP, глубина 24 бита
Упаковать и сжечь и все, заменить bootlogo ненужныйкомпилировать
Эта часть только 5.4 Внутриядерный Можетиспользовать,4.9 Внутриядро не применимо
Linux Принесите свой собственный FBCON водить машину,Может Вывести командную строку на экранкакмаленький компьютериспользовать。
голова Первый make kernel_menuconfig Проверьте следующие конфигурации
(1) Выберите устройство телетайпа.
Device Drivers > Character devices
[*] Virtual terminal
(2) Включить ФБКОН
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 и так далее.
Вот и все Включение питание показать командную строку