Как заставить HDMI-аудио (интеллектуальную карту) активироваться, несмотря на то, что вы получили поврежденный EDID

EDID, отправленный моим монитором при прямом подключении к моей графической карте, в порядке, я сбросил его в /lib/firmware/edid/viewsonic.bin .

Я хочу получить доступ к своему монитору через KVM-переключатель, HDMI-аудио-экстрактор и разветвитель HDMI. С этой настройкой EDID, полученный моим компьютером, сломан, и даже UEFI не может обнаружить, что мой экран включен.

Я нашел обходное решение, добавив drm_kms_helper.edid_firmware=edid/viewsonic.bin video=HDMI-A-1:D в мою загрузочную строку ядра. Благодаря этой линии выход HDMI видео в порядке.

Однако звук HDMI не работает. Pulseaudio настроен на правильный приемник, который обнаруживается как отключенный (недоступен).

Я пробовал следующее без каких-либо изменений:

  • Добавьте файл edid в initramfs, чтобы EDID был загружен ранее
  • xrandr --output HDMI-1 --set audio on

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

Спасибо за любые предложения, которые у вас есть!


Возможно, релевантно:

 $ pactl list sinks Sink #0 State: RUNNING Name: alsa_output.pci-0000_00_1f.3.hdmi-stereo Description: Audio interne Digital Stereo (HDMI) Driver: module-alsa-card.c Sample Specification: s16le 2ch 44100Hz Channel Map: front-left,front-right Owner Module: 7 Mute: no Volume: front-left: 65536 / 100% / 0,00 dB, front-right: 65536 / 100% / 0,00 dB balance 0,00 Base Volume: 65536 / 100% / 0,00 dB Monitor Source: alsa_output.pci-0000_00_1f.3.hdmi-stereo.monitor Latency: 39654 usec, configured 40000 usec Flags: HARDWARE DECIBEL_VOLUME LATENCY SET_FORMATS Properties: alsa.resolution_bits = "16" device.api = "alsa" device.class = "sound" alsa.class = "generic" alsa.subclass = "generic-mix" alsa.name = "HDMI 0" alsa.id = "HDMI 0" alsa.subdevice = "0" alsa.subdevice_name = "subdevice #0" alsa.device = "3" alsa.card = "0" alsa.card_name = "HDA Intel PCH" alsa.long_card_name = "HDA Intel PCH at 0xdf240000 irq 325" alsa.driver_name = "snd_hda_intel" device.bus_path = "pci-0000:00:1f.3" sysfs.path = "/devices/pci0000:00/0000:00:1f.3/sound/card0" device.bus = "pci" device.vendor.id = "8086" device.vendor.name = "Intel Corporation" device.product.id = "a170" device.product.name = "Sunrise Point-H HD Audio" device.form_factor = "internal" device.string = "hdmi:0" device.buffering.buffer_size = "352800" device.buffering.fragment_size = "176400" device.access_mode = "mmap+timer" device.profile.name = "hdmi-stereo" device.profile.description = "Digital Stereo (HDMI)" device.description = "Audio interne Digital Stereo (HDMI)" alsa.mixer_name = "Realtek ALC1150" alsa.components = "HDA:10ec0900,1462da12,00100001 HDA:80862809,80860101,00100000" module-udev-detect.discovered = "1" device.icon_name = "audio-card-pci" Ports : hdmi-output-0: HDMI / DisplayPort (priority: 5900, not available) Active port: hdmi-output-0 Formats: pcm 

