Разработка базовых компонентов Allwinner R128 — дисплей и драйвер экрана ①
Разработка базовых компонентов Allwinner R128 — дисплей и драйвер экрана ①

RTOS предоставляет полный набор драйверов экрана, поддерживающих экраны форматов RGB, i8080, SPI и DBI.

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

Интерфейс RGB также называется интерфейсом HV (горизонтальная синхронизация и вертикальная синхронизация) на платформе Allwinner. Некоторые ЖК-экраны поддерживают расширенные функции, такие как настройка гаммы, формата пикселей и т. д., но сам протокол RGB не поддерживает передачу других данных, кроме данных изображения, поэтому ЖК-экран нельзя настроить через контакты RGB, поэтому я получил экран с интерфейсом 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) экран 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, всего 65 тыс. цветов
  2. RGB666, всего 262 тыс. цветов.
  3. 9бит фиксировано до 262К

(3) Экран SPI

SPI LCD — это экран, который использует шину SPI для передачи данных изображения и отображается только на экранах с очень низким разрешением. Вообще говоря, перед открытием экрана требуется инициализация.

Шаги по адаптации к ЖК-экрану

  1. Убедитесь, что Allwinner показывает структуру конфигурации ядра.
  2. Подготовка основывается на информации:
  3. Руководство по экрану На экране приведена основная информация и электрические характеристики. Подождите, обратитесь за информацией к изготовителю экрана.
  4. Driver IC руководство. В основном экран описания IC из Подробности. этотвнутрихозяинхотетда предоставляет подробное объяснение каждой отдельной команды и первых нас. выдающийся Индивидуальный и полезный,Спросите у фабрики экранов хотеть.
  5. информация о времени экрана. Пожалуйста, обратитесь к производителю экрана.
  6. Код инициализации экрана можно узнать у производителя экрана. Обычно DSI и I8080 экранждать Всенуждатьсяпервый команда разначализации для редактирования экрана выдающийся。
  7. мультиметр. Регулировка экрана не может избежать измерения соответствующих напряжений.
  8. На этапе 2 производитель экрана предоставляет информацию,Найдите этот тип экрана,Тогда выберите одининдивидуальный Уже есть такой же типиздействие на экранедля Шаблон для добавления драйвера экранаилипрямойловитьсверху Исправлять。
  9. Исправить каталог драйверов экрана Внизиз panel.c и panel.h。в переменных глобальной структуры panel_array середина Новый Добавлен только что strcut __lcd_panel изуказатель переменной。panel.h середина新增 strcut __lcd_panel из заявления.
  10. Исправлять Makefile. существовать lcd Каталог драйверов экрана из Предыдущий уровень из Makefile документвdisp-objsсередина Новый Добавлен только чтодрайвер экрана.o
  11. Исправлять sys_config.fex в lcd0 узел.
  12. Скомпилировать тест

Исходный код драйвера ЖК-экрана

