추가사양 및 설치(할)OS | 좌절금지 10.13.1 |
---|---|
공지숙지/증상설명 | 숙지 |
현재 클로버에서 dsdt를 추출하여 MaciASL 프로그램에서 수정하려고 하는데, 팁 게식판에 있는 dsdt 수정 방법에 있는 게식물을 보았는데도 이해가 가질않아 질문합니다.
IVDG, 64,
DSPR, 8,
DDSO, 16,
DDSF, 16,
DSAD, 8,
DSRS, 8,
DVDG, 64,
EIDF, 8,
GFPS, 32,
GFPI, 32,
GNSM, 8,
GNSC, 8,
GGNR, 32,
GBTW, 32,
GBTK, 32,
GBTI, 32,
GPDI, 32,
GPLI, 32,
일단 배터리를 잡기위해 기본적인 dsdt의 오류를 잡아주고, 위 글에 있는것을 16비트 이상인것을 8비트로 나누어주면 되는건가요?
( ex DDSF, 16, 을 DDS0, 8, DDS1, 8, )
월드님의 새글 알림을 받으실려면 구독
자세한 설명 정말정말 감사드립니다ㅠㅠㅠㅠㅠ
제게 아직 dsdt 수정은 너무 먼산인거 같습니다... 일단 dsdt 수정하는데 노가다 일뿐더러 너무 어렵네요ㅠㅠㅠ
하다가 포기했습니다,,,ㅠㅠㅠㅠㅠ
1. MacIASL 설치
1-1. 아래 링크를 다운로드 받아 압출을 풀면 나오는 MaciASL 앱을 어플리케이션 폴더 (파인더 좌측의 “응용 프로그램” (=/Applications/)으로 복사합니다.
https://bitbucket.org/RehabMan/os-x-maciasl-patchmatic/downloads/RehabMan-MaciASL-2017-0117.zip
2. iASL 설치
2-1. 아래 링크의 파일을 다운로드 받아 압축을 풉니다.
https://bitbucket.org/RehabMan/acpica/downloads/iasl.zip
2-2. 터미널에서 다음과 같이 입력하이 iasl을 /usr/bin으로 복사합니다.
$ sudo cp ~/Downloads/iasl /usr/bin/
2-3. MaciASL 앱 내의 iasl도 변경합니다.
$ sudo cp /usr/bin/iasl /Applications/MaciASL.app/Contents/MacOS/iasl161
------
3. AML을 DSL로 변환하기
/EFI/CLOVER/ACPI/ORIGINAL 폴더에 미리 추출해놓은 AML파일을 작업용 폴더에 복사합니다.
3-1. 바탕화면에 “0_test”라는 이름으로 폴더를 만듭니다.
3-2. 여기로 acpi파일들을 복사해옵니다.
3-3. 터미널을 열어 해당 폴더로 이동합니다.
$ cd ~/Desktop/0_test
3-4. 다음 텍스트를 드래그하여 선택하고 command + c를 눌러 클립보드에 복사합니다.
External(MDBG, MethodObj, 1)
External(_GPE.MMTB, MethodObj, 0)
External(_SB.PCI0.LPCB.H_EC.ECWT, MethodObj, 2)
External(_SB.PCI0.LPCB.H_EC.ECRD, MethodObj, 1)
External(_SB.PCI0.LPCB.H_EC.ECMD, MethodObj, 1)
External(_SB.PCI0.PEG0.PEGP.SGPO, MethodObj, 2)
External(_SB.PCI0.GFX0.DD02._BCM, MethodObj, 1)
External(_SB.PCI0.SAT0.SDSM, MethodObj, 4)
External(_GPE.VHOV, MethodObj, 3)
External(_SB.PCI0.XHC.RHUB.TPLD, MethodObj, 2)
3-5. 클립보드에 있는 내용을 refs.txt라는 파일을 만들어 붙여넣습니다.
$ pbpaste > refs.txt
3-6. DSDT, SSDT를 함께 aml->dsl 변환합니다.
$ iasl -da -dl -fe refs.txt DSDT.aml SSDT*.aml
DSL 파일이 만들어졌습니다.
------
4. DSDT 수정
이렇게 변환한 DSDT.DSL을 MaciASL으로 열어서 상단의 컴파일 아이콘을 눌러보면 빨간 아이콘의 에러가 표시됩니다. 윈도우에서는 이상 없이 작동되겠지만 macOS에서는 에러가 나는 부분(?) 이거나, iasl의 디컴파일 버그로 인해 잘못된 부분인 것 같습니다.
패치하기 전에 이것들 먼저 해결해야 합니다.
제 DSDT의 경우 열자마자 컴파일을 하면 위 와 같은 에러가 나타났습니다.
에러표시난 줄을 클릭하면 해당 행으로 이동합니다.
이동한 줄 위에 보시면 Store (MMTB (), Arg0) , 그리고 그 아래. Local0은 변수 혼자 덩그러니 있습니다.
Store 명령이니까 앞에 있는걸 뒤에다가 넣으라는 명령일텐데, 그 뒤..라는건 변수나 어떤 주소가 되어야 하는데 Arg0이 올 수는 없습니다. 이상하죠. 그럼 MMTB가 뭔지 찾아봅니다.
메소드였습니다. 한개의 변수(argument)와의 조합으로 명령어가 구성되는군요.
이 변수값이 0인 경우 변수명() <= 이렇게 선언할 수 있는데, 이 메소드는 1개의 Arg를 갖게 되어있습니다. 자동사와 타동사의 차이같은거라고 보시면 됩니다. 그럼, 아까 화면으로 다시 돌아가보겠습니다.
A를 B에 넣는다… Store (A, B)이니까. 다음과 같이 되어야 문법이 맞습니다.
Store (MMTB (Arg0), Local0)
MMTB(Arg0)으로 불러온 값을 Local0에 써넣는거죠.
위와 같이 변경하고 다시 컴파일을 해보니 에러 한 개가 사라졌지요.
이제 다음 에러를 보겠습니다.
또 MMTB네요. 대신 이번에는 앞의 명령이 Store가 아닌 Add입니다. 더하는거죠.
Add (A, B, C) 는 A와 B의 합을 C에 넣는 것입니다.
그렇다면,
Add (MMTB (Arg0), 0x0548, Local0)
또는
Add (MMTB (Arg0), Local0, 0x0548)
이 둘 중 하나라는 것인데요.
어이쿠.. MMTB(Arg0)에 Local0을 더한 값을 0x0548로 보내게 해놓고 컴퍼일을 돌려보니.. 에러가 안 사라지네요. 그럼 Local0 0x0548의 자리를 바꿔보겠습니다.
오! 에러가 없어졌습니다. 이게 맞는건가 봅니다.
그럼 다음 에러를 보겠습니다.
MMTB와 …TFPS라는것도 좀 거슬리네요.
TFPS도 메소드인 것 같은데.. 한 번 찾아보죠. “Method (TFPS” 키워드로 찾으면 금방 찾겠군요.
변수 없이 그냥 사용하는.. (목적어 없이도 사용할 수 있는) 자동사 같은 메소드였군요. 그럼. TFPS() 로 사용되는게 맞는 것 같습니다.
그럼 또 MMTB네요.
Add (MMTB (Arg0), Local1)로 고쳐주니 에러가 또 사라졌습니다.
남은 것들도 결국 이 두 패턴의 에러더군요. 마저 고쳐주고 다시 컴파일 버튼을 눌러봅니다.
.....
응?????;;;;
그렇습니다. 아까까지의 (기본중에 기본적인) 문법 에러를 고치고 나면 이제 좀 더 본격적인 에러를 볼 수 있습니다.
워닝소리는 일단 두고 에러를 보겠습니다.
Name aleady exists in scope (~~~)
이런 에러는 소괄호 안의 이름을 검색하셔서 가장 위에 있는 External (~~~~) 줄을 삭제하거나 주석처리 하면 됩니다. 중복된다는 거니까요.
주석처리하고 다시 컴파일해보면 에러가 사라집니다.
메소드 로컬 변수가 초기화 되지 않았다..Local1이 그렇다는 것 같네요.
이상하긴 합니다.
Add 명령이면 값이 세개여야하는데 두 개 밖에 없네요.
Local1은 동 메소드 내에서 단 한 번 사용되는데 그게 바로 다음 줄의 OperationRegion 선언 입니다. 어떤 선언에 사용될 변수라면 여기서는 결과값이 되어야 할 것 갈은데요.
그럼.
Add (MMTB (Arg0), <?여기 무엇?>, Local1)
<>요 사이에 뭐가 들어갈지 찾아야 하는데…. 솔직히 자신은 없습니다만, 바로 윗줄에서 TFPS()값을 받아온 Local0이거나 또 다른 값일겁니다. 그런데 아까 맨 처음 해결했던 에러같은 패턴을 보면 Local? 값이 줄이 밀리곤 했으니.. 이번엔 누락되었다고 생각해보기로 했습니다.
Add (MMTB (Arg0), Local0, Local1) 로 수정해봅니다.
맹신할 수는 없겠지만, 일단 에러는 사라졌습니다.
어떤 가이드에는 이런 경우 그냥 Zero를 추가해 넣으라고 하는데요. 상황을 모르는 상태에서 조언을 해야하니 그냥 아무 값이나 채워 넣으면 문법은 통과할 수 있단는 의미인 것 같습니다. 또 애초에 Zero를 넣을 거였으면 Add를 쓸 필요 없이 Store를 썼을거라 생각하고요.
뭐, 어째튼 이렇게 에러를 잡아보았습니다.
남은건 워닝소리네요.
Not all control paths return value
모든 컨트롤 패스에 리턴값이 붙어있지는 않다.. 리턴값이 돌아오는 조건은 있는데, 돌아오지않는 경우도 있다는 것입니다. 리턴값이 돌아와야 하는 부분에서 안 돌아온다면 문제이지만, 그래도 문제없는 경우는 문제가 되지 않습니다.
그래도 너~무 너무 거슬린다면 이렇게 없앨 수 있습니다.
길이가 긴건 거시기 하니까(?) 짧아서 보기 편한 GPEH 메소드를 보겠습니다.
DVID가 0xFFFF이면 Return (Zero)하고, 그렇지 않을경우만 뭘 하라는거니까요. 여기서 포인트는 그 뭘 하라는거 아니겠습니까? 그럼 그도 저도 아니면 DVID가 0xFFFF일때와 동일하게 처리하면 되겠네? 이런 생각의 흐름을 거쳐서..
Return (Zero)를 추가보겠습니다. 라인 번호 5311 기억해주세요.
네. 사라졌죠? 이렇게 특정 상황에 취할 행동이 정해지지않은것에 대한 에러는 읽어보시고 논리적으로 무난한 값을 채워 넣으면 되고.. 또.. 그냥 놔두셔도 됩니다.(?)
마지막.. _VPC, _CFG. Unknow reserved name이라고 나오네요.
이건 저도 아직 정확히 모르겠습니다만 _VPC => VPC로, _CFG => CFG로. 언더바를 없애주면 된다고 합니다.
됐네요.
어? Method Local is set but never user (Local2).. 이건 뭔가요.
Local2에 뭐가 들어가긴 했는데 아무데도 안쓰고 무용지물인데 이거 뭐 잘못된거 아니냐고 묻는 것 같습니다.
FPPC메소드에 속한 부분이군요.
PPCM 값을 Local0에 넣고 이게 0x08이면 얼씨구절씨구 한 값을 Local2에, 0x09면 또 얼씨구절씨구 한 값을 Local2에!, 그도 아니면서 뭐가 뭐보다 작으면 Local0값을 Local2에!!!!!, 그도 아니면 APST값을 Local2에!!
Local2 가 서울이네요. 어찌됐건 Local2로 가는군요.
그러고는 그냥 끝? 입력해놓은 Local2값은 버리네요?
리턴해줘야할 것 같습니다.
Return (Local2) 를 넣어줍시다!
워닝 소리가 사라진 것 도 그렇지만, 논리적으로도 이상하지않았죠? 각 메소드는 실행되었을 때 뭔가 돌려줘야하는데, 내부적으로 담아놓기만 하고 사라지는데다가.. 그 담아놓는 곳이 다 동일했다면, 그걸 리턴하는게.. 맞겠죠? ㅎㅎ
남은 not all controll path return a value 워닝들은 그냥 두시거나 처리하시면 됩니다.
File 메뉴에서 Save As에 들어가 보시면 기본 DSL로 저장되도록 되어있는데 클릭해보시면 AML로 전환할 수 있습니다. 이렇게 DSDT.AML을 저장하시면 됩니다.
이제 배터리 관련부를 수정할 DSDT 준비가 끝났습니다.
일단 저장하시고, 또 다른 이름으로 복제하고 그걸 수정해 나갑니다.
나중에 햇갈릴때 롤백하기 편합니다.
저는 요렇게 새로 작업할 것은 복사해서 새 번호를 붙이고 수정했습니다. 나중에 예전거 다시 확인해야 할 때 편합니다.
일하는데 짬 내서 적고는 있는데..시간이 많이 걸리네요.
본편이 될 배터리 부분은 다음에 또 시간이 되면 올리겠습니다.
이거 읽어보시고 DSDT와 조금은 친해지셨으면 좋겠습니다. :)
헐 이제서야 보게되었습니다,,,
이거 작성하시는데 정말 많이 힘드셨을텐데 이렇게 하나하나 세세하게 작성해주셔서 정말 감사합니다!
제가 현재 시험기간이다보니 현재 dsdt 수정을 못하지만 시험 끝나고 바로 해보도록 하겠습니다,,,
정말정말 감사드리고,, 제가 작성하는 질문 모든곳에 하나하나 다 알려주시고 정말 너무 감사드립니다,,ㅠㅠㅠㅠ
우와~~~~~
감탄사 연발~~~
자세한 설몀 너무 감사 합니다
전 이번 놋북은 수정 안해도 배터리 표시라
좋은 정보 감사합니다 ^^
와 삽질의 끝을 보는 느낌이군요. 해킨한지 3년 째인데 아직도 DSDT는 난공불락이라...
빨리 lilu 같은 배터리 패치 모듈이 나와야 할텐데...
그러기 전에는 어떡하든 DSDT와 친해져야 할텐데 이 글이 도움이 되겠군요.
"님의 댓글"
이 댓글을 신고 하시겠습니까?
제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|
모니터(오류화면) 사진 찍을 때 팁(소소함) +269 | 달쇠 | 17.07.3020:49 | 11만 |
빠르고 정확한 답변을 받는 팁 및 질답자의 매너, EFI폴더 압축법 +90 | Mactopia | 17.02.1014:21 | 12만 |
제온 내장그래픽을 못잡겟네요 ㅠㅠ +9 | 데스맥 | 24.10.0207:44 | 64 |
GTX TITAN 그래픽과 macOS의 호환성. +5 | 민준송 | 24.09.3014:22 | 135 |
해킨 윈도우 듀얼부팅일때 윈도우 보안부팅 활성화 해보신분 있을까요? +2 | oreo | 24.09.2922:21 | 88 |
데스맥 | 24.10.0207:44 | 65 | |
민준송 | 24.09.3014:22 | 135 | |
oreo | 24.09.2922:21 | 88 | |
수박 | 24.09.2917:58 | 83 | |
루마루 | 24.09.2913:21 | 70 | |
루마루 | 24.09.2910:19 | 116 | |
머트 | 24.09.2723:18 | 96 | |
ashly | 24.09.2720:41 | 111 | |
loopers | 24.09.2716:50 | 121 | |
Caper | 24.09.2602:42 | 161 | |
낡은기계 | 24.09.2301:36 | 187 | |
Door | 24.09.2122:38 | 121 | |
루베콘 | 24.09.2108:35 | 181 | |
에잉 | 24.09.2022:16 | 400 | |
밤가시 | 24.09.1910:03 | 190 | |
SUNWAYFOTO | 24.09.1822:20 | 208 | |
Nelson | 24.09.1815:34 | 373 | |
sebali | 24.09.1814:34 | 373 | |
Panictosh | 24.09.1813:37 | 186 | |
SUNWAYFOTO | 24.09.1801:27 | 223 | |
그냥인간 | 24.09.1719:17 | 128 | |
dlraud | 24.09.1620:36 | 241 | |
Nelson | 24.09.1618:45 | 188 | |
아스타틴 | 24.09.1612:07 | 80 | |
lesmi | 24.09.1522:02 | 146 | |
윤수꾸하하 | 24.09.1323:56 | 195 | |
뚜비 | 24.09.1319:18 | 206 | |
Steer | 24.09.1200:33 | 170 | |
상큼버터 | 24.09.0918:08 | 219 | |
인터찹 | 24.09.0717:13 | 968 | |
서재희 | 24.09.0711:07 | 1442 | |
시습이 | 24.09.0113:39 | 1250 | |
블루 | 24.08.3022:44 | 476 | |
lesmi | 24.08.2911:20 | 417 | |
김덕뱀 | 24.08.2823:04 | 225 | |
그냥구름 | 24.08.2517:14 | 284 | |
Panictosh | 24.08.2218:42 | 252 | |
YouPick | 24.08.2022:45 | 127 | |
윤수꾸하하 | 24.08.2018:52 | 133 | |
HopeMan | 24.08.2012:14 | 211 | |
Panictosh | 24.08.1913:41 | 183 | |
YouPick | 24.08.1509:07 | 441 | |
Panictosh | 24.08.1518:04 | 346 | |
hackillious | 24.08.1514:14 | 144 | |
shion | 24.08.1420:32 | 118 | |
인터찹 | 24.08.1418:19 | 115 | |
Panictosh | 24.08.1217:23 | 423 | |
오디세이 | 24.08.1112:07 | 123 | |
동집 | 24.08.1105:35 | 239 | |
동집 | 24.08.1102:48 | 146 | |
유튜브 | 24.08.1019:03 | 156 | |
유튜브 | 24.08.0909:14 | 297 | |
Direct | 24.08.0901:18 | 258 | |
Panictosh | 24.08.0809:46 | 166 | |
인터찹 | 24.08.0801:41 | 126 | |
mac니망 | 24.08.0615:24 | 161 | |
페러 | 24.08.0615:10 | 145 | |
페러 | 24.08.0600:03 | 120 | |
bl | 24.08.0522:08 | 92 | |
Sequoia | 24.08.0410:04 | 261 | |
Panictosh | 24.08.0320:43 | 90 | |
yeojun | 24.08.0310:01 | 112 | |
yeojun | 24.08.0217:46 | 315 | |
oreo | 24.08.0214:44 | 114 | |
yeojun | 24.08.0214:07 | 272 | |
빅서로가 | 24.08.0118:45 | 306 | |
itstory | 24.08.0118:28 | 191 | |
oreo | 24.08.0115:38 | 96 | |
동집 | 24.07.3122:15 | 167 | |
류가파 | 24.07.3121:42 | 252 | |
마요네즈 | 24.07.3109:23 | 267 | |
동집 | 24.07.3012:52 | 113 | |
동집 | 24.07.2912:11 | 464 | |
인터찹 | 24.07.2901:06 | 314 | |
인터찹 | 24.07.2623:40 | 950 | |
찡준 | 24.07.2611:52 | 94 | |
psychyyy | 24.07.2503:18 | 622 | |
wnsks | 24.07.2502:19 | 150 | |
아키나리 | 24.07.2422:44 | 239 | |
페러 | 24.07.2313:55 | 130 |
https://www.tonymacx86.com/threads/guide-how-to-patch-dsdt-for-working-battery-status.116102/
저는 위 링크를 몇번 반복해서 읽으며 패치를 했습니다.
우선 dsdt, ssdt는 클로버에서 추출하고.
그 추출한 aml을 iasl을 사용해서 dsl 로 변환합니다. 아래 링크에 나온 설명입니다.
https://www.tonymacx86.com/threads/guide-patching-laptop-dsdt-ssdts.152573/
그리고 maciasl을 사용하여 편집할 포인트는..
command + f (find)명령으로 "embedded controller"라는 구문을 검색합니다. 그 중 EC 나 HECI나 ECF2를 찾아서, 8bit 크기가 아닌 것들을 8bit로 쪼개는 것입니다.
이 때 field에 지정은 되어있자만 실제로 사용되지않는 경우 (검색에 결과가 한 개 뿐) 고치지 않아도 됩니다.
다른 배터리 패치를 보면 B1B2, B1B4라는 메소드가 있는데 이걸 DSDT에 직접 추가하시거나, 해당 내용이 적용된 패치를 실행하면 자동으로 입력됩니다. 16비트, 32비트의 경우 위 두 개의 메소드로 처리하면 되는데, 32비트를 넘는 것들은 버퍼로 처리해야합니다. ( 이 역시 첫 링크의 본문에 설명되어있습니다. 필드 내 해당 옵셋값을 계산해서 해당 주소에 직접(버퍼를 통해서, 나누지않고) 적게 됩니다.
버퍼와 관련된 읽기 매소드 2개 쓰기 매소드 2개가 있는데 (쓰기는 필요 없는 경우도 있습니다만/ RECB, RE1B, WECB, WE1B) 이것들도 B1B2, B1B4 뒤에 넣어줍니다.
이건 제 DSDT인데요.
OperationRegion (ECF2, EmbeddedControl, Zero, 0xFF)
Field (ECF2, ByteAcc, Lock, Preserve)
{
ACST, 1,
, 1,
BAST, 1,
, 1,
Offset (0x01),
LSTE, 1,
, 5,
LWKE, 1,
Offset (0x02),
B1ST, 2,
Offset (0x03),
Offset (0x04),
GCIN, 1,
Offset (0x05),
OSTP, 8,
Offset (0x09),
GPUP, 8,
Offset (0x0E),
BACL, 8, // <= 0x0E
BALL, 8, // <= 0x0F
BM00,8,BM01,8, //BMA0 ////16 unused // 0x10, 0x11 <= 원래 이름을 주석으로 남겨놓습니다. 나중에 햇갈려서요. ㅠㅠ
ML00,8,ML01,8, // 0x12, 0x13
BT00,8,BT01,8, //BST0, 16, //// 0x14, 0x15 //16 unused
AV00,8,AV01,8, // 0x16, 0x17
AC00,8,AC01,8, // 0x18, 0x19
RSOC, 8, // 0x1A
Offset (0x1C), //0X1A까지 왔는데 다음 주소가 옵셋으로 지정되었으니 다음 줄은 해당 옵셋 값입니다.
RC00,8,RC01,8, //BRC0, // 0x1C, 0x1D
BP00,8,BP01,8, //BTP0, 16, //////16 Store into BUF8 <OK> <= 어디로 연결되는지도 일단 메모..
CC00,8,CC01,8, //BCC0
BV00,8,BV01,8, //BCV0
ME00,8,ME01,8, //BME0, 16, //////16 unused <= 사용되지않는건데.. 이 문제 저 문제 겪다보니까 이것들도 의심스러워서 그냥 바꿔본 것 뿐입니다;;
FC00,8,FC01,8, //FCC0
DC00,8,DC01,8, //BDC0
DV00,8,DV01,8, //BDV0
BD00,8,BD01,8, //BMD0, 16, //////16 Store into BUF9 <OK>
SN00,8,SN01,8, //BSN0
MANA, 96, //////96 Store into BUFE //0x30 <= 버퍼로 직접 액세스해야하는 경우 옵셋값을 정확히 계산해해야합니다.. 이거 틀리면.. 안됩니다.
CT00,8,CT01,8, //BCT0, 16, //////16 unused //0x3C
SI00,8,SI01,8, //BSI0, 16, //////16 unused //0x3D
CTHM, 8,
Offset (0x42),
STH1, 8,
STH2, 8,
Offset (0x4A),
NOVO, 8,
CRIS, 8,
Offset (0x4D),
TSLT, 8,
Offset (0x50),
TJMX, 8,
Offset (0x52),
RTEN, 8,
RTDS, 8,
Offset (0x64),
WOLW, 1,
RTCW, 1,
Offset (0x65),
, 4,
WLAN, 1,
BLUE, 1,
WWAN, 1,
GPSE, 1,
PCVL, 8,
Offset (0x8B),
TSHT, 8,
DENA, 64, //////64 Store into BUFD //0x8C <OK>
CH00,8,CH01,8,CH02,8,CH03,8, //CHEM, 32, //////32 Store into BUFC //0x94 <OK>
BA00,8,BA01,8, //BAAC, 16, //////16 unused //0x98
RT00,8,RT01,8, //RTE0, 16, //////16 unused //0x9A
AE00,8,AE01,8, //ATE0, 16, //////16 Store into BUF4 <OK>
AF00,8,AF01,8, //ATF0, 16, //////16 Store into ATTF & BUF5 <OK>
FWIN, 64, //////64 Store into ECI & BUFG //0xA0 <OK>
BARC, 128, //////128 Store into BUFF //0xA8 <OK>
Offset (0xC6),
DXCB, 8,
Offset (0xD1),
VCMD, 8,
VDAT, 8,
VSTA, 8,
Offset (0xD6),
PSHK, 8,
Offset (0xDC),
S3ST, 1,
S4ST, 1,
TACK, 1,
Offset (0xDD),
Offset (0xE0),
VID0, 1,
VID1, 1,
VID2, 1,
Offset (0xE1),
SKU0, 3,
Offset (0xE2),
PCHG, 1,
WCHG, 1,
NCHG, 1,
Offset (0xE3),
Offset (0xF0),
HKDB, 1,
TPEN, 1,
UCHG, 1,
Offset (0xF1)
대강 이런식이구요.
B1B2
Method (B1B2, 2, NotSerialized) { Return(Or(Arg0, ShiftLeft(Arg1, 8))) }
B1B4
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)
RECB
Method (RE1B, 1, NotSerialized)
{
OperationRegion(ERAM, EmbeddedControl, Arg0, 1)
Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }
Return(BYTE)
}
Method (RECB, 2, Serialized)
// Arg0 - offset in bytes from zero-based EC
// Arg1 - size of buffer in bits
{
ShiftRight(Add(Arg1,7), 3, Arg1)
Name(TEMP, Buffer(Arg1) { })
Add(Arg0, Arg1, Arg1)
Store(0, Local0)
While (LLess(Arg0, Arg1))
{
Store(RE1B(Arg0), Index(TEMP, Local0))
Increment(Arg0)
Increment(Local0)
}
Return(TEMP)
}
WECB (이건 안 필요하면 굳이 안 넣어도..)
Method (WE1B, 2, NotSerialized)
{
OperationRegion(ERAM, EmbeddedControl, Arg0, 1)
Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }
Store(Arg1, BYTE)
}
Method (WECB, 3, Serialized)
// Arg0 - offset in bytes from zero-based EC
// Arg1 - size of buffer in bits
// Arg2 - value to write
{
ShiftRight(Add(Arg1,7), 3, Arg1)
Name(TEMP, Buffer(Arg1) { })
Store(Arg2, TEMP)
Add(Arg0, Arg1, Arg1)
Store(0, Local0)
While (LLess(Arg0, Arg1))
{
WE1B(Arg0, DerefOf(Index(TEMP, Local0)))
Increment(Arg0)
Increment(Local0)
}
}
---
필드 이름 바꾸기, 매소드 추가하기... 아 필드명이 실제 사용되는 곳에도 이름 바꾸기 적용해야죠.
Method (GSBI, 0, Serialized)
{
Name (BATE, Buffer (0x53) {})
CreateField (BATE, Zero, 0x10, BUF1)
CreateField (BATE, 0x10, 0x10, BUF2)
CreateField (BATE, 0x20, 0x10, BUF3)
CreateField (BATE, 0x30, 0x10, BUF4)
CreateField (BATE, 0x40, 0x10, BUF5)
CreateField (BATE, 0x50, 0x10, BUF6)
CreateField (BATE, 0x60, 0x10, BUF7)
CreateField (BATE, 0x70, 0x10, BUF8)
CreateField (BATE, 0x80, 0x10, BUF9)
CreateField (BATE, 0x90, 0x10, BUFA)
CreateField (BATE, 0xA0, 0x10, BUFB)
CreateField (BATE, 0xB0, 0x50, BUFC)
CreateField (BATE, 0x0100, 0x40, BUFD)
CreateField (BATE, 0x0140, 0x60, BUFE)
CreateField (BATE, 0x01A0, 0xB8, BUFF)
CreateField (BATE, 0x0258, 0x40, BUFG)
Store (B1B2(DC00,DC01), BUF1)/////=BDC0 => 원래 Store (BDC0, BUF1)이었는데 BDC0을 B1B2(DC00,DC01)로 바꾼겁니다.
Store (B1B2(FC00,FC01), BUF2)/////=FCC0
Store (B1B2(RC00,RC01), BUF3)/////=BRC0
Store (B1B2(AE00,AE01), BUF4)/////////ATE0
Store (B1B2(AF00,AF01), BUF5)/////////ATF0
Store (B1B2(AV00,AV01), BUF6)/////=BAV0
Store (B1B2(CC00,CC01), BUF7)/////=BCC0
Store (B1B2(BP00,BP01), BUF8)////////////BTP0
Store (B1B2(BD00,BD01), BUF9)//////////BMD0
Store (0xFFFF, BUFA)
Store (B1B2(DV00,DV01), BUFB)/////=BDV0
Store (B1B4(CH00,CH01,CH02,CH03), BUFC) /////////CHEM
Store (RECB(0x8C,64), BUFD)/////DENA => 32비트를 초과하는 값은 RECB메소드를 사용하여 해당 주소(옵셋)에 직접 액세스합니다.
Store (RECB(0x30,96), BUFE)/////MANA
Store (RECB(0xA8,128), BUFF)////////BARC
Store (RECB(0xA0,64), BUFG)//////FWIN
Return (BATE)
그리고, 교체하기 전 원래 이름으로 검색해서 B1B2, B1B4, RECB등의 메소드를 적용해줍니다.
Method (MHIF, 1, NotSerialized)
{
Name (BFWI, Buffer (0x0A) {})
CreateField (BFWI, Zero, 0x10, RES)
CreateField (BFWI, 0x10, 0x40, ECI)
Store (Arg0, Local0)
If (LAnd (Local0, One))
{
Store (Zero, BFWI)
}
Else
{
MAMW (0x8E, 0xE0)
Store (Zero, RES)
Store (RECB(0xA0,64), ECI) /////FWIN => 원래 Store (FWIN, ECI), FWIN을 RECB메소드로 0xA0 주소에서 64비트만큼 읽어서 ECI에 쓰기~
}
Return (BFWI)
....
Method (_BIF, 0, NotSerialized) // _BIF: Battery Information
{
Name (BPKG, Package (0x0D)
{
Zero,
0xFFFFFFFF,
0xFFFFFFFF,
One,
0xFFFFFFFF,
Zero,
Zero,
0x0100,
0x40,
"BASE-BAT",
"12345678",
"LiP",
"LENOVO"
})
If (ECON)
{
Acquire (ECMT, 0xFFFF)
Store (B1B2(ML00,ML01), Local1) // => (아마 원래)BML0을 B1B1(ML00,ML01)로 수정
And (Local1, 0x8000, Local1)
If (LEqual (Local1, 0x8000))
{
Store (0x0A, BASC)
Store (Zero, Index (BPKG, Zero))
}
Else
{
Store (One, BASC)
Store (One, Index (BPKG, Zero))
}
Store (Multiply (B1B2(DC00,DC01), BASC), Index (BPKG, One)) //여기도
Store (Multiply (B1B2(FC00,FC01), BASC), Index (BPKG, 0x02)) // 여기두...
Store (B1B2(DV00,DV01), Index (BPKG, 0x04))
If (B1B2(FC00,FC01))
{
Store (Divide (Multiply (B1B2(FC00,FC01), BASC), 0x0A, ), Index (BPKG, 0x05))
Store (Divide (Multiply (B1B2(FC00,FC01), BASC), 0x19, ), Index (BPKG, 0x06))
Store (Divide (Multiply (B1B2(DC00,DC01), BASC), 0x64, ), Index (BPKG, 0x07))
}
Release (ECMT)
}
--
이런 식입니다.
아..
그런데..
그 전에 기본 적인 에러 (문법 에러같은거) 먼저 수정해야합니다.
https://www.insanelymac.com/forum/topic/298027-guide-aio-guides-for-hackintosh/
https://www.tonymacx86.com/threads/guide-patching-laptop-dsdt-ssdts.152573/
여기 참고하시면 좋습니다.
그럼, 대강은 감 잡으셨길 바라며.. 일하다 빠져나온거라 ..그럼 이만.. (후다닥;;;)
p.s. aleady 어쩌고 하는 에러는 중복되서 그런거니까, 해당 이름으로 검색해서 external~~ 로 시작하는 줄을 // 로 주석 처리 하면 됩니다.