破損したEDIDを受信したにもかかわらず、HDMIオーディオを強制的に有効にする方法(インテルカード)

破損したEDIDを受信したにもかかわらず、HDMIオーディオを強制的に有効にする方法(インテルカード)

グラフィックカードに直接接続すると、モニターから送信されたEDIDが正しく機能するため/lib/firmware/edid/viewsonic.bin

KVMスイッチ、HDMIオーディオ抽出器、HDMIディストリビューターを介してモニターにアクセスしたいです。この設定を有効にすると、コンピュータが受信したEDIDが破損し、UEFIでも画面がオンになっていることを検出できません。

drm_kms_helper.edid_firmware=edid/viewsonic.bin video=HDMI-A-1:Dカーネルのブートラインに追加して解決策を見つけました。このラインのおかげで、Linuxでの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                                

編集:edid_firmwareオプションで起動するとフィールドは設定されません(eld#2.0および他の2. *と同じ結果)。

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

ただし、モニターを直接接続してブートパラメーターを使用または使用せずにブートした場合、eld#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

編集:カーネル側を掘り下げてみてください

もっと詳しく見てみると、すべてが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:パイプ_構成_err [i915]]間違いhas_audioの不一致(予想0、発見1)慣れたから当然なんだ。したがって、Intel GPU ツールを使用して HSW_AUD_PIN_ELD_CP_VLD を手動で変更することもできますが、よく知っている人に尋ねたいと思います。

答え1

IRCのfreenodeの#intel-gfxから回答を得ました。問題は、他のモジュールの中で、i915モジュールがdrm_kms_helperに提供されているedidファームウェアを無視するdrm_(do_)get_edidを呼び出すことです。

すでにパッチがありますLinuxの場合(私はこれをLinux 4.12に適用してマイナーな競合を解決しました)、この動作を変更しました。 linux-source/drivers/gpu/drm/ 以下のすべてのモジュールを再構築し、新しい起動パラメータを追加する必要があります。drm.edid_firmware=edid/viewsonic.bin その後、オーディオ出力が使用可能としてマークされ、音がよく聞こえます。この問題は解決されました。今回のパッチがお受けできますように!

答え2

部分的な答え:

EDIDには、オーディオ情報、特にリストされているCEAオーディオ拡張ブロックが含まれていますedid-decode。このデータはカーネルドライバによって抽出され、ALSAに次のように提供されます。老年(「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を完全に停止するか、pasuspenderALSAレベルで調査することをお勧めします。aplay --dump-hw-params -D ...役に立つかもしれません。

EDIDを使用しているように、ELDをカスタムELDに強制的にオーバーライドする方法がわからず、そのような方法が存在するかどうかはわかりません。

つまり、この問題をどのように解決するかはわかりませんが、おそらくこの情報を使用して、より多くの情報をどこで見つけることができるかについてのアイデアを得ることができます。

関連情報