질문 [해결 완료] 노트북 안정화 - 내장 그래픽 가속 시 글리치(Glitch) 발생 및 기타
- Stultus
- 3106
- 63
Stultus님의 기기정보
질문용 시스템 사양 | 2번 |
---|---|
추가사양 및 설치(할)OS | Monterey 12.7.1, OpenCore 0.9.7 |
공지숙지/증상설명 | 숙지 |
안녕하세요.
macOS 설치 중 제목과 같은 현상이 발생하여 문의 드립니다.
'-igfxvesa' 옵션 부여 시 화면에 정상적으로 출력이 되나, 해당 옵션을 지우고 내장 그래픽 가속을 하면 사진과 같이 글리치가 발생합니다.
글리치 관련으로 검색해봐도 도움되는 내용을 찾지 못했고, Azul Framebuffer List의 다른 프레임버퍼로 변경을 해도 상황은 마찬가지입니다.
WhateverGreen/Manual/FAQ.IntelHD.en.md at master · acidanthera/WhateverGreen · GitHub
바이오스에선 설정을 변경할 수 있는 항목이 몇 가지 없어 사진과 같이 세 가지만 바꿨습니다.
해당 오류와 관련하여 조언해주시면 감사하겠습니다.
사용한 EFI를 첨부합니다.
Stultus
댓글 63
OS Mode Selection을 'CSM and UEFI'로 변경했더니 문제가 해결됐습니다. 조언 감사합니다.
혹시 이후의 안정화 과정 중에 문제가 생기거나 궁금한 사항 등을 댓글로 여쭤봐도 될까요?
정리해주신 안정화 관련 글들 잘 보고 있습니다.
[VoodooI2C 설치 가이드] I2C 방식의 터치패드 활성화 및 제스처 안정화하기 + ACPI 패치 과정, 샘플 SSDT 수록! (x86.co.kr)
[VoodooI2C] 터치패드 GPIO Pinning 작업 - APIC Pin 의 값을 통하여 GPIO Pin 의 값을 구하기! (x86.co.kr)
위 링크의 내용을 바탕으로 아래 질문들을 작성하였습니다.
안정화 첫 단계로 터치 패드와 관련, 링크의 내용과 제 시스템을 살펴보고 있는데 몇 가지 궁금한 게 있습니다.
1. IORegistryExplorer와 OEM DSDT.dsl에서 사진과 같이 APIC Pin 값이 0x2F보다 작음을 확인, 제 시스템에서는 Interrupt (APIC) Mode로 사용할 수 있다고 이해했는데 맞는지 모르겠습니다. 그리고 이후 내용은 인텔 4세대에 관한 내용이 없고, APIC 사용이므로 GPIO Pinning 관련 글은 넘기면 되는 걸까요?
2. 내용 중 '2-2. Darwin OS Check Fix'에 나온 내용을 바탕으로 제 시스템의 OEM DSDT를 열어봤는데, 링크의 내용과 달리 OSI가 아닌 XOSI로 표기되는 이유는 ACPI에 SSDT-XOSI.aml를 주입하면서 Rename 패치를 적용해서 그런 것이라고 알고 있는데, 맞게 이해하고 있는 걸까요?
3. 아래 내용 중 SSDT-OSYS.aml를 적용하기 위해서는 현재 제 EFI에 적용한 SSDT-XOSI.aml과 Rename 패치를 삭제 후 해당 SSDT를 주입하면 되는 것으로 알고 있습니다.
내용에 있는 SSDT-OSYS.aml(dsl)에서 OSYS값인 0x07DF를 제 시스템에서는 0x07D0로 변경하면 되는 것인지요?
4. '2-5. VoodooI2C의 ACPI 패치'에 나온 코드는 제 OEM DSDT에서 해당 부분을 찾아서 수정하면 되는 걸까요? 만약 그렇다면 수정한 DSDT를 EFI에 어떻게 적용해야 하는 건지도 궁금합니다.
1. IORegistryExplorer 와 OEM DSDT.dsl 에서 사진과 같이 APIC Pin 값이 0x2F보다 작음을 확인,
제 시스템에서는 Interrupt (APIC) Mode 로 사용할 수 있다고 이해했는데 맞는지 모르겠습니다.
-> 네, Interrupt (APIC) 모드를 사용할 수 있으며, Polling 모드도 사용할 수 있습니다.
추가로, Intel 4th Gen Haswell 은 VoodooGPIO 를 지원하지 않기 때문에 Interrupt (GPIO) 모드는 사용이 불가능합니다.
그리고 이후 내용은 인텔 4세대에 관한 내용이 없고, APIC 사용이므로 GPIO Pinning 관련 글은 넘기면 되는 걸까요?
-> 네, Intel 4th Gen Haswell 은 VoodooGPIO 를 지원하지 않기 때문에
Interrupt (GPIO) 모드는 사용이 불가능하므로 GPIO Pinning 작업은 필요하지 않습니다.
또한, GPIO Controller (GPI0 Device) 를 활성화할 필요도 없습니다.
2. 내용 중 '2-2. Darwin OS Check Fix'에 나온 내용을 바탕으로 제 시스템의 OEM DSDT를 열어봤는데, 링크의 내용과 달리 OSI가 아닌 XOSI로 표기되는 이유는 ACPI에 SSDT-XOSI.aml를 주입하면서 Rename 패치를 적용해서 그런 것이라고 알고 있는데, 맞게 이해하고 있는 걸까요?
-> 혹시, 댓글의 사진에 있는 DSDT.dsl 이 macOS 로 부팅하고 MaciASL 등의 앱으로 열어서 저장한 것이라면, 네 맞습니다.
Rename 패치가 적용되어 있는 상태에서 macOS 로 부팅하고 시스템의 ACPI Tables 를 불러오면 패치가 적용되어 있는 상태의 DSDT 가 열리므로 XOSI 로 표시됩니다.
그래서, Rename 패치 등이 적용되어 있는 상태에서 macOS 로 부팅하고 MaciASL 앱으로 저장한 DSDT 는
수정하지 않은 원본 상태의 OEM DSDT 와 내용이 다릅니다.
3. 아래 내용 중 SSDT-OSYS.aml를 적용하기 위해서는 현재 제 EFI에 적용한 SSDT-XOSI.aml과 Rename 패치를 삭제 후 해당 SSDT를 주입하면 되는 것으로 알고 있습니다.
내용에 있는 SSDT-OSYS.aml(dsl)에서 OSYS값인 0x07DF를 제 시스템에서는 0x07D0로 변경하면 되는 것인지요?
-> 질문자님의 노트북의 DSDT 는 OSYS 값이 0x07D0 보다 크거나 같으면 활성화되도록 되어 있지만,
요즘 최신 노트북들은 Windows 8 (=Windows 2012) 에 해당하는 값인 0x07DC 이상이어야 활성화되도록 되어 있습니다.
댓글의 DSDT 사진에서는 아래 부분이 잘려서
Windows 10 (Windows 2015) 에 해당하는 값인 0x07DF 가 있는지 없는지 잘 보이지는 않지만,
저는 0x07D0 보다는 가장 마지막 Windows 버전에 해당하는 값으로 수정하는 것을 추천드립니다.
하지만, SSDT-XOSI.aml + _OSI to XOSI Rename 패치가 잘 작동한다면, 굳이 SSDT-OSYS.aml 을 사용하지 않아도 될 것 같습니다.
4. '2-5. VoodooI2C의 ACPI 패치'에 나온 코드는 제 OEM DSDT에서 해당 부분을 찾아서 수정하면 되는 걸까요?
-> 제가 작성한 VoodooI2C 설치 가이드의 2-5. 단계 내용은 CPU 세대에 상관 없이
다른 노트북의 DSDT 내용을 예시로 어떻게 패치해야 하는지 원리에 대해서 설명한 것입니다.
그런데, 질문자님의 _CRS Method 를 보면 APIC Pin 이 SBFB 에 해당하는 Object (사진에서는 SBFI) 와
Combined (결합되어 있는) 상태인데, 이의 경우에 대한 패치 방법은 제가 따로 설명하지 않아서 제가 댓글로 설명해 드리겠습니다.
Name (SBFI, ~ ) 항목(8769~8779번째 줄)을 복사해서 새로 Pin 을 하나 더 만들고
기존의 SBFI 는 SBFB 로 이름을 변경하고 그 안에 있는 Interrupt Pin 내용을 지워서 I2cSerialBusV2 만 남기도록 수정합니다.
그리고, 복사하여 새로 만들었던 SBFI 에서는 I2cSerialBusV2 내용을 지우고 Interrupt Pin 내용만 남기도록 수정합니다.
그 후에, 아래에 있는 Return (SBFI) 를 Return (ConcatenateResTemplate (SBFB, SBFI)) 로 수정하면 됩니다.
만약 그렇다면 수정한 DSDT를 EFI에 어떻게 적용해야 하는 건지도 궁금합니다.
-> 수정한 DSDT 는 DSDT.aml 로 컴파일하여 저장하고 ACPI 폴더에 추가합니다.
그리고, Config.plist 의 ACPI - Add 에서 첫 번째 순서 항목으로 DSDT.aml 을 추가하고 그 후에 SSDT 가 로드되도록 설정하면 됩니다.
또한, 수정한 DSDT.aml 로 I2C 방식의 터치패드가 잘 작동한다면
DSDT 에 수정하였던 터치패드 관련 패치 내용을 SSDT 로 분리하여
Preset Variable Method (PVM) 방식이나 Hot Patch 방식으로 패치하는 것은 질문자님의 자유입니다. :)
자세한 설명 감사합니다.
2-1. (2번 관련) 말씀하신대로 OEM DSDT가 아니라 macOS 부팅 후 Hackintool에서 추출한 DSDT였습니다. 제 용어 사용이 정확하지 못했네요. 주의하겠습니다.
3-1. (3번 관련) 관련 글에 맞춰 SSDT-OSYS.aml을 사용해보려고, SSDT-XOSI와 Rename 패치는 제거하였습니다. 그리고 SSDT-OSYS.aml에 사진과 같이 최고값인 '0x07DD'를 적용하면 되는 걸까요?
4-1. (4번 관련) 말씀하신 내용 수정은 사진처럼 하면 될까요?
그리고 관련 코드가 세 부분(SHUB, DFUD, TDP4)에 존재하는데 전부 적용해야 할까요 아니면 그 중 어느 곳에 적용해야 할까요? (SHUB, DFUD, TDP4가 뭘 뜻하는지 어디를 찾아보면 알 수 있을까요?)
5. MaciASL에서 연 DSDT를 수정없이 컴파일하면 구문 에러가 발생하는데 구체적인 내용이 없습니다. 괄호 문제는 아닌 것 같은데, 이 경우 어떻게 처리해야 하는지 궁금합니다. (DSDT.dsl : https://tmpstorage.com/download/se4q56ruzf)
3-1. (3번 관련) 관련 글에 맞춰 SSDT-OSYS.aml을 사용해보려고, SSDT-XOSI와 Rename 패치는 제거하였습니다. 그리고 SSDT-OSYS.aml에 사진과 같이 최고값인 '0x07DD'를 적용하면 되는 걸까요?
-> 네, 0x07DD 로 수정하면 됩니다.
4-1. (4번 관련) 말씀하신 내용 수정은 사진처럼 하면 될까요? 그리고 관련 코드가 세 부분(SHUB, DFUD, TDP4)에 존재하는데 전부 적용해야 할까요 아니면 그 중 어느 곳에 적용해야 할까요? (SHUB, DFUD, TDP4가 뭘 뜻하는지 어디를 찾아보면 알 수 있을까요?)
-> 네, 사진처럼 수정하면 되는 것이 맞습니다.
그런데, 질문자님의 I2C 터치패드에 해당하는 장치인 SPTP Device 의 _CRS Method 를 수정해야 합니다.
다른 Device 의 _CRS Method 는 수정할 필요가 없습니다.
위의 댓글 사진에서 IOReg 에서는 APIC Pin 의 값이 0x1F 로 표시되는데
DSDT 사진에서는 Interrupt 의 APIC Pin 값이 0x0000001C 로 표시되서 조금 의아했었는데
SPTP Device 가 아닌 다른 Device 의 _CRS Method 였네요.
그리고, SHUB, DFUD, TPD4 가 구체적으로 무엇인지는 저도 잘 모르며, Device 이름이 그냥 이렇게 지어진 것입니다.
단지, SHUB, DFUD, TPD4 등의 Device 는 SPTP 처럼 I2C Device 하위에 정의된 장치인 것을 보아
이 장치도 마찬가지로 I2C 와 관련된 장치라는 것을 알 수 있습니다.
Device 이름은 예를 들어서 프로그래밍 언어에서 변수를 선언할 때 식별하기 편하게
프로그래머/개발자가 마음대로 지정하는 것처럼 ACPI 에서도 마음대로 정의하고 수정할 수 있습니다.
또한, ACPI 내용에는 여러 가지 많은 Device 가 정의되어 있는데, 이러한 Device 가 모두 활성화되어 있는 것은 아닙니다.
_STA Method 에서 Return 되는 값이 제각각이며 모두 다릅니다.
이의 예시로, TPD4 Device 는 터치패드와 관련된 장치인데
질문자님의 삼성 노트북 DSDT 에는 TPD4 Device 가 정의되어 있지만,
실제로 작동 및 물리적으로 사용할 수 있는 I2C 터치패드는 SPTP Device 하나 밖에 없습니다.
단, 실제로 사용하지 않는 Device 의 _STA Method 가 활성화되어 있지만,
물리적으로 해당 하드웨어와 연결되어 있지 않은 경우도 있으며, 이것도 그냥 무시하면 됩니다.
기본적으로, 이러한 ACPI 코드 설계는 해당 노트북 또는 BIOS 펌웨어 제조사에서 하는 것으로 알고 있습니다.
5. MaciASL에서 연 DSDT를 수정없이 컴파일하면 구문 에러가 발생하는데 구체적인 내용이 없습니다. 괄호 문제는 아닌 것 같은데, 이 경우 어떻게 처리해야 하는지 궁금합니다.
-> 13934번째 줄에 있는 Arg0 을 삭제하면 해결됩니다.
ACPI Source Language (ASL) 문법 오류이며, 매개 변수 값이 혼자 덩그라니 있는 것은 문법적으로 오류입니다.
해당 오류는 아마 MaciASL 앱 자체의 버그인 것으로 알고 있으며,
컴퓨터 및 노트북마다 이 오류가 발생하는 경우도 있고 그렇지 않은 경우도 있어서
이 부분은 그냥 ASL 문법을 알고 있으면 그냥 수정하면 되지만
만약, 모른다면 구글에 "DSDT MDBG Arg0 syntax error" 등으로 검색해보면 이와 똑같은 오류가 발생한 사례가 나오며 수정하여 해결하면 됩니다.
추가로, Arg0 은 해당 Method 를 Call (호출)할 때 사용된 첫 번째 매개 변수(인수)를 의미합니다.
즉, ADBG(0x80) 으로 Call (호출)하면 ADBG Method(함수) 안의 Arg0 의 값은 0x80 입니다.
또 다른 예로, ADBG(P80D) 으로 Call (호출)하면 ADBG Method(함수) 안의 Arg0 의 값은 P80D 라는 변수에 저장된 값입니다.
제가 해당 문법 오류를 수정하고 SPTP Device 의 _CRS Method 를 수정한 DSDT.dsl 을 첨부합니다.
4-2. 안정화 자료에 있는 설명이 그 내용이었군요. 이제 제대로 이해가 됩니다.
그리고 SPTP에 제 시스템의 터치 패드 모델명이 나와 있는 걸 확인할 수 있었습니다.
5-1. 수정해주신 DSDT로 Static Patch를 적용해도 터치패드가 작동하지 않습니다. 이후 단계인 '속도 상수 활성화 패치'를 진행하면 될까요? (용량 문제로 업로드가 되지 않아 Config.plist만 올렸습니다. https://tmpstorage.com/download/to0pzroibe)
그리고 MaciASL에 그런 버그가 있는 줄 모르면 전혀 감도 못 잡을 것 같습니다. 추가 설명까지 해주셔서 많이 배웁니다.
I2C 버스 속도 상수인 SSCN & FMCN 은 질문자님의 DSDT 를 보면 I2C0 Device 에 이미 정의되어 있습니다.
따로, USTP 라는 변수에 의해서 활성화 여부가 달라지는 것이 아닌 I2C0 Device 하위에 직접 정의되어 있습니다.
즉, I2C 버스 속도 상수 SSCN & FMCN 은 이미 활성화되어 있는 상태입니다.
혹시, Interrupt (APIC) 모드 말고 Polling 모드로는 작동하는지 확인해 주실 수 있을까요?
Config.plist 의 boot-args 에 -vi2c-force-polling 부트 옵션을 추가하고 다시 부팅해보세요.
또한, 아래의 정보를 댓글로 보내주시면 제가 확인해 보겠습니다.
1. GenI2C 앱의 Information 화면 스크린샷
2. DebugEnhancer.kext 를 추가하고 다시 부팅한 후에 터미널에서 아래의 명령어를 실행한 결과
sudo dmesg | grep -i "Voodoo"
0. '-vi2c-force-polling' 옵션 추가에도 터치패드 반응이 없습니다.
1. GenI2C의 Information 화면입니다.
2. DebugEnhancer.kext 적용 결과입니다.
- '-vi2c-force-polling' 옵션 적용 시
- '-vi2c-force-polling' 옵션 제거 시
혹시, Config.plist - ACPI - Add 에서 수정하여 넣은 DSDT.aml 을 잠시 비활성화하고
-vi2c-force-polling 부트 옵션을 적용한 상태로 다시 부팅해서 확인해보세요.
DSDT.aml 비활성화와 '-vi2c-force-polling' 옵션 적용 후에도 변화 없습니다.
Could not find an I2C Serial Bus declaration 라는 로그가 출력되었다는 것은
I2cSerialBusV2 에 해당하는 Object 를 찾지 못했다는 의미입니다.
아래에 첨부한 DSDT.aml 로 교체하고 DSDT.aml 로드를 활성화하고,
-vi2c-force-polling 부트 옵션을 적용한 상태로 부팅한 후에 터치패드가 작동하는지 확인해주세요.
만약, 그래도 안 될 경우에는 SSDT-OSYS.aml 을 비활성화하고
그 대신에 SSDT-XOSI.aml + _OSI to XOSI Rename 패치를 사용하도록 수정하고 다시 부팅해보세요.
로그를 그렇게 해석하면 되는군요. 설명 감사합니다.
그리고 DSDT.aml 첨부가 안 보입니다. 재첨부해주시면 좋겠습니다.
별 말씀을 다 하십니다. :)
말씀하신 내용을 모두 반영해봤지만 변화가 없습니다. SSDT-XOSI.aml을 Prebuilt 버전과 SSDTTime으로 생성한 것으로 바꿔서 재부팅해봐도 반응이 없네요. ;;
설정이 잘못된 게 있나 싶어 EFI 첨부합니다. (용량 문제로 Wi-Fi/BT 관련 켁스트는 뺐습니다.)
음... 혹시, 현재 상태의 EFI 폴더로 부팅하였을 때 VoodooI2C 로그에서 여전히 동일하게
SPTP 에서 Could not find an I2C Serial Bus declaration 로그가 출력된다면 저도 잘 모르겠습니다... ㅜㅅㅠ
I2cSerialBusV2 에 해당하는 Object 를 SBFB 라는 이름으로 직접 수정하였는 데에도 안 된다니 이상하네요...
EFI 폴더는 확인해보니 이상한 부분은 없습니다.
VoodooI2C 로 터치패드가 작동하지 않는다면 VoodooPS2Controller 를 사용해야 할 것 같습니다.
I2C 방식의 터치패드도 VoodooPS2Controller 로 작동하는 경우가 있으며, 대신에 조작감이 조금 떨어질 수 있습니다.
추가로, 밝기 조절 Fn 키 Remapping 이나 HDMI 디지털 사운드 출력 등의 다른 안정화 작업은 도움이 필요하시면 도와 드리겠습니다. :)
쉬셔야 할 시간인데 번거롭게 해드린 것 같아 죄송합니다.
VoodooPS2Controller 내용을 찾아보고, 하다 안 되면 잠시 미뤄두고 다른 안정화 부분을 건드려봐야 할 것 같습니다.
하다가 막히는 부분이 생기면 염치 불고하고 또 여쭤보겠습니다.
편한 밤 되세요. :)
이것저것 만지다 정리 차 마지막으로 재부팅해서 확인해봤는데, 여전히 작동은 안 되지만 이전과 다른 로그가 출력됩니다.
1. -vi2c-force-polling 적용 시
2. -vi2c-force-polling 제거 시
3. GenI2C
'DeviceName, IOName, Mode'가 안 뜨는 건 GenI2C 오류일까요? 아니면 제대로 안 잡혀서 안 나오는 걸까요?
4. EFI
로그를 보면 SPTP Device 의 SBFB 를 인식하고 Polling 모드로 작동시킨다는 내용을 확인할 수 있습니다.
IOReg 를 확인해보면 SPTP Device 하위에 VoodooInput 등의 여러 가지 항목이 더 연결되어 있을 것입니다.
전보다 조금 더 진전이 이루어진 것 같습니다.
또한, GenI2C 앱의 정보 화면은 터치패드가 제대로 잡히지 않으면 일부 항목이 표시되지 않을 수 있습니다.
점심 시간이라 잠깐 만져보려고 켜봤더니 사과에서 무한 재부팅에, USB로 부팅했더니 내장그래픽 가속도 안 돼 재설치를 해야겠습니다.
그래도 변화가 보여 다행입니다. 재설치 후 진행하다 막히는 부분이 생기면 댓글로 여쭙겠습니다.
(트랙패드 안정화는 우선 순위를 잠시 뒤로 미뤘습니다.)
1. 배터리 표시는 'ECEanbler.kext'와 'SMCBattery.kext'를 주입 후 작동 확인했습니다.
2. 내장 디스플레이 밝기 조절은 'SSDT-PNLF.am'과 'SSDT-ALS0.aml'을 주입 후 작동 확인했습니다.
3. (질문) HDMI 오디오 출력 관련하여 궁금한 게 있습니다. (상황은 노트북과 외부 모니터 1대를 HDMI로 연결한 상태)
출력을 노트북의 내장 스피커나 3.5mm 단자로 설정 시 소리가 제대로 나오고 (노트북에서) 음량 조절도 잘 됩니다.
그러나 출력을 모니터로 설정 시 (모니터의 스피커에서) 소리는 나오지만 (노트북에서) 음량 조절이 비활성화됩니다.
IRQ 충돌로 인해 오디오 설정 시 SSDTTime으로 SSDT-HPET.aml과 관련 Rename 패치를 생성 후 주입하고, ALC298에 해당하는 Layout-id를 찾아 적용하였습니다.
외부 모니터 연결을 위해 커넥터 패치를 하였고, HDMI 오디오 출력을 설정 중 HDMI Audio out 관련 자료에서 스푸핑은 해당 사항인 아닌 것으로 판단하여 FakePCIID.kext 등은 주입하지 않았습니다.
GUIDE - How to Enable Intel IGPU HDMI/DP Audio on macOS | EliteMacx86 Forum
EFI를 첨부합니다. (용량 문제로 Wi-Fi/BT 관련 켁스트는 제거하였습니다.)
원래, macOS 는 DP/HDMI 사운드의 음량 조절 기능을 제공하지 않습니다.
실제 리얼 Mac 컴퓨터에서도 DP/HDMI 사운드의 음량 조절은 불가능합니다.
https://www.tonymacx86.com/threads/no-volume-control-with-hdmi-audio.244979/
https://www.olarila.com/topic/9146-no-volume-control-on-hdmi-output/
물론, Windows 는 DP/HDMI 사운드의 음량 조절 기능을 제공하지만,
Apple 이 macOS 를 그렇게 디자인(설계)하였기 때문에 macOS 사운드 설정에서 음량을 조절할 수 있는 방법은 없습니다.
그 대신에, 모니터 자체의 음량 조절 기능을 사용하거나
별도의 앱/유틸리티를 사용하는 방법 밖에 없는 것으로 알고 있습니다.
커넥터 패치만 했는데 모니터에서 소리가 나오길래 hda-gfx를 설정하면 음량 조절도 될 거라고 생각했습니다.^^;;
혹시 hda-gfx 관련 설정에 잘못되거나 이상한 부분은 없을까요?
hda-gfx 속성에 잘못된 부분은 없는 것으로 보입니다.
또한, AppleALC 가 특정 버전부터 hda-gfx 속성을 자동으로 인젝션한다는 글을 해외 해킨토시 커뮤니티에서 본 것 같습니다.
아마도, AppleALC 가 hda-gfx 속성을 자동으로 인젝션해서 커넥터 패치만 잘 하여도 HDMI 사운드 출력이 작동한 것 같습니다.
확인 감사합니다. 그래서 hda-gfx 속성 주입을 안 했는데도 소리가 난 거로군요. 궁금한 게 많이 해소가 됐습니다.
1. 내장 웹캠은 USB Mapping 시 Internal로 타입을 설정하여 작동 확인하였습니다.
2. 내장 SD 카드 리더기는 Realtek 제품으로 'RealtekCardReader.kext'를 주입, 작동 확인하였습니다. (위 사진의 'USB Storage'가 SD 카드입니다.)
3. (질문) 음량 조절 시 'Fn' 키가 작동하나 화면 밝기 조정 시에는 작동하지 않습니다. (윈도우(MS Windows)에서도 마찬가지 상황이라 'Fn' 키 문제가 아니라 F2, F3 기능키가 제대로 동작을 안 하는 것 같습니다.)
'Fn' 키 조합을 'Fn + Fx'가 아니라 'Fn + 방향 키 또는 Page UP/DN'으로 조정할 수 있지 않을까하는 생각에 아래 내용들을 보고 있습니다.
https://x86.co.kr/qa/7760513#comment_7763123
[해결불가] 노트북 fn키 밝기조절 리맵핑하는 방법 질문드려요 (x86.co.kr)
사진은 제 DSDT로, 방향키나 Page UP/DN으로 변경할 수 있는 경우 해당 키값을 어떻게 알아내야 하는지 궁금합니다.
Fn 키의 EC Query 를 확인하는 방법은 링크하신 저의 질문글의 내용대로 DSDT 에 아래의 패치를 적용하고
- Add DSDT Debug Methods
- Instrument EC Queries
ACPIDebug.kext 도 추가한 후에 다시 부팅하고 터미널에서 ACPIDebug 의 로그를 확인하면 됩니다.
그런데, 혹시 _Q63 & _Q64 Method 에 밝기 조절 Fn 키 패치(PS2K Device 에 밝기 조절 관련 값을 Notify)는 시도해 보셨나요?
Windows 에서 작동하지 않은 것은 삼성 키보드 이벤트 드라이버가 설치되어 있지 않다면 그럴 수 있습니다.
또한, 밝기 조절 Fn 키가 [Fn + Fx] 인 노트북에서 [Fn + 방향키] 조합을 눌렀을 때
그에 해당하는 EC Query 가 반드시 호출된다고 보장할 수 없습니다.
즉, [Fn + 방향키] 조합에 해당하는 EC Query 가 존재하지 않을 수 있습니다.
이 부부은 노트북 모델 및 제조사마다 하드웨어적으로 할당되어 있는 것으로 알고 있습니다.
DSDT Debug Method와 Instrument EC Queries 패치하는 법을 모르겠습니다.
그리고 PS2K Device에 밝기 조절 관련 값을 Notify하는 방법과 관련 글들 몇 번 더 읽어보고 이해를 좀 더 하고 시도해보려고 합니다.
노트북 해킨에 모르는 것 투성이라 재미는 확실히 있으나, DSDT나 SSDT 코드 수정에 대한 지식이 너무 없어서 진도가 쉽사리 나가지 않네요. ;)
예전에는 MaciASL 의 패치 목록에 있었는데, 지금은 사라진 것 같습니다.
MaciASL 앱으로 DSDT 를 열고 아래의 질문글에서 제가 작성한 댓글의 패치 내용을 패치란에 복사하여 넣고 패치를 적용해주세요.
또는, DSDT 에 RMDT Device 를 넣지 않고 SSDT 로 넣고, DSDT 에서 RMDT Device 를 외부 참조하는 방법도 있습니다.
https://github.com/daliansky/OC-little/blob/master/17-ACPIDebug/SSDT-RMDT.dsl
Instrument EC Queries 패치는 아래의 내용을 DSDT 에 적용하면 됩니다.
https://github.com/RehabMan/OS-X-ACPI-Debug/blob/master/instrument_Qxx.txt
0. 상황
- 외부 USB 키보드 연결 시 밝기 조절은 'Fn+Scroll Lock'과 'Fn+Pause'로 동작하나, 노트북 내장 키보드의 'Fn+F2'와 'Fn+F3'로는 작동 안 함 (노트북 내장 키보드에는 Scroll Lock과 Pause 키 없음)
- 키보드 디스플레이 단축키 설정에서 밝기 조절 키로 F2와 F3로 등록 시 F2는 등록 및 동작을 하나 F3는 등록 안 됨
- 키보드를 점검해보니 다른 몇 개의 키와 함께 F3 키 고장 진단 (F2 키가 정상이므로 'Fn 키' 활성화 작업 시도 가능)
1. _Q63 & _Q64 Method에 Fn 키 패치
SSDT Hotpatch & Override 방식으로 링크에 나온 값들을 바꿔가며 적용, (BRTN 구문이 있는) _Q63 & _Q64 Method에 Fn 키 패치를 시도해봤으나 변화가 없었습니다.
- H_EC : DSDT의 경로가 '_SB_.PCI0.LPCB.H_EC'로 FNBL에 명시된 Object의 절대 경로와 일치 확인
- PS2K : DSDT의 경로가 '_SB_.PCI0.LPCB.PS2K'로 FNBL에 명시된 Object의 절대 경로와 일치 화인
2. Brightnesskeys.kext 사용 시에도 변화가 없었습니다. (SSDT-FNBL.aml과 Rename 패치 비활성화)
3. Fn 키의 EC Query 확인
알려주신 'Debug Method'와 'Instrument EC Queries' 패치 모두 DSDT에 적용하고, RehabMan의 Prebuilt 'ACPIDebug.kext'를 주입 후 터미널에서 명령어를 입력해도 로그가 나오지 않습니다.
GitHub - RehabMan/OS-X-ACPI-Debug
RehabMan / OS-X-ACPI-Debug / Downloads
부팅 후 터미널을 열고, 'Fn+F2'를 누른 후 명령어를 실행했는데, 로그 띄우는 방법이 맞는지 모르겠습니다.
EFI가 아니라 S\L\E에 ACPIDebug.kext를 설치해야 한다는 내용이 있어 시도했으나 복사가 안 돼, 'Kext Wizard'를 이용했는데 S\L\E를 보면 해당 켁스트가 제대로 설치되지 않는 것 같습니다.
설정을 잘못한 건지, 설정은 다 됐는데 코드 스캔 방법이 따로 있는데 그걸 모르는 건지 혹은 둘 다 인지 알 수가 없습니다.
사용한 EFI를 첨부합니다. (임시저장소 접속이 안 되네요.;;)
3. Fn 키의 EC Query 확인 부분에서 SSDT-FNBL.aml + _Q63 to _X63 & _Q64 to _X64 Rename 패치가 활성화되어 있으므로
macOS 에서 [Fn + F2] (밝기 감소) 키를 눌렀을 때 호출되는 _Q36 Method 는
DSDT 에 있는 것이 아닌 SSDT-FNBL.aml 에 있는 _Q36 Method 가 호출됩니다.
하지만, SSDT-FNBL.aml 에 있는 _Q36 Method 에는 Instrument EC Queries 패치가 적용되어 있지 않습니다.
터미널에서 ACPIDebug.kext 를 통하여 로그를 출력하는 원리는 Fn 키를 눌렀을 때,
해당 Fn 키와 연결되어 있는 EC Query Method가 호출되는데
Instrument EC Queries 패치를 적용하면서 EC Query Method 안에 다음과 같은 코드가 실행되어서
\RMDT.P1 ("EC _Q63 enter")
\RMDT.P1 ("EC _Q63 exit")
터미널에 EC _Q63 enter, EC _Q63 exit 로그가 출력되는 것입니다.
SSDT-FNBL.aml + _Q63 to _X63 & _Q64 to _X64 Rename 패치가 활성화되어 있는 상태이지만,
SSDT-FNBL.aml 의 _Q36 Method 에
\RMDT.P1 ("EC _Q63 enter")
\RMDT.P1 ("EC _Q63 exit")
위의 코드가 삽입되어 있지 않은 상태이므로 터미널에서 [Fn + F2] 키를 눌러도 로그가 출력되지 않는 것으로 보입니다.
Instrument EC Queries 패치가 SSDT 가 아닌 DSDT 에 적용되어 있으므로,
터미널에서 Fn 키의 EC Query 를 확인하려면 DSDT.aml 은 활성화하여 로드하도록 하고
SSDT-FNBL.aml 과 _Q63 to _X63 & _Q64 to _X64 Rename 패치는 잠시 비활성화하고 부팅한 후에 확인해야 합니다.
또는, \RMDT.P1 ("EC _Q63 enter") 와 \RMDT.P1 ("EC _Q63 exit") 코드를
SSDT-FNBL.aml 에서 _Q63 Method 의 If (_OSI ("Darwin")) 하위에 넣어주고
RMDT Device 와 P1 Method 를 DSDT 로 부터 외부 참조하도록 하면 됩니다.
만약, 위의 내용대로 하여도 로그가 출력되지 않는다면 저도 잘 모르겠습니다..
추가로, /S/L/E 경로에 Kext 를 추가하는 것은 권장하지 않습니다.
/S/L/E 경로에서 Kext 를 추가하거나 삭제하면 권한 복구 & Kernel Cache 재생성 작업을 진행해야 해서 불편하며
macOS Big Sur 11 버전부터인지는 잘 모르겟지만 macOS 의 시스템 스냅샷 기능 때문에 수정하기가 어렵습니다.
저는 부트로더의 Kexts 폴더에 넣어도 로드가 잘 되었습니다.
현재 로드된 Kext 를 확인하는 방법은 터미널에서 kextstat 명령어를 실행하면 확인할 수 있습니다.
DSDT만 활성화한 상태로 부팅 후 터미널에서 kextstat을 실행한 결과 ACPIDebug.kext는 제대로 로드되는 것으로 보입니다. (SSDT-FNBL.aml과 Rename 패치 비활성화)
다만 터미널 실행 후 'Fn+F2'를 누르고 명령어 'log show --last 5 | grep ACPIDebug'의 실행에도 로그는 안 나옵니다.
처음 해보는 작업이라 누락하거나 실수한 부분이 있을 가능성이 높으니 좀 더 살펴보겠습니다.
그리고 'DSDT Debug Method와 Instrument EC Queries를 DSDT에 패치한 결과 RMDT Device와 동작이 삽입(정의)된 DSDT를 활성화 시에는 Fn 키 작동에 의한 로그가 발생한다. 그러나 SSDT-FNBL은 해당 패치를 한 상황이 아니므로 (즉, SSDT에는 RMDT에 관한 어떠한 것도 삽입(정의)되지 않았으므로 ), SSDT가 활성화 된 경우 해당 키의 동작이 DSDT가 아닌 SSDT의 내용을 따라가서 로그가 발생하지 않는다.' 라고 이해하면 될까요? (맞는 표현인지 모르겠습니다.)
\RMDT.P1 ("EC _Q63 enter")와 \RMDT.P1 ("EC _Q63 exit")를 SSDT-FNBL에 추가하는 건 알겠는데, 'RMDT Device 와 P1 Method를 DSDT로부터 외부 참조'는 어떻게 하는 건가요?
ACPI 관련 부분을 알아가는 게 많이 어려운데, 댓글로 잘 설명해주셔서 하나 하나 배우기도 하고 이것 저것 찾아보게 되어 즐겁네요. 감사합니다. :)
그리고 'DSDT Debug Method와 Instrument EC Queries를 DSDT에 패치한 결과 RMDT Device와 동작이 삽입(정의)된 DSDT를 활성화 시에는 Fn 키 작동에 의한 로그가 발생한다. 그러나 SSDT-FNBL은 해당 패치를 한 상황이 아니므로 (즉, SSDT에는 RMDT에 관한 어떠한 것도 삽입(정의)되지 않았으므로 ), SSDT가 활성화 된 경우 해당 키의 동작이 DSDT가 아닌 SSDT의 내용을 따라가서 로그가 발생하지 않는다.' 라고 이해하면 될까요? (맞는 표현인지 모르겠습니다.)
-> 네, 맞습니다.
DSDT 또는 SSDT 에서 다른 ACPI Table 에 있는 내용을 외부 참조하려면
윗 부분에 External (ACPI 절대 경로를 포함한 Object 이름, Object 타입) 으로 추가하면 됩니다.
예를 들어, RMDT Device 가 최상단 루트 ₩ Scpoe 에 정의된 경우의 외부 참조는
External (RMDT, DeviceObj)
위와 같이 입력하면 됩니다.
Object 타입은 DeviceObj, MethodObj, IntObj, PkgObj, FieldUnitObj, MutexObj 등이 있습니다.
SSDT-FNBL.aml에 있는 External이 그런 역할이었군요.
설명을 듣고 나니 Notify에 절대 경로와 Object가 있는 이유를 알겠습니다. 감사합니다.
트랙패드(터치패드)가 잡혔습니다.
복기하면서 로그나 코드를 아무리 살펴봐도 문제가 없는 것 같아 구글링하다 발견한 파일로 대체하니 바로 동작하더군요.
(필요한 분들을 위해 파일 첨부합니다. 내용은 VoodooI2C.kext, VoodooI2CHID.kext로, 사이트에서 받으셔도 됩니다.)
1. SSDT-XOSI.aml 및 Rename patch 적용 시 : 정상 작동
GenI2C의 'DeviceName, IOName, Mode'가 공란인 건 별로 상관 없는 것 같습니다.
2. SSDT-OSYS.aml 및 VoodooI2C의 ACPI 패치(#1) 적용 시 : 인식 불가
3. SSDT-OSYS.aml 및 VoodooI2C의 ACPI 패치(#2) 적용 시 : 정상 작동
4. VoodooI2C.kext 및 VoodooI2CHID.kext 내용 비교
궁금한 게 있습니다. 위 3번의 경우 'Polling' 모드로 작동하는 이유가 있을까요?
1번과 달리 로그에 'SPTP Warning : Could not find any APIC nor GPIO interrrupts. Your chosen satellite will run in polling mode if implemented'가 있는 건 알겠지만, polling 옵션을 따로 주지 않았는데도 해당 모드로 동작을 합니다.
위 3번의 경우 'Polling' 모드로 작동하는 이유가 있을까요?
-> _CRS Method 에서 I2cSerialBusV2 에 해당하는 SBFB 만 Return 되었기 때문입니다.
VoodooI2C 는 -vi2c-force-polling 부트 옵션이 적용되어 있지 않아도
I2C 터치패드 장치에서 APIC Pin (Interrupt, SBFI)이나 GPIO Pin (GpioInt, SBFG)이 없으면 Polling 모드로 작동합니다.
Interrupt (APIC) 모드로 작동하려는 경우에는 I2cSerialBusV2 (SBFB) 와 Interrupt (SBFI) 가 필요합니다.
단, 질문자님의 삼성 노트북은 I2cSerialBusV2 와 Interrupt 가 하나의 변수로 묶여 있고 그 변수 이름이 SBFI 였습니다.
1번에서 2개의 DSDT 를 아무것도 적용하지 않고 부팅하였을 때,
SBFI 변수를 SBFB 와 SBFI 로 두 개로 나누지 않았는데도 APIC Pin (Interrupt) 를 인식한 것을 보아
굳이 두 개의 변수로 나눠서 ConcatenateResTemplate 구문을 사용할 필요는 없는 것 같습니다.
그래도, 터치패드 문제가 해결되어서 다행입니다. :)
추가로, 다른 분은 VoodooI2C 를 기존에 잘 사용하다가 버전만 업데이트하였는데 작동이 안 되서 구 버전으로 되돌리고 사용하는 사례도 종종 있기도 했습니다.
VoodooI2C 는 비록 구 버전이어도 작동이 잘 된다면 굳이 최신 버전으로 업데이트할 필요는 없을 것 같습니다.
자세한 설명과 함께 직접 수정한 DSDT까지 제공해주셔서 저는 그냥 따라가기 바쁩니다.^^;;
댓글을 읽고 또 읽어보면서 조금이라도 더 이해하려고 노력 중입니다.
남은 안정화 과정에도 많은 조언 부탁드립니다. 감사합니다.:)
잠자기(Sleep) 관련하여 Instant Wake 문제가 있어서 'SSDT-GPRW.aml'과 관련 'ACPI Patch'를 적용하였습니다.
GPRW/UPRW/LANC Instant Wake Patch | OpenCore Post-Install (dortania.github.io)
적용 후 (덮개를 연 상태에서) 잠자기를 실행하는 경우 그리고 덮개를 덮어 자동으로 잠자기에 들어가는 경우 모두 잘 작동(전원 표시 LED도 꺼짐)하고 전원 단추로 깨우기(Wake)도 이상없이 동작합니다.
덮개를 덮을 때 화면이 꺼지고 덮개를 연 후 전원 단추를 누르면 깨면서 화면이 들어와서, 'LID' 관련 패치는 불필요한 것으로 판단하여 적용하지 않았습니다.
관련 로그를 보면 대부분이 'due to GLAN/ Assertion Using AC 또는 Batt'인데, 바이오스에 WOL 옵션은 없습니다.
노트북에서의 잠자기가 제대로 잡힌 건지 알고 싶습니다.
SSDT-GPRW.aml 을 적용하고 나서 잠자기 및 깨우기가 잘 작동한다면 저 로그는 무시해도 될 것 같습니다.
Fn Remapping 문제를 다시 살펴보다 궁금한 점이 생겨 문의 드립니다.
macOS에서는 밝기 조절과 관련, 키보드의 디스플레이 단축키로 F14, F15가 기본(Default)으로 설정되어 있습니다.
외장 키보드 사용 시 F13, F14, F15는 Print Screen, Scroll Lock, Pause(Break) 키에 할당, Scroll Lock과 Pause 키로 화면 밝기 조절이 됩니다. (할당된 F키 확인은 아래와 같이 단축키 설정을 비활성화 후 키보드 테스터에서 실시)
그러나 노트북 내장 키보드의 경우 자판 수 제한이 있어 기능(Fn)키 조합으로 그 역할을 대신하는데, Fn Remapping은 해당 기능(밝기 조절)을 위해 'Fn+밝기 조절 키' 입력 시 F14, F15 키로 매핑, 즉 F14, F15 키가 입력된 것처럼 치환해주는 역할이다라고 이해하고 있습니다. (같은 맥락으로 _Q63 & _Q64 Notify에서 여러 값 조합으로 변경해보는 것 역시 해당 시스템의 F14, F15 스캔 코드값에 일치시키는 것이다라고 생각하고 있습니다.)
제 시스템의 경우 키보드 테스터에서 'Fn+F2'를 누르면 어떠한 표시도 되지 않습니다.
'Fn+F2' 입력 시 (위 사진과 마찬가지로 키보드 테스터에) F14, F15키가 인식되었다고 표시되거나, 다른 키에 할당되어 있으면 그 키가 표시되어야 하는데 아무련 변화가 없습니다.
키보드 테스터에서 Fn 키 조합 인식이 안 되는 건가 싶어 시험을 해본 결과 Fn 키 조합에 할당된 자판은 다음과 같았습니다.
- 'Fn+F1, F2, F3' : 반응 없음 (Non)
- 'Fn+F4' : Command + P
- 'Fn+F5' : Command + Left Ctrl
- 'Fn+F6' : 무음(Mute)
- 'Fn+F7' : 음량 감소(Volume Down)
- 'Fn+F8' : 음량 증가(Volume Up)
- 'Fn+F9' : Command + Left Ctrl + Tab
- 'Fn+F10' : Command + D
- 'Fn+F11' : Option(Left Alt) + F4
- 'Fn+F12' : 반응 없음 (Non)
따라서 제 노트북의 경우 'Fn+F2'에 어떠한 스캔 코드도 할당되지 않았으며, 그로 인해 ACPIDebug 시에도 로그가 뜨지 않는 것 같다는 생각입니다.
ACPIDebug 관련 설정 및 EFI는 다음과 같으며, DSDT는 ACPIDebug 관련 부분만 수정된 상태입니다.
(임시 저장소는 여전히 접속이 안 됩니다.;;)
위 내용 중 제가 잘못 이해하고 있는 부분이 있는지, 분석을 잘못한 게 아닌지 또는 빠진 부분이 있거나 설정에 문제가 있는지 알려주시면 감사하겠습니다.
그러나 노트북 내장 키보드의 경우 자판 수 제한이 있어 기능(Fn)키 조합으로 그 역할을 대신하는데, Fn Remapping은 해당 기능(밝기 조절)을 위해 'Fn+밝기 조절 키' 입력 시 F14, F15 키로 매핑, 즉 F14, F15 키가 입력된 것처럼 치환해주는 역할이다라고 이해하고 있습니다. (같은 맥락으로 _Q63 & _Q64 Notify에서 여러 값 조합으로 변경해보는 것 역시 해당 시스템의 F14, F15 스캔 코드값에 일치시키는 것이다라고 생각하고 있습니다.)
-> "F14, F15 스캔 코드값에 일치시키는 것" 이라고 하기 보다는 PS2K 장치에 대하여 어떤 밝기 관련 값을 Notify 해야 macOS 에서 밝기 조절이 되는지를 찾고 이와 연결하는 것이 조금 더 알맞은 표현일 것 같습니다.
ACPI 에서 Notify 구문은 첫 번째 인수인 Object 에 두 번째 인수인 어떤 값을 알렸는지를 운영 체제(OS)에게 통보하는 역할을 합니다.
사진 출처 - ACPI Specification v6.5
https://uefi.org/sites/default/files/resources/ACPI_Spec_6_5_Aug29.pdf
만약, 질문자님의 삼성 노트북의 밝기 조절 Fn 키가 EC Query 를 통하여 처리하는 방식이 아닌
PS2 Scan Code 방식일 경우에는 ACPIDebug.kext 가 아닌 Debug 버전의 VoodooPS2 를 사용하고
시스템 로그에서 확인하고 PS2/ADB Scan 코드를 Remapping 해야 합니다.
VoodooPS2Keyboard.kext 의 Info.plist 에서 직접 수정하여 Remapping 하는 방법과
SSDT 에서 Name(\_SB.PCI0.LPCB.PS2K.RMCF,Package() { ... } 로 작성하는 방법이 있습니다.
만약, 그래도 안 된다면 저도 잘 모르겠습니다.
여러 배터리 패치 자료를 참고하면서 시도 중입니다. Static patch 후 Hot patch로 바꾸는 작업까지 해보려고 합니다.
[Guide] How to patch DSDT for working battery status | tonymacx86.com
5탄 쌩 초보도 할수있다 노트북 배터리 패치 DSDT-SSDT 패치를 하여보자. (x86.co.kr)
삼성 갤럭시북 이온 NT950XCR-G58A, i5-10210u, OC 0.6.1, 10.15.7 (빅서 가능) (x86.co.kr)
현재 배터리 관련 변수들을 8비트로 나누는 작업까지는 진행한 상황입니다.
다음 순서로 B1B2, B1B4 Method를 적용하려고 하니, 아래 사진과 같이 해당 변수가 Store, Method가 아닌 경로에만 사용되고 있습니다.
이런 경우 어디를 참고해서 수정해야 하는지 궁금합니다. ('x.x.H_EC.BTPC=Local0'가 'Store (BTPC,Local0)'와 같은 역할이라 해당 코드를 'Store (B1B2(TPC0,TPC1), Local0)'로 변경하면 되는 걸까요?)
그리고 B1B2, B1B4 Method를 '하단'에 추가하라는데 '어디'의 하단을 뜻하는 건지 모르겠습니다.
다음 순서로 B1B2, B1B4 Method를 적용하려고 하니, 아래 사진과 같이 해당 변수가 Store, Method가 아닌 경로에만 사용되고 있습니다. 이런 경우 어디를 참고해서 수정해야 하는지 궁금합니다.
('x.x.H_EC.BTPC=Local0'가 'Store (BTPC,Local0)'와 같은 역할이라 해당 코드를 'Store (B1B2(TPC0,TPC1), Local0)'로 변경하면 되는 걸까요?)
-> ^^PCI0.LPCB.H_EC.BTPC = Local0 이 Store 구문입니다.
ASL 컴파일러 버전이 업데이트되면서 기존의 문자열 연산자를 사용하다가 C/C++ 프로그래밍 언어와 비슷하게 바뀌었습니다.
사진 출처 : ACPI Spec v6.5 - 827 페이지
댓글에 링크하신 원도리님께서 작성하신 배터리 패치 강좌글에는
배터리 관련 변수에서 값을 읽는 경우에 대해서만 설명하고 있고,
어떤 값을 배터리 관련 변수에 쓰는(할당하는) 경우에 대한 설명은 없습니다.
BTPC 변수에 B1B2 Method 를 사용하여도 컴파일 오류는 발생하지 않지만, 배터리 작동 로직에서는 논리적인 오류입니다.
BTPC 변수는 링크하신 갤럭시북 이온 설치 후기글의 내용대로 직접 비트 연산자를 사용하거나
W16B Method 를 사용하면 됩니다.
추가로, BTPC = Local0 구문은
Store (BTPC, Local0) 이 아닌
Store (Local0, BTPC) 과 같은 의미입니다.
Store (A, B) 구문은 A 의 값을 B 에 저장하겠다는 의미입니다.
A = B 구문은 B 의 값을 A 에 저장하겠다는 의미입니다.
아래의 글을 참고해보세요.
https://x86.co.kr/info/8093437
그리고 B1B2, B1B4 Method를 '하단'에 추가하라는데 '어디'의 하단을 뜻하는 건지 모르겠습니다.
-> 가장 최상위 루트 (\) Scope 의 하단에 추가하라는 의미입니다.
하지만, B1B2, B1B4 Method 는 사실 추가해야 하는 위치기 정해져 있지 않으며, 원하는 위치에 추가해도 됩니다.
단지, 가장 최상위 루트 (\) Scope 의 하단에 추가하는 것이 Method 를 호출할 때 편리하기 때문에, 주로 여기에 추가합니다.
ACPI 경로는 폴더 디렉터리 경로처럼 트리 구조입니다.
그리고, 가장 최상위 루트 (\) Scope 범위에서 하단이 아닌 상단에 넣어도 상관 없습니다.
어떠한 하위 Object 로 추가하지만 않으면 절대 경로는 동일합니다.
설명 감사합니다.
이전 댓글에서 알려주신 ACPI Specification은 내려받아 놓았는데, 같이 띄워놓고 봐야겠네요.
링크 내용 참고해보겠습니다.
1. '3. 32 Bit 분할 레지스터 읽기 : B1B4...'에서 이해가 안 되는 부분이 있는데, B1CH가 어디서 나온 건지 모르겠습니다.
조건문에서 수정 전 If((B1PV...) 가 수정 후 If((B1B4...)라면 알 것 같은데, 중간에 생략된 부분이 있는 것인지요?
[ACPI 패치 강좌] 배터리 패치 관련 Method 문법과 구문 별 패치 강좌 + RECB / WECB Method 구별하기! (x86.co.kr)
2. 8비트 세분화 중 몇몇 변수(B2RR, B2PV, B2AF, B2VL)는 DSDT에서 확인 시 32비트로 선언(?)만 되어 있고 다른 곳에서 쓰이지 않는데, 이 경우 아래와 같이 8비트로 쪼갤 필요없이 그냥 32비트로 놔둬도 되는 게 아닌지 궁금합니다.
3. W16B Method로 변수 'BTPC' 관련 내용을 수정했는데, 아래와 같이 3개의 오류가 발생합니다. 어떻게 처리해야 하는지 알고 싶습니다.
수정(추가) 내용은 다음과 같습니다.
1. '3. 32 Bit 분할 레지스터 읽기 : B1B4...'에서 이해가 안 되는 부분이 있는데, B1CH가 어디서 나온 건지 모르겠습니다.
조건문에서 수정 전 If((B1PV...) 가 수정 후 If((B1B4...)라면 알 것 같은데, 중간에 생략된 부분이 있는 것인지요?
B1CH 변수는 그냥 예제에서 가져온 것입니다.
https://xstar-dev.github.io/hackintosh_advanced/Guide_For_Battery_Hotpatch.html
2. 8비트 세분화 중 몇몇 변수(B2RR, B2PV, B2AF, B2VL)는 DSDT에서 확인 시 32비트로 선언(?)만 되어 있고 다른 곳에서 쓰이지 않는데, 이 경우 아래와 같이 8비트로 쪼갤 필요없이 그냥 32비트로 놔둬도 되는 게 아닌지 궁금합니다.
-> 네, 선언만 되어 있고 다른 곳에서 사용되지 않으면 8비트로 쪼갤 필요가 없으며, 그대로 두면 됩니다.
3. W16B Method로 변수 'BTPC' 관련 내용을 수정했는데, 아래와 같이 3개의 오류가 발생합니다. 어떻게 처리해야 하는지 알고 싶습니다.
-> 댓글의 사진을 확인해보면 W16B Method 의 코드 내용이 잘못되었으며, 인수 개수가 3 이 아닌 2 로 정의되어 있습니다.
다음과 같이 수정해주세요.
Method (W16B, 3, NotSerialized)
{
Arg0 = Arg2
Arg1 = (Arg2 >> 0x08)
}
또한, 기존에 BTPC 변수를 사용하는 곳을 보면 ^^PCI0.LPCB.H_EC.BTPC = Local0 으로 코드가 작성되어 있었습니다.
BTPC 변수 앞에 ^^PCI0.LPCB.H_EC. 를 붙여서 경로도 같이 작성되어 있었습니다.
그러므로, W16B(TPC0, TPC1, Local0) 이 아닌
W16B(^^PCI0.LPCB.H_EC.TPC0, ^^PCI0.LPCB.H_EC.TPC1, Local0) 으로 패치해야 합니다.
W16B(\_SB.PCI0.LPCB.H_EC.TPC0, \_SB.PCI0.LPCB.H_EC.TPC1, Local0) 처럼 절대 경로를 사용해도 됩니다.
TPC0, TPC1 (쪼개기 전에는 BTPC) 변수는 H_EC Device 에서 정의되었으므로
이 변수에 접근 및 사용할 수 있는 Scope 범위는 H_EC Device 의 중괄호 { } 로 묶여진 블록입니다.
변수가 선언된 블록 범위 밖에서 그 변수에 접근하려면 절대 경로를 앞에 붙이거나 Parent Scope 기호인 ^ 를 사용하여 접근해야 합니다.
^ 기호는 처음 다룬다면 조금 헷갈리기 쉽습니다.
TPC0 변수를 \_SB.BAT1 경로의 _BTP Method 에서 접근하여 사용하려고 하므로,
\_SB.BAT1._BTP 인데, 접근하려고 하는 TPC0 변수의 절대 경로는
\_SB.PCI0.LPCB.H_EC.TPC0 입니다.
\_SB Scope 이후부터 경로가 달라지므로
\_SB.BAT1._BTP 에서 Parent Scope 기호 ^ 를 2번 사용하면 \_SB Scope 가 되며,
그 이후 하위 경로인 PCI0.LPCB.H_EC.TPC0 로 접근하면 되므로
정리하면 ^^PCI0.LPCB.H_EC.TPC0 와 같이 접근하면 됩니다.
만약, Parent Scope 기호 ^ 를 3번 사용한다면
^^^_SB.PCI0.LPCB.H_EC.TPC0 이 됩니다.
\_SB.BAT1._BTP 경로에서
^^PCI0.LPCB.H_EC.TPC0
^^^_SB.PCI0.LPCB.H_EC.TPC0
위의 두 개의 코드는 똑같이 TPC0 변수에 접근하는 코드이며 문법적으로 오류는 없습니다.
추가로, Parent Scope 기호 ^ 를 1번만 사용하는 것으로는 TPC0 변수에 접근할 수 없습니다.
마치, 프로그래밍 언어에 비유하면 지역 변수와 전역 변수, 구조체의 멤버 변수 접근과 비슷한 개념입니다.
지역 변수는 선언된 블록 내에서만 접근 및 사용이 가능합니다.
자세한 설명과 ACPI 패치 강좌 덕분에 많이 배우고, 배터리 Static patch도 잘 마쳤습니다.
SSDT Hot patch도 시도 중인데, 점점 헷갈리기 시작하더니 코드도 머리 속도 뒤죽박죽이네요.
어떤 부분에서 잘못 접근하고 있는 건지 봐주시면 고맙겠습니다. (Static Patched DSDT와 SSDT를 첨부합니다.)
1. SSDT 에서 BF10 변수가 시작하는 부분의 Offset 주소값이 잘못되었습니다.
제가 계산해보니 Offset (0xB9) 가 아닌 Offset (0xB0) 이 맞습니다.
2. SSDT 로 가져온 _PTS Method 의 이름을 _QTS 로 바꾸는 것은 옳지 않습니다.
Config.plist - ACPI - Patch 에서 DSDT 에 Rename _PTS to XPTS 패치를 적용해주세요.
추가로, 저는 이름을 _QTS 보다는 XPTS 로 바꾸는 것이 더 헷갈리지 않고 좋을 것 같습니다.
3. If (_OSI ("Darwin")) 구문과 대응되는 Else 구문이 없습니다.
이렇게 되면, OpenCore 부트로더에서 Windows 등의 다른 OS 로 부팅하면 블루 스크린이나 부팅이 되지 않을 수 있습니다.
왜냐하면, 다른 OS 에서는 If (_OSI ("Darwin")) 조건이 거짓(False)이므로 아무 내용도 수행하지 않게 되는데
OS 에서 필요한 Method 의 코드 내용이 비어 있게 되므로 오작동할 확률이 높습니다.
4. Scope (BAT1) 이 아닌 Scope (\_SB.BAT1) 으로 수정해야 합니다.
그리고, Scope (\_SB.BAT1) 으로 수정한 후에는 External (\_SB.BAT1, DeviceObj) 외부 참조를 추가해야 합니다.
5. SSDT 로 가져온 SBIX Method 의 이름도 XBIX 로 바꾸는 것은 옳지 않습니다.
6. _BIF Method, _BIX Method, STAT PkgObj 는 SSDT 로 가져올 필요가 없습니다.
단, 배터리 패치를 하면서 _BST Method 가 수정되었는데, _BST Method 에서 STAT 을 사용하므로
External (\_SB.BAT1.STAT, PkgObj) 을 추가하여 DSDT 로부터 외부 참조하면 됩니다.
External (\_SB.BAT1.STAT, IntObj) 라는 외부 참조가 이미 정의되어 있는데, IntObj 가 아닌 PkgObj 가 맞습니다.
7. 위의 3번을 수정하면 배터리 관련 변수를 치환하면서 패치했던 부분에서 모두 Error 가 발생하며 모두 수정해주세요.
B1B4 (^^_SB.PCI0.LPCB.H_EC.BF10, ^^_SB.PCI0.LPCB.H_EC.BF11, ^^_SB.PCI0.LPCB.H_EC.BF12, ^^_SB.PCI0.LPCB.H_EC.BF13)
위의 코드에서 ^^ 오른쪽의 _SB. 을 모두 제거해주세요.
B1B4 (^^PCI0.LPCB.H_EC.BF10, ^^PCI0.LPCB.H_EC.BF11, ^^PCI0.LPCB.H_EC.BF12, ^^PCI0.LPCB.H_EC.BF13) 이 맞습니다.
8. If (_OSI ("Darwin")) 구문은 SSDT 로 가져온 Method 의 바로 하위에 넣어야 합니다.
Scope (\_SB.BAT1)
{
If (_OSI ("Darwin"))
{
Method (SBIX, 0, Serialized)
{
위의 코드 내용을 아래와 같이 작성하는 것이 맞습니다.
Scope (\_SB.BAT1)
{
Method (SBIX, 0, Serialized)
{
If (_OSI ("Darwin"))
{
그리고, 각 Method 안의 If (_OSI ("Darwin")) 와 대응되는 Else 구문에서
Config.plist - ACPI - Patch 에서 DSDT 에 Rename 패치하였던 이름의 Method 로 호출하거나 Return 되도록 하면 됩니다.
아래의 SSDT 를 참고해보세요.
https://github.com/wei756/NT950XCR-G58A-Hackintosh/blob/master/DSDT%26SSDT/SSDT-BATT.dsl
1. Offset 다시 계산해보니 제가 잘못 입력한 게 맞았습니다. 말씀해주신대로 수정했습니다.
2. 'Text to Hex' 변환으로 Rename 패치를 다음과 같이 생성하였으나 ByteCode 확인법을 모르겠습니다.
(터미널에서 명령어 실행 시 Command not found : iasl 또는 maciasl 오류 발생)
노트북 하드웨어 구성/바이오스 변경 업데이트 시 DSDT/SSDTs 패치 안 하기: hotpatch (x86.co.kr)
3. If (_OSI ("Darwin")) 구문과 대응되는 Else 구문을 작성하였으나 사진과 같이 오류가 발생합니다.
Syntax Error는 Return 값 구문 오류인 듯 싶은데 어떻게 처리해야 하는지 알려주시면 감사하겠습니다.
4. Scope (\_SB.BAT1)로 수정하고, External (\_SB.BAT1, DeviceObj)를 추가하였습니다.
5. 원래 이름인 SBIX로 수정하였습니다.
6. _BIF Method와 _BIX Method를 삭제하고, External (\_SB.BAT1.STAT, PkgObj)를 추가하였습니다.
7. '^^_SB'를 '^^'로 대체하였습니다.
8. Method 하위에 'If (_OSI ("Darwin"))'을 반영하였습니다.
9. 참고 자료에서 배터리를 세분화한 OperationRegion과 패치 관련 Method(B1B2)에 'If (_OSI ("Darwin"))'의 대응 Else 구문이 없는 건 SSDT 내 즉, macOS에서만 사용하는 코드이기 때문에 Else 구문이 필요 없어서인 건가요?
관련 자료를 첨부합니다.
2. 'Text to Hex' 변환으로 Rename 패치를 다음과 같이 생성하였으나 ByteCode 확인법을 모르겠습니다.
(터미널에서 명령어 실행 시 Command not found : iasl 또는 maciasl 오류 발생)
-> 터미널에서 iasl 명령어를 실행하기 위한 바이너리 파일이 필요합니다.
터미널에서 주로 사용하는 명령어인 cp, rm, ls, kextload, mount 등은
원래, macOS 시스템 파티션의 /bin, /sbin 경로에 내장되어 있습니다.
하지만, iasl 바이너리 파일은 MaciASL 앱에 내장되어 있고 이를 꺼내와서 사용하면 됩니다.
MaciASL 앱을 마우스 우클릭하고 패키지 내용 보기를 눌러서 Contents - MacOS 폴더에 들어가고
iasl-stable 파일을 복사한 후에 Byte Code 로 디컴파일하려는 DSDT 파일이 있는 경로에 붙여 넣습니다.
그리고, iasl-stable 파일 이름을 iasl 로 변경하고 터미널에서 아래의 명령어를 실행하면 됩니다.
./iasl -l DSDT.aml
3. If (_OSI ("Darwin")) 구문과 대응되는 Else 구문을 작성하였으나 사진과 같이 오류가 발생합니다.
Syntax Error는 Return 값 구문 오류인 듯 싶은데 어떻게 처리해야 하는지 알려주시면 감사하겠습니다.
-> XPTS 앞에 언더바 _ 를 붙이면 안 되며, 역슬래시 \ 도 붙일 필요가 없습니다.
ACPI 에서 변수 이름은 거의 대부분 4자리이며, 최상단 루트 Scope 에 정의되었으므로 \ 를 사용할 필요가 없습니다.
그리고, 변수 이름이 언더바 _ 로 시작하는 것들은 (예시 : _CRS, _DSM, _HID, _OSI, _STA, _UID, _Qxx 등)
ACPI 에서 특별한 목적으로 사용되는 예약어(키워드)입니다.
또한, _PTS Method 의 코드 내용을 보면 어떠한 값을 Return (반환)하는 코드가 없으므로
Else 구문에서 Return 을 사용하기 보다는 Call (호출)하는 것이 더 적합합니다.
Else
{
Return (\_XPTS())
}
위의 코드를 아래와 같이 수정하면 됩니다.
Else
{
XPTS()
}
Return (\_SB.BAT1.XSBIX()) 도
Return (\_SB.BAT1.XBIX()) 로 수정해야 합니다.
_BST Method 의 Else 구문에서는 다음과 같이 수정합니다.
Return (\_SB.BAT1.XBST ())
_BTP Method 의 Else 구문에서는 다음과 같이 수정합니다.
\_SB.BAT1.XBTP(Arg0)
추가로, 외부 참조 중에서 External (\_SB.PCIO.LPBC.H_EC.PTS, MethodObj) 는 삭제해도 될 것 같습니다.
SSDT 에서 해당 변수를 사용하는 코드가 없습니다.
9. 참고 자료에서 배터리를 세분화한 OperationRegion과 패치 관련 Method(B1B2)에 'If (_OSI ("Darwin"))'의 대응 Else 구문이 없는 건 SSDT 내 즉, macOS에서만 사용하는 코드이기 때문에 Else 구문이 필요 없어서인 건가요?
-> 네, Windows 등의 다른 OS 가 아닌 macOS 에서만 필요하기 때문에 Else 구문이 필요하지 않습니다.
2. 말씀해주신 방법으로 DSDT.dsl 추출 후 ByteCode 확인하였습니다.
3. 해당 내용 모두 반영 및 관련 외부 참조 추가하여 오류 없이 컴파일 완료 후, SSDT 배터리 패치를 완료하였습니다.
4. Rename 패치와 관련하여 궁금한 사항이 있습니다. (아래 사진은 제 이전 댓글에 있는 Rename 패치 내용입니다.)
SSDT-BATT.aml 생성 후 설정을 마치고 재부팅을 해보니 배터리 아이콘이 뜨지 않았습니다. 그래서 DSDT를 확인해본 결과 XBIX를 제외한 나머지 명칭이 바뀌지 않았습니다.
(위에서 설명해주신 바와 같이 '_'의 경우 예약어라서 Rename이 안 되는 것 같아) XPTS, XBST, XBTP의 경우 '_'를 제거하여 정상적으로 패치가 되었는데, XECR은 해당 사항이 아닌데도 패치가 안 됐습니다.
그래서 (많이 사용하는) XCR로 설정하니 Rename 패치가 되어 비로소 배터리 SSDT 패치가 완료되었습니다. ECR의 경우 '_'처럼 특별한 이유가 있는 것인가요?
ECR 을 XECR 로 Rename 하는 패치는 적용하면 안 됩니다.
macOS 가 아닌 다른 OS 로 부팅한 경우에는 기존의 DSDT 에 ECR Field 에 정의되어 있던 배터리 변수를 사용합니다.
지금 다시 SSDT-BATT.dsl 내용을 보니 수정해야 하는 부분이 하나 더 있습니다.
OperationRegion (ECR, EmbeddedControl, Zero, 0xFF)
Field (ECR, ByteAcc, Lock, Preserve)
위의 코드를 아래와 같이 수정해주세요.
OperationRegion (XECR, EmbeddedControl, Zero, 0xFF)
Field (XECR, ByteAcc, Lock, Preserve)
그리고, 언더바 _ 로 시작하는 예약어(키워드) 변수도 Rename 잘 됩니다.
Rename 패치를 할 때 Find, Replace 값의 크기(길이)가 같게 패치해주세요.
아래와 같이 Rename 패치를 수정해주세요.
Rename _PTS to XPTS
Find : 5F 50 54 53 01
Replace : 58 50 54 53 01
Rename SBIX to XBIX
Find : 53 42 49 58 08
Replace : 58 42 49 58 08
Rename _BST to XBST
Find : 5F 42 53 54 08
Replace : 58 42 53 54 08
Rename _BTP to XBTP
Find : 5F 42 54 50 09
Replace : 58 42 54 50 09
SSDT-BATT.aml에서 ECR을 XECR로 수정하였습니다.
'Find', 'Replace' 설명을 보고 (위의 패치가 안 됐던) 사진을 보니 제가 길이를 다르게 설정해서 패치가 안 되었던 것이었습니다. 그리고 적용값은 DSDT.dsl에서 선언 부분의 코드를 따와야 되는 것이었군요.
말씀해주신 사항 모두 반영 후 배터리 패치가 제대로 작동함을 확인하였습니다. 설명과 함께 확인까지 감사합니다.
윗 댓글에서 질문을 하나 누락했습니다. 다름 아니라 ECR만 특별히 DSDT가 아니라 SSDT-BATT.aml에서 XECR로 변경하는 이유가 있나요?
다른 변수(함수(?))의 경우 macOS가 SSDT-BATT.aml에서 (DSDT에 있던) 원래 이름을 사용하고 다른(macOS가 아닌) OS는 DSDT에서 Rename Patched 변수(함수(?))를 사용하는데 반해, ECR의 경우 반대로 DSDT에서 다른 OS가 원래 이름을 사용하고, macOS는 SSDT에서 Rename Patched 변수(함수(?))인 XECR를 사용하는 모양새라 이유가 궁금합니다.
마지막 안정화로 트랙패드(터치패드) SSDT를 설정 중인데, SSDT-SPTP.dsl 컴파일 시 오류가 발생합니다.
오류의 해당 주소에서 '_ADR'은 SPTP뿐만 아니라 DSDT의 여러 다른 곳에서도 다른 형태로 선언 후 사용되는 것이라 Rename patch 적용 대상이 아닌 것 같고, '_Y36'의 경우 _CRS Method 내에서만 사용 돼 어느 부분이 문제인지 모르겠습니다.
윗 댓글에서 질문을 하나 누락했습니다. 다름 아니라 ECR만 특별히 DSDT가 아니라 SSDT-BATT.aml에서 XECR로 변경하는 이유가 있나요?
다른 변수(함수(?))의 경우 macOS가 SSDT-BATT.aml에서 (DSDT에 있던) 원래 이름을 사용하고 다른(macOS가 아닌) OS는 DSDT에서 Rename Patched 변수(함수(?))를 사용하는데 반해, ECR의 경우 반대로 DSDT에서 다른 OS가 원래 이름을 사용하고, macOS는 SSDT에서 Rename Patched 변수(함수(?))인 XECR를 사용하는 모양새라 이유가 궁금합니다.
-> macOS 에서 꼭 원래 이름을 사용해야 하는 것은 아닙니다.
배터리 패치를 SSDT 로 하려다보니 그렇게 된 것입니다.
_PTS, SBIX, _BST, _BTP Method 는 배터리 패치를 하면서 코드의 양이 늘어났습니다.
이 부분은 Config.plist - ACPI - Patch 에서 DSDT 에 Rename 패치로 할 수 있는 부분이 아닙니다.
그래서, 배터리 패치된 Method 를 SSDT 로 가져오기 때문에 SSDT 에서 원래 이름의 Method 가 SSDT 로 오게 된 것입니다.
또한, ECR Field 는 배터리 관련 변수가 같은 위치의 Offset 에 정의되어 있는데 Field 이름이 서로 같으면
배터리 관련 변수가 같은 위치의 Offset 에 정의되어 있는데 Field 이름이 서로 같으면 엑세스할 때 오류가 발생합니다.
그래서, 원래의 ECR 과는 다른 이름으로 아무거나 바꾸면 됩니다.
그리고, DSDT 에서 XCR 등의 다른 이름으로 Rename 하고 SSDT 에서 ECR 로 사용해도 됩니다.
단, 이의 경우에는 Config.plist - ACPI - Patch 에서 Rename 패치를 적용해야 하는데 굳이 불편하게 이렇게 할 필요가 없다는 것입니다.
그냥 SSDT 로 ECR Field 를 가져오고 이름만 바꿔주는게 Rename 패치할 필요도 없고 편리합니다.
오류의 해당 주소에서 '_ADR'은 SPTP뿐만 아니라 DSDT의 여러 다른 곳에서도 다른 형태로 선언 후 사용되는 것이라 Rename patch 적용 대상이 아닌 것 같고, '_Y36'의 경우 _CRS Method 내에서만 사용 돼 어느 부분이 문제인지 모르겠습니다.
-> XCRS 가 아닌 _CRS 이어야 합니다.
CreateByteField (SBFB, \_SB.PCI0.I2C0.SPTP.XCRS._Y36._ADR, ADR2) 가 아닌
CreateByteField (SBFB, \_SB.PCI0.I2C0.SPTP._CRS._Y36._ADR, ADR2) 이어야 합니다.
또한, Rename _CRS to XCRS 패치의 Find, Replace 값을 저렇게 입력하면 안 됩니다.
저렇게 입력하면 SPTP Device 가 아닌 다른 Device 의 _CRS Method 도 다 바뀌게 됩니다.
그러면, 다른 장치에서 _CRS Method 가 사라져 버리게 되므로 장치가 오작동하거나 오류가 발생할 수 있습니다.
SPTP Device 의 _CRS Method 만 Rename 될 수 있도록 Find, Replace 값을 더 길게 지정해야 합니다.
Rename _CRS to XCRS in SPTP Device
Find : 14 41 08 5F 43 52 53 00
Replace : 14 41 08 58 43 52 53 00
Rename 관련하여 자세하게 설명해주신 덕분에 이해를 잘 했습니다.
그리고 말씀해주신 수정 사항 모두 반영하여 마지막 트랙패드(터치패드) SSDT 패치까지 완료하였습니다. (컴파일 시 주의 표시는 무시하고 넘어갔습니다.)
이번 기회를 통해 ACPI 관련 내용을 많이 배웠습니다.
일단 완성은 했지만 설명해주신 내용들을 모두 소화할 수는 없었고, 여러 번 읽어보면서 되새김질을 해야 할 것 같습니다.
고수왕님의 도움의 손길이 없었으면 노트북 안정화 시도도 못 했을 겁니다.
처음부터 끝까지 귀중한 시간과 지식을 아낌없이 나눠주시고, 신경 써주셔서 마음 깊이 감사드립니다. :)
BIOS 설정에서 CSM 을 Enabled (On) 으로 설정하는 것을 시도해 볼 수 있습니다.
혹시, BIOS 설정의 Boot 탭에서 OS Mode Selection 항목을 UEFI OS 가 아닌
CSM and UEFI OS 로 설정하고 다시 부팅해보세요.
만약, 그래도 글리치 문제가 발생한다면 Config.plist 에서
UEFI - Output - Resolution 항목의 값을 1366x769 등으로 작게 설정하고 다시 부팅해보세요.