Платформа Qualcomm Lcd драйвера, которую я понимаю

Фреймбуфер (framebuffer) — это интерфейс, предоставляемый системой Linux для устройств отображения.Он абстрагирует буфер отображения, скрывает основные различия аппаратного обеспечения изображения и позволяет приложениям верхнего уровня напрямую считывать и записывать в буфер отображения в графическом режиме. Пользователю не нужно заботиться о конкретном местоположении и методе хранения физического буфера дисплея, все это делается самим драйвером устройства буфера кадра. Для устройства кадрового буфера, если значение цвета записано в области, соответствующей точке отображения в буфере отображения, соответствующий цвет будет автоматически отображаться на экране. Буфер кадров — это стандартное символьное устройство со старшим номером устройства 29, что соответствует /dev/fbn. Драйвер lcd — это драйвер устройства кадрового буфера.

ЖК классификация:

ЖК-дисплей разделен на материалы: STN (супервитая матрица), TFT (тонкопленочный транзистор), LTPS (низкотемпературный кристаллический поликремний), OLED (органический светоизлучающий диод) и так далее. Типы ЖК-интерфейса: TTL RGB (цифровой цветной интерфейс RGB), i80 (также известный как интерфейс MCU), LVDS (дифференциальный сигнал низкого напряжения), RSDS (дифференциальный сигнал с низким размахом), EDP (интерфейс встроенного дисплея), MIPI DSI (MIPI). стандартный интерфейс дисплея) и т. д.

ЛК:

  • aboot_init ()
  • target_display_init ()
  • gcdb_display_init ()
  • oem_panel_select (): выберите используемую панель
  • dsi_panel_init (): Инициализировать параметры панели
  • msm_display_init ()
    • pdata-> power_func включение питания
    • pdata-> pll_clk_func включить часы
    • msm_fb_alloc  выделяет память для буфера кадра.
    • display_image_on_screen () Получить изображение логотипа lk из раздела-заставки.Если раздел-заставка не соответствует требуемым данным, он будет отображать логотип по умолчанию.
    • msm_display_config () dsi отправляет команду инициализации
    • msm_display_on () Включить DSI VIDEO, использовать команду инициализации для инициализации панели
    • pdata-> bl_func (1) Включить подсветку

ядро:

Общая последовательность выполнения следующая:   зонд MDP → зонд DSI → зонд FB .
  • Драйвер MDP: это внутренний чип управления дисплеем Qualcomm. В основном инициализируйте используемые аппаратные ресурсы: часы, прерывание, iommu, шину, DMA и т. д. Также зарегистрируйте некоторые интерфейсы для использования устройствами fb.
  • Драйвер DSI: устройство уровня транспортного протокола. Проанализировать файл dtsi панели, предоставленный производителем модуля, из какого файла можно получить режим, разрешение и команду инициализации ИМС драйвера;
  • Драйвер FB: устройство драйвера видеокарты. Реализуйте регистрацию фреймбуфера Linux и предоставьте интерфейс управления доступом для пользователей верхнего уровня. Драйвер FB завершен в mdss_fb.c
