시스템 사양 선택 | 3번 |
---|
https://github.com/wei756/NT950XCR-G58A-Hackintosh/releases/tag/v200927
후기
드디어 제 커맥빌드가 실사 가능한 수준이 되어 정리차원에서 올리게 됩니다.
그중에서도 내장 사운드가 고쳐져서 특히 만족스럽네요(삼성 랩탑중에 스피커까지 되는건 제가 처음이지 않을까 조심스레 자랑해봅니다:) )
shl628님의 빌드후기를 보고 감명받아 안정화 과정을 최대한 자세하게 적어보았습니다.
해당 기기가 아니더라도 도움이 될 수 있게 누구나 보고 참고할 수 있도록 해놓았습니다.
박서는 맛만 보고 정식버전 나올 때까지 기다리렵니다.
베타 6버전에서 사운드, 와이파이 등등 작동하는 것만 확인하고 바로 내려왔습니다.
VoodooInput 만 최신버전으로 업뎃하니까 잘 되더군요.
지난 빌드로부터 변경점
오픈코어 버전을 0.6.1로 업데이트하였습니다. (빅서 부팅 가능합니다)
내장 스피커와 이어폰잭(alc298)이 작동합니다.
wifi가 작동합니다.
화면 커버를 덮은 후 바로 잠자기가 깨지 않습니다.
배터리 잔량, fn 단축키 패치를 dsdt static pacth에서 ssdt + hotpatch로 수정하였습니다.
USB 매핑 관련 패치를 제거하였습니다.
오픈코어를 통해서 부팅한 윈도우가 더 안정적으로 작동하도록 수정하였습니다.
되는 것
키보드 / 트랙패드
내장 스피커/이어폰 잭
WiFi
블루투스
잠자기
USB 포트
배터리 상태 확인
화면 밝기 조절
화면 커버 인식
전면 카메라
밝기 조절/볼륨 단축키
SD/UFS 슬롯
QE/CI
스피드스텝
HDMI 포트
안 되는 것
썬더볼트 3
내장 마이크
지문인식
트랙패드 무선충전
연속성(에어드롭 등)
알려진 문제점
화면 덮기로 잠자기 후 덮개가 열렸을 때 자동으로 깨어나지 않음
ㄴ 전원키 5초 이상 누르면 (재부팅없이)정상적으로 깨어납니다.
썬더볼트3 작동 안 함
ㄴ 썬더볼트 허브를 구매하게 되면 고쳐보겠습니다..
HDMI 오디오 출력 확인 안 함
ㄴ 세팅하는 게 귀찮아서쓸 일이 없어서 생략했습니다.
배터리 잔량이 미세하게 다르게 표시됨
ㄴ (실제 85%)->90%로 표시되는 정도입니다. 크게 불편하진 않아서 그냥 두었습니다.
또 뭐 하나 있었는데 그건 생각나면 적겠습니다
ㄴ 청년 치매가 심각합니다..
스크린샷
인텔 AX201은 실제로 AC9462로 잡힙니다. 동작에는 이상 없습니다.
AX201+AirportItlwm 조합 인터넷 속도입니다.
다른 분들은 이거보다 잘 나오던데 왜그런지는 모르겠습니다.(같은 공유기&윈도우에서는 300메가 이상 잡힘)
스피드스텝 및 XCPM활성화 확인 스샷입니다.
트랙패드 아주 스무스하게 작동하고 제스쳐같은 거 잘 됩니다.
안정화 과정
안정화 과정에 사용된 SSDT 목록입니다.
순서 | SSDT 이름 | ACPI Rename 여부 | 기능 | 안정화 목차 |
1 | SSDT-ALS0 | X | Fake Ambient Light Sensor 인젝션 | 12 |
2 | SSDT-AWAC | X | AWAC Device 비활성화 | 1 |
3 | SSDT-BATT | O | 배터리 잔량 표시 | 2 |
4 | SSDT-EC-USBX | X | Fake EC, USBX Device 인젝션 | 1 |
5 | SSDT-FNBL | O | 밝기 조절 Fn키 리매핑 | 3 |
6 | SSDT-GPI0 | X | GPI0 Device 활성화 | 1 |
7 | SSDT-GPRW | O | GPRW Method Override | 9 |
8 | SSDT-HPET | O | IRQ 충돌 Fix | 10 |
9 | SSDT-LIDP | X | LIDP Device 인젝션 (with ACPIPoller Kext) | 9 |
10 | SSDT-OSYS | X | OSYS Method 윈도우10 인식 | 11 |
11 | SSDT-PLUG | X | XCPM 활성화 | 1 |
12 | SSDT-PNLF-CFL | X | PNLF Device 인젝션 | 1 |
13 | SSDT-SBUS-MCHC | X | SMBus Fix | 1 |
14 | SSDT-dGPU-Off | X | dGPU(MX250) 비활성화 | 1 |
15 | ssdt-rmne | X | RMNE Device 인젝션 (with NullEthernet Kext) | 13 |
제가 진행한 안정화 과정은 다음과 같습니다.
안정화 목차
1. 기본적인 거 config.plist 생성, SSDT-PLUG, SSDT-EC-USBX 등등...
2. 배터리 잔량 표시 fix
3. Fn 단축키 fix
4. ALC298 내장 사운드 fix
5. QE/CI 활성화 및 HDMI 포트 fix
6. 인텔 무선랜(AX201) 활성화&Apple secure boot 설정
7. VoodooInput.kext 업데이트 (빅서 관련)
8. USBPorts.kext 제거
9. lid, 잠자기 관련 fix
10. HPET, IRQ fix
11. Darwin OS check fix
12. Fake ALS0 인젝션
13. RNME Device 인젝션
지난 빌드에서 배터리 잔량 패치와 fn 단축키 패치를 dsdt static patch 로 적용하는 바람에
다른 파생 모델(본인은 i5 15인치 외장그래픽 버전)에서 적용할 때 acpi error가 난다는 분들이 계셨습니다.
따라서 이번 빌드에서는 dsdt를 완전히 제거하고 모든 패치를 ssdt와 핫패치를 이용하여 안정화를 진행했습니다.
1. 기본적인 거 config.plist 생성, SSDT-PLUG, SSDT-EC-USBX 등등...
기본적인 config.plist 생성과 코멧레이크 공통 acpi 패치는 오픈코어 바닐라 가이드를 따라 진행했습니다.
https://dortania.github.io/OpenCore-Install-Guide/
2. 배터리 잔량 표시 fix SSDT-BATT
배터리 잔량 표시는 tonymac쪽 강좌를 참고하여 DSDT static pacth를 만들었고
https://www.tonymacx86.com/threads/guide-how-to-patch-dsdt-for-working-battery-status.116102/
패치한 dsdt를 가지고 뽀로로님의 강좌를 참고하여 hotpatch를 제작하였습니다.
기타 ACPI 문법 관련해서는 ACPI 스펙 문서를 참고하였습니다.
https://www.uefi.org/sites/default/files/resources/ACPI_6_0_Errata_A.PDF
배터리 잔량 fix는 맥os에서 인식하지 못하는 16비트 이상의 레지스터를 8비트로 쪼개주어 인식시켜주는 방식으로 진행됩니다.
이온에서 수정해야 하는 레지스터는 다음 6개입니다.
BTPC, 16
B1RR, 32
B1PV, 32
B1AF, 32
B1VL, 32
CYLC, 16
해당 레지스터들은 SB.PCI0.LPCB.H_EC의 ECR 필드에 선언되어 있습니다.
Scope (_SB.PCI0.LPCB.H_EC) { OperationRegion (ECR, EmbeddedControl, Zero, 0xFF) Field (ECR, ByteAcc, Lock, Preserve) { Offset (0x10), VERS, 16, Offset (0x14), CCI0, 8, CCI1, 8, CCI2, 8, CCI3, 8, ...
Offset (0x90),
SWST, 8, BTPC, 16, LUXH, 8, LUXL, 8, Offset (0x96), LRNG, 8, Offset (0x9A), VRMF, 8, ...
이것을 ssdt로 가져오기 위해 먼저 필요없는 레지스터를 제거주는 것이 좋습니다.
각 레지스터의 크기는 bit 단위로 선언되고
Offset 은 byte 단위로 레지스터의 위치를 지정하는 책갈피 역할을 합니다.
예를 들어 위 코드 블럭에서 BTPC만 남기고 그 앞에 나머지를 제거하려면
먼저 가장 가까운 Offset(여기선 0x90)을 찾고 그 Offset 위에 선언된 부분을 모두 제거합니다.
그 다음 Offset과 BTPC사이에 있는 레지스터를 지워야 하는데
그 레지스터(SWST)의 크기가 8비트이므로
SWST를 제거한 뒤 Offset에 1을 더하면 됩니다.(1byte=8bit)
그리고 macOS에서 사용되는 레지스터의 크기는 모두 8비트여야 하므로 BTPC,16, 을 TPC0,8,TPC1,8, 로 바꿔줍니다.(이름은 자유)
위 과정을 거치면 다음과 같은 형태가 됩니다.
Scope (_SB.PCI0.LPCB.H_EC)
{
OperationRegion (ECR, EmbeddedControl, Zero, 0xFF)
Field (ECR, ByteAcc, Lock, Preserve)
{
Offset (0x91),
TPC0, 8, TPC1, 8,
...
위 과정을 나머지 레지스터에도 진행하여 6개의 레지스터만 남기고 ssdt에 정리해줍니다.
DefinitionBlock ("", "SSDT", 2, "WEI756", "BATT", 0x00001000) { External (_SB_.PCI0.LPCB.H_EC, DeviceObj) Scope (\_SB.PCI0.LPCB.H_EC) { If (_OSI ("Darwin")) { OperationRegion (XCR, EmbeddedControl, Zero, 0xFF) Field (XCR, ByteAcc, Lock, Preserve) { Offset (0x91), TPC0,8,TPC1,8, Offset (0xA0), BRR0,8,BRR1,8,BRR2,8,BRR3,8, BPV0,8,BPV1,8,BPV2,8,BPV3,8, Offset (0xB0), BAF0,8,BAF1,8,BAF2,8,BAF3,8, BVL0,8,BVL1,8,BVL2,8,BVL3,8, Offset (0xD0), YLC0,8,YLC1,8 } } } }
DSDT에 이미 ECR이란 이름의 필드가 있으므로 XCR로 변경했고,
맥에서만 활성화되도록 if _OSI 문을 추가했습니다.
레지스터 선언을 했으면 바뀐 레지스터에 맞춰 해당 레지스터가 사용되는 부분을 수정해야 합니다.
레지스터를 읽는 것은 B1B2, B1B4 메소드를 이용해 치환만 해주면 됩니다.
B1B2, B1B4 메소드는 각각 2, 4개로 쪼개진 값을 하나로 합친 뒤 반환하는 메소드입니다.
먼저 두 메소드를 SSDT에 선언합니다.
Method (B1B2, 2, NotSerialized) { Return(Or(Arg0, ShiftLeft(Arg1, 8))) } Method (B1B4, 4, NotSerialized) { Store(Arg3, Local0) Or(Arg2, ShiftLeft(Local0, 8), Local0) Or(Arg1, ShiftLeft(Local0, 8), Local0) Or(Arg0, ShiftLeft(Local0, 8), Local0) Return(Local0) }
SB.PCI0.LPCB.H_EC.BAT1의 SBIX 메소드를 예로 들겠습니다.
SBIX 메소드에서는 B1AF, B1VL, CYLC가 다음과 같이 쓰입니다.
Scope (_SB.PCI0.LPCB.H_EC)
{
Device (BAT1)
{
...
Method (SBIX, 0, Serialized)
{
If ((ECON == Zero)) {
...
}
Else
{
Local3 = B1AF /* \_SB_.PCI0.LPCB.H_EC.B1AF */
Local4 = B1VL /* \_SB_.PCI0.LPCB.H_EC.B1VL */
...
Local0 = CYLC /* \_SB_.PCI0.LPCB.H_EC.CYLC */
...
}
Return (BIFP) /* \_SB_.PCI0.LPCB.H_EC.BAT1.BIFP */
}
....
}
}
B1Bn 메소드를 이용하여 다음과 같이 치환해줍니다.
Local3 = B1B4(BAF0,BAF1,BAF2,BAF3) /* \_SB_.PCI0.LPCB.H_EC.B1AF */ Local4 = B1B4(BVL0,BVL1,BVL2,BVL3) /* \_SB_.PCI0.LPCB.H_EC.B1VL */ Local0 = B1B2(YLC0,YLC1) /* \_SB_.PCI0.LPCB.H_EC.CYLC */
수정한 메소드를 SSDT에 넣을 때 if _OSI 문을 사용해 맥으로 부팅될 때만 실행되도록 합니다.
그리고 해당 메소드에 사용된 다른 변수나 메소드(ECON, GSSW 등)들은 External로 import하고 절대 주소로 바꿔주어서 컴파일할 때 에러가 안 나도록 합니다.
위 과정을 모두 거쳤다면 아래와 같은 결과물이 나옵니다.
Scope(BAT1) { Method (SBIX, 0, Serialized) { If (_OSI ("Darwin")) { If ((\ECON == Zero)) { Local0 = Zero Local0 = \GSSW (0x82, 0xB0) If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [One] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x02] = 0xFFFFFFFF } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [One] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x02] = Local0 } Local0 = Zero Local0 = \GSSW (0x82, 0xB2) If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x02] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x03] = 0xFFFFFFFF } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x02] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x03] = Local0 } Local0 = Zero Local0 = \GSSW (0x82, 0xB4) If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x04] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x05] = 0xFFFFFFFF } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x04] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x05] = Local0 } Local0 = Zero Local0 = \GSSW (0x82, 0xB6) If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x05] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x06] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x06] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x07] = Zero } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x05] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x06] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x06] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x07] = Local0 } If ((\RELT == 0xBA)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x05] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x06] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x06] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x07] = Zero } Local0 = Zero Local0 = \GSSW (0x82, 0xD0) If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x08] = Zero } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x08] = Local0 } } Else { Local3 = B1B4(BAF0,BAF1,BAF2,BAF3) /* \_SB_.PCI0.LPCB.H_EC.B1AF */ Local4 = B1B4(BVL0,BVL1,BVL2,BVL3) /* \_SB_.PCI0.LPCB.H_EC.B1VL */ Local0 = Local3 Local0 &= 0xFFFF Local1 = (Local0 << 0x08) Local1 &= 0xFF00 Local0 >>= 0x08 Local0 |= Local1 If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [One] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x02] = 0xFFFFFFFF } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [One] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x02] = Local0 } Local0 = Local3 Local0 >>= 0x10 Local0 &= 0xFFFF Local1 = (Local0 << 0x08) Local1 &= 0xFF00 Local0 >>= 0x08 Local0 |= Local1 If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x02] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x03] = 0xFFFFFFFF } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x02] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x03] = Local0 } Local0 = Local4 Local0 &= 0xFFFF Local1 = (Local0 << 0x08) Local1 &= 0xFF00 Local0 >>= 0x08 Local0 |= Local1 If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x04] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x05] = 0xFFFFFFFF } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x04] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x05] = Local0 } Local0 = Local4 Local0 >>= 0x10 Local0 &= 0xFFFF Local1 = (Local0 << 0x08) Local1 &= 0xFF00 Local0 >>= 0x08 Local0 |= Local1 If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x05] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x06] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x06] = 0xFFFFFFFF \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x07] = 0xFFFFFFFF } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x05] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x06] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x06] = Local0 \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x07] = Local0 } If ((\RELT == 0xBA)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x05] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x06] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIFP [0x06] = Zero \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x07] = Zero } Local0 = B1B2(YLC0,YLC1) /* \_SB_.PCI0.LPCB.H_EC.CYLC */ Local0 &= 0xFFFF Local1 = (Local0 << 0x08) Local1 &= 0xFF00 Local0 >>= 0x08 Local0 |= Local1 If ((Local0 == 0xFFFF)) { \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x08] = Zero } Else { \_SB.PCI0.LPCB.H_EC.BAT1.BIXP [0x08] = Local0 } } Return (\_SB.PCI0.LPCB.H_EC.BAT1.BIFP) /* \_SB_.PCI0.LPCB.H_EC.BAT1.BIFP */ } Else { Return (\_SB.PCI0.LPCB.H_EC.BAT1.XBIX ()) } } ...
레지스터에 쓰는 경우에는 하나의 입력값을 비트시프트 연산을 이용해 쪼개진 레지스터에 나누어야 합니다.
이온에서 레지스터에 쓰는 경우는 BTPC 하나입니다.
Scope (\_SB.PCI0.LPCB.H_EC) { Scope(BAT1) { Method (_BTP, 1, Serialized) // _BTP: Battery Trip Point { If (_OSI ("Darwin")) { Local0 = Arg0 If ((\ECON == Zero)) { Local0 <<= 0x08 Local0 &= 0x00FFFF00 Local0 |= 0x91 \GSSW (0x84, Local0) } Else { Local0 &= 0xFFFF Local1 = (Local0 << 0x08) Local1 &= 0xFF00 Local0 >>= 0x08 Local0 |= Local1 // BTPC = Local0 TPC1 = (Local0 >> 0x08) TPC0 = Local0 & 0xFF } } Else { \_SB.PCI0.LPCB.H_EC.BAT1._XTP(Arg0) } }
TPC1에 Local0의 앞 8비트를 TPC0에 Local0의 뒤 8비트를 저장하도록 수정하였습니다.
아래는 모든 작업이 끝나 적용된 SSDT입니다.
https://github.com/wei756/NT950XCR-G58A-Hackintosh/blob/master/DSDT%26SSDT/SSDT-BATT.dsl
마지막으로 SSDT에 추가된 메소드들이 충돌이 일어나지 않도록 오픈코어 config에서 Rename 패치를 해줍니다.
<dict> <key>Comment</key> <string>Rename method _Q66 to _X66</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>X1E2Ng==</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>X1g2Ng==</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict> <dict> <key>Comment</key> <string>Rename method SBIX to XBIX</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>U0JJWAg=</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>WEJJWAg=</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict> <dict> <key>Comment</key> <string>Rename method _BTP to _XTP</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>X0JUUA==</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>X1hUUA==</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict> <dict> <key>Comment</key> <string>Rename method _BST to _XST</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>X0JTVA==</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>X1hTVA==</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict> <dict> <key>Comment</key> <string>Rename method QPTS to XPTS</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>UVBUUwE=</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>WFBUUwE=</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict> <dict> <key>Comment</key> <string>Rename method QWAK to XWAK</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>UVdBSwE=</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>WFdBSwE=</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict>
3. Fn 단축키 fix SSDT-FNBL
Fn 단축키 fix는 insanelymac 강좌를 참고하여 static pacth 적용 후 핫패치로 만들었습니다.
https://www.insanelymac.com/forum/topic/305030-guide-how-to-fix-brightness-hotkeys-in-dsdt/
이온의 밝기 다운/업 쿼리는 _Q63, _Q64이고 키보드 장치 이름은 PS2K입니다.
해당 정보를 가지고 hotpatch를 만들어 줍니다.
DefinitionBlock ("", "SSDT", 2, "WEI756", "FNKEYFIX", 0x00001000) { External (_SB_.PCI0.LPCB.H_EC, DeviceObj) External (_SB_.PCI0.LPCB.PS2K, DeviceObj) External (_SB_.PCI0.LPCB.H_EC._X63, MethodObj) External (_SB_.PCI0.LPCB.H_EC._X64, MethodObj) Scope (\_SB.PCI0.LPCB.H_EC) { Method (_Q63, 0, Serialized) // _Qxx: EC Query, xx=0x00-0xFF { If (_OSI ("Darwin")) { Notify (\_SB.PCI0.LPCB.PS2K, 0x0205) Notify (\_SB.PCI0.LPCB.PS2K, 0x0285) } Else { _X63() } } Method (_Q64, 0, Serialized) // _Qxx: EC Query, xx=0x00-0xFF { If (_OSI ("Darwin")) { Notify (\_SB.PCI0.LPCB.PS2K, 0x0206) Notify (\_SB.PCI0.LPCB.PS2K, 0x0286) } Else { _X64() } } } }
<dict> <key>Comment</key> <string>Rename method _Q63 to _X63</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>X1E2Mw==</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>X1g2Mw==</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict> <dict> <key>Comment</key> <string>Rename method _Q64 to _X64</string> <key>Count</key> <integer>0</integer> <key>Enabled</key> <true/> <key>Find</key> <data>X1E2NA==</data> <key>Limit</key> <integer>0</integer> <key>Mask</key> <data></data> <key>OemTableId</key> <data></data> <key>Replace</key> <data>X1g2NA==</data> <key>ReplaceMask</key> <data></data> <key>Skip</key> <integer>0</integer> <key>TableLength</key> <integer>0</integer> <key>TableSignature</key> <data></data> </dict>
4. ALC298 내장 사운드 fix
alc298이 들어간 삼성제 랩탑은 자체 앰프를 사용하기 때문에 AppleALC를 이용해 레이아웃을 적용해도 사운드가 작동하지 않았습니다.
이는 다른 비 윈도우 os에서도 마찬가지로 나타나는 문제였는데 최근 우분투 버그 리포트에서 hda-verb를 이용한 해결법이 나왔습니다.
관련 리포트 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1851518
위 리포트의 John hoff님이 제작한 스크립트를 변형하면 맥os에서도 적용이 됩니다.
먼저 AppleALC로 레이아웃을 잡아줍니다. (alcid=16)
그 다음 아래 링크에서 hda-verb를 받고 위 리포트의 #90에 첨부된 TO912.sh를 다운받습니다.
https://bitbucket.org/RehabMan/os-x-eapd-codec-commander/downloads/
다운받은 스크립트를 열어보면 아래와 같습니다.
#!/bin/bash sudo hda-verb /dev/snd/hwC0D0 0x1a SET_PIN_WIDGET_CONTROL 0x5 sudo hda-verb /dev/snd/hwC0D0 0x20 0x500 0x2b sudo hda-verb /dev/snd/hwC0D0 0x20 0xc00 0x0 sudo hda-verb /dev/snd/hwC0D0 0x20 0x500 0x2b sudo hda-verb /dev/snd/hwC0D0 0x20 0x40c 0x10 sudo hda-verb /dev/snd/hwC0D0 0x20 0x500 0x3 sudo hda-verb /dev/snd/hwC0D0 0x20 0x400 0x42 ...
여기서 맥에 맞게 수정해주어야 하는데 각 라인에서 /dev/snd/hwC0D0을 모두 지워줍니다.
이제 hda-verb와 스크립트를 같은 위치에 두고 스크립트를 실행하면 이어폰 잭과 스피커에서 소리가 나기 시작합니다.
그 다음에 오디오 MIDI 설정 앱을 열어 내장 출력의 샘플레이트를 48.0kHz로 설정해주면 스피커에서 금속성 노이즈가 사라집니다.
해당 스크립트는 재부팅/잠자기에서 깨어난 후 적용이 풀리므로 automator등을 이용해 자동화하는 것을 추천합니다.
아래 림크에서 스크립트를 automator로 자동화한 파일을 받을 수 있습니다.
https://github.com/wei756/NT950XCR-G58A-Hackintosh/tree/master/Audio%20patch
5. QE/CI 활성화 및 HDMI 포트 fix
엉뚱한 데서 헤매서 고생을 좀 했는데 SMBIOS 설정하고 버스 id 수정하니까 잘 됩니다.
아래 레딧 스레드를 참고하여 커넥터 패치하였습니다.
SMBios는 MacBookPro15,2, 프레임버퍼는 3E9B0000 이용하여 QE/CI 및 HDMI 포트 활성화 했습니다.
인덱스 2번은 c타입 to hdmi로 추정되는데 제가 썬더볼트 허브가 없어서 이 부분은 일부러 비활성화 시켰습니다^^;;
config.plist->DeviceProperties->PciRoot(0x0)/Pci(0x2,0x0)->framebuffer-con2-alldata 에서 4번째 숫자가 버스 id인데 c타입 허브가 있는 분들은 직접 테스트해보면서 활성화하시기 바랍니다:)
6. 인텔 와이파이(AX201) 활성화&Apple secure boot 설정
존버 끝에 인텔 무선랜 드라이버가 나왔습니다. (zxystd 만세!)
https://github.com/OpenIntelWireless/itlwm
두 가지 방법이 있는데 하나는 itlwm + Heliport 앱을 사용하는 것, 나머지는 AirportItlwm을 사용하는 것입니다.
전자는 os버전의 영향도 받지 않고 apple secure boot가 비활성화되어 있는 상태에서도 잘 작동하지만
써드파티 앱(HeliPort)을 이용해 네트워크 검색을 해야한다는 단점이 있습니다.
후자의 경우 기본 ui를 통해 무선랜 사용이 가능해서 좀 더 네이티브스럽다는 장점이 있지만 os 버전마다 다른 kext를 적용해야 하고 apple secure boot를 활성화해야 작동한다는 단점이 있습니다.
저는 좀 더 네이티브한 게 좋아서 후자를 선택했고 따라서 본 빌드에는 카탈리나용 AirportItlwm이 첨부되어 있습니다.
(빅서로 가실 분들은 kext 교체가 필요합니다.)
(Heliport를 사용하실 분들을 위해 efi에 itlwm도 첨부해놓았습니다. 이 경우 아래 내용은 생략해도 됩니다.)
AirportItlwm을 사용하기 위해서는 IO80211Family가 로드되어 있어야 하는데 이게 apple secure boot가 활성화되어있는 상태에서만 불러와집니다.
Kernel->Force로 강제로 활성화할 수 있다는데 저는 잘 안 돼서 그냥 secure boot 를 활성화시키기로 했습니다.
secure boot 관련해서 오픈코어 가이드에도 설명이 되어있으니 참고하시기 바랍니다.
https://dortania.github.io/OpenCore-Post-Install/universal/security/applesecureboot.html
Apple secure boot 를 활성화하기 위해서 오픈코어에서 다음과 같이 설정해야 합니다.
- Misc->Security->DmgLoading를 Signed 또는 Disabled로 설정할 것(Signed 추천)
- Misc->Security->SecureBootModel이 Disabled가 아닐 것
그런데 문제는 저렇게 설정한다고 바로 부팅이 되는 것이 아닙니다.
제 경우에는 이렇게 진행하였습니다.
클린 설치를 하는 경우입니다.
1. 일단 secure boot를 비활성화한 상태로 설치를 시작합니다.
2. 설치과정 중 한 번 재부팅이 되고 두 번 재부팅이 될 때, 그러니까 애플 로고에서 x분 남음..뜨는 게 지나가고 재부팅되는 시점에 그대로 종료
3. 다른 컴을 이용하여 secure boot를 활성화하고 '복구 모드'로 부팅
4. 복구 모드에서 인터넷에 연결한 뒤 터미널 열고 'bless bless --folder "/Volumes/설치한 디스크 이름/System/Library/CoreServices" --bootefi --personalize' 입력
5. personalize되었다는 표시 확인 후 재부팅
6. 나머지 설치 과정 진행
7. 설치 완료
이렇게 진행하면 설치 과정에서 인터넷 연결도 가능하고 부팅 실패도 일어나지 않습니다.
만약 귀찮다면 2번을 생략하고 설치가 완전히 끝난 뒤 3-5번 진행하면 됩니다.
클린설치를 하지 않고 efi만 교체하는 경우에는 3-5번만 진행하면 됩니다.
7. VoodooInput.kext 업데이트 (빅서 관련)
VoodooPS2나 VoodooI2C에 포함된 VoodooInput이 업데이트가 안 되어있는 건지 그대로 넣고 부팅하면 에러가 납니다.
따라서 최신 버전의 VoodooInput을 받아 추가하였습니다.
8. USBPorts.kext 제거
일부러 제거한 거라 취소선 쳤습니다.
USB 포트가 15개 넘게 잡히는 것도 아니고 내장 포트들 internal로 잘 잡히고 패치 적용하면 오히려 포트가 증식(?)하는 문제가 생겨 제거하였습니다.
한마디로 필요가 없어서 패치를 안 했다 이 말인데 혹시 이게 맞는 건가 싶어서 적어 둡니다.(훈수환영!!)
9. lid, 잠자기 관련 fix ACPIPoller.kext with SSDT-LIDP, GPRW hotpatch, EnableLidOpen.kext
화면을 덮으면 바로 잠자기에서 깨버리는 문제 때문에 적용하였습니다.
lidp는 굳이 dsdt로 추가하지 않고 SSDT로 변환하여 적용하였습니다.
DefinitionBlock ("", "SSDT", 2, "RebMan", "LIDP", 0x00001000) { External (_SB_.LID0, DeviceObj) External (_SB_.LID0._LID, MethodObj) If (_OSI ("Darwin")) { Device (LIDP) { Name (_HID, "FAN00000") Name (PLID, 0xFFFF) // Poll for _LID status changes, notify if different Method (FCPU, 0, Serialized) { Store(\_SB.LID0._LID(), Local0) if (LNotEqual(Local0, PLID)) { Store(Local0, PLID) Notify(\_SB.LID0, 0x80) } } } } }
그리고 해당 링크를 참고하여 GPRW to XPRW 패치를 적용하였습니다.
https://dortania.github.io/OpenCore-Post-Install/usb/misc/instant-wake.html
가끔 잠자기 후 깨어날 때 화면이 나가는 경우가 있어서 EnableLidWake kext도 적용하였습니다.
https://github.com/syscl/EnableLidWake
10. HPET, IRQ fix
최신 기기에서 필수는 아니지만 IRQ 충돌로 AppleALC 활성화에 문제를 일으키는 경우가 있다고 합니다.
특히 이전에 해당 기기에서 AppleALC 사용시 소리만 안 나오는 게 아니라 재생도 안 되던 문제가 발생했었기 때문에 적용하였습니다.
아래 가이드를 참고하여 SSDTime을 이용해 패치를 생성했습니다.
https://dortania.github.io/Getting-Started-With-ACPI/ssdt-methods/ssdt-easy.html
11. Darwin OS 확인 fix
맥os로 부팅시 ACPI 로딩할 때 윈도우10으로 인식시켜주는 패치입니다.
OSYS 변수 SB.PCI0._INI 메소드에 의해 다음과 갇이 정의됩니다.
Scope (_SB.PCI0) { Method (_INI, 0, Serialized) // _INI: Initialize { TBPE = One OSYS = 0x03E8 If (CondRefOf (\_OSI, Local0)) { If (_OSI ("Windows 2001")) { OSYS = 0x07D1 } If (_OSI ("Windows 2001 SP1")) { OSYS = 0x07D1 } If (_OSI ("Windows 2001 SP2")) { OSYS = 0x07D2 } If (_OSI ("Windows 2001.1")) { OSYS = 0x07D3 } If (_OSI ("Windows 2006")) { OSYS = 0x07D6 } If (_OSI ("Windows 2009")) { OSYS = 0x07D9 } If (_OSI ("Windows 2012")) { OSYS = 0x07DC } If (_OSI ("Windows 2013")) { OSYS = 0x07DD } If (_OSI ("Windows 2015")) { OSYS = 0x07DF } If (_OSI ("Windows 2016")) { OSYS = 0x07E0 } If (_OSI ("Windows 2017")) { OSYS = 0x07E1 } } ... } }
여기서 OSYS가 윈도우10(Windows 2017)에 해당하는 0x07E1로 설정되도록 SSDT를 작성해주었습니다.
DefinitionBlock("", "SSDT", 2, "ACDT", "OSYS", 0x00000000) { External (OSYS, FieldUnitObj) Scope (_SB) { Device (PCI1) { Name (_ADR, Zero) Method (_STA, 0, NotSerialized) { If (_OSI ("Darwin")) { Return (0x0F) } Else { Return (Zero) } } Method (_INI, 0, NotSerialized) { If (CondRefOf (\OSYS)) { OSYS = 0x07E1 } } } } }
12. ALS0 Device 인젝션
macOs 10.15 버전부터 Ambient Light Sensor가 존재해야 백라이트 컨트롤이 가능하다고 합니다.
이온은 해당 패치가 없어도 화면 밝기 조절이 가능하지만 혹시 몰라 포함시켰습니다.
DSDT 내에 ACPI0008을 가지는 Device가 존재하지 않으므로 오픈코어에서 제공하는 샘플 ssdt를 그대로 사용하였습니다.
성공 축하드립니다. 저는 데스크탑 컴퓨터도 다른분이 올려주신 efi 파일 넣어서 쓰는 왕초보입니다.
노트북 성공은 정말 고난이도 라고 하는데 정말 멋지십니다.
오옷 배터리 패치 잘 따라해보겠습니다!!
이제 충전기 안꼽아놓고 배터리 얼마남았는지 모를 일은 없어졌네요ㅎㅎ
같은 기종 같은 EFI 썼는데 왜 자꾸 갑자기 꺼지는 오류가 발생할까요 ㅠㅠ 즐기고 있는 와중에 10분도 안되서 꺼져버려요
1일 동안 고셍했군요. 카찰리나는 잘 설치되는데 빅서 설치 할때 너무 삽질을 했네요 기본 ssd 로 하니 멈추고 다른 m.2 sata ssd로 하니 설치자체는 되었는데 애플로고에서 안넘어가네요 하지만 저는 1일 정도 삽질을 하여서 부팅 잘됩니다. ) 제가 어떻게 했냐면 config 열고 mic-보안-secureBootModel 에서 default 놓으니 부팅은 되었는데 와이파이가 안되서 본 글을 잘읽으니 keat파일 넣으니 와이파이 잘됩니다. ^^
동일한 기종에 WD SN520 256기가와 메모리만 8기가 추가한 상태입니다. OpenCore Guide를 보면서 올려주신 EFI로 교체하여 설치를 진행하는 중 3분 남았을 때 종료가 되면서 In Memory Panic Stackshot Succeeded 오류가 발생하면서 노트북이 멈춰버리네요. 강제로 종료 후 다시 켜면 설치가 계속 되지만 부팅 후에도 시스템이 작동을 멈춰버려 실사가 안되는데 혹시 해결방법 아실까요? AppleMCEReporterDisabler.kext 를 넣어서 해결한다는 방법도 있는 것 같은데 우선 같은 기종인데 정상 작동하시는 분께 여쭤보고 싶습니다.
PM981 모델 과 WD 모델를 같이 부팅시키면 해당증상이 나타날수 있습나더. PM981를 빼고 해보세요.
(참고로 빅서 작업 하실때 인터넷과 시큐리티 부트 를 손 보셔야 할것 입니다)
"님의 댓글"
이 댓글을 신고 하시겠습니까?
제목 | 조회 수 | 날짜 | 글쓴이 |
---|---|---|---|
macOS Sequoia 15.0.1 24A348 정식버젼 고스트 이미지 OC 1.0.2 ft: 전체공개 +28 | 833 | 24.10.1121:10 | 좌절금지 |
오픈코어 1.0.2 +22 | 547 | 24.10.0900:22 | 줌바이퍼 |
[중급편] 노트북 해킨 +16 | 1365 | 24.07.1219:19 | Stultus |
macOS Ventura 13.7 22H123 정식버젼 고스트 이미지 OC 1.0.1 ft: 전체 공개 +17 | 560 | 24.09.1917:09 | 좌절금지 |
macOS Sonoma 14.7 23H124 정식버젼 고스트 이미지 OC 1.0.1 ft: 전체공개 +31 | 890 | 24.09.1723:58 | 좌절금지 |
[초급편] 문제 스스로 해결하기 +20 | 3975 | 24.03.2920:07 | Stultus |
[입문편] 첫 해킨 길라잡이 +40 | 5035 | 24.01.1218:54 | Stultus |
[필독 - 안정화] macOS 해킨토시 설치 후 안정화 작업 목록 및 글타래 모음 총정리 📋 +67 | 5.1만 | 23.01.0913:39 | shl628 |
Hot AMD Sequoia용 AppleALC 1.9.2 +3 | 42 | 24.10.2319:04 | 사노라맨 |
Hot [Sequoia 15.0.1, OC r1.0.2] ASUS TUF B550-PLUS / RYZEN 5 5600X / RX470 +2 | 20 | 24.10.2322:26 | 뿌엥 |
Hot OCLP로 지원되지 않는 기기/dGPU를 사용하는 해킨토시의 사이드카 품질 문제 해결방법 +1 | 27 | 24.10.2321:29 | 해킨도전자 |
20 | 24.10.2322:26 | 뿌엥 | |
27 | 24.10.2321:29 | 해킨도전자 | |
42 | 24.10.2319:04 | 사노라맨 | |
467 | 24.10.1412:27 | shl628 | |
600 | 24.10.1316:00 | 수박 | |
325 | 24.10.1222:56 | Stultus | |
833 | 24.10.1121:10 | 좌절금지 | |
409 | 24.10.1115:53 | 수박 | |
547 | 24.10.0900:22 | 줌바이퍼 | |
1365 | 24.07.1219:19 | Stultus | |
1179 | 24.10.0500:31 | 줌바이퍼 | |
564 | 24.10.0410:49 | Tamy | |
734 | 24.09.2923:48 | 머트 | |
623 | 24.09.2822:28 | 머트 | |
448 | 24.09.2808:22 | Tamy | |
879 | 24.09.2321:32 | Stultus | |
990 | 24.09.2210:59 | 좌절금지 | |
627 | 24.09.2203:23 | 누림어멈 | |
1166 | 24.09.1919:17 | 좌절금지 | |
560 | 24.09.1917:09 | 좌절금지 | |
496 | 24.09.1813:37 | Stultus | |
890 | 24.09.1723:58 | 좌절금지 | |
592 | 24.09.1722:40 | 좌절금지 | |
450 | 24.09.1717:13 | 맥가즈아 | |
558 | 24.09.1708:13 | 김경석 | |
226 | 24.09.1617:47 | Panictosh | |
760 | 24.09.1504:35 | Tamy | |
580 | 24.09.1319:18 | Stultus | |
695 | 24.09.1019:44 | 치토 | |
482 | 24.09.0118:13 | 머핀X | |
451 | 24.09.0112:54 | 해킨도전자 | |
537 | 24.08.3115:34 | 머핀X | |
300 | 24.08.2601:42 | 화정큐삼 | |
300 | 24.08.2422:59 | 하나브 | |
316 | 24.08.2316:25 | 화정큐삼 | |
411 | 24.08.1810:56 | CanBe | |
358 | 24.08.1800:04 | 화정큐삼 | |
297 | 24.08.1722:03 | 화정큐삼 | |
197 | 24.08.1710:14 | jbhlyk | |
309 | 24.08.1622:06 | Stultus | |
214 | 24.08.1511:16 | hackillious | |
164 | 24.08.1421:30 | 세유니 | |
416 | 24.08.1419:58 | Stultus | |
375 | 24.08.1311:26 | 오디세이 | |
263 | 24.08.1115:46 | 좌절금지 | |
184 | 24.08.1111:21 | 티타보르 | |
231 | 24.08.1022:46 | Stultus | |
525 | 24.08.1022:10 | 오디세이 | |
166 | 24.08.1019:05 | jbhlyk | |
193 | 24.08.0923:20 | RogerT | |
336 | 24.08.0717:18 | 좌절금지 | |
129 | 24.08.0609:17 | RogerT | |
568 | 24.08.0606:14 | 줌바이퍼 | |
86 | 24.08.0523:34 | jbhlyk | |
262 | 24.08.0521:10 | 수인과윤슈 | |
880 | 24.08.0521:08 | 좌절금지 | |
603 | 24.08.0221:07 | Stultus | |
389 | 24.07.3019:12 | Tamy | |
340 | 24.07.2915:37 | 해킨도전자 | |
272 | 24.07.2813:52 | june119 | |
301 | 24.07.2112:43 | Stultus | |
4030 | 23.05.0502:19 | BlueGuerrilla | |
3727 | 21.08.0213:10 | 김태국 | |
275 | 24.07.1122:47 | Stultus | |
211 | 24.07.1020:44 | Stultus | |
250 | 24.07.0921:44 | Stultus | |
371 | 24.07.0820:57 | Stultus | |
198 | 24.07.0811:28 | 의정이 | |
381 | 24.07.0721:25 | Stultus | |
357 | 24.07.0604:41 | bsiugr | |
645 | 24.07.0509:56 | 애플브리크 | |
2435 | 24.02.1715:21 | 광호 | |
470 | 24.06.2723:24 | 치토 | |
239 | 24.06.2617:24 | talas | |
155 | 24.06.2120:58 | 블루사탕 | |
551 | 24.06.1609:01 | gtrfxdsp | |
387 | 24.06.1401:04 | Mactopia | |
849 | 24.06.1120:40 | Stultus | |
762 | 24.06.1115:07 | 새콤칠리 | |
118만 | 23.02.2118:35 | 좌절금지 |
임시작성글 걸어놨는데 이게 왜 올라왔죠?..
한창 작성중인데 추천알림떠서 깜짝 놀랐네유..