Исходный код драйвера ЖК-экранаструктура
Язык кода:javascript
копировать
.
├── Kconfig
├── Makefile
├── disp
│   ├── Kconfig
│   ├── Makefile
│   ├── de                            # Display Engine Драйвер слоя, включая управление ипоказывать слой
│   │   ├── Makefile
│   │   ├── bsp_display.h
│   │   ├── disp_capture.c
│   │   ├── disp_capture.h
│   │   ├── disp_device.c
│   │   ├── disp_device.h
│   │   ├── disp_display.c
│   │   ├── disp_display.h
│   │   ├── disp_enhance.c
│   │   ├── disp_enhance.h
│   │   ├── disp_features.c
│   │   ├── disp_features.h
│   │   ├── disp_hdmi.c
│   │   ├── disp_hdmi.h
│   │   ├── disp_lcd.c
│   │   ├── disp_lcd.h
│   │   ├── disp_manager.c
│   │   ├── disp_manager.h
│   │   ├── disp_private.c
│   │   ├── disp_private.h
│   │   ├── disp_smart_backlight.c
│   │   ├── disp_smart_backlight.h
│   │   ├── disp_tv.c
│   │   ├── disp_tv.h
│   │   ├── disp_vdevice.c
│   │   ├── disp_vdevice.h
│   │   ├── include.h
│   │   └── lowlevel_v2x               # DISP Драйвер низкого уровня, аппаратное обеспечение Регистрация Взаимодействие
│   │       ├── Makefile
│   │       ├── de_ase.c
│   │       ├── de_ase_type.h
│   │       ├── de_bws.c
│   │       ├── de_bws_type.h
│   │       ├── de_ccsc.c
│   │       ├── de_clock.c
│   │       ├── de_clock.h
│   │       ├── de_csc.h
│   │       ├── de_csc_type.h
│   │       ├── de_dcsc.c
│   │       ├── de_dsi.c
│   │       ├── de_dsi.h
│   │       ├── de_dsi_28.c
│   │       ├── de_dsi_type.h
│   │       ├── de_dsi_type_28.h
│   │       ├── de_eink.c
│   │       ├── de_eink.h
│   │       ├── de_enhance.c
│   │       ├── de_enhance.h
│   │       ├── de_fcc.c
│   │       ├── de_fcc_type.h
│   │       ├── de_fce.c
│   │       ├── de_fce_type.h
│   │       ├── de_feat.c
│   │       ├── de_feat.h
│   │       ├── de_gsu.c
│   │       ├── de_gsu_type.h
│   │       ├── de_hal.c
│   │       ├── de_hal.h
│   │       ├── de_lcd.c
│   │       ├── de_lcd.h
│   │       ├── de_lcd_sun50iw10.c
│   │       ├── de_lcd_type.h
│   │       ├── de_lti.c
│   │       ├── de_lti_type.h
│   │       ├── de_peak.c
│   │       ├── de_peak_type.h
│   │       ├── de_rtmx.c
│   │       ├── de_rtmx.h
│   │       ├── de_rtmx_type.h
│   │       ├── de_scaler.h
│   │       ├── de_scaler_table.c
│   │       ├── de_scaler_table.h
│   │       ├── de_smbl.c
│   │       ├── de_smbl.h
│   │       ├── de_smbl_tab.h
│   │       ├── de_smbl_type.h
│   │       ├── de_vep.h
│   │       ├── de_vep_table.c
│   │       ├── de_vep_table.h
│   │       ├── de_vsu.c
│   │       ├── de_vsu_type.h
│   │       ├── de_wb.c
│   │       ├── de_wb.h
│   │       ├── de_wb_type.h
│   │       ├── disp_al.c
│   │       ├── disp_al.h
│   │       ├── disp_eink_data.c
│   │       ├── disp_eink_data.h
│   │       ├── disp_waveform.c
│   │       ├── disp_waveform.h
│   │       ├── rtmx_eink.c
│   │       └── rtmx_eink.h
│   ├── dev_disp.c                 # DISP общественный порт
│   ├── dev_disp.h
│   ├── disp_debug.c
│   ├── disp_debug.h
│   ├── disp_sys_intf.c
│   ├── disp_sys_intf.h
│   ├── lcd                        # LCD Драйвер панели, включая кастомную первую разначало химический контроль, контроль последовательности включения
│   │   ├── Kconfig
│   │   ├── S6D7AA0X01.c
│   │   ├── S6D7AA0X01.h
│   │   ├── VVX07H005A10.c
│   │   ├── VVX07H005A10.h
│   │   ├── WilliamLcd.c
│   │   ├── WilliamLcd.h
│   │   ├── b080uan01_mipi1200x1920.c
│   │   ├── b080uan01_mipi1200x1920.h
│   │   ├── cl40bc1019_cpu.c
│   │   ├── cl40bc1019_cpu.h
│   │   ├── cpu_gg1p4062utsw.c
│   │   ├── cpu_gg1p4062utsw.h
│   │   ├── default_eink.c
│   │   ├── default_eink.h
│   │   ├── default_panel.c
│   │   ├── default_panel.h
│       └── wtq05027d01.h
├── soc                             # SoC драйвер специализации слоев
│   ├── Kconfig
│   ├── Makefile
│   ├── VVX07H005A10_mipi_config.c
│   ├── disp_board_config.c
│   ├── disp_board_config.h
│   ├── he0801a068_mipi_config.c
│   ├── platform_resource.c
│   ├── platform_resource.h
│   ├── sun20iw2.c
└── tv                               # TV водить машину,R128Нетиспользовать    ├── Makefile
    ├── de_tve_sun8iw11.c
    ├── de_tve_sun8iw7.c
    ├── de_tve_v1.c
    ├── de_tvec.h
    ├── drv_tv.c
    ├── drv_tv.h
    ├── gm7121.c
    ├── tv_ac200.c
    ├── tv_ac200.h
    ├── tv_ac200_lowlevel.c
    └── tv_ac200_lowlevel.h
Расположение исходного кода драйвера экрана
Драйвер панели RGB

Для тех, которые не требуют инициализации RGB экран (обычно 40PIN, 50PIN) используйте default_panel.c

Язык кода:javascript
копировать
lichee/rtos‑hal/hal/source/disp2/disp/lcd/default_panel.c
Специализированный драйвер ЖК-панели

Некоторым ЖК-панелям требуется запись инициализации IIC, SPI или особые требования к включению и выключению питания, а также необходимость написания специализированных драйверов экрана.

Язык кода:javascript
копировать
lichee/rtos‑hal/hal/source/disp2/disp/lcd/
Конфигурационный файл

Среди них «модель чипа», например r128s3, и «название платы», например pro, замените их в соответствии с реальной ситуацией.

Язык кода:javascript
копировать
плата/модель чипа/название платы/конфигурации/
Конфигурация драйвера экрана

Код, связанный с ЖК-дисплеем, включен в модуль драйвера дисплея. Выполните команду для входа в основной интерфейс конфигурации меню и выполните следующие действия:

Добавить новый экран

