Hdmi driver in linux

Русские Блоги

Linux Driver Learning-HDMI Разработка (2) Анализ исходного кода драйвера HDMI (платформа RK)

Оглавление

——-> Драйвер главного устройства HDMI

Введение

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

2. Рамка вождения

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

1. DDC: секреты данных HDCP между процессорами и отображающими устройствами, а также EDID (EDID содержит параметры о мониторах и производительности). Драйвер устройства IIC)

2. HDP: горячая плагина, предназначенная для реализации горячей вставки в паре соединений HDMI. Проще говоря, когда отправляющийся терминал доступен, конец принятия ответит на сигнал HPD на конце отправки, а затем терминал доставки запустит канал DDC, прочитайте информацию приемлемого конца edid, а затем взаимодействует с HDCP. Затем видео и аудио работа обычно, в противном случае соединение не сбои, и разные системы будут иметь различную лечение.

HDCP играет роль в защите цифрового контента. Его обмен ключами требует шины IIC, которая является каналом DDC HDMI. Кроме того, HDMI также необходимо получить соответствующие параметры (EDID), такие как разрешение и другая информация отображения с устройства дисплея. Эта информация также взаимодействует через автобус IIC, а канал DDC идет. Нет необходимости говорить больше о HPD. «Работа» после горячей вставки HDMI зависит от этого. Драйвер Linux должен реализовать драйвер этих компонентов отдельно, и драйвер этих компонентов сотрудничает друг с другом, чтобы поддержать драйвер HDMI.

Вам также необходимо представить здесь CEC: вы можете просто понять, что, когда у вас есть много устройств HDMI через кабель HDMI, когда переключатель или дистрибьютор подключен, если все продукты HDMI поддерживают функцию CEC, то вы можете использовать один из пульт дистанционного управления Элементы управления. Вы можете управлять другими устройствами. Это функция CEC. 210 также предоставляет исходный код вождения HDMI CEC и генерирует файлы устройств, которые предоставляют пользовательские операции пространства (он зарегистрирован как смешанное устройство). Его также можно увидеть на приведенной выше диаграмме кадров. Драйвер компонентов, таких как DDC, обеспечивает функцию Интерфейс к пространству ядра. Только метод работы File_operation реализован в драйвере CEC, чтобы предоставить пользователям вызов при использовании файла устройства. Нет экспозиции интерфейса функции экспозиции в пространстве ядра.

Читайте также:  Установка linux раздел дисков

В рамках платформы RK после определения связанных узлов HDMI в DTS будет вызвана функция инициализации HDMI RockChip_hdmiv2_probe.

Из приведенной выше кадрской диаграммы можно увидеть, что существует только три файла устройства, связанные с HDMI, которые мы можем увидеть в пространстве пользователя, которые представляют собой три файла устройства CEC HPD Video14. Файлы устройства реализованы функциями HDMI CEC, Прочитайте статус устройства HOT INSERTION HDMI и выполните операции устройства HDMI. Как создаются эти три файла устройства и какие операции они предоставляют? Посмотрите на следующий анализ ————

 hdmi: [email protected] < compatible = "rockchip,rk322xh-hdmi"; reg = , ; interrupts = , , ; . rockchip,hdcp_enable = ; rockchip,cec_enable = ; status = "disabled"; >; 

Инициализация и использование DDC в RK не выполняются в операционном интерфейсе без одиночества
Называется «rockchip_hdmiv2_hw.c ‘

Конкретная реализация не означает, что суть заключается в использовании данного интерфейса I2C для получения EDID и другой связанной информации

Драйвер HDMI HDCP под платформой RK расположен в
Среди них определяется соответствующий интерфейс операции HDCP. Следующее вводит функцию инициализации

// Функция инициализации HDCP будет вызвана при инициализации устройства HDMI void rockchip_hdmiv2_hdcp_init(struct hdmi *hdmi) < pr_info("%s", __func__); if (!hdcp) < hdcp_init(hdmi); >else < if (hdcp->keys) hdcp_load_key(hdmi, hdcp->keys); else pr_info("hdcpkeys is no load\n"); > > static int hdcp_init(struct hdmi *hdmi) < . // построить связанный операционный интерфейс HDCP, а затем вызовать его hdmi->ops->hdcp_cb = rockchip_hdmiv2_hdcp_start; hdmi->ops->hdcp_auth2nd = rockchip_hdmiv2_hdcp_2nd_auth; hdmi->ops->hdcp_power_off_cb = rockchip_hdmiv2_hdcp_stop; > 

Ниже приведена часть HDCP в процессе инициализации

rockchip_hdmiv2_probe() --> rockchip_hdmiv2_dev_initial() -----> rockchip_hdmiv2_hdcp_init(hdmi); 

