고수님들 HDMI 오디오 도와주세요.
- 비밀이야
- 1046
- 12
비밀이야님의 기기정보
질문용 시스템 사양 | 1번 |
---|---|
추가사양 및 설치(할)OS | Catalina 10.15.6 |
공지숙지/증상설명 | 숙지 |
HDMI 때문에 2주간 고생하다가 글을 올립니다. 문제는 HDMI 싸운드가 되다 말다 합니다.
가끔 만지다가 우연히 HDMI가 동작하면 리부팅을 하거나 혹은 부트캠프로 윈도우를 다녀오면 또다시 안됩니다.
레이아웃은 1220 권장은 다 시도해본것 같고, 버전도 여러개 테스트 해보았으나, 최신개발빌드가 가장 낳았습니다.
버전이 낮아지면 되던 헤드셋도 안되고 하는 경우가 많이 생기더라구요.
제가 무슨 과정을 잘못하고 있는건지 고수님들의 도움이 필요 합니다.
헤드레스로 인텔 그래픽은 사용하고 RX580에 2개의 HDMI로 모니터를 연결 합니다.
FakePCIID_Intel_HDMI_Audio 또한 사용해보았으나 로드되지 않아도 HDMI오디오가 작동할때 있고 로드되어도 작동하지 않고.. 큰 의미가 없었습니다.
OpenCore 0.59, 0.60과 AppleALC layout-id 7번으로 하기 디바이스를 전부 테스트를 진행 하였습니다.
00:1b.0 8086:06c0 /PCI0@0/RP17@1B = PciRoot(0x0)/Pci(0x1B,0x0)
01:00.1 1002:aaf0 /PCI0@0/PEG0@1/HDAU@0,1 = PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x1)
00:1f.3 8086:06c8 /PCI0@0/HDEF@1F,3 = PciRoot(0x0)/Pci(0x1F,0x3)
RX580의 SSDT는 하기와 같습니다.
/*
* Intel ACPI Component Architecture
* AML/ASL+ Disassembler version 20180427 (64-bit version)(RM)
* Copyright (c) 2000 - 2018 Intel Corporation
*
* Disassembling to non-symbolic legacy ASL operators
*
* Disassembly of iASLavuS5S.aml, Fri Jul 31 05:28:10 2020
*
* Original Table Header:
* Signature "SSDT"
* Length 0x000005D3 (1491)
* Revision 0x01
* Checksum 0xA5
* OEM ID "AMD"
* OEM Table ID "RX580"
* OEM Revision 0x00000000 (0)
* Compiler ID "INTL"
* Compiler Version 0x20180427 (538444839)
*/
DefinitionBlock ("", "SSDT", 1, "AMD", "RX580", 0x00000000)
{
External (_SB_.PCI0.PEG0, DeviceObj) // (from opcode)
External (_SB_.PCI0.PEG0.PEGP, DeviceObj) // (from opcode)
External (BRTL, IntObj) // (from opcode)
External (DTGP, MethodObj) // 5 Arguments (from opcode)
External (EGPS, IntObj) // (from opcode)
External (PEGP, DeviceObj) // (from opcode)
Scope (_SB.PCI0.PEG0)
{
Scope (PEGP)
{
Name (_STA, Zero) // _STA: Status
}
Device (GFX0)
{
Name (_ADR, Zero) // _ADR: Address
Name (ATIB, Buffer (0x0100){})
Method (ATIF, 2, Serialized)
{
If (LEqual (Arg0, Zero))
{
Return (AF00 ())
}
If (LEqual (Arg0, One))
{
Return (AF01 ())
}
If (LEqual (Arg0, 0x02))
{
Return (AF02 ())
}
Else
{
CreateWordField (ATIB, Zero, SSZE)
CreateWordField (ATIB, 0x02, VERN)
CreateDWordField (ATIB, 0x04, NMSK)
CreateDWordField (ATIB, 0x08, SFUN)
Store (Zero, SSZE)
Store (Zero, VERN)
Store (Zero, NMSK)
Store (Zero, SFUN)
Return (ATIB)
}
}
Method (AF00, 0, NotSerialized)
{
CreateWordField (ATIB, Zero, SSZE)
CreateWordField (ATIB, 0x02, VERN)
CreateDWordField (ATIB, 0x04, NMSK)
CreateDWordField (ATIB, 0x08, SFUN)
Store (0x0C, SSZE)
Store (One, VERN)
Store (0x0C, NMSK)
Store (0x03, SFUN)
Return (ATIB)
}
Method (AF01, 0, NotSerialized)
{
CreateWordField (ATIB, Zero, SSZE)
CreateDWordField (ATIB, 0x02, VMSK)
CreateDWordField (ATIB, 0x06, FLGS)
Store (0x0A, SSZE)
Store (0x03, VMSK)
Store (One, FLGS)
Return (ATIB)
}
Method (AF02, 0, NotSerialized)
{
CreateWordField (ATIB, Zero, SSZE)
CreateDWordField (ATIB, 0x02, PSBI)
CreateByteField (ATIB, 0x09, FPWR)
CreateByteField (ATIB, 0x0A, FPID)
Store (0x0D, SSZE)
Store (0x08, PSBI)
Store (Zero, FPWR)
Store (EGPS, FPID)
Return (ATIB)
}
Method (ABCL, 0, NotSerialized)
{
Return (Package (0x52)
{
0x50,
0x32,
One,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
0x08,
0x09,
0x0A,
0x0B,
0x0C,
0x0D,
0x0E,
0x0F,
0x10,
0x11,
0x12,
0x13,
0x14,
0x15,
0x16,
0x17,
0x18,
0x19,
0x1A,
0x1B,
0x1C,
0x1D,
0x1E,
0x1F,
0x20,
0x21,
0x22,
0x23,
0x24,
0x25,
0x26,
0x27,
0x28,
0x29,
0x2A,
0x2B,
0x2C,
0x2D,
0x2E,
0x2F,
0x30,
0x31,
0x32,
0x33,
0x34,
0x35,
0x36,
0x37,
0x38,
0x39,
0x3A,
0x3B,
0x3C,
0x3D,
0x3E,
0x3F,
0x40,
0x41,
0x42,
0x43,
0x44,
0x45,
0x46,
0x47,
0x48,
0x49,
0x4A,
0x4B,
0x4C,
0x4D,
0x4E,
0x4F,
0x50
})
}
Method (_DOD, 0, Serialized) // _DOD: Display Output Devices
{
Return (Package (0x01)
{
0x0110
})
}
Method (_PRW, 0, NotSerialized) // _PRW: Power Resources for Wake
{
Return (Package (0x02)
{
0x69,
0x03
})
}
Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method
{
If (LEqual (Arg2, Zero))
{
Return (Buffer (One)
{
0x03
})
}
Return (Package (0x1C)
{
"AAPL,slot-name",
Buffer (0x07)
{
"Slot-1"
},
"@0,AAPL,boot-display",
Buffer (One)
{
0x00
},
"@0,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@1,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@2,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@3,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@4,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"ATY,Card#",
Buffer (0x10)
{
"113-4E353CU-O6T"
},
"ATY,Copyright",
Buffer (0x33)
{
"(C) 1988-2017, AMD Technologies Inc."
},
"ATY,VendorID",
Buffer (0x02)
{
0x02, 0x10
},
"ATY,DeviceID",
Buffer (0x02)
{
0xDF, 0x67
},
"device_type",
Buffer (0x12)
{
"ATY,OrinocoParent"
},
"model",
Buffer (0x12)
{
"AMD Radeon RX 580"
},
"hda-gfx",
Buffer (0x0A)
{
"onboard-2"
}
})
}
OperationRegion (PEGH, PCI_Config, Zero, 0x40)
Field (PEGH, ByteAcc, NoLock, Preserve)
{
VID0, 16,
DID0, 16,
GCMD, 8,
Offset (0x24),
BAR4, 32
}
Return (0x80000002)
}
Device (HDAU)
{
Name (_ADR, One) // _ADR: Address
OperationRegion (HDAH, PCI_Config, Zero, 0x40)
Field (HDAH, ByteAcc, NoLock, Preserve)
{
VID0, 16,
DID0, 16
}
Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method
{
Store (Package (0x0E)
{
"built-in",
Buffer (One)
{
0x00
},
"AAPL,slot-name",
Buffer (0x07)
{
"Slot-1"
},
"layout-id",
Buffer (0x04)
{
0x01, 0x00, 0x00, 0x00
},
"name",
Buffer (0x10)
{
"RX 580 HD-Audio"
},
"model",
Buffer (0x10)
{
"RX 580 HD-Audio"
},
"device_type",
Buffer (0x16)
{
"Multimedia Controller"
},
"hda-gfx",
Buffer (0x0A)
{
"onboard-2"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
Return (0x80000002)
}
}
Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, ToUUID ("a0b5b7c6-1318-441c-b0c9-fe695eaf949b")))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}
If (LEqual (Arg2, One))
{
Return (One)
}
}
}
Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}
}
비밀이야
댓글 12
아래 글 10번부터 참조해 보세요. 외장그래픽 HDMI 오디오 잡는 방법인듯 합니다.
저도 rx580.aml(다른 것)를 사용하는데 모니터 1개 DP포트로 연결되어 있어 해 보면 소리 잘 나옵니다.
그런데 블루투스를 사용 중이라서 자세히는 모르겠습니다.
클로버 기준으로 설명이 되어 있는 아래 글을 참조하세요. layout-id 값을 입력하는 듯 함.
1<완결편> <필독요망>인텔그래픽 퍼팩트하게 잡는 방법과 headless 완벽 구성
그리고 RootPci 값 이 조금 다르네요. 강좌에 있는 것도 아래와 같이 되어 있습니다. 참조하세요.
내장그래픽(HD4000) onboard-2 , Internal@0,2,0
외장그래픽(RX580) onboard-1 , Internal@0,1,0/0,0 그리고 HDMI Audio onboard-1 , Internal@0,1,0/0,1
설정 후 인젝션 7
해도 안되네요 ㅠㅠ
DSDT 또한 수정해서 테스트 해봤어여.
/*
* Intel ACPI Component Architecture
* AML/ASL+ Disassembler version 20180427 (64-bit version)(RM)
* Copyright (c) 2000 - 2018 Intel Corporation
*
* Disassembling to non-symbolic legacy ASL operators
*
* Disassembly of iASLfPZJPX.aml, Fri Jul 31 14:24:40 2020
*
* Original Table Header:
* Signature "SSDT"
* Length 0x000004D2 (1234)
* Revision 0x01
* Checksum 0x5E
* OEM ID "AMD"
* OEM Table ID "RX580"
* OEM Revision 0x00000000 (0)
* Compiler ID "INTL"
* Compiler Version 0x20180427 (538444839)
*/
DefinitionBlock ("", "SSDT", 1, "AMD", "RX580", 0x00000000)
{
External (_SB_.PCI0.PEG0, DeviceObj) // (from opcode)
External (_SB_.PCI0.PEG0.PEGP, DeviceObj) // (from opcode)
External (BRTL, IntObj) // (from opcode)
External (EGPS, IntObj) // (from opcode)
External (PEGP, DeviceObj) // (from opcode)
Scope (_SB.PCI0.PEG0)
{
Scope (PEGP)
{
Name (_STA, Zero) // _STA: Status
}
Device (GFX0)
{
Name (_ADR, Zero) // _ADR: Address
Name (ATIB, Buffer (0x0100){})
Method (ATIF, 2, Serialized)
{
If (LEqual (Arg0, Zero))
{
Return (AF00 ())
}
If (LEqual (Arg0, One))
{
Return (AF01 ())
}
If (LEqual (Arg0, 0x02))
{
Return (AF02 ())
}
Else
{
CreateWordField (ATIB, Zero, SSZE)
CreateWordField (ATIB, 0x02, VERN)
CreateDWordField (ATIB, 0x04, NMSK)
CreateDWordField (ATIB, 0x08, SFUN)
Store (Zero, SSZE)
Store (Zero, VERN)
Store (Zero, NMSK)
Store (Zero, SFUN)
Return (ATIB)
}
}
Method (AF00, 0, NotSerialized)
{
CreateWordField (ATIB, Zero, SSZE)
CreateWordField (ATIB, 0x02, VERN)
CreateDWordField (ATIB, 0x04, NMSK)
CreateDWordField (ATIB, 0x08, SFUN)
Store (0x0C, SSZE)
Store (One, VERN)
Store (0x0C, NMSK)
Store (0x03, SFUN)
Return (ATIB)
}
Method (AF01, 0, NotSerialized)
{
CreateWordField (ATIB, Zero, SSZE)
CreateDWordField (ATIB, 0x02, VMSK)
CreateDWordField (ATIB, 0x06, FLGS)
Store (0x0A, SSZE)
Store (0x03, VMSK)
Store (One, FLGS)
Return (ATIB)
}
Method (AF02, 0, NotSerialized)
{
CreateWordField (ATIB, Zero, SSZE)
CreateDWordField (ATIB, 0x02, PSBI)
CreateByteField (ATIB, 0x09, FPWR)
CreateByteField (ATIB, 0x0A, FPID)
Store (0x0D, SSZE)
Store (0x08, PSBI)
Store (Zero, FPWR)
Store (EGPS, FPID)
Return (ATIB)
}
Method (ABCL, 0, NotSerialized)
{
Return (Package (0x52)
{
0x50,
0x32,
One,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
0x08,
0x09,
0x0A,
0x0B,
0x0C,
0x0D,
0x0E,
0x0F,
0x10,
0x11,
0x12,
0x13,
0x14,
0x15,
0x16,
0x17,
0x18,
0x19,
0x1A,
0x1B,
0x1C,
0x1D,
0x1E,
0x1F,
0x20,
0x21,
0x22,
0x23,
0x24,
0x25,
0x26,
0x27,
0x28,
0x29,
0x2A,
0x2B,
0x2C,
0x2D,
0x2E,
0x2F,
0x30,
0x31,
0x32,
0x33,
0x34,
0x35,
0x36,
0x37,
0x38,
0x39,
0x3A,
0x3B,
0x3C,
0x3D,
0x3E,
0x3F,
0x40,
0x41,
0x42,
0x43,
0x44,
0x45,
0x46,
0x47,
0x48,
0x49,
0x4A,
0x4B,
0x4C,
0x4D,
0x4E,
0x4F,
0x50
})
}
Method (_DOD, 0, Serialized) // _DOD: Display Output Devices
{
Return (Package (0x01)
{
0x0110
})
}
Method (_PRW, 0, NotSerialized) // _PRW: Power Resources for Wake
{
Return (Package (0x02)
{
0x69,
0x03
})
}
Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method
{
If (LEqual (Arg2, Zero))
{
Return (Buffer (One)
{
0x03
})
}
Return (Package (0x1C)
{
"AAPL,slot-name",
Buffer (0x07)
{
"Slot-1"
},
"@0,AAPL,boot-display",
Buffer (One)
{
0x00
},
"@0,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@1,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@2,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@3,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"@4,name",
Buffer (0x0C)
{
"ATY,Orinoco"
},
"ATY,Card#",
Buffer (0x10)
{
"113-4E353CU-O6T"
},
"ATY,Copyright",
Buffer (0x33)
{
"(C) 1988-2017, AMD Technologies Inc."
},
"ATY,VendorID",
Buffer (0x02)
{
0x02, 0x10
},
"ATY,DeviceID",
Buffer (0x02)
{
0xDF, 0x67
},
"device_type",
Buffer (0x12)
{
"ATY,OrinocoParent"
},
"model",
Buffer (0x12)
{
"AMD Radeon RX 580"
},
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
})
}
OperationRegion (PEGH, PCI_Config, Zero, 0x40)
Field (PEGH, ByteAcc, NoLock, Preserve)
{
VID0, 16,
DID0, 16,
GCMD, 8,
Offset (0x24),
BAR4, 32
}
Return (0x80000002)
}
}
Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, ToUUID ("a0b5b7c6-1318-441c-b0c9-fe695eaf949b")))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}
If (LEqual (Arg2, One))
{
Return (One)
}
}
}
Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}
}
저는 DP포트로 연결 된 것을 테스트 해 보니 잘 되었습니다.
그리고 저는 방금 RX580.aml 버렸습니다. JGP 유저님의 말대로 해 보니 정상작동합니다.
사파이어 RX580 Pulse 4G 사용자이며 Orinoco 로 인식시켜서 사용했습니다.
지금, 테스트 해 보니 DP포트로 소리 잘 나옵니다. Orinoco 로 인식되지 않음.
즐거운 하루 되세요.
단지 orinoco 프레임버퍼를 인젝트 하고 싶으신거면 디바이스 프로퍼티에
<dict>
<key>PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)</key>
<dict>
<key>@0,name</key>
<string>ATY,Orinoco</string>
</dict>
</dict>
요렇게만 넣어 주셔도 됩니다.~ PCIRoot 은 본인꺼로 바꾸셔야 하구요.
좋은 정보 감사드립니다. 도전해 보아야겠네요.
도전해 보니 Orinoco 로 인식을 못 합니다. 저는 안 되는 모델인듯 합니다.
아무튼, 감사드리며 즐거운 하루 되세요.
혹시? WhateverGreen.kext 사용하시는지요? 저는 사용중입니다.
한번 넣어서 해 보세요.
프레임버퍼 인젝트는 아래와 같이 더 넣으니 정상적으로 되네요.
@0,name @1,name @2,name @3, name @4,name
터미널에서 ioreg | grep -i aty 입력하니 Orinoco 로 나옵니다.
제가 HDMI를 듀얼로 사용중에 있는데 우연히 하나를 뽑으니 사운드가 멀정하게 잡혀서 HDMI 듀얼이 문제였나 봐요.
현재 해결하지 못한 것은 부프캠프로 윈도우 진입하고 리부팅으로 맥 진입시 헤드셋이 안되는 상황이네요.
전원을 종료 하였다가 다시 부팅하면 정상이 되구요..
특별한 목적이 없다면 SSDT는 독이 될 수도 있습니다