Добавление нового экрана обычно требует следующих шагов:

  • panel.c и panel.h,Когда пользователь «Добавить новый экран» запускает,дануждаться Исправлятьэтотдваиндивидуальныйдокументиз,нуждаться добавляет переменную структуры экрана к глобальной переменной структуры Panel_arrayсередина.
  • lcd_source.c и lcd_source.h,этотдваиндивидуальныйдокумент Реальностьсейчасизда给драйвер экранаиспользоватьизфункцияинтерфейс,Например, выключатель питания,gpio,интерфейс чтения dsi,использовать户Нетнуждаться Исправлять Тольконуждатьсяиспользовать。
  • драйвер экрана. Помимо упомянутых выше исходных файлов, другие файлы обычно представляют собой отдельные файлы c. Индивидуальный файл h представляет собой экран драйвера.
  • существовать Расположение исходного кода драйвера экраниз на один уровень выше, с пользователем нуждаться Исправлятьиз Makefile документ.

мы можем открыть lichee/rtos‑hal/hal/source/disp2/disp/lcd/default_panel.c В качестве примера драйвера экрана в конце файла:

Язык кода:javascript
копировать
struct __lcd_panel default_panel = {
    /* panel driver name, must mach the lcd_drv_name in sys_config.fex */
    .name = "default_lcd",
    .func = {
        .cfg_panel_info = LCD_cfg_panel_info,
        .cfg_open_flow = LCD_open_flow,
        .cfg_close_flow = LCD_close_flow,
    },
};
  • Глобальная переменная default_panel изстановитьсячлен name и lcd_driver_name Должен быть последовательным, этот индивидуальный связан с тем, сможет ли водитель найти указанный документ.
  • ловить Вниз Приходить да func становиться член из первый раз начало изменять, этот внутри большинство хозяин хотеть Реальность сейчас три индивидуальный раз настраивать письмо число。LCD_cfg_panel_info, LCD_open_flow и LCD_close_flow
  • Процесс переключения экрана — это процесс подачи питания на экран, руководство по экрану. driver IC руководствосерединавнутрилапшаиз Power on Sequence и Power off Последовательность. Процесс работы по переключению экрана показан на рисунке.
image-20230508110033147
image-20230508110033147
  • Чтосередина,LCD_open_flow и LCD_close_flow Это называется функцией переключения экрана. Функция коробки, например. LCD_power_on,сказатьдля Действия по включению и выключению экранафункция.
  • Нетнуждатьсяруководитьпервый выдающийсядействоватьиз LCD экран, например, часть RGB экранждать,LCD_panel_init и LCD_panel_exit этотнекоторыйфункция Можетдлянулевой。
LCD_open_flow

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

Прототип функции:

Язык кода:javascript
копировать
static __s32 LCD_open_flow(__u32 sel)

Часто используемые функции:

Язык кода:javascript
копировать
static __s32 LCD_open_flow(__u32 sel)
{
    LCD_OPEN_FUNC(sel, LCD_power_on,10);
    LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
    LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 100);
    LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
    return 0;
}

Как и выше, четырехкратный вызов LCD_OPEN_FUNC регистрирует четыре функции обратного вызова, соответствующие четырем процессам открытия экрана. Сначала зарегистрируйтесь и сначала выполните. Фактически, пользователь сам решает, сколько функций зарегистрировать, если это разумно.

  1. LCD_power_on Прямо сейчас Открыть LCD мощность, затем задержка 10 мс этот индивидуальный шаг обычно используется для Открытия; LCD Сопутствующие источники питанияи Связанный Приколотьнапримерперезагрузитьступня。этотвнутрив целомдаиспользовать Функция контроля мощностииллюстрироватьи Функция управления контактами инструкция по эксплуатации.
  2. LCD_panel_init Прямо сейчаспервый разначало расплавить экран и снова задержать 50ms;Нетнуждатьсяпервый разначало экран, вы можете сохранить этот шаг, эта индивидуальная функция обычно используется для отправки первого Команда разначализации выводит экран первым разначало. Если да I8080 экраниспользоватьинтерфейс Описание функции I8080, если есть другие ситуации, такие как i2c или spi Вы можете увидеть использование iic/spi сериалинтерфейспервый разначалоизменять, также можно использовать GPIO Приход осуществляет моделирование.
  3. sunxi_lcd_tcon_enable Открытие TCON, дальнейшая задержка 100 мс; этот один шаг исправления означает включение начала отправки сигналов изображения.
  4. LCD_bl_open Открыть подсветку, затем задержку 0 мс. Включайте подсветку только после выполнения предыдущих действий, чтобы не увидеть мерцания. этовнутриобщее использованиеизфункция Пожалуйста, посмотрите Функция управления подсветкойиллюстрировать。
LCD_OPEN_FUNC

Зарегистрируйте функцию шага открытия экрана в процессе открытия экрана. Помните, что это регистрация, а не выполнение!

Прототип функции:

Язык кода:javascript
копировать
void LCD_OPEN_FUNC(__u32 sel, LCD_FUNC func, __u32 delay)

Описание параметра:

func указатель этой функции,Что类型да:void (*LCD_FUNC) (__u32 sel),Пользовательская изфункция также должна использовать унифицированную форму. например:

