Monkey.D.Luffy

Technical Hackintosh
Staff member
12/5/15
527
244
63
36
Thông tin cơ bản để các bạn nắm bắt :

1. Bởi vì phần cứng của pin trong PCs không tương thích với phần cứng SMBUS của Apple và chúng ta sử dụng ACPI cho phép trạng thái của pin hoạt động trên OSX của laptop. Và điều cần thiết tôi khuyến nghị mọi người sử dụng ACPIBatteryManager.kext và nó có sẵn trong Hackintosh Vietnam Tool

Các phiên bản sau này của AppleACPIPlatform không thể truy cập một cách chính xác các trường trong EC (bộ điều khiển nhúng). Điều này gây khó khăn cho ACPIBatteryManager như các phương pháp khác nhau cho ACPI không hoạt động (_BIF, _STA, _BST, vv). Mặc dù nó có thể sử dụng một phiên bản cũ của AppleACPIPlatform đó là mong muốn sử dụng phiên bản mới nhất của AppleACPIPlatform vì với máy tính có CPU Ivy Bridge nó cho phép quản lý điện năng bản địa cho những máy tính. Để sử dụng phiên bản mới nhất, DSDT phải được thay đổi để phù hợp với những hạn chế của AppleACPIPlatform của Apple.

Đặc biệt, bất kỳ trường trong EC lớn hơn 8-bit, phải được thay đổi để được truy cập 8-bit tại một thời điểm. Điều này bao gồm 16, 32, 64, và các trường lớn hơn 64 như là 256.

Trước khi bắt tay về patch battery bạn phải có kinh nghiệm về patch DSDT và SSDT

Bắt tay về patch pin


Trước hết , bạn có thể tìm các bản patches được cho là sài được cho máy bạn tại địa chỉ sau
https://github.com/RehabMan/Laptop-DSDT-Patch

Để phù hợp với DSDT của bạn với một miếng vá, nó thường là cần thiết để hiểu làm thế nào các bản vá lỗi được thực hiện ở nơi đầu tiên, vì vậy bạn có biết những gì cần tìm kiếm trong DSDT của bạn và có thể phù hợp với những gì bạn nhìn thấy với các bản vá lỗi đã có sẵn.

*** Chú ý : Không sử dụng DSDT Editor hoặc các chương trình khác ngoài MaciASL . Tôi không kiểm tra các patches với các chương trình hay DSDT Editor . tôi kiểm tra luôn với MacIASL .

Các vấn đề liên quan đến Patch DSDT Battery

Ngoài các trường multi-byte EC , có một vài vấn đề có ảnh hưởng đến trạng thái pin . Có một số vấn đề riêng không ảnh hưởng đến trạng thái pin . nhưng nó có thể được nhận ra khi chúng ta thực hiện patch pin

Code battery có thể phụ thuộc vào phiên bản được công nhận Windows .để khắc phục , áp dụng " OS Check Fix" từ laptop DSDT patch repository.

Một vấn đề phổ biến là một thực tế rằng việc thực hiện ACPI OS X có khó khăn với các đối tượng Mutex khai báo với một khác không SyncLevel (để biết thêm đọc spec ACPI). Để khắc phục, áp dụng "Fix Mutex with non-zero SyncLevel" từ laptop DSDT patch repository.

Kỹ năng yêu cầu :

DSDT là một chương trình, như vậy nếu bạn có kỹ năng về lập trình thì sẽ giúp bạn rất nhiều , Ngoài ra Macisal là một ngôn ngữ riêng. Cuối cùng các bản patches là phạm trù cơ bản tìm kiếm / thay thế . do đó, nó là hữu ích để hiểu biểu thức thông thường (regex). Quen thuộc với các trình biên dịch, biên dịch lỗi, và một khả năng để xác định những gì các trình biên dịch là nói cho bạn về các lỗi trong mã này cũng rất hữu ích.

Ngoài ra . có 1 ý tưởng nếu bạn muốn làm quen ACPI thì bạn nên tải các phần sau về đọc và ngâm
https://www.acpica.org/

Nó không phải là mục đích của hướng dẫn này để dạy cho bạn những kỹ năng cơ bản lập trình, biểu thức thông thường, hoặc ngôn ngữ ACPI.

Tiến trình patch Battery :