Драйвер HDMI HDCP под платформой RK расположен в
Среди них определяется соответствующий операционный интерфейс CEC, и функция инициализации введена ниже

void rockchip_hdmiv2_cec_init(struct hdmi *hdmi) < struct hdmi_dev *hdmi_dev = hdmi->property->priv; if (init) < rockchip_hdmi_cec_init(hdmi, rockchip_hdmiv2_cec_sendframe, rockchip_hdmiv2_cec_readframe, rockchip_hdmiv2_cec_setcecla); init = 0; /* init_waitqueue_head(&wait); */ >/* * Enable sending all message even if sink refuse * message broadcasted by us. */ if (hdmi_dev->soctype == HDMI_SOC_RK3288 && hdmi_readl(hdmi_dev, REVISION_ID) == 0x1a) writel_relaxed((1

Ниже приведена часть HDCP в процессе инициализации

rockchip_hdmiv2_probe() --> rockchip_hdmiv2_dev_initial() -----> rockchip_hdmiv2_cec_init(hdmi); 

Драйвер главного устройства HDMI

Я сказал, что после того, как интерфейс, связанный с HDMI, определен в DTS, функция инициализации HDMI будет вызвана
Ниже приведена фиксированная блок -схема инициализации I

compatible = "rockchip,rk322xh-hdmi-hdcp2"; compatible = "rockchip,rk322xh-hdmi"; rockchip_hdmiv2_probe() drivers\video\rockchip\hdmi\rockchip-hdmiv2\rockchip_hdmiv2.c rockchip_hdmiv2_clk_enable() RockChip_hdmiv2_dev_init_ops () Интерфейс работы HDMI, предоставленный в RockChip_hdmiv2_hw.c, заполните структуру OPS RockChip_hdmiv2_hw.c rockchip_hdmi_register() drivers\video\rockchip\hdmi\rockchip-hdmi-core.c hdmi-> vic = uboot_vic Если HDMI изначально сначала в Uboot, Vic будет передана в ядро ​​и инициализируется его rk_hdmi_register() android\u-boot\drivers\video\rk_hdmi.c Rk_get_lcdc_drv () vop0 lcdc aquisition lcdcdrivers \ video \ rockchip \ rk_fb.c hdmi_register_display_sysfs() drivers\video\rockchip\hdmi\rockchip-hdmi-sysfs.c HDMI_INIT_MODELIST (HDMI) Установите разрешение и другую конфигурацию драйверов \ Video \ rockchip \ hdmi \ rockchip-hdmi-core.c Switch_dev_register () Зарегистрируйте устройство Switch, чтобы обнаружить устройство HDMI для получения драйверов \ switch \ switch_class.c RockChip_hdmiv2_dev_initial () в соответствии с типом HDMI, установите основные драйверы регистра \ video \ rockchip \ hdmi \ rockchip-hdmiv2 \ rockchip_hdmiv2_hw.c HDMI_DEV_DETECT_HOTPLUG () Определите, поддерживает ли он горячая вставка на основе регистра ROCKCHIP_HDMIV2_WRITE_PHY () Заполните адрес устройства (адрес I2C), чтобы открыть прерывание RockChip_hdmiv2_cec_init (hdmi); инициализация CEC RockChip_hdmiv2_hdcp_init (hdmi); HDCP инициализация rk_display_device_enable () Включите устройство отобразить устройство 

Среди них давайте посмотрим на »

struct hdmi *rockchip_hdmi_register(struct hdmi_property *property, struct hdmi_ops *ops) < . hdmi->property = property; hdmi->ops = ops; hdmi->enable = false; hdmi->mute = HDMI_AV_UNMUTE; hdmi->hotplug = HDMI_HPD_REMOVED; hdmi->autoset = HDMI_AUTO_CONFIG; if (uboot_vic > 0) < hdmi->vic = uboot_vic & HDMI_UBOOT_VIC_MASK; if (uboot_vic & HDMI_UBOOT_NOT_INIT) hdmi->uboot = 0; else hdmi->uboot = 1; hdmi->autoset = 0; > else if (hdmi->autoset) < hdmi->vic = 0; > else < hdmi->vic = hdmi->property->defaultmode; > hdmi->colormode = HDMI_VIDEO_DEFAULT_COLORMODE; hdmi->colordepth = hdmi->property->defaultdepth; hdmi->colorimetry = HDMI_COLORIMETRY_NO_DATA; hdmi->mode_3d = HDMI_3D_NONE; hdmi->audio.type = HDMI_AUDIO_DEFAULT_TYPE; hdmi->audio.channel = HDMI_AUDIO_DEFAULT_CHANNEL; hdmi->audio.rate = HDMI_AUDIO_DEFAULT_RATE; hdmi->audio.word_length = HDMI_AUDIO_DEFAULT_WORDLENGTH; hdmi->xscale = 100; hdmi->yscale = 100; if (hdmi->property->videosrc == DISPLAY_SOURCE_LCDC0) hdmi->lcdc = rk_get_lcdc_drv("lcdc0"); else hdmi->lcdc = rk_get_lcdc_drv("lcdc1"); if (!hdmi->lcdc) goto err_create_wq; if (hdmi->lcdc->prop == EXTEND) hdmi->property->display = DISPLAY_AUX; else hdmi->property->display = DISPLAY_MAIN; memset(name, 0, 32); sprintf(name, "hdmi-%s", hdmi->property->name); hdmi->workqueue = create_singlethread_workqueue(name); if (hdmi->workqueue == NULL) < pr_err("HDMI,: create workqueue failed.\n"); goto err_create_wq; >hdmi->ddev = hdmi_register_display_sysfs(hdmi, NULL); if (hdmi->ddev == NULL) < pr_err("HDMI : register display sysfs failed.\n"); goto err_register_display; >hdmi->id = i; hdmi_init_modelist(hdmi); . > 

Видно, что здесь существуют различные конфигурации HDMI, LCDC и т. Д.
В конце концов, будет зарегистрирован интерфейс SYSFS, и серия операций определяется для интерфейса

static struct rk_display_ops hdmi_display_ops = < .setenable = hdmi_set_enable, .getenable = hdmi_get_enable, .getstatus = hdmi_get_status, .getmodelist = hdmi_get_modelist, .setmode = hdmi_set_mode, .getmode = hdmi_get_mode, .set3dmode = hdmi_set_3dmode, .get3dmode = hdmi_get_3dmode, .getedidaudioinfo = hdmi_get_edidaudioinfo, .setcolor = hdmi_set_color, .getcolor = hdmi_get_color, .getmonspecs = hdmi_get_monspecs, .setscale = hdmi_set_scale, .getscale = hdmi_get_scale, .getdebug = hdmi_get_debug, >; 

  • Соответствует соответствующим узлам нашего устройства
Читайте также:  Обновление ядра роса линукс

Источник

Порт HDMI не обнаружен в Ubuntu 18.04

HDMI-порт моего Lenovo IdeaPad 500 с Ubuntu 18.04 LTS не работает.

Я также выполнил команду xrandr, но обнаружен только основной монитор.

Как я могу решить мою проблему?

Как я могу проверить, что HDMI не сломан?

16 ответов

Как я могу решить мою проблему?

То, что сработало для меня (Lenovo ThinkPad X1 Carbon, Ubuntu 18.04 LTS), это либо переключение диспетчера дисплея назад и вперед между gdm3 и lightdm

sudo dpkg-reconfigure gdm3 

и / или переустановить lightdm и переконфигурировать его вместо использования gdm3

sudo apt-get install --reinstall lightdm ubuntu-desktop 

То же самое случилось со мной, но я смог решить это. Мое решение было:

  1. Выключите компьютер.
  2. Отсоедините кабель HDMI.
  3. Включите компьютер (без HDMI).
  4. Авторизоваться.
  5. Подсоедините кабель HDMI.

Если вы используете видеокарту Nvidia, может возникнуть проблема с драйвером nvidia.

В моем случае я использовал свой Lenovo Y530(GTX 1050 ti) с Ubuntu 18.04 с драйвером nvidia 415.xx, который не поддерживает дополнительный монитор через HDMI. Я пытался во многом без удачи. Я наконец-то обновил драйвер до 418.39 и дополнительный монитор начал работать!:)

Но будьте осторожны, если вы решили пойти и установить драйвер, но не привыкли. Есть несколько сценариев, которые могут нанести вред вашей системе, что в конечном итоге приведет к ее форматированию.

Что случилось со мной, так это то, что я не обновил / не установил зависимость драйвера ядра.

Я обнаружил это, запустив свой терминал и получив следующее сообщение об ошибке:

Reading package lists. Done Building dependency tree Reading state information. Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: nvidia-driver-470 : Depends: nvidia-kernel-source-470 (= 470.86-0ubuntu0.20.04.1) but it is not going to be installed E: Unable to correct problems, you have held broken packages. 

Простая установка отсутствующей зависимости (в моем случае nvidia-kernel-source-470 ) для моего драйвера () и запуска autoinstall снова работал. Итак, шаги были в основном такими:

  • Бежать sudo apt install nvidia-kernel-source-470
  • Бежать sudo ubuntu-drivers autoinstall опять таки. Obs: Убедитесь, что вы используете правильный драйвер, в моем случае nvidia-driver-470
  • Перезагрузитесь, и вы готовы к работе!
Читайте также:  How to execute program in linux

Мои характеристики:

  • Итак: Убунту 20.04
  • Компьютер: Lenovo Ideapad Gaming 3i
  • Видеокарта: Geforce GTX 1650

Источник

Оцените статью
Adblock
detector