Язык кода:javascript
копировать
void user_defined_func(__u32 sel)
{
    // do something
}

delay Это время задержки после выполнения этого шага. Единица времени — миллисекунды.

Второй параметр LCD_OPEN_FUNC — это длительность задержки двух шагов до и после, в мс. Обратите внимание, что значение здесь должно быть заполнено в соответствии с правилами руководства по экрану. Случайное заполнение может привести к некорректной инициализации экрана или к сбою. долго включать и выключать экран, что влияет на удобство использования.

LCD_close_flow

и LCD_open_flow Соответствует LCD_close_flow,它использовать于注册关экранфункция.использовать LCD_CLOSE_FUNC Для регистрации функции сначала зарегистрируйтесь и сначала выполните. Это просто для регистрации функции обратного вызова, а не для ее немедленного выполнения.

Язык кода:javascript
копировать
static s32 LCD_close_flow(u32 sel)
{
    /* close lcd backlight, and delay 0ms */
    LCD_CLOSE_FUNC(sel, LCD_bl_close, 0);
    /* close lcd controller, and delay 0ms */
    LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 50);
    /* open lcd power, than delay 200ms */
    LCD_CLOSE_FUNC(sel, LCD_panel_exit, 100);
    /* close lcd power, and delay 500ms */
    LCD_CLOSE_FUNC(sel, LCD_power_off, 0);
    return 0;
}
  • Подсветка первого закрытия,этот Как и весьиндивидуальный关экран过程,Пользователь не увидит процесс перепрошивки;
  • закрытие TCON (т. е. прекратить отправку данных), а затем задержать 50ms;
  • Выполните код выключения экрана, а затем задержите 200ms;(Нетнуждатьсяпервый выдающийсяизэкран,Этот шаг можно пропустить)
  • большинствоназадзакрытиемощность, затем задержка 0ms。
LCD_cfg_panel_info

Настроенные параметры расширения TCON, такие как гамма-функции и функции цветового отображения.

Прототип функции:

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

Расширенные параметры TCON можно настроить только в файле экрана. Определение параметров:

LCD_FRM

Модулятор частоты кадров ЖК-дисплея, FRM предназначен для решения проблемы глубины цвета, вызванной уменьшением PIN-кода. Формат пикселей некоторых ЖК-экранов имеет глубину цвета 18 бит (RGB666) или глубину цвета 16 бит (RGB565). Рекомендуется включить функцию FRM и. компенсируйте глубину цвета с помощью дизеринга, благодаря чему дисплей достигает эффекта глубины цвета 24 бита (RGB888). Как показано на рисунке ниже, верхний рисунок представляет собой ЖК-дисплей с глубиной цвета RGB66, а нижний рисунок — это дисплей после включения сглаживания. После включения сглаживания цветовой градиент становится чрезмерно плавным.

Соответствующие значения настроек параметров:

Язык кода:javascript
копировать
0:RGB888 ‑‑ RGB888 direct
1:RGB888 ‑‑ RGB666 dither
2:RGB888 ‑‑ RGB565 dither
image-20230508111409720
image-20230508111409720
LCD_GAMMA_EN

Lcd Gamma Correction Enable, соответствующее значение установки соответствующего значения:

Язык кода:javascript
копировать
0:LCD из Gamma Функция коррекциизакрытия
1:LCD из Gamma Функция калибровки включена

установлен на 1 Когда необходимо настроить драйвер экрана lcd_gamma_tbl[256] Сделайте задание.

LCD_CMAP_EN

Lcd Color Map Enable, установлен на 1 когда, необходимо lcd_cmap_tbl [2][3][4] Сделать задание Lcd Color Map Table

Каждый пиксель имеет три единицы: R, G и B. Каждые четыре пикселя представляют собой выборку, всего 12 вариантов. Первое измерение массива представляет нечетные и четные строки, второе измерение представляет RGB пикселя, а третье измерение представляет номер пикселя. Содержимое массива представляет содержимое, сопоставленное с позицией.

LCD CMAP — это функция вывода сопоставления пикселей, которую необходимо настраивать только для ЖК-экранов со специальным расположением пикселей.

LCD CMAP определяет 4 пикселя в каждой строке как общую единицу, и каждый пиксель делится на 3 маленьких единицы: R, G и B, всего 12 маленьких единиц. Определив отношение сопоставления с помощью lcd_cmap_tbl, каждая маленькая единица вывода может быть произвольно сопоставлена ​​с одной из 12 маленьких единиц.

Язык кода:javascript
копировать
__u32 lcd_cmap_tbl[2][3][4] = {
    {
        {LCD_CMAP_G0,LCD_CMAP_B1,LCD_CMAP_G2,LCD_CMAP_B3},
        {LCD_CMAP_B0,LCD_CMAP_R1,LCD_CMAP_B2,LCD_CMAP_R3},
        {LCD_CMAP_R0,LCD_CMAP_G1,LCD_CMAP_R2,LCD_CMAP_G3},
    },
    {
        {LCD_CMAP_B3,LCD_CMAP_G2,LCD_CMAP_B1,LCD_CMAP_G0},
        {LCD_CMAP_R3,LCD_CMAP_B2,LCD_CMAP_R1,LCD_CMAP_B0},
        {LCD_CMAP_G3,LCD_CMAP_R2,LCD_CMAP_G1,LCD_CMAP_R0},
    },
};