Tôi sử dụng một quá trình chứ không phải "mechanical" để patches DSDT cho tình trạng pin. Tôi chỉ đơn giản là tìm kiếm những phần mà OS X thấy offensive và chuyển đổi mechanically của nó. Tôi không cố gắng quá khó để xác định những phần của mã đang thực sự đi vào thực hiện, tôi chỉ chuyển đổi tất cả mọi thứ mà tôi nhìn thấy.

Để theo dõi, tải về DSDT ví dụ từ bài này và làm theo cùng. Ví dụ cụ thể này DSDT là một HP Envy 14. Các thức, bản vá hoàn chỉnh, có sẵn từ repo vá của tôi là "HP Envy 14."

Đầu tiên bắt đầu bởi identifing các lĩnh vực của DSDT rằng có khả năng cần thay đổi. Nạp DSDT vào MaciASL và tìm kiếm 'EmbeddedControl'. Có thể có một số phần 'EmbeddedControl' trong một DSDT duy nhất, mỗi tờ khai lĩnh vực gắn liền với nó.

Vì vậy, tôi luôn bắt đầu tìm kiếm cho 'embedded control' để tìm ra cách thức patches này :

Trong ví dụ sau về DSDT tôi tìm được vùng EC độc lập :

OperationRegion (ECF2, EmbeddedControl, Zero, 0xFF)

Đoạn mã trên được định nghĩa là vùng EC 255 byte

Chúng tôi biết nó được gọi là ECF2, vì vậy bây giờ chúng tôi muốn tìm kiếm cho 'Field (ECF2'. Như bạn có thể thấy trong ví dụ DSDT, chỉ có một định nghĩa Dòng đề cập đến khu vực này. Đôi khi có rất nhiều.

Đoạn mã trên được định nghĩa là vùng EC 255 byte. Bạn có thể nói nó có liên quan bởi vì tên ECF2 được gọi bởi các Field. Hãy suy nghĩ về điều này như một cấu trúc (struct cho các lập trình C) trong EC