EDIT: при загрузке с параметром edid_firmware, поле не задано (результат одинаковый для поля # 2.0, как и для других 2. *):

 $ grep eld_valid /proc/asound/card0/eld#2.0 monitor_present 0 eld_valid 0 

Но при загрузке с подключенным монитором и с параметрами загрузки или без них результат для поля # 2.0 теперь является действительным полем:

 $ cat /proc/asound/card0/eld\#2.0 monitor_present 1 eld_valid 1 monitor_name VX2703 SERIES connection_type HDMI eld_version [0x2] CEA-861D or below edid_version [0x3] CEA-861-B, C or D manufacture_id 0x635a product_id 0xf62b port_id 0x0 support_hdcp 0 support_ai 0 audio_sync_delay 0 speakers [0x1] FL/FR sad_count 1 sad0_coding_type [0x1] LPCM sad0_channels 2 sad0_rates [0x1ee0] 32000 44100 48000 88200 96000 176400 192000 sad0_bits [0xe0000] 16 20 24 

выход aplay -l

 $ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: PCH [HDA Intel PCH], device 0: ALC1150 Analog [ALC1150 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 1: ALC1150 Digital [ALC1150 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0] Subdevices: 0/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: PCH [HDA Intel PCH], device 10: HDMI 4 [HDMI 4] Subdevices: 1/1 Subdevice #0: subdevice #0 

 $ edid-decode /lib/firmware/edid/viewsonic.bin Extracted contents: header: 00 ff ff ff ff ff ff 00 serial number: 5a 63 2b f6 01 01 01 01 19 17 version: 01 03 basic params: 80 3c 22 78 2e chroma info: b2 05 a3 56 4f 9e 28 0f 50 54 established: bf ef 80 standard: b3 00 a9 40 95 00 90 40 81 80 81 40 71 4f 01 01 descriptor 1: 02 3a 80 18 71 38 2d 40 58 2c 45 00 55 50 21 00 00 1e descriptor 2: 00 00 00 ff 00 54 38 47 31 33 32 35 30 30 34 32 30 0a descriptor 3: 00 00 00 fd 00 32 4c 0f 53 12 00 0a 20 20 20 20 20 20 descriptor 4: 00 00 00 fc 00 56 58 32 37 30 33 20 53 45 52 49 45 53 extensions: 01 checksum: f2 Manufacturer: VSC Model f62b Serial Number 16843009 Made week 25 of 2013 EDID version: 1.3 Digital display Maximum image size: 60 cm x 34 cm Gamma: 2.20 DPMS levels: Off Supported color formats: RGB 4:4:4, YCrCb 4:4:4 Default (sRGB) color space is primary color space First detailed timing is preferred timing Established timings supported: 720x400@70Hz 640x480@60Hz 640x480@67Hz 640x480@72Hz 640x480@75Hz 800x600@56Hz 800x600@60Hz 800x600@72Hz 800x600@75Hz 832x624@75Hz 1024x768@60Hz 1024x768@70Hz 1024x768@75Hz 1280x1024@75Hz 1152x870@75Hz Standard timings supported: 1680x1050@60Hz 1600x1200@60Hz 1440x900@60Hz 1400x1050@60Hz 1280x1024@60Hz 1280x960@60Hz 1152x864@75Hz Detailed mode: Clock 148.500 MHz, 597 mm x 336 mm 1920 2008 2052 2200 hborder 0 1080 1084 1089 1125 vborder 0 +hsync +vsync Serial number: T8G132500420 Monitor ranges (GTF): 50-76Hz V, 15-83kHz H, max dotclock 180MHz Has 1 extension blocks Checksum: 0xf2 (valid) CEA extension block Extension version: 3 30 bytes of CEA data Video data block VIC 16 1920x1080@60Hz (native) VIC 5 1920x1080i@60Hz VIC 4 1280x720@60Hz VIC 3 720x480@60Hz VIC 2 720x480@60Hz VIC 7 1440x480i@60Hz VIC 6 1440x480i@60Hz VIC 31 1920x1080@50Hz VIC 20 1920x1080i@50Hz VIC 19 1280x720@50Hz VIC 18 720x576@50Hz VIC 17 720x576@50Hz VIC 22 1440x576i@50Hz VIC 21 1440x576i@50Hz VIC 1 640x480@60Hz Audio data block Linear PCM, max channels 2 Supported sample rates (kHz): 192 176.4 96 88.2 48 44.1 32 Supported sample sizes (bits): 24 20 16 Speaker allocation data block Speaker map: FL/FR Vendor-specific data block, OUI 000c03 (HDMI) Source physical address 1.0.0.0 Underscans PC formats by default Basic audio support Supports YCbCr 4:4:4 Supports YCbCr 4:2:2 1 native detailed modes Detailed mode: Clock 148.500 MHz, 597 mm x 336 mm 1920 2008 2052 2200 hborder 0 1080 1084 1089 1125 vborder 0 +hsync +vsync Detailed mode: Clock 74.250 MHz, 597 mm x 336 mm 1920 2008 2052 2200 hborder 0 540 542 547 562 vborder 0 +hsync +vsync interlaced Detailed mode: Clock 74.250 MHz, 597 mm x 336 mm 1280 1390 1430 1650 hborder 0 720 725 730 750 vborder 0 +hsync +vsync Detailed mode: Clock 27.000 MHz, 597 mm x 336 mm 720 736 798 858 hborder 0 480 489 495 525 vborder 0 -hsync -vsync Detailed mode: Clock 148.500 MHz, 597 mm x 336 mm 1920 2448 2492 2640 hborder 0 1080 1084 1089 1125 vborder 0 +hsync +vsync Checksum: 0x4d (valid) EDID block does NOT conform to EDID 1.3! Name descriptor not terminated with a newline 

EDIT: Копание ядра

После некоторого дополнительного копания, похоже, все начинается с linux-source-4.12 / drivers / gpu / drm / i915 / intel_ddi.c. Возвращаемое значение I915_READ(HSW_AUD_PIN_ELD_CP_VLD) & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe) определяет, выводится ли «has_audio» или нет. Так как это не так, функция intel_audio_codec_enable не вызывается. Я попытался заставить его позвонить. После этого ELD настроился правильно и сообщил, что он действителен в /proc/asound/card0/eld#2.0 . Pulseaudio больше не говорит, что выход отключен . Но это все еще не работает, и я получаю сообщение об ошибке: [drm: pipe_config_err [i915]] Ошибка несоответствия ERROR в has_audio (ожидается 0, найдено 1), что является нормальным, так как я закалил его. Итак, я не знаю, может быть, я могу вручную изменить HSW_AUD_PIN_ELD_CP_VLD с помощью инструментов intel gpu, но я предпочитаю спрашивать людей, которые знают лучше.

Частичный ответ:

EDID содержит аудиоинформацию, в частности блок расширения аудиосигнала CEA, который вы указали с помощью edid-decode . Эти данные извлекаются драйверами ядра и предоставляются ALSA как ELD («EDID-подобные данные»). Вы видите текущие ELD (и проверяете, присутствуют ли они вообще) с

 cat /proc/asound/card*/eld\#* 

Вы также можете изменить некоторые данные ELD с помощью этого интерфейса, например

 echo 'audio_sync_delay 23' | sudo tee /proc/asound/card0/eld#3.2 

Так что, если по какой-то причине ваш EDID для загрузки ядра не преобразуется в ELD, выход звука HDMI не будет работать.

Могут быть другие причины, по которым это не работает; в этом случае я рекомендую полностью остановить Pulseaudio (или использовать pasuspender ) и попытаться исследовать уровень ALSA. aplay --dump-hw-params -D ... может помочь.

Я не знаю, как принудительно перезаписать ELD с помощью специального ELD, как вы можете сделать с EDID, и я не уверен, существует ли такой способ.

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

Я получил ответ на IRC от # intel-gfx на freenode. Проблема в том, что модуль i915, а также другие вызовы вызывает drm_ (do_) get_edid, который игнорирует прошивку edid, предоставленную drm_kms_helper.

Существует патч для linux (я применил его к linux 4.12 с небольшим разрешением конфликта), чтобы изменить это поведение. Для этого необходимо перестроить все модули под Linux-источником / drivers / gpu / drm / и добавить новый параметр загрузки: drm.edid_firmware=edid/viewsonic.bin После этого аудиовыход помечается как доступный, и звук работает. Поэтому проблема решена. Я надеюсь, что этот патч будет принят!