Как указано выше, три верхние строки представляют расположение пикселей строк с нечетными номерами, а три нижних строки представляют расположение пикселей строк с четными номерами;

Каждые четыре пикселя представляют собой единицу измерения, первый столбец представляет первую карту пикселей каждых четырех пикселей, второй столбец представляет вторую карту пикселей каждых четырех пикселей и так далее.

Как определено выше, выходной формат пикселей показан на рисунке ниже.

image-20230508111448521
image-20230508111448521
LCD_RB_SWAP

Менять TCON модуль RGB в R сумма компонентов B Часть.

Язык кода:javascript
копировать
0:Нет变
1:МенятьRсумма компонентовBмасса

нуждаться gamma Коррекция, или цветовое отображение, в sys_config.fex серединабудет соответствоватьмодульиз enable Настройки параметров 1,lcd_gamma_en, lcd_cmap_en,и заполните таблицу 3 индивидуальных коэффициентов,lcd_gamma_tbl, lcd_cmap_tbl,Примечание: гамма,Шаблон предоставляет 18 значение точки перегиба сегмента, а затем интерполировать все значения (255 индивидуальный). В соответствующую таблицу можно добавлять подпункты, чтобы дополнить детали. cmap_tbl Размер фиксированный, размер таблицы нельзя уменьшить или увеличить. Окончательный сгенерированный gamma Запись таблицы состоит из rgb три gamma состоит из ценностей, каждая из которых учитывает 8бит. В настоящее время предлагается из шаблонов середина, три gamma Значения те же.

функция задержки

прототип функции

(миллисекундный уровень)

Язык кода:javascript
копировать
s32 sunxi_lcd_delay_ms(u32 ms)

(микросекундный уровень)

Язык кода:javascript
копировать
s32 sunxi_lcd_delay_us(u32 us)
Функция включения данных изображения

Включите контроллер ЖК-дисплея и начните обновление ЖК-дисплея.

Язык кода:javascript
копировать
void sunxi_lcd_tcon_enable(u32 screen_id)

Выключите контроллер ЖК-дисплея и прекратите обновление данных.

Язык кода:javascript
копировать
void sunxi_lcd_tcon_disable(u32 screen_id)
Функция управления подсветкой

Включите подсветку, операция sys_config.fex середина lcd_bl настроен gpio

Язык кода:javascript
копировать
void sunxi_lcd_backlight_enable(u32 screen_id)

Выключите подсветку, операция sys_config.fex середина lcd_bl настроен gpio

Язык кода:javascript
копировать
void sunxi_lcd_backlight_disable(u32 screen_id)

Включить ШИМ-подсветку, при включении pwm будет выводиться pwm форма волны。Соответствуетlcd_pwm_ch Соответствующая дорога pwm。

Язык кода:javascript
копировать
s32 sunxi_lcd_pwm_enable(u32 screen_id)

Отключить подсветку ШИМ при включении pwm будет выводиться pwm форма волны。Соответствует lcd_pwm_ch Соответствующая дорога pwm。

Язык кода:javascript
копировать
s32 sunxi_lcd_pwm_disable(u32 screen_id)
Функция контроля мощности

Открыть Lcd источник питания, управляемый sys_config.fex в lcd_power/lcd_power1/lcd_power2。( pwr_idОпределить индекс мощности)

Язык кода:javascript
копировать
void sunxi_lcd_power_enable(u32 screen_id, u32 pwr_id)

закрытие Lcd источник питания, управляемый sys_config.fex в lcd_power/lcd_power1/lcd_power2。( pwr_idОпределить индекс мощности)

Язык кода:javascript
копировать
void sunxi_lcd_power_disable(u32 screen_id, u32 pwr_id)
  1. pwr_id = 0: соответствует sys_config.fex в lcd_power。
  2. pwr_id = 1: соответствует sys_config.fex в lcd_power1。
  3. pwr_id = 2: Соответствует sys_config.fex в lcd_power2。
  4. pwr_id = 3: Соответствует sys_config.fex в lcd_power3。
sunxi_lcd_pin_cfg

Настройка ЖК-io

прототип функции

Язык кода:javascript
копировать
s32 sunxi_lcd_pin_cfg(u32 screen_id, u32 bon)

Конфигурация lcd из data/clk ждать pin,переписываться sys_config.fex в lcdd0‑lcdd23/lcddclk/lcdde/lcdhsync/lcdvsync

параметр:

  • Bon: 1: с开,0:с Конфигурация будет остановлена. disable состояние.
интерфейс I8080функцияиллюстрировать

Драйвер дисплея предоставляет для использования 5 функций интерфейса. следующее:

SUNXI_LCD_CPU_WRITE

настраивать CPU экраниз Укажите регистрдляобозначениеизценить。

прототип функции