Уровень драйвера MDP :
  • module_init (mdp3_driver_init) ----> platform_driver_register(&mdp3_driver) Затем в соответствии с mdss_mdp в файле дерева устройств dsi: qcom,mdss_mdp@1a00000 {совместимый = "qcom, mdss_mdp3", с mdp3_dt_m из mdp3_driver atch[] = { { .совместимый = "qcom, mdss_mdp3 ",}} совпадение
  • mdp3_probe (). Если совпадение прошло успешно, выполните функцию probe.
    • mdp3_res->mdss_util = mdss_get_util_intf (), а затем выполнить инициализацию глобальной переменной mdss_util на mdp3_res->mdss_util, которая будет использоваться при регистрации fb.
    • mdss_fb_register_mdp_instance (&mdp3_interface): Назначьте mdp3_interface глобальной переменной mdp_instance, инициализируйте mdp и другие операции при регистрации в fb.
    • mdp3_res->mdss_util->mdp_probe_done = true : отметьте, что mdp выполнил зонд, зонд dsi обнаружит

Уровень драйвера DSI :

  • module_init (msm_dsi_v2_driver_init) ----> platform_driver_register(&msm_dsi_v2_driver), используемый драйвер dsi, основан на mdss_dsi0: совместимый = "qcom, msm-dsi-v2 " в файле дерева устройств dsi. Затем сопоставьте драйвер с driver.name=" msm_dsi_v2 " в структуре msm_dsi_v2_driverв ядре/драйверах/видео/msm/mdss/dsi_host_v2.c
  • msm_dsi_probe (). Если совпадение успешно, выполните .probe = msm_dsi_probe в msm_dsi_v2_driver, функцию msm_dsi_probe . (Информация об инициализации ЖК-дисплея: просмотрите дерево устройств, чтобы найти узел устройства fb. Инициализируйте ЖК-экран и зарегистрируйте ЖК-экран.)
    • platform_set_drvdata  (pdev, ctrl_pdata). Передайте данные ctrl_pdata в pdev.
    • платформа_получить_ресурс  (). Получить ресурсы памяти и прерывания от устройства
    • mdss_get_util_intf  (): получить глобальную переменную mdp_instance, зарегистрировать при проверке mdp.
    • of_platform_populate  (pdev->dev.of_node, NULL, NULL, &pdev->dev); Заполнить данные дерева устройств в platform_device
    • dsi_get_panel_cfg  (). MDSS_DSI0 в dsi выбирает конкретную конфигурацию LCD в массиве MDSS_MDP. В соответствии с конфигурацией ЖК-дисплея, выбранной MDSS_MDP, получите элемент конфигурации с конкретным именем qcom, mdss-dsi-panel-name = «xxxx».
    • dsi_find_panel_of_node  (). Найдите узел панели dsi по имени панели, полученному выше.
    • mdss_dsi_panel_init  (). Инициализируйте параметр панели lcd в узле.
    • dsi_ctrl_config_init (). Получить данные для настройки блока питания и проанализировать настройки gpio и phy.
    • msm_dsi_io_init (). Инициализация часов и регулятора
    • dsi_register_interface (). Зарегистрировать интерфейс dsi
    • msm_dsi_ctrl_init (). Инициализировать контроллер
    • msm_dsi_irq_init (). прерывание инициализации
    • dsi_panel_device_register_v2 (). Зарегистрируйте узел устройства panel_device, подтвердите, является ли он видео или командным режимом, и зарегистрируйте dsi_event_handler для связи с уровнем mdp и уровнем fb. 

Регистрация водителя FB :

  • module_init (mdss_fb_init)---------->> Вызов platform_driver_register(&mdss_fb_driver). Устройство платформы — fb0, поэтому используется mdss_mdb в dsi: mdi_fb0: compatible="qcom, mdss_fb " и driver.name=" m d ss_fb " в структуре mdss_fb_driverдля соответствия драйверу. в ядре/драйверах/видео/msm/mdss/mdss_fb.c
  • mdss_fb_probe (). Если совпадение прошло успешно, выполните функцию .probe = mdss_fb_probe в mdss_fb_driver.
    • dev_get_platdata (&pdev->dev) . Получить информацию о структуре mdss_panel_data.
    • mdss_fb_register (): заполните структуру fb_info, завершите регистрацию fb, извлеките информацию об экране из mfd и поместите ее в fbi, зарегистрируйте fb и включите функцию работы fb для пользовательского пространства.
      • register_framebuffer (struct fb_info *fb_info): Зарегистрируйте fb-устройство (в том же файле функций, а именно: module_init(fbmem_init) в kernel\drivers\video\fbmem.c ----> fbmem_init ----> register_chrdev ( ) created A символьное устройство, что доказывает, что драйвер lcd является драйвером символьного устройства), это интерфейс базового уровня, а прикладной уровень может управлять узлом fb0 для работы с буфером кадрового буфера.
        • структура fb_info *fb_info . Структура fb_info должна использоваться при регистрации фреймбуфера, а структура fb_info включает в себя структуры fb_ops, fb_var_screeninfo и fb_fix_screeninfo.
          • fb_read и fb_write в структуре fb_ops используются для операций чтения и записи в фреймбуфер прикладным уровнем, fb_mmap используется для сопоставления памяти между процессом приложения и фреймбуфером, fb_ioctl используется для некоторых операций управления фреймбуфером прикладным уровнем , а fb_check_var и fb_set_par используются соответственно
          • fb_var_screeninfo  записывает изменяемые пользователем параметры управления отображением, включая разрешение экрана и количество бит на пиксель.
          • fb_fix_screeninfo  записывает параметры контроллера дисплея, которые не могут быть изменены пользователем, такие как физический адрес и длина экранного буфера.
      • mfd->mdp.init_fnc ( mfd): вызов интерфейса MDP: init_fnc = mdp3_init
        • mdp3_heat
          • mdp3_ctrl_init функция управления регистром
    • led_classdev_register (&pdev->dev, &backlight_led) . Зарегистрировать устройство подсветки

Guess you like

Origin blog.csdn.net/weixin_42432281/article/details/113246959