Мой коллега и я работаем над университетским проектом, который требует от нас создания системы сборки на базе Linux для платы BeagleBone AI-64. Созданная система сборки должна уметь обнаруживать камеры, подключенные к портам CSI/USB, и дисплеи, подключенные к порту miniDP. Чтобы подтвердить функциональность, нам нужно создать приложение потоковой передачи, которое собирает видеосигнал с камеры и передает его непосредственно на дисплей (с некоторыми эффектами, например, обнаружением краев), используя Video4Linux (V4L) и GStreamer.
Для создания системы сборки мы использовали Buildroot версии 2024.05 с beagleboneai64_defconfig в качестве отправной точки настройки. Затем мы выбрали последнюю версию ядра (в данном случае это была Linux 6.8.12) с defconfig по умолчанию и исходным кодом дерева устройств (dts) (k3-j721e-beagleboneai64.dts) для нашего ядра. Выбранный загрузчик — U-Boot, для системы инициализации мы использовали systemd и, наконец, используемую нами цепочку инструментов — ту, которую создает Buildroot. Затем мы приступили к выбору пакетов и библиотек для нашего приложения. Мы включили GStreamer и некоторые его плагины, необходимые для нашего приложения, драйвер V4L и некоторые его инструменты (например, v4l2grab) и dropbear для ssh-соединения.
На данный момент мы протестировали нашу систему сборки, и она без проблем загружается на плате. Мы также протестировали нашу USB-камеру, которая отлично работает с V4L, и протестировали некоторые конвейеры GStreamer, которые собираемся использовать в нашем приложении. Мы подтвердили эти функции, сохранив изображения/видео с камеры в файл (хранилище файлов), а затем скопировав их на хост-компьютер, а также сетевое соединение с платой и хостом с использованием udpsink для потоковой передачи данных камеры на дисплей хоста через UDP.
Проблема началась после того, как мы попытались подключить дисплей к плате через miniDP. Для установки соединения мы использовали настольный монитор с кабелем miniDP-DP, но соединение не удалось. Дисплей не получает никакого сигнала от платы и после нескольких попыток просто переходит в режим ожидания. Мы перепробовали практически все, что смогли найти в Интернете. На плате мы запустили несколько тестовых инструментов и команд, таких как kmsprint, modetest и проверили логи ядра с помощью dmesg (результаты я покажу). Мы попытались проверить статус отображения в /sys/class/card0-DP-1, но он был отключен и отключен. Также мы не смогли получить edid из этого каталога. В результате нашего исследования мы определенно поняли, что за соединение с дисплеем отвечают DRM и драйвер tidss, но мы не смогли найти никакого решения или чего-то, чего нам не хватает. Поскольку мы уже довольно давно застряли в этой проблеме, мы надеемся, что у кого-нибудь есть идея, как решить эту проблему.
Вот несколько журналов, которые мы получили с помощью следующих команд. Мы просмотрели журналы ядра с помощью dmesg и использовали grep dss для получения информации или драйвера drm и tidss. Это был результат:
>> dmesg | grep dss
[ 0.040778] platform a000000.dp-bridge: Fixed dependency cycle(s) with /bus@100000/dss@4a00000
[ 0.041302] platform a000000.dp-bridge: Fixed dependency cycle(s) with /bus@100000/dss@4a00000
[ 0.041335] platform 4a00000.dss: Fixed dependency cycle(s) with /bus@100000/dp-bridge@a000000
[ 6.732895] [drm] Initialized tidss 1.0.0 20180215 for 4a00000.dss on minor 0
[ 6.740127] tidss 4a00000.dss: [drm] Cannot find any crtc or sizes
[ 6.746863] tidss 4a00000.dss: [drm] Cannot find any crtc or sizes
Очевидно, последние две строки вызывают беспокойство, но мы не смогли найти в Интернете ничего полезного или не совсем поняли, на что смотрим. Затем мы попытались использовать инструмент modetest libdrm, но ничего не получилось:
>> modetest
trying to open device 'i915'...failed
trying to open device 'amdgpu'...failed
trying to open device 'radeon'...failed
trying to open device 'nouveau'...failed
trying to open device 'vmwgfx'...failed
trying to open device 'omapdrm'...failed
trying to open device 'exynos'...failed
trying to open device 'tilcdc'...failed
trying to open device 'msm'...failed
trying to open device 'sti'...failed
trying to open device 'tegra'...failed
trying to open device 'imx-drm'...failed
trying to open device 'rockchip'...failed
trying to open device 'atmel-hlcdc'...failed
trying to open device 'fsl-dcu-drm'...failed
trying to open device 'vc4'...failed
trying to open device 'virtio_gpu'...failed
trying to open device 'mediatek'...failed
trying to open device 'meson'...failed
trying to open device 'pl111'...failed
trying to open device 'stm'...failed
trying to open device 'sun4i-drm'...failed
trying to open device 'armada-drm'...failed
trying to open device 'komeda'...failed
trying to open device 'imx-dcss'...failed
trying to open device 'mxsfb-drm'...failed
trying to open device 'simpledrm'...failed
trying to open device 'imx-lcdif'...failed
trying to open device 'vkms'...failed
no device found
а также скромный -M tidss:
Encoders:
id crtc type possible crtcs possible clones
39 0 none 0x00000001 0x00000001
Connectors:
id encoder status name size (mm) modes encoders
40 0 disconnected DP-1 0x0 0 39
props:
1 EDID:
flags: immutable blob
blobs:
value:
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 0
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
4 TILE:
flags: immutable blob
blobs:
value:
CRTCs:
id fb pos size
38 0 (0,0) (0x0)
#0 nan 0 0 0 0 0 0 0 0 0 flags: ; type:
props:
24 VRR_ENABLED:
flags: range
values: 0 1
value: 0
27 CTM:
flags: blob
blobs:
value:
28 GAMMA_LUT:
flags: blob
blobs:
value:
29 GAMMA_LUT_SIZE:
flags: immutable range
values: 0 4294967295
value: 256
Planes:
...
Также мы попытались что-нибудь поиграть с конвейером GStreamer, надеясь, что он «разбудит» дисплей, но это не удалось:
>> gst-launch-1.0 v4l2src ! jpegdec ! kmssink driver-name=tidss
Setting pipeline to PAUSED ...
ERROR: from element /GstPipeline:pipeline0/GstKMSSink:kmssink0: Could not get allowed GstCaps of device
Additional debug info:
../sys/kms/gstkmssink.c(1217): gst_kms_sink_start (): /GstPipeline:pipeline0/GstKMSSink:kmssink0:
driver does not provide mode settings configuration
ERROR: pipeline doesn't want to preroll.
ERROR: from element /GstPipeline:pipeline0/GstKMSSink:kmssink0: GStreamer error: state change failed and some element failed to post a proper error message with the reason for the failure.
Additional debug info:
../libs/gst/base/gstbasesink.c(5881): gst_base_sink_change_state (): /GstPipeline:pipeline0/GstKMSSink:kmssink0:
Failed to start
ERROR: pipeline doesn't want to preroll.
Failed to set pipeline to PAUSED.
Setting pipeline to NULL ...
Freeing pipeline ...
>> gst-launch-1.0 v4l2src ! jpegdec ! autovideosink
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
WARNING: from element /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0: Could not initialise Xv output
Additional debug info:
../sys/xvimage/xvimagesink.c(1944): gst_xv_image_sink_open (): /GstXvImageSink:autovideosink0-actual-sink-xvimage:
Could not open display (null)
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Redistribute latency...
^Chandling interrupt.
Interrupt: Stopping pipeline ...
Execution ended after 0:00:10.655685875
Setting pipeline to NULL ...
Freeing pipeline ...
Примечание. Мы подтвердили, что дисплей и кабель работают нормально и могут подключаться к плате при загрузке платы с системой, которая поставляется на карте eMMC, поэтому мы отбросили их как потенциальную проблему.
По сути, мы перепробовали все, что смогли найти в Интернете. Мы попытались включить множество графических драйверов и библиотек как из конфигурации buildroot, так и из конфигурации ядра, но ничего не изменилось. Мы подозревали, что дерево устройств может быть проблемой (поскольку наши знания о написании и понимании дерева устройств довольно низки), но мы уделили этому много внимания и рекомендуемым dt-привязкам. Мы действительно не могли увидеть, чего не хватает в нашем исходном дереве устройств, чтобы дисплей работал, и мы даже пытались заменить наш dtb на dtb, который используется в системе на карте eMMC (которая работает с дисплеем), но все же ничего не произошло. Мы проверили в конфигурации ядра, включены ли драйверы DRM и tidss, и, как я уже сказал, мы пытались включить множество различных драйверов и библиотек для графики, но пока ничего не получалось.
Обновлять: К сожалению, нам не удалось решить проблему, но мы собрали некоторую новую информацию, которая может оказаться полезной (dmesg | grep dp)
[ 6.579043] cdns-mhdp8546 a000000.dp-bridge: invalid resource (null)
[ 6.586830] cdns-mhdp8546 a000000.dp-bridge: Failed to get SAPB memory resource, HDCP not supported
[ 6.597952] cdns-mhdp8546 a000000.dp-bridge: Direct firmware load for cadence/mhdp8546.bin failed with error -2
[ 6.609014] cdns-mhdp8546 a000000.dp-bridge: cdns_mhdp_fw_cb: No firmware.
Сделал это 30 минут назад и это было решение. Я написал ответ ниже, не заметил, что вы это опубликовали. Спасибо !
Вероятно, вам следует включить CONFIG_DRM_DISPLAY_CONNECTOR
в конфигурации вашего ядра. Это необходимо для обнаружения горячего подключения, которое не обрабатывается непосредственно драйвером контроллера дисплея.
Также убедитесь, что CONFIG_DRM_CDNS_MHDP8546=y
и CONFIG_DRM_CDNS_MHDP8546_J721E=y
Мы только что проверили, все это включено. Хотя мы обнаружили несколько новых сообщений журнала, которые могут оказаться полезными. Я скоро обновлю этот вопрос.
По сути, последний опубликованный мной журнал обновлений был решением. Мы загрузили последнюю версию прошивки Linux (10 июня 2024 г.) и скопировали файл mhdp8546.bin из папки cadence в папку /lib/firmware/cadence в корневой файловой системе платы. После перезагрузки дисплей успешно подключился. Также я почти уверен, что некоторые конфигурации из конфигурации ядра, такие как упомянутые выше droptop, должны быть включены (проверьте конфигурации DRM, TIDSS и CADENCE_TORRENT).
Проверьте /lib в рабочей системе на emmc на наличие
mhdp8546.bin
. Если он есть, вам нужно добавить его в корневую файловую систему сборки с помощью наложения.