Язык кода:javascript
копировать
void sunxi_lcd_cpu_write(__u32 sel, __u32 index, __u32 data)
{
    sunxi_lcd_cpu_write_index(sel, index);
    sunxi_lcd_cpu_wirte_data(sel, data);
}

Шина 8080 оснащена двумя отдельными операциями копирования.

  • sunxi_lcd_cpu_write_index Реальностьсейчас Первыйиндивидуальный写действовать,этотчас PIN ступня RS (A1) имеет низкий уровень, а содержимое данных шины является параметром index изценить。
  • sunxi_lcd_cpu_wirte_data Реальностьсейчасвторойиндивидуальный写действовать,этотчас PIN ступня RS (A1) имеет высокий уровень, а содержимое данных шины является параметром. data изценить。
SUNXI_LCD_CPU_WRITE_INDEX

настраивать CPU Экран представляет собой специальный регистр.

Язык кода:javascript
копировать
void sunxi_lcd_cpu_write_index(__u32 sel,__u32 index)

параметр:

  • sel: отображаемый идентификатор
  • index: хотетьнастраиватьиззарегистрироваться
SUNXI_LCD_CPU_WRITE_DATA

настраивать CPU экранзарегистрироватьсяизценитьдляобозначениеизценить

Язык кода:javascript
копировать
void sunxi_lcd_cpu_write_data(__u32 sel, __u32 data)

параметр:

  • sel: отображаемый идентификатор
  • index: хотетьнастраиватьиззарегистрироватьсяизценить
TCON0_CPU_RD_24B_DATA

Операция чтения

Язык кода:javascript
копировать
s32 tcon0_cpu_rd_24b_data(u32 sel, u32 index, u32 *data, u32 size)

параметр:

  • sel: отображаемый идентификатор
  • индекс: хотелпрочитать из реестра
  • data: используется для хранения указателя массива прочитанного интерфейса. Пользователь должен убедиться, что в нем достаточно места для хранения данных.
  • размер: хочеть читать в байтах
Функция управления контактами
SUNXI_LCD_GPIO_SET_VALUE

PIN-вывод LCD_GPIO выводит высокий или низкий уровень

Язык кода:javascript
копировать
s32 sunxi_lcd_gpio_set_value(u32 screen_id, u32 io_index, u32 value)

параметр:

  • io_index = 0: соответствует sys_config.fex в lcd_gpio_0。
  • io_index = 1: соответствует sys_config.fex в lcd_gpio_1。
  • io_index = 2: Соответствует sys_config.fex в lcd_gpio_2。
  • io_index = 3: Соответствует sys_config.fex в lcd_gpio_3。
  • значение = 0: соответствует низкому уровню выхода ввода-вывода.
  • значение = 1: соответствует высокому уровню выхода ввода-вывода.

используется только для этого GPIO определениедлявыходизситуация。

SUNXI_LCD_GPIO_SET_DIRECTION

Установите PIN-код LCD_GPIO в режим ввода или вывода.

Язык кода:javascript
копировать
s32 sunxi_lcd_gpio_set_direction(u32 screen_id, u32 io_index, u32 direction)

параметр:

  • io_index = 0: соответствует sys_config.fex в lcd_gpio_0。
  • io_index = 1: соответствует sys_config.fex в lcd_gpio_1。
  • io_index = 2: Соответствует sys_config.fex в lcd_gpio_2。
  • io_index = 3: Соответствует sys_config.fex в lcd_gpio_3。
  • direction = 0: Соответствует IO установлен навходить。
  • direction = 1: Корреспонденция IO установлен на выходе.

одинчастьэкраннуждатьсяруководитьпервый Разначало операцию, на шаге открытия экрана Функциясередина соответствует LCD_panel_init Функция, предоставляющая несколько способов экранирования изпервых разначало. для CPU экран, через 8080 Автобус из режима,использованияизда LCDIO(PD,PH)руководитьпервый выдающийся。этотдобрыйпервый режим разначализации, ее возбуждение по шине, определение положения ступня CPU Экран соответствует. для SPI/IIC первый выдающийсяиз LCD,использоватьнезависимыйизIOпервый выдающийся。

Инициализация с использованием SPI

общее использование GPIO Аналоговый способ первый выдающийся SPI Экран,Чтосередина SPI Симуляция выглядит так

Язык кода:javascript
копировать
#define spi_scl_1 sunxi_lcd_gpio_set_value(0, 3, 1)  // Конфигурация lcd_gpio_3 для SCL
#define spi_scl_0 sunxi_lcd_gpio_set_value(0, 3, 0)
#define spi_sdi_1 sunxi_lcd_gpio_set_value(0, 2, 1)  // Конфигурация lcd_gpio_2 для SDI
#define spi_sdi_0 sunxi_lcd_gpio_set_value(0, 2, 0)
#define spi_cs_1 sunxi_lcd_gpio_set_value(0, 1, 1)   // Конфигурация lcd_gpio_1 для CS
#define spi_cs_0 sunxi_lcd_gpio_set_value(0, 1, 0)