Bước tiếp theo là kiểm tra các hằng trong định nghĩa Field, tìm kiếm các mục có dung lượng lớn hơn so với 8-bit. Ví dụ, trường đầu tiên tuyên bố là BDN0, 56:
Field (ECF2, ByteAcc, Lock, Preserve)
{
Offset (0x10),
BDN0, 56,
...

Nó là trường 56 bit . và lớn hơn 8 bit và nếu nó được sử dụng trong DSDT , mã này sẽ được chỉnh sửa về trường này . Trong ví dụ DSDT , nếu bạn có thể tìm kiếm phần còn lại của DSDT là "BDN0", bạn sẽ tìm thấy :

Store (BDN0, BDN)

Điều này được dự định để lưu trữ các giá trị tại BDN0 (trong EC) vào BDN. Khi các lĩnh vực lớn hơn 32-bit được truy cập, chúng được truy cập như là loại đệm. Fields 32-bit hoặc theo được truy cập như là số nguyên. Điều này là quan trọng để nhận ra khi bạn thay đổi mã. Bộ đệm là một công việc bit hơn để thay đổi. Ngoài ra, nhận ra mã này được "đọc" từ EC. Đọc và viết phải được xử lý khác nhau.

Vì vậy, đối với dòng này cụ thể của mã này, mục tiêu là để đọc lĩnh vực này 56-bit (7 byte) 8-bit tại thời gian vào một bộ đệm, do đó, các bộ đệm kết quả có thể được lưu trữ vào BDN. Chúng tôi sẽ lấy lại cho cách này được thực hiện sau đó, bây giờ chúng ta hãy khám phá phần còn lại của các trường trong EC này.

Nhìn qua phần còn lại của EC, chúng ta hãy tìm tất cả các lĩnh vực lớn hơn 8-bit, và cho mỗi một, tìm kiếm phần còn lại của DSDT để xem nếu chúng được truy cập. Nó là phổ biến mà một số lĩnh vực không được truy cập và cho những người chúng ta không cần phải làm bất cứ điều gì. Vì vậy, các trường tiếp theo chúng ta thấy là BMN0:

BMN0, 32,
Nếu chúng ta tìm kiếm các DSDT cho 'BMN0' chúng ta thấy chỉ tuyên bố này, vì vậy nó không được truy cập. Chúng ta có thể bỏ qua một này. Cùng với BMN4. BCT0, mặt khác, là 128 bit và được truy cập, giống như BDN0:
Store (BCT0, CTN)
Tìm kiếm thêm dẫn đến danh sách toàn diện này:
BDN0, 56,
BCT0, 128,
BDN1, 56,
BCT1, 128,
...
BDC0, 16,
BDC1, 16,
BFC0, 16,
BFC1, 16,
...
BDV0, 16,
BDV1, 16,
...
BPR0, 16,
BPR1, 16,

BRC0, 16,
BRC1, 16,
BCC0, 16,
BCC1, 16,
CV01, 16,
CV02, 16,
CV03, 16,
CV04, 16,
CV11, 16,
CV12, 16,
CV13, 16,
CV14, 16,
...
BMD0, 16,
BMD1, 16,
BPV0, 16,
BPV1, 16,
BSN0, 16,
BSN1, 16,
BCV0, 16,
BCV1, 16,
CRG0, 16,
CRG1, 16,
BTY0, 32,
BTY1, 32,
...
CBT0, 16,
CBT1, 16,

Như bạn có thể thấy, có khá một vài lĩnh vực trong DSDT này cần làm việc, và tất cả các kích cỡ khác nhau. 16-bit, 32-bit, 56-bit và 128-bit.

Fields sized 16-bit and 32-bit

Các lĩnh vực mà là 16-bit và 32-bit là đơn giản nhất để đối phó với, vì vậy chúng ta hãy bắt đầu ở đó. Hãy lấy ví dụ, trường 16-bit đầu tiên trong danh sách trên, BDC0. Những gì chúng tôi muốn làm là thay đổi lĩnh vực này nên nó được chia thành hai peices (byte thấp, cao-byte). Để làm được điều đó chúng ta cần phải đi lên với một tên 4 nhân vật mà không xung đột với bất kỳ tên khác trong DSDT. Nó thường là dễ dàng để loại bỏ các chữ cái đầu tiên và sử dụng sau đây ba.

// was: BDC0, 16
DC00, 8,
DC01, 8,

Đây là một bản sửa lỗi
into device label H_EC code_regex BDC0,\s+16, replace_matched begin DC00,8,DC01,8, end;
Nhìn vào bản patches , nhìn vào các mã trong một thiết bị với nhãn H_EC, tìm kiếm cho "BDC0, <dấu cách> 16," và thay thế nó bằng "DC00,8, DC01,8," Điều này có hiệu quả phá vỡ vực thành hai phần. Nếu bạn áp dụng bản vá này, và cố gắng để biên dịch các DSDT sửa đổi, bạn sẽ nhận được lỗi vì mã vẫn đang truy BDC0. Những lỗi này thực sự giúp chúng ta xác định những gì mã cần phải thay đổi:
Store (BDC0, Index (DerefOf (Index (Local0, 0x02)), Zero))
Store (ShiftRight (BDC0, 0x08), Index (DerefOf (Index (Local0, 0x02)), One))
Như bạn có thể nhìn thấy mã này được đọc từ BDC0, mà bây giờ là trong hai phần. Để thực hiện một bản vá dễ dàng hơn để xây dựng, chúng tôi sử dụng một phương pháp hữu ích được gọi là B1B2, mà chúng ta chèn vào DSDT với miếng vá này:
into method label B1B2 remove_entry;
into definitionblock code_regex . insert
begin
Method (B1B2, 2, NotSerialized) { Return(Or(Arg0, ShiftLeft(Arg1, 8))) }\n
end;
Phương pháp này có hai đối số (byte thấp, cao-byte), và trả về một giá trị 16-bit từ các giá trị hai 8-bit.

Đối với các mã trên, chúng tôi muốn dịch nó để:
Store (B1B2(DC00,DC01), Index (DerefOf (Index (Local0, 0x02)), Zero))
Store (ShiftRight (B1B2(DC00,DC01), 0x08), Index (DerefOf (Index (Local0, 0x02)), One))
Một miếng vá có thể được xây dựng để tự động hoá này, và bạn có thể xem các bản vá lỗi cho trường 16-bit khác theo cùng một mô hình này:
into method label GBTI code_regex \(BDC0, replaceall_matched begin (B1B2(DC00,DC01), end;
Một người đọc tinh ý sẽ lưu ý rằng mã này có thể được tối ưu hóa:
Store (DC00, Index (DerefOf (Index (Local0, 0x02)), Zero))
Store (DC01, Index (DerefOf (Index (Local0, 0x02)), One))
Tối ưu hóa như vậy chỉ có thể được thực hiện bằng cách sử dụng bộ não của bạn, và nói chung nó không phải là giá trị nó. Mục tiêu ở đây là để đến với một phương pháp tự động sửa lỗi trong code này và không nên cố gắng sử dụng bộ não của chúng ta quá nhiều như chúng tôi có thể giới thiệu các lỗi vào mã nếu chúng ta thay đổi nó quá mạnh. Ngoài ra, loại mã là hiếm (tôi đã nhìn thấy nó chỉ trong hai DSDTs trong số hơn 20 mà tôi đã viết các bản vá lỗi cho).

Bây giờ bạn hiểu làm thế nào để đối phó với thanh ghi 16-bit, nó có lẽ là dễ nhất để chỉ chuyển đổi tất cả trong số họ. Dưới đây là các bản vá toàn diện cho các lĩnh vực EC 16-bit:
# 16-bit registers
into device label H_EC code_regex BDC0,\s+16 replace_matched begin DC00,8,DC01,8 end;
into device label H_EC code_regex BDC1,\s+16 replace_matched begin DC10,8,DC11,8 end;
into device label H_EC code_regex BFC0,\s+16 replace_matched begin FC00,8,FC01,8 end;
into device label H_EC code_regex BFC1,\s+16 replace_matched begin FC10,8,FC11,8 end;
into device label H_EC code_regex BDV0,\s+16 replace_matched begin DV00,8,DV01,8 end;
into device label H_EC code_regex BDV1,\s+16 replace_matched begin DV10,8,DV11,8 end;
into device label H_EC code_regex BPR0,\s+16 replace_matched begin PR00,8,PR01,8 end;
into device label H_EC code_regex BPR1,\s+16 replace_matched begin PR10,8,PR11,8 end;
into device label H_EC code_regex BRC0,\s+16 replace_matched begin RC00,8,RC01,8 end;
into device label H_EC code_regex BRC1,\s+16 replace_matched begin RC10,8,RC11,8 end;
into device label H_EC code_regex BCC0,\s+16 replace_matched begin CC00,8,CC01,8 end;
into device label H_EC code_regex BCC1,\s+16 replace_matched begin CC10,8,CC11,8 end;
into device label H_EC code_regex CV01,\s+16 replace_matched begin CV10,8,CV11,8 end;
into device label H_EC code_regex CV02,\s+16 replace_matched begin CV20,8,CV21,8 end;
into device label H_EC code_regex CV03,\s+16 replace_matched begin CV30,8,CV31,8 end;
into device label H_EC code_regex CV04,\s+16 replace_matched begin CV40,8,CV41,8 end;
into device label H_EC code_regex CV11,\s+16 replace_matched begin CV50,8,CV51,8 end;
into device label H_EC code_regex CV12,\s+16 replace_matched begin CV60,8,CV61,8 end;
into device label H_EC code_regex CV13,\s+16 replace_matched begin CV70,8,CV71,8 end;
into device label H_EC code_regex CV14,\s+16 replace_matched begin CV80,8,CV81,8 end;
into device label H_EC code_regex HPBA,\s+16 replace_matched begin PBA0,8,PBA1,8 end;
into device label H_EC code_regex HPBB,\s+16 replace_matched begin PBB0,8,PBB1,8 end;
into device label H_EC code_regex BMD0,\s+16 replace_matched begin MD00,8,MD01,8 end;
into device label H_EC code_regex BMD1,\s+16 replace_matched begin MD10,8,MD11,8 end;
into device label H_EC code_regex BPV0,\s+16 replace_matched begin PV00,8,PV01,8 end;
into device label H_EC code_regex BPV1,\s+16 replace_matched begin PV10,8,PV11,8 end;
into device label H_EC code_regex BSN0,\s+16 replace_matched begin SN00,8,SN01,8 end;
into device label H_EC code_regex BSN1,\s+16 replace_matched begin SN10,8,SN11,8 end;
into device label H_EC code_regex BCV0,\s+16 replace_matched begin BV00,8,BV01,8 end;
into device label H_EC code_regex BCV1,\s+16 replace_matched begin BV10,8,BV11,8 end;
into device label H_EC code_regex CRG0,\s+16 replace_matched begin RG00,8,RG01,8 end;
into device label H_EC code_regex CRG1,\s+16 replace_matched begin RG10,8,RG11,8 end;
into device label H_EC code_regex CBT0,\s+16 replace_matched begin BT00,8,BT01,8 end;
into device label H_EC code_regex CBT1,\s+16 replace_matched begin BT10,8,BT11,8 end;
Và tất cả các mã mà truy cập những người đăng ký cần phải được cố định:
# fix 16-bit methods
into method label GBTI code_regex \(BDC0, replaceall_matched begin (B1B2(DC00,DC01), end;
into method label GBTI code_regex \(BDC1, replaceall_matched begin (B1B2(DC10,DC11), end;
into method label GBTI code_regex \(BFC0, replaceall_matched begin (B1B2(FC00,FC01), end;
into method label GBTI code_regex \(BFC1, replaceall_matched begin (B1B2(FC10,FC11), end;
into method label BTIF code_regex \(BFC0, replaceall_matched begin (B1B2(FC00,FC01), end;
into method label BTIF code_regex \(BFC1, replaceall_matched begin (B1B2(FC10,FC11), end;
into method label ITLB code_regex \(BFC1, replaceall_matched begin (B1B2(FC10,FC11), end;
into method label ITLB code_regex \sBFC0, replaceall_matched begin B1B2(FC00,FC01), end;
into method label _Q09 code_regex \(BRC0, replaceall_matched begin (B1B2(RC00,RC01), end;
into method label _Q09 code_regex \sBFC0\) replaceall_matched begin B1B2(FC00,FC01)) end;
into method label GBTI code_regex \(BDV0, replaceall_matched begin (B1B2(DV00,DV01), end;
into method label GBTI code_regex \(BDV1, replaceall_matched begin (B1B2(DV10,DV11), end;
into method label BTIF code_regex \(BDV0, replaceall_matched begin (B1B2(DV00,DV01), end;
into method label BTIF code_regex \(BDV1, replaceall_matched begin (B1B2(DV10,DV11), end;
into method label GBTI code_regex \(BPR0, replaceall_matched begin (B1B2(PR00,PR01), end;
into method label GBTI code_regex \(BPR1, replaceall_matched begin (B1B2(PR10,PR11), end;
into method label BTST code_regex \sBPR0, replaceall_matched begin B1B2(PR00,PR01), end;
into method label BTST code_regex \sBPR1, replaceall_matched begin B1B2(PR10,PR11), end;
into method label BTST code_regex \(BPR0, replaceall_matched begin (B1B2(PR00,PR01), end;
into method label BTST code_regex \(BPR1, replaceall_matched begin (B1B2(PR10,PR11), end;
into method label BTST code_regex \(BRC0, replaceall_matched begin (B1B2(RC00,RC01), end;
into method label BTST code_regex \(BRC1, replaceall_matched begin (B1B2(RC10,RC11), end;
into method label GBTI code_regex \(BRC0, replaceall_matched begin (B1B2(RC00,RC01), end;
into method label GBTI code_regex \(BRC1, replaceall_matched begin (B1B2(RC10,RC11), end;
into method label _Q09 code_regex \(BRC0, replaceall_matched begin (B1B2(RC00,RC01), end;
into method label GBTI code_regex \(BCC0, replaceall_matched begin (B1B2(CC00,CC01), end;
into method label GBTI code_regex \(BCC1, replaceall_matched begin (B1B2(CC10,CC11), end;
into method label GBTI code_regex \(CV01, replaceall_matched begin (B1B2(CV10,CV11), end;
into method label GBTI code_regex \(CV02, replaceall_matched begin (B1B2(CV20,CV21), end;
into method label GBTI code_regex \(CV03, replaceall_matched begin (B1B2(CV30,CV31), end;
into method label GBTI code_regex \(CV04, replaceall_matched begin (B1B2(CV40,CV41), end;
into method label GBTI code_regex \(CV11, replaceall_matched begin (B1B2(CV50,CV51), end;
into method label GBTI code_regex \(CV12, replaceall_matched begin (B1B2(CV60,CV61), end;
into method label GBTI code_regex \(CV13, replaceall_matched begin (B1B2(CV70,CV71), end;
into method label GBTI code_regex \(CV14, replaceall_matched begin (B1B2(CV80,CV81), end;
into method label BTIF code_regex \(BMD0, replaceall_matched begin (B1B2(MD00,MD01), end;
into method label BTIF code_regex \(BMD1, replaceall_matched begin (B1B2(MD10,MD11), end;
into method label GBTI code_regex \sBMD0\) replaceall_matched begin B1B2(MD00,MD01)) end;
into method label GBTI code_regex \(BMD0, replaceall_matched begin (B1B2(MD00,MD01), end;
into method label GBTI code_regex \sBMD1\) replaceall_matched begin B1B2(MD10,MD11)) end;
into method label GBTI code_regex \(BMD1, replaceall_matched begin (B1B2(MD10,MD11), end;
into method label BTST code_regex \(BPV0, replaceall_matched begin (B1B2(PV00,PV01), end;
into method label BTST code_regex \(BPV1, replaceall_matched begin (B1B2(PV10,PV11), end;
into method label GBTI code_regex \(BPV0, replaceall_matched begin (B1B2(PV00,PV01), end;
into method label GBTI code_regex \(BPV1, replaceall_matched begin (B1B2(PV10,PV11), end;
into method label BTIF code_regex \(BSN0, replaceall_matched begin (B1B2(SN00,SN01), end;
into method label BTIF code_regex \(BSN1, replaceall_matched begin (B1B2(SN10,SN11), end;
into method label GBTI code_regex \(BSN0, replaceall_matched begin (B1B2(SN00,SN01), end;
into method label GBTI code_regex \(BSN1, replaceall_matched begin (B1B2(SN10,SN11), end;
into method label GBTI code_regex \(BCV0, replaceall_matched begin (B1B2(BV00,BV01), end;
into method label GBTI code_regex \(BCV1, replaceall_matched begin (B1B2(BV10,BV11), end;
into method label GBTI code_regex \(CRG0, replaceall_matched begin (B1B2(RG00,RG01), end;
into method label GBTI code_regex \(CRG1, replaceall_matched begin (B1B2(RG10,RG11), end;
into method label GBTI code_regex \(CBT0, replaceall_matched begin (B1B2(BT00,BT01), end;
into method label GBTI code_regex \(CBT1, replaceall_matched begin (B1B2(BT10,BT11), end;
Bây giờ, những gì về các thanh ghi 32-bit, BTY0, và BTY1?
Đây được xử lý tương tự như 16-bit, ngoại trừ chúng ta cần một phương pháp B1B4 rằng có thể xây dựng một giá trị 32-bit ra bốn giá trị 8-bit:
into method label B1B4 remove_entry;
into definitionblock code_regex . insert
begin
Method (B1B4, 4, NotSerialized)\n
{\n
Store(Arg3, Local0)\n
Or(Arg2, ShiftLeft(Local0, 8), Local0)\n
Or(Arg1, ShiftLeft(Local0, 8), Local0)\n
Or(Arg0, ShiftLeft(Local0, 8), Local0)\n
Return(Local0)\n
}\n
end;
Và chúng ta cần phải chuyển đổi BTY0 và BTY1 thành bốn thanh ghi 8-bit:
# 32-bit registers
into device label H_EC code_regex BTY0,\s+32 replace_matched begin TY00,8,TY01,8,TY02,8,TY03,8 end;
into device label H_EC code_regex BTY1,\s+32 replace_matched begin TY10,8,TY11,8,TY12,8,TY13,8 end;
Và các mã trong GBTI cần sửa chữa:
Store (BTY0, BTY)
...
Store (BTY1, BTYB)
Tương tự như các bản vá lỗi cho 16-bit, nhưng thay vào đó chúng tôi sử dụng B1B4:
# fix 32-bit methods
into method label GBTI code_regex \(BTY0, replaceall_matched begin (B1B4(TY00,TY01,TY02,TY03), end;
into method label GBTI code_regex \(BTY1, replaceall_matched begin (B1B4(TY10,TY11,TY12,TY13), end;
Mà thay đổi mã trên, như sau:
Store (B1B4(TY00,TY01,TY02,TY03), BTY)
...
Store (B1B4(TY10,TY11,TY12,TY13), BTYB)
Buffer Fields (các lĩnh vực lớn hơn 32-bit
Trở lại tìm kiếm ban đầu của chúng tôi cho các lĩnh vực lớn hơn 8-bit, chúng tôi đã có những lĩnh vực lớn hơn 32-bit:

BDN0, 56,
BCT0, 128,
BDN1, 56,
BCT1, 128,
Để truy cập vào các lĩnh vực này 8-bit tại một thời điểm là khá tẻ nhạt, vì vậy tôi muốn truy cập chúng bằng cách bù đắp, và để đảm bảo rằng không có mã hiện truy cập trực tiếp, chúng ta đổi tên chúng:
into device label H_EC code_regex (BDN0,)\s+(56) replace_matched begin BDNX,%2,//%1%2 end;
into device label H_EC code_regex (BDN1,)\s+(56) replace_matched begin BDNY,%2,//%1%2 end;
into device label H_EC code_regex (BCT0,)\s+(128) replace_matched begin BCTX,%2,//%1%2 end;
into device label H_EC code_regex (BCT1,)\s+(128) replace_matched begin BCTY,%2,//%1%2 end;
Tiếp theo chúng ta cần phải xác định các hiệu số trong EC mà các trường này được đặt. Hãy ghi nhớ những kích thước là trong bit, nhưng hiệu số là byte. Các offsets tôi có trong các ý kiến dưới đây nằm trong hex. Xem nếu bạn có thể đến với các con số tương tự.
Field (ECF2, ByteAcc, Lock, Preserve)
{
Offset (0x10),
BDN0, 56, //!!0x10
Offset (0x18),
BME0, 8,
Offset (0x20),
BMN0, 32, //0x20
BMN2, 8, //0x24
BMN4, 88, //0x25
BCT0, 128, //!! 0x30
BDN1, 56, //!! 0x40
Offset (0x48),
BME1, 8,
Offset (0x50),
BMN1, 32, //0x50
BMN3, 8, //0x54
BMN5, 88, //0x55
BCT1, 128, //!!0x60
Một khi bạn chạy các bản vá cho đổi tên, và sau đó biên dịch, trình biên dịch sẽ cho bạn biết những gì đang cần sự chú ý. Trong trường hợp của chúng tôi, chúng tôi nhìn thấy đoạn mã này với các lỗi:
...
Store (BCT0, CTN)
...
Store (BDN0, BDN)
...
Store (BCT1, CTNB)
...
Store (BDN1, BDNB)
...
Có sai lầm vì chúng ta đổi tên họ từ BCT0, BDN0, BCT1, BDN1 để BCTX, BDNX, BCTY, BDNY, tương ứng.

Như bạn có thể nhìn thấy mã này được đọc từ các lĩnh vực đệm EC và lưu trữ chúng ở một nơi khác. Để đọc các mặt hàng này 8-bit tại lúc, chúng ta cần một phương pháp hữu ích:

# utility methods to read/write buffers from/to EC
into method label RE1B parent_label H_EC remove_entry;
into method label RECB parent_label H_EC remove_entry;
into device label H_EC insert
begin
Method (RE1B, 1, NotSerialized)\n
{\n
OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
Return(BYTE)\n
}\n
Method (RECB, 2, Serialized)\n
// Arg0 - offset in bytes from zero-based EC\n
// Arg1 - size of buffer in bits\n
{\n
ShiftRight(Arg1, 3, Arg1)\n
Name(TEMP, Buffer(Arg1) { })\n
Add(Arg0, Arg1, Arg1)\n
Store(0, Local0)\n
While (LLess(Arg0, Arg1))\n
{\n
Store(RE1B(Arg0), Index(TEMP, Local0))\n
Increment(Arg0)\n
Increment(Local0)\n
}\n
Return(TEMP)\n
}\n
end;
"RECB" là viết tắt của "Đọc EC đệm". Nó có hai tham số cho thấy sự bù đắp trong EC và kích thước trong bit của trường bạn muốn đọc. Kích thước trong bit phải là một bội số của tám (8). Các mã không kiểm tra.

Những phương pháp giúp đỡ phải được xác định trong các thiết bị EC, trong trường hợp của DSDT này, được đặt tên H_EC:
Device (H_EC)
{
Name (_HID, EisaId ("PNP0C09"))
Bạn sẽ cần phải thay đổi các bản vá lỗi mà tạo RECB / RE1B nếu tên của thiết bị EC của bạn là khác nhau. Tên thường gặp là EC, EC0, và như trong ví dụ này H_EC.

Để xử lý các trường hợp đầu tiên của BCT0, chúng tôi muốn làm tương đương với điều này:
Store(RECB(0x30,128), CTN)
Các 0x30 được bù đắp của các lĩnh vực BTC0 (bây giờ gọi là BCTX) và 128 là số bit.

Những sửa đổi có thể được thực hiện với các bản vá lỗi:
into method label GBTI code_regex \(BCT0, replaceall_matched begin (RECB(0x30,128), end;
into method label GBTI code_regex \(BCT1, replaceall_matched begin (RECB(0x60,128), end;
into method label GBTI code_regex \(BDN0, replaceall_matched begin (RECB(0x10,56), end;
into method label GBTI code_regex \(BDN1, replaceall_matched begin (RECB(0x40,56), end;
DSDT này không có bất kỳ ghi vào bộ đệm EC, nhưng nếu nó đã làm, phương pháp hữu ích này rất hữu ích:
into method label WE1B parent_label H_EC remove_entry;
into method label WECB parent_label H_EC remove_entry;
into device label H_EC insert
begin
Method (WE1B, 2, NotSerialized)\n
{\n
OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
Store(Arg1, BYTE)\n
}\n
Method (WECB, 3, Serialized)\n
// Arg0 - offset in bytes from zero-based EC\n
// Arg1 - size of buffer in bits\n
// Arg2 - value to write\n
{\n
ShiftRight(Arg1, 3, Arg1)\n
Name(TEMP, Buffer(Arg1) { })\n
Store(Arg2, TEMP)\n
Add(Arg0, Arg1, Arg1)\n
Store(0, Local0)\n
While (LLess(Arg0, Arg1))\n
{\n
WE1B(Arg0, DerefOf(Index(TEMP, Local0)))\n
Increment(Arg0)\n
Increment(Local0)\n
}\n
}\n
end;
Hãy xem xét một dòng giả của mã để viết để BCT0:
Store (local0, BCT0)
Trong trường hợp này, việc tiếp cận BCT0 không thể được thay thế bằng một cuộc gọi đến RECB. Nó là một viết, không đọc. WECB phải được sử dụng để thay thế.

WECB (0x30,128, local0)
Hai thông số đầu tiên WECB cũng giống như những người để RECB (offset và kích thước của trường EC). Tham số thứ ba (arg2) là giá trị mà nên được ghi vào các lĩnh vực EC. Trong trường hợp này nó là nguồn gốc của các cửa hàng (các tham số đầu tiên để Store) ... local0.

Cửa hàng không phải là AML opcode chỉ có thể viết. Cũng như cửa hàng không phải là AML opcode chỉ có thể đọc. Cũng như một ví dụ, hãy xem xét thêm:

Add (X, Y, Z)
Ví dụ trên lần đọc từ X, Y lần đọc từ, thực hiện một sự bổ sung ... và ghi kết quả vào Z.

Khi bạn không chắc chắn về một opcode AML có, đọc spec ACPI. Nó hoàn toàn được tài liệu đó, nhưng ngoài phạm vi của bài viết này.

Các máy tính xách tay hiện repo là một nguồn tốt của các ví dụ và thông tin. Có rất nhiều ví dụ WECB / RECB trong các bản vá lỗi hiện có trong repo máy tính xách tay.


Góp phần

Nếu bạn làm ra một bản vá cho các phương pháp pin của bạn, bạn sẽ được khuyến khích đóng góp vào kho lưu trữ bản vá của tôi, vì vậy xin vui lòng chia sẻ bản vá của bạn cùng với thông tin về máy tính của bạn, vì vậy tôi có thể thêm các bản vá để kho DSDT vá máy tính xách tay của tôi. Vui lòng cung cấp cả các tập tin văn bản có chứa các bản vá lỗi và DSDT bản địa (vì vậy tôi có thể xem lại các bản vá lỗi chống lại DSDT bản địa). Tôi sẽ không thêm bản vá lỗi cho các kho lưu trữ, trừ khi tôi có thể xem lại các bản vá lỗi khi áp dụng cho các DSDT bản địa.

Nguồn từ tonymacx86 - Rehabman

Dịch và chỉnh sửa bởi Monkey.D.Luffy .

Nếu có mang đi đâu vì lòng để lại nguồn
 
Last edited:
  • Like
Reactions: el_capitan
làm sao để fix được lỗi không phát hiện cắm adapter khi pin đầy trên Asus vậy anh