static void spi_write_cmd(u8 value)
{
    int i;

    spi_cs_0;
    spi_scl_0;

    spi_sdi_0;
    spi_scl_1;
    spi_scl_0;

    for (i = 0; i < 8; i++) {
        if (value & 0x80)
            spi_sdi_1;
        else
            spi_sdi_0;
        value <<= 1;

        spi_scl_1;
        spi_scl_0;
    }
    spi_cs_1;
}

static void spi_write_data(u8 value)
{
    int i;

    spi_cs_0;
    spi_scl_0;

    spi_sdi_1;
    spi_scl_1;
    spi_scl_0;

    for (i = 0; i < 8; i++) {
        if (value & 0x80)
            spi_sdi_1;
        else
            spi_sdi_0;
        value <<= 1;

        spi_scl_1;
        spi_scl_0;
    }
    spi_cs_1;
}

Тогда вы можете позвонить spi_write_cmd(u8 value) и spi_write_data(u8 value) Функция записывает команду инициализации.

Вы также можете использовать экран инициализации аппаратного SPI, код следующий:

Язык кода:javascript
копировать
static int spi_init(void)
{
    int ret = ‑1;
    struct spi_master *master;
    master = spi_busnum_to_master(1);
    if (!master)
    {
        lcd_fb_wrn("fail to get master\n");
        goto OUT
    }
    spi_device = spi_alloc_device(master);
    if (!spi_device)
    {
        lcd_fb_wrn("fail to get spi device\n");
        goto OUT;
    }
    spi_device‑> bits_per_word = 8;
    spi_device‑> max_speed_hz = 50000000; /*50MHz*/
    spi_device‑> mode = SPI_MODE_0;
    ret = spi_setup(spi_device);
    if (ret)
    {
        lcd_fb_wrn("Faile to setup spi\n");
        goto FREE;
    }
    lcd_fb_inf("Init spi1:bits_per_word:%d max_speed_hz:%d mode:%d\n", spi_device‑> bits_per_word,
               spi_device‑> max_speed_hz, spi_device‑> mode);
    ret = 0;
    goto OUT;
FREE:
    spi_master_put(master);
    kfree(spi_device);
    spi_device = NULL;
OUT:
    return ret;
}

static int comm_out(unsigned int sel, unsigned char cmd)
{
    struct spi_transfer t;
    if (!spi_device)
        return ‑1;
    DC(sel, 0);
    memset(&t, 0, sizeof(struct spi_transfer));
    t.tx_buf = &cmd;
    t.len = 1;
    t.bits_per_word = 8;
    t.speed_hz = 24000000;
    return spi_sync_transfer(spi_device, &t, 1);
}

Первый звонок spi_init пара функций spi аппаратное обеспечениеруководитьпервый разначалоизменять,spi_init Функцию можно разделить на несколько этапов. Первый — получить. master;в соответствии с Реальностьмеждународноеаппаратное обеспечениедажеловить,выбирать spi(кодсерединавыбирать了 spi1),еслиэтотодин步返разошибка сказала spi Не так хорошо, как Конфигурация. Шаг второй наладки spi device,этотвнутривключатьбольшинствобольшая скорость,spi Режим передачи содержит количество битов на отдельное слово. большинство используется после настройки spi_setup Заканчивать master и device из ассоциации.

comm_out это spi Пример передачи, ядро ​​да spi_sync_transfer функция.

Параллельный интерфейс RGB

когда мы Конфигурация Параллельный интерфейс При использовании RGB это не требуется в разделе конфигурации. 24 немного, 18 Бит и 16 Немного, большинство большойразрядность, что это за ссылка pin mux форма, если LCD Сам экран поддерживает коэффициент изразрядности. SoC Поддержите изразрядность меньше, конечно вы можете выбрать только сторону с меньшим изрядностью.

потому чтодля Нетнуждатьсяпервый разначалоизменять,RGB Проблемы с интерфейсом возникают редко, поэтому сосредоточьтесь на lcd из timing изразумности, то есть далcd_ht, lcd_hspw, lcd_hbp, lcd_vt, lcd_vspw и lcd_vbp этотиндивидуальныйсвойствоизрациональность。

Внизлапшадатипичный Параллельный интерфейс RGB sys_config.fex Конфигурация Пример,Чтосерединаиспользоватьнулевой行把Конфигурацияточкастановиться Несколькоиндивидуальныйчасть

Язык кода:javascript
копировать
;--------------------------------------------------
;Parallel RGB LCD
;--------------------------------------------------
[lcd0]
; Part 1
lcd_used            = 1
lcd_driver_name     = "default_lcd"

; Part 2
lcd_if              = 0

; Part 3
lcd_x               = 480
lcd_y               = 480
lcd_width           = 150
lcd_height          = 94
lcd_rb_swap         = 0
lcd_dclk_freq       = 21
lcd_hv_clk_phase    = 1

; Part 4
lcd_backlight       = 150
lcd_pwm_used        = 1
lcd_pwm_ch          = 5
lcd_pwm_freq        = 5000
lcd_pwm_pol         = 1

; Part 5
lcd_hbp             = 80
lcd_ht              = 648
lcd_hspw            = 8
lcd_vbp             = 10
lcd_vt              = 522
lcd_vspw            = 2
lcd_lvds_if         = 0
lcd_lvds_colordepth = 1
lcd_lvds_mode       = 0
lcd_frm             = 1
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 6
;LCD_D2-LCD_D7
lcd_gpio_4               = port:PA00<8><0><3><0>
lcd_gpio_5               = port:PA01<8><0><3><0>
lcd_gpio_6               = port:PA02<8><0><3><0>
lcd_gpio_7               = port:PA03<8><0><3><0>
lcd_gpio_8               = port:PA04<8><0><3><0>
lcd_gpio_9               = port:PA05<8><0><3><0>

;LCD_D10-LCD_D15
lcd_gpio_10              = port:PA11<8><0><3><0>
lcd_gpio_11              = port:PA10<8><0><3><0>
lcd_gpio_12              = port:PA08<8><0><3><0>
lcd_gpio_13              = port:PA07<8><0><3><0>
lcd_gpio_14              = port:PA06<8><0><3><0>
lcd_gpio_15              = port:PA09<8><0><3><0>

;LCD_D18-LCD_D23
lcd_gpio_16              = port:PA12<8><0><3><0>
lcd_gpio_17              = port:PA13<8><0><3><0>
lcd_gpio_18              = port:PA14<8><0><3><0>
lcd_gpio_19              = port:PA15<8><0><3><0>
lcd_gpio_20              = port:PB03<8><0><3><0>
lcd_gpio_21              = port:PB02<8><0><3><0>

;LCD_VSYNC, LCD_HSYNC, LCD_DCLK, LCD_DE
lcd_gpio_0              = port:PA18<8><0><3><0>
lcd_gpio_1              = port:PA19<8><0><3><0>
lcd_gpio_2              = port:PA20<8><0><3><0>
lcd_gpio_3              = port:PA21<8><0><3><0>
  1. Первыйчасть,Решаем не использовать его в конфигурации,кииспользоватьгдеиндивидуальныйдрайвер экрана,lcd_driver_name Решил, какой драйвер экрана использовать разначалоизменять,этотвнутрида default_lcd,да针对Нетнуждатьсяпервый выдающийсянастраиватьиз RGB экран.
  2. второйчасть Решать Внизлапшаиз Конфигурацияэтопараллельный RGB из Конфигурация。
  3. Номер тричасти определяет время передачи SoC в ЖК-модуле. Пожалуйста, проверьте описание параметра синхронизации экрана.
  4. Четвертая часть определяет подсветку (ШИМ и lcd_bl_en). Пожалуйста, ознакомьтесь с параметрами, связанными с подсветкой.
  5. Пятая часть — показать эффект, часть Конфигурации, если нет. 24 Бит из RGB, то общая ситуация Внизнуждатьсянастройкеlcd_frm.
  6. Шестая часть посвящена питанию и настройке. RGB666 Ну давай же RGB888,нуждатьсяв соответствии с Реальностьмеждународная pinmux Таблица Прихода определяет, имеет ли чип только 18 корень rgb Данные могут только rgb18. Пожалуйста, ознакомьтесь с параметрами источника питания.

Последовательный интерфейс RGB

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

То же, что и Параллельный интерфейс Как и в случае с RGB, настройку среды проводить не требуется. интерфейс RGB,Когда вы это сделаете, просто установите аппаратное обеспечение и правильно ловите.

этотвнутринуждаться Уведомлениеизда,Для интерфейса,SoC Для завершения одного индивидуального цикла требуется в общей сложности три цикла нуждатьсятри. пиксель, поэтому, когда мы настраиваем время, нуждаться в удовлетворении lcd_dclk_freq*3=lcd_ht*lcd_vt60,или lcd_dclk_freq=lcd_ht/3*lcd_vt*60 Или 3 раз lcd_ht Или 3 раз lcd_dclk_freq

интерфейс I8080

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

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

Приколоть

Описание функции

Сигнал выбора чипа CS

Определите, работает ли чип.

Сигнал выбора регистра RS

Низкий указывает на выбор index или status Регистр, высокий уровень означает выбор регистра управления. Реальностьмеждународная сценасерединагенералловить SoC из LCD_DE контакт (контакт включения данных).

Команда данных WR различает сигнал

То есть записывайте тактовый сигнал, обычно подключаемый к SoC из LCD_CLK ступня. (Низкий уровень означает запись данных)

Сигнал чтения данных RD

Считайте тактовый сигнал, обычно подключенный к SoC из LCD_HSYNC ступня. (Низкий уровень означает чтение данных)

RESET

Сброс ЖК-дисплея (сброс с помощью фиксированной серии команд 0 1 0)

Data

Двусторонние данные

I8080 в соответствии с Data изчисло据разрядностьинтерфейсиметь 9.08.16.18, даже какая ступня ссылка, даже если разрядность одинаковая, даже из Приколоть не та, тоже хотелось бы учесть из фактора да rgb Формат.

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

Схема конфигурации контактов RGB и I8080

image-20230508170051477
image-20230508170051477
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