I. Hướng dẫn patch DSDT dành cho máy tính để bàn doc

62 2.3K 27
I. Hướng dẫn patch DSDT dành cho máy tính để bàn doc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

I. Câu chuyện mở đầu Mấy hôm gần đây, tớ thấy bạn danght post rất nhiều kinh nghiệm hay trong việc cài Snow Leopard trên Desktop và Laptop, trong đó đ iều mà tớ quan tâm nhất là kĩ thuật patch DSDT của bạn ấy. Vì thế tớ quyết định thử vọc một chút về DSDT với hi vọng là Mac OS sẽ hoạt độ ng tốt hơn. Thực ra tớ đã có một chút kiến thức về DSDT và đã từng dùng phần mềm DSDT Auto Patcher (madl0n) patch DSDT con main Gigabyte G31M-S2L của tớ để fix một số thành phần như RTC, HPET, USB, , từ đó phối hợp với Chameleon 2.0 RC5 mà bỏ được một số kext ngoài như LegacyAppleRTC, NullCPUPM và EVOReboot, và chạy ổn định hơn. Nhưng bản thân tự sửa DSDT trực tiếp thì tớ chưa bao giờ thử, vả lại chức năng sleep không hoạt động được nếu không có SleepEnabler, cho nên tớ mới quyết định táy máy một chút để nâng cao kinh nghiệm và cũng là để giải quyết trọn vẹn bài toán DSDT cho con main của tớ. Và thế là tớ bắt đầu đọc, ngâm cứu các bài viết củ a bạn danght và tìm kiếm một số thông tin trên mạng. Sau đó tớ bắt tay vào công việc. Dựa trên cái DSDT đã được patch đ ợt 1 bằ ng DSDT Auto Patcher, tớ bắt đầu chỉnh sửa, thêm bớt cho phù hợp. Quá trình chỉnh sửa khá phức tạp, nhiều lúc điên lên vì gặp lỗi. Đã có lần chỉnh sửa sai phần SATA dẫn đế n không boot được, thậm chí còn có lần quên không đổi tên file DSDT cho phù hợp, dẫn đến Kernel panic, và khi khở i động lại thì ôi thôi, CMOS Reset do không fix RTC. Nhưng cuối cùng, sau bao khó khăn cộng với khoảng chục lần reset máy, cuối cùng tớ đã patch gần như hoàn chỉnh DSDT của tớ, và đã đạt được các thành quả sau: Phần cứng, chức năng Kế t quả Phương thức CPU Intel Pentium Dual Core E5200 Speedstep OK (dùng Chameleon 2.0 RC5, đọc patch DSDT để bật Speedstep thấy khó quá nên không làm, sau này sẽ nghiên cứu tiếp). Nhiệt độ các nhân CPU (đo bằng iStats) ổn định ở 37 o C và 26 o C Chameleon 2.0 RC5, bật GeneratePStates GenerateCStates nVidia GeForce 9400 GT Full QE/CI (patch DSDT, không cần ROM nVidia hay NVEnabler.kext) patch DSDT USB OK (UCHI – USB 1.1 và EHCI – USB 2.0 nhận đầy đủ) patch DSDT Time Machine Đã fix lỗi, không cần EthernetBuiltIn trong Chameleon patch DSDT SATA Nhận đầy đủ, không cần JMicron36xSATA.kext patch DSDT Audio Nhận tất cả các cổng, không cần Voodoo HDA patch DSDT + AppleHDA patch + ALC662.kext Sleep OK, không SleepEnabler.kext patch DSDT Shutdown, Restart OK, không EVOReboot.kext patch DSDT + RestartFix trong Chameleon HPET OK, không cần NullCPUPowerManagement.kext patch DSDT RTC OK, không cần LegacyRTC.kext, không CMOS Reset patch DSDT LPC, PIC, TMR OK patch DSDT Việc tự chỉnh sửa đã đem lại cho mình rất nhiều kinh nghiệm về phần cứng, hệ thống Mac OS và kĩ thuật patch DSDT. Đọc lại các hư ớng dẫn patch DSDT trên mạng, mình thấy chúng vẫn chưa thật sự chi tiết và thư ờng hướng tới phần cứng cố định. Vì vậy mình tự tổng hợp lại kinh nghiệm và quyết định post bài viết này để hỗ trợ các bạn patch DSDT dễ dàng và hiệu quả. Mặc dù kinh nghiệm còn ít, song hi vọng sẽ giúp được các bạn trong việc patch DSDT, để Mac OS hoạt động ổn định và hiệu quả hơn. Nguồn bài viết tham khảo: Hướng dẫn về cài đặt Snow Leopard retail trên laptop dòng core 2 (danght) Hướng dẫn cài đặt Mac OSX 10.6.5 lên PC dòng Core 2 Duol (danght) Retail Snow Leopard lên dòng Core I (Scripted w/RAID 0 2SSD Scrip) (danght) Vanila Speedstep CPU Core Duo cho đến Core i không cần Kext (danght) Minimal DSDT Edits for Gigabyte Socket 1366 Motherboards (macmanx86) Advanced DSDT Fixes: nVidia Graphics (tonymacx86) Advanced DSDT Fixes: Enable Sleep on P55 Motherboards (tonymacx86) Advanced DSDT Fixes: Enable Native Intel SpeedStep on P55 Motherboards (tonymacx86) và rất nhiều bài viết khác trên các diễn đàn về HACKINTOSH (InsanelyMac, ProjectOSX, ) Bài viết này có thể còn sai sót, hi vọng được các bạn góp ý nhiệt tình. II. Giới thiệu về DSDT và hướng dẫn patch DSDT cơ bản 1. DSDT là gì? Tại sao phải patch DSDT? DSDT (Differentiated System Description Table) là bảng dữ liệu chính trong ACPI của BIOS, có nhiệm vụ mô tả các phần cứng trên bo mạch chủ, từ đó làm liên kết trung gian giữa mộ t hệ điều hành tương thích chuẩn ACPI và BIOS. Các hệ đ iề u hành như Windows hoặc Linux tư ơng thích tốt vớ i chuẩn ACPI nên cũng hiểu và vận hành tốt với DSDT của bo mạch chủ. Còn Mac OS không tương thích hoàn toàn với ACPI và chỉ hỗ trợ một phần DSDT, vì thế không thể dùng DSDT vanilla (DSDT nguyên gốc của bo mạch chủ chưa hề bị chỉnh sửa) để liên kết với Mac OS. Việc chỉnh sửa DSDT sao cho phù hợp với khả năng hỗ trợ và cách hiểu của Mac OS sẽ giúp cho các Kext (Kernel extension) của Mac OS điều khiển được phần cứng của PC. Từ đó có thể chạy được Mac OS trên PC mà không cầ n các kext bên ngoài, dẫn đến đ ộ ổn định và hiệu năng được nâng cao. Công đoạn đó gọi là patch DSDT. Vớ i một số phần cứng mà không có kext hỗ trợ hoặc kext hoạt động không hiệu quả thì patch DSDT là giải pháp tốt nhất và có thể là duy nhất (như đồ họa Intel GMA X3100 chẳng hạn). Lưu ý một điều là ta sẽ không thay đổi DSDT của bo mạch chủ, vì như thế sẽ làm cho hệ thống không chạy được các hệ điều hành thông dụng như Linux và Windows. Mà ở đây ta sẽ sử dụng khả năng DSDT Override của Chameleon bootloader cho phép load file DSDT đã patch để giả mạo DSDT của bo mach chủ, dẫn đến Mac OS liên kết được với các phần cứng mà không ảnh hưởng đến DSDT gốc của bo mạch chủ. 2. Tổng quát về cách patch DSDT DSDT của bo mạch chủ có thể được các phần mềm đặc biệt trích xuất thành file DSDT.AML và được dịch ngược thành file DSDT.DSL để thay đổi. Sau đó file DSDT.DSL đã patch thông qua trình biên dịch iasl sẽ thành file DSDT.AML. Cuối cùng chỉ cần kết hợp file DSDT.AML đã patch vớ i Chameleon là xong. Quá trình này có thể thực hiện thủ công hoặc bằng phần mềm tự động. Hiện nay các chương trình chỉnh sửa DSDT đều cho phép thực hiện tự động một số patch mà mình muốn. Các công đoạn patch DSDT đều có các công việc chung như sau: + Thay đổi một số giá trị (Value), địa chỉ (Address), tên (Name), của các đối tượng trong DSDT mà không phù hợp với Mac OS thành giá trị đúng. + Thay đổi một số lệnh trong các phương thức (Method) có trong DSDT sao cho phù hợp với Mac OS. + Thêm một số phương thức để Mac OS có thể nhận diện đầy đủ phần cứng (Method _DSM, Method DTGP, ) Các công đoạn patch DSDT này có cách thức tương tự với việc lập trình, chỉ có điều cú pháp và các câu lệnh khác so với các ngôn ngữ phổ biến như C++ và các đối tượng cần xử lí là các biến, các địa chỉ phần cứng và các giá trị (thường ở dạng dãy nhị phân binary, số nguyên trong hệ cơ số 16 hexadecimal, xâu kí tự string, ) 3. Các patch phổ biến trong DSDT. Dưới đây là các patch phổ biến trong việc patch DSDT cho Desktop (máy tính để bàn). Với Laptop, hoặc các phần cứng khác thì mình chưa có điều kiện nghiên cứu thêm, các bạn có thể tham khảo thêm trên mạng, trong các diễn đ àn về HACKINTOSH. Tên patch Công dụng DTGP Thêm method DTGP, là thành phần của method _DSM để Mac OS nhận diện các loại phần cứ ng PC. _WAK chỉnh lại method _WAK để trả lại giá trị phù hợ p, tránh cảnh báo (Warning) khi biên dịch. Shutdown chỉnh lại method _PTS và thêm OperationRegion (PMRS) để shutdown. Sau đó bật tiếp RestartFix trong Chameleon 2.0 RC5 . HID/CID chỉnh lại Device PWRB (Power Button) cho phép sleep bằng cách nhấn nút power. HPET chỉnh lại Device HPET để nhận diện HPET (High Precision Event Timer), tránh lỗi Kernel Panic do AppleIntelCPUPowerManagement.kext gây ra. RTC Fix lỗi CMOS Reset khi khởi động lại do không nhận RTC. IRQs Fix device PIC và device TMR để sửa lỗi audio trên một số bo mạch chủ. Time Machine sửa lỗi Time Machine bằng cách chỉnh lại Device LAN0 để nhận diện card mạng LAN là built-in (gắ n liền vớ i bo mạ ch chủ). Tương đương với options EthernetBuiltIn trong Chameleon 2.0 RC5 LPC Chỉnh lại device LPC (Low Pin Count) như PX40 hoặc SBRG, từ đó bật kext AppleLPC để Mac OS quản lí năng lượng của các thiết bị. UHCI/EHCI chỉnh lại các device UHCI (USB 1.1) và EHCI (USB 2.0) để Mac OS nhận diện được các cổng và thiết bị USB, hỗ trợ USB Sleep. Audio ALCxxx + AZAL to HDEF chỉnh sửa Device AZAL và đổi AZAL thành HDEF để Mac OS nhận diện đúng card âm thanh HD Audio. SATA chỉnh lại device IDE1 thành device SATA và chỉnh lại các device PRIM (Primary) và SECD (Secondary) để nhận diện ổ SATA. Fix lỗi nhận diện nhầm ổ cứng internal thành external, dẫn đến biểu tượng màu vàng cam. Bus0 và SBUS Nhận diện SMBUS SpeedStep Bật SpeedStep cho CPU hỗ trợ. Tương tự với 2 option GeneratePState và GenerateCState của Chameleon 2.0 RC5 Và còn một số các patch khác nữa như patch nhận diện card đồ họa, patch cho card LAN, Nhiều patch trong số đó có thể tìm trên mạng hoặc trong các phần mềm patch DSDT như DSDT Simple Editor (EvOSX86 Team) III. Cú pháp của ASL (ACPI Control Method Source Language) trong file DSDT.DSL Ở đây chỉ nói về các cú pháp cơ bản, không đi sâu vào ngôn ngữ ASL dùng để mô tả các bảng dữ liệu trong ACPI (DSDT, RSDT, FACP, ), chỉ nhằm mục đích giúp các bạn hiểu một số cú pháp để việc chỉnh sửa dễ dàng hơn. Để tìm hiểu kĩ hơn, các bạn có thể tìm các tài liệu về ACPI và ngôn ngữ ASL trên mạng. 1. Các cú pháp thông dụng Từ khóa (Các tham số) { Mô tả chi tiết nếu có } Cú pháp Chức năng Add ( Addend1, Addend2, Result ) Phép cộng 2 số Addend1, Addend2 và gán kết quả vào Result And (Source1, Source2, Result) Phép toán bitwise (xử lí bit) And 2 giá trị Source1, Source2, gán kết quả vào Result Alias ( SourceObject, AliasObject ) Khai báo đối tượng AliasObject có giá trị trỏ đến SourceObject Arg0 | Arg1 | Arg2 | Arg3 | Arg4 | Arg5 | Arg6 Nế u method có n tham số thì các tham số đó có tên gọi lần lượt là Arg0, Arg1, Arg2, , Arg[n-1] . Một method có tối đa 7 tham số (từ Arg0 đến Arg6) Break Thoát giữa chừng vòng lặp while Buffer (BufferSize) { String or ByteList } Khai báo một mảng có kích thước là BufferSize chứa các dữ liệu 1 byte Concatenate (Source1, Source2, Result) Ghép 2 dữ liệu trong Source1 và Source2 thành 1 dữ liệu chung trong Result Concatenate (“abc”, “def”, kq) : kq=”abcdef” Continue Tiếp tục vòng lặp while, bỏ qua các câu lệnh tiếp theo sau Continue CopyObject (Source, Destination) Copy dữ liệu từ Source đến Destination Decrement (Minuend) Làm giảm giá trị của Minuend đi 1 DefinitionBlock (AMLFileName, TableSignature, ComplianceRevision, OEMID, TableID, OEMRevision) { TermList } Khai báo mở đầu cho 1 bảng của ACPI (DSDT, FACP, RSDT, ), cụ thể hóa nội dung của bảng trong TermList Device (DeviceName) { ObjectList } Khai báo thiết bị tên là DeviceName, cụ thể hóa trong ObjectList Divide (Dividend, Divisor, Remainder, Result) Chia Dividend cho Divisor được thương là Result, dư là Remainder EISAID (EisaIdString) Chuyển EisaIdString về mộ t số nguyên mô tả EISA ID của 1 thiết bị VD: EisaID(“PNP0C08”) Else { TermList } Câu lệnh rẽ nhánh trong trường hợp còn lại của If và ElseIf ElseIf (Predicate) { TermList } Mô tả một nhánh khác của câu lệnh rẽ nhánh nếu điều kiện ở Predicate cho giá trị thỏa mãn (một số nguyên khác 0 hoặc True) Field (RegionName, AccessType, LockRule, UpdateRule) { FieldUnitList } Từ khóa Field khai báo một trường dữ liệu trong OperationRegion (cái này mình không rõ) Function (FunctionName, ReturnType, ParameterTypes) { TermList } Khai báo một hàm tên FunctionName, dữ liệu trả về có kiểu là ReturnType, danh sách tham số là ParameterTypes, các câu lệnh củ a hàm nằm trong TermList Khai báo Method có NotSeriallized cũng cho tác dụng tương tự If (Predicate) { TermList } Câu lệnh rẽ nhánh: Nếu điều kiện ở Predicate cho giá trị thỏ a mãn (một số nguyên khác 0 hoặc True) thì thực hiện các câu lệnh trong TermList, còn không thì xét các ElseIf tiếp theo và Else. Increment (Addend) Tăng giá trị của Addend lên 1 đơ n vị. Index (Source, IndexNum, Destination) Trỏ đến phần tử có chỉ số là IndexNum trong biến Source (biến Source có kiểu dữ liệu là Buffer, String, hoặc Package) IRQNoFlags (DescriptorName) { InterruptList } Khai báo một bảng ngắt IRQ (cái này mình không rõ lắm) LAnd (Source1, Source2) Nế u 2 giá trị Source1, Source2 khác 0 thì kết quả là True, ngược lại là False LEqual (Source1, Source2) Nế u 2 giá trị Source1, Source2 giống nhau thì kết quả là True, ngược lại là False LGreater (Source1, Source2) Nế u Source1 lớn hơn Source2 thì kết quả là True, ngược lại là False LGreaterEqual (Source1, Source2) Nế u Source1 lớn hơn hoặc bằng Source2 thì kết quả là True, ngược lại là False LLess (Source1, Source2) Nế u Source1 nhỏ hơn Source2 thì kết quả là True, ngược lại là False LLessEqual (Source1, Source2) Nế u Source1 nhỏ hơn hoặc bằng Source2 thì kết quả là True, ngược lại là False LNot (Source) Nế u Source bằng 0 thì kết quả là True, ngược lại là False LNotEqual (Source1, Source2) Nế u 2 giá trị Source1, Source2 khác nhau thì kết quả là True, ngược lại là False LOr (Source1, Source2) Nế u 1 trong 2 giá trị Source1, Source2 khác 0 hoặc cả hai đều khác 0 thì kết quả là True, ngược lại là False Memory32Fixed (ReadAndWrite, AddressBase, RangeLength, DescriptorName) Khai báo một dãy địa chỉ bộ nhớ (cái này mình không rõ) Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, ParameterTypes) { TermList } Khai báo một phương thức (một khối lệnh) tên MethodName, số lượng tham số là NumArgs, đặc điểm là Serialized hoặc NotSerialized, các câu lệnh được mô tả trong TermList. Các tham số tùy chọn như SyncLevel, ReturnType, ParameterTypes thì mình không rõ, tươ ng tự như khai báo trong Function. Mid (Source, Index, Length, Result) Copy Length dữ liệu từ vị trí Index ở trong Source vào Result . Source có thể là Buffer, String, hoặc Package Mod (Dividend, Divisor, Result) Phép gán modulo (số dư) vào Result khi chia Dividend cho Divisor Multiply (Multiplicand, Multiplier, Result) Phép nhân 2 số Multiplicand, Multiplier và gán kết quả vào Result Name (ObjectName, Object) Khai báo đối tượng tên ObjectName có giá trị khởi tạo là Object NAnd (Source1, Source2, Result) Phép toán bitwise (xử lí bit) NAnd 2 giá trị Source1, Source2, gán kết quả vào Result NOr (Source1, Source2, Result) Phép toán bitwise (xử lí bit) NOr 2 giá trị Source1, Source2, gán kết quả vào Result Not (Source, Result) Phép toán bitwise (xử lí bit) Not giá trị Source, gán kế t quả vào Result Notify (Object, NotificationValue) Nhắc hệ điều hành rằng có sự kiện xảy ra ở Object với giá trị NotificationValue. Object thường là Device, Processor, hoặc ThermalZone ObjectType (Object) Trả về một số nguyên cho biết kiểu dữ liệu của Object One Hẳ ng số nguyên mang giá trị là 1 (dãy bit mà bit cuối cùng là 1, các bit còn lại là 0) hay 0x01 Ones Hẳ ng số nguyên mang giá trị là 1 dãy bit mà tất cả các bit là 1 (VD: 0xFFFFFFFF) OperationRegion (RegionName, RegionSpace, Offset, Length) Khai báo một OperationRegion Or (Source1, Source2, Result) Phép toán bitwise (xử lí bit) Or 2 giá trị Source1, Source2, gán kết quả vào Result Package (NumElements) { PackageList } Khai báo một gói dữ liệu kích thước là NumElements, danh sách các phần tử trong gói được mô tả ở PackageList PowerResource (ResourceName, SystemLevel, ResourceOrder) { ObjectList } Khai báo một Power Resource Processor (ProcessorName, ProcessorID, PBlockAddress, PblockLength) { ObjectList } Khai báo một nhân CPU RefOf (Object) Trả về con trỏ liên kết tới Object ResourceTemplate () { ResourceMacroList } Khai báo một ResourceTemplate Return (Arg) Kết thúc method và trả về giá trị Arg Scope (Location) { ObjectList } Khai báo một Scope (phạm vi) chứa một tập hợp các đối tượng ShiftLeft (Source, ShiftCount, Result) Phép toán dịch ShiftCount bit của Source sang trái và gán kết quả vào Result ShiftRight (Source, ShiftCount, Result) Phép toán dịch ShiftCount bit của Source sang phải và gán kết quả vào Result SizeOf (ObjectName) Cho biết kích thước của ObjectName (String, Buffer, Package) Sleep (MilliSeconds) Tạm dừng phương thức trong MilliSeconds ms (1/1000 giây) Store (Source, Destination) Gán giá trị củ a Source vào Destination Subtract (Minuend, Subtrahend, Result) Phép trừ Minuend cho Subtrahend và gán kết quả vào Result ThermalZone (ThermalZoneName) { ObjectList } Khai báo một ThermalZone While (Predicate) { TermList } Vòng lặp: Nếu điều kiện ở Predicate còn cho giá trị thỏa mãn (một số nguyên khác 0 hoặc True) thì thực hiện các câu lệnh trong TermList, còn không thì thoát khỏi vòng lặp. Zero Hẳ ng số nguyên mang giá trị là 0 (1 dãy bit mà tất cả các bit là 0) hay 0x00 2. Các tên chuẩn Các tên này được chuẩn hóa để hệ điều hành tương thích chuẩn ACPI có thể tìm đúng thiết bị cần giao tiếp và thực hiện đúng các phương thức. Một số tên chuẩn được viết đầy đủ như sau (nghĩa của chúng có thể tra cứu trong các tài liệu về ACPI): Tên Viết đầy đủ _ADR Address _ATT Type-Specific Attribute _ASI Address Space Id _ASZ Access Size _BAS Base Address _BBN Bios Bus Number _BCL Brightness Control Levels _BCM Brightness Control Method _BCT Battery Charge Time _BFS Back From Sleep _BIF Battery Information _BM Bus Master _BST Battery Status _BTM Battery Time _CID Compatible ID _CRS Current Resource Settings _CST C States _DDC Display Data Current _DDN Dos Device Name _DGS Display Graphics State _DMA Direct Memory Access _DOD Display Output Devices _DOS Disable Output Switching _DSM Device Specific Method _DSS Device Set State _DSW Device Sleep Wake _Exx Edge GPE (ex: E01, E02, E0A, ) _EC Embedded Controller _FIF Fan Information _FPS Fan Performance States _FST Fan Status _GL Global Lock _GLK Global Lock _GPE General Purpose Events _GTS Going To Sleep _GTM Get Timing Mode _HID Hardware ID _INI Initialize _INT Interrupts _Lxx Level GPE (ex: L01, L1D, L1E, ) _LCK Lock _LEN Length _LID Lid _MAF Maximum Address Fixed _MAT Multiple Apic Table Entry _MAX Maximum Base Address _MEM Memory Attributes _MIF Minimum Address Fixed _MIN Minimum Base Address _MSG Message _MSM Memory Set Monitoring _OFF Off _ON On _OS Operating System _OSC Operating System Capabilities _OSI Operating System Interfaces _OST Ospm Status Indication _PCL Power Consumer List _PCT Performance Control _PDC Processor Driver Capabilities _PDL P-state Depth Limit _PIC PIC _PIF Power Source Information _PPC Performance Present Capabilites _PR Processor _PR0 Power Resources for D0 _PR1 Power Resources for D1 _PR2 Power Resources for D2 _PR3 Power Resources for D3 _PRS Possible Resource Settings _PRT Pci Routing Table _PRW Power Resources for Wake _PS0 Power State 0 _PS1 Power State 1 _PS2 Power State 2 _PS3 Power State 3 _PSC Power State Current _PSD Processor State Dependencies _PSR Power Source _PSS Performance Supported States _PSW Power State Wake _PTS Prepare To Sleep _Qxx Query (ex: Q01, Q02, ) _REG Region _REV Revision _ROM Read-Only Memory _S0 S0 System State _S1 S1 System State _S2 S2 System State _S3 S3 System State _S4 S4 System State _S5 S5 System State _S1D S1 Device State _S2D S2 Device State _S3D S3 Device State _S4D S4 Device State _S0W S0 Device Wake State _S1W S1 Device Wake State _S2W S2 Device Wake State _S3W S3 Device Wake State _S4W S4 Device Wake State _SB System Bus _SBS Smart Battery Subsystem _SDD Set Device Data _SI System Indicators _SIZ Size _SLI System Locality Information _SPD Set Post Device _SRS Set Resource Settings _SST System Status _STA Status _STM Set Timing Mode _STR String _SUN Slot User Number _T_x Temporary variables (ex: _T_0, _T_1, ) _TMP Temperature _TZ Thermal Zone _TZD Thermal Zone Devices _UID Unique ID _WAK Wake _Wxx Wake Event (ex: W01, W02, ) 3. Cặp ngoặc nhọn mô tả mộ t đ ối tượng Cặ p ngoặc nhọn {} là kí hiệu dùng để đóng gói các nội dung trong một đối tư ợng hoặc đóng gói các câu lệnh trong một phương thức VD: Device (BUS0) { Name (_CID, "smbus") Name (_ADR, Zero) Device (DVL0) { Name (_ADR, 0x57) Name (_CID, "diagsvault") Method (_DSM, 4, NotSerialized) { Store (Package (0x03) { "address", 0x57, Buffer (One) { [...]... hoặc sử dụng tính năng Fix Error trong DSDT Editor VI Các patch DSDT thông dụng dành cho máy để bàn Với mỗi patch DSDT, bạn nên sao lưu lại DSDT chứa các patch trước đó để nếu patch sai còn có thể sửa lại Khi patch DSDT, bạn nên Compile lại để xem patch có bị lỗi gì không Patch đến đâu, bạn có thể thử file DSDT. AML đã patch đến đó để kiểm tra xem patch có hoạt động không, bởi vì các patch gần như... gói dữ liệu (Package) Trong các patch, gói dữ liệu thường được dùng như 1 bảng thuộc tính gồm nhiều thuộc tính và giá trị của chúng Khai báo bằng cú pháp: Package ([n x 2]) { [Tên thuộc tính 1], [Giá trị của thuộc tính 1], [Tên thuộc tính 2], [Giá trị của thuộc tính 2], [Tên thuộc tính n], [Giá trị của thuộc tính n] } Tên thuộc tính có kiểu string, và giá trị của thuộc tính có thể là số nguyên, String,... trong quá trình patch Tất nhiên Mac OS có một số công cụ để tìm thông tin phần cứng nhưng dùng Windows vẫn là tốt nhất - Bạn nên update BIOS để phần cứng hoạt động tốt hơn Ngoài ra phải tinh chỉnh BIOS phù hợp: SATA AHCI nếu có, HPET để là 64 bit - Bạn cần có một phần mềm dùng để patch DSDT có đi kèm trình biên dịch iasl mới nhất Có thể kiếm phần mềm DSDTSE hoặc DSDT Editor Mình dùng DSDT Editor vì... thường, để Mac OS nhận diện được nó ta phải patch DSDT bằng cách thêm method _DSM vào Device tương ứng với phần cứng đó Nội dung của method _DSM như sau: Method (_DSM, 4, NotSerialized) { Store (Package (nx2) { [thuộc tính 1], [giá trị thuộc tính 1], [thuộc tính 2], [giá trị thuộc tính 2], [thuộc tính n], [giá trị thuộc tính n] }, Local0) // Lưu trữ bảng thuộc tính vào biến Local0 DTGP (Arg0, Arg1, Arg2,... đầu tiên Những hướng dẫn dưới đây sẽ được thực hiện trên DSDT Editor, với DSDTSE các bạn làm tương tự Trong các fix này tớ dùng replace [Từ 1] -> [Từ 2] có nghĩa là thay thế tất cả các vị trí xuất hiện [Từ 1] thành [Từ 2] 1 Tạo file DSDT. dsl Mở DSDT Editor, vào Menu File, chọn Extract DSDT Sau đó vào Menu File -> Save DSL, chọn vị trí lưu file, đặt tên là dsdt. dsl hay gì cũng được, nên để đuôi là dsl... 2 Lưu ý trong cách sử dụng DSDT Editor Việc patch DSDT có thể thực hiện lần lượt cho từng phần cứng một, vì vậy bạn nên tạo nhiều bản DSDT cho mỗi lần patch thêm một phần cứng nào đó Để biên dịch file dsl thành file aml, bạn vào menu IASL -> Compile Nếu Compile thành công, không còn bất cứ Error hay Warning nào thì bạn vào menu IASL -> Save AML As, chọn vị trí lưu file aml Để xem vị trí lỗi (error)... máy] /AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI - Bấm vào mỗi Device, các thuộc tính sẽ xuất hiện trong bảng thuộc tính bên cạnh Bảng thuộc tính gồm có các cột sau: + Property: Tên thuộc tính + Type: kiểu dữ liệu của thuộc tính Quy đổi kiểu dữ liệu của thuộc tính sang kiểu dữ liệu tương ứng trong DSDT như sau: Data -> Buffer | Number -> số nguyên hex | String -> String + Value: Giá trị của thuộc tính. .. ngay lập tức di chuyển đến vị trí chứa lỗi Sau khi sửa lỗi xong thì compile luôn để kiểm tra xem lỗi đã thật sự sửa được chưa Để DSDT hoạt động tốt, các lỗi và cảnh báo đều phải được xử lí hết DSDT Editor có nút Fix Error để sửa lỗi, không sửa cảnh báo Vì vậy bạn nên xem các DSDT Fixes trong DSDTSE rồi áp dụng tương tự lên DSDT của bạn Ngoài ra bạn có thể cập nhật trình biên dịch IASL và phần mềm lên... bảng thuộc tính gồm 13 thuộc tính (1A16 = 26 = 13x2) IV Các bước chuẩn bị để patch DSDT 1 Chuẩn bị - Hiển nhiên là bạn phải có Mac OS, nếu không thì patch làm chi Cố gắng tìm các giải pháp kext ngoài hoặc dùng bootloader Chameleon để nhận diện càng nhiều phần cứng càng tốt, tất nhiên là phải hoạt động ổn định Các kext nên dùng phiên bản mới nhất, Chameleon nên update lên RC5 vì có nhiều tính năng m i.. . không thì cứ làm theo cách ban đầu Việc patch DSDT cho LPC sẽ giúp load AppleLPC.kext, từ đó bật C-State cho CPU và quản lí năng lượng của các thiết bị Kiểm tra kết quả patch bằng cách mở IORegistryExplorer sẽ thấy load được AppleLPC ở LPCB, ngoài ra nếu có SpeedStep thì sẽ nhận được C-State Lưu ý là hình ở dưới thể hiện kết quả khi mình patch AppleLPC.kext và patch DSDT với giá trị đúng (pci8086,27b8, . hi vọng được các bạn góp ý nhiệt tình. II. Gi i thiệu về DSDT và hướng dẫn patch DSDT cơ bản 1. DSDT là gì? T i sao ph i patch DSDT? DSDT (Differentiated System Description. Dividend cho Divisor được thương là Result, dư là Remainder EISAID (EisaIdString) Chuyển EisaIdString về mộ t số nguyên mô tả EISA ID của 1 thiết bị VD: EisaID(“PNP0C08”) Else { TermList. giá trị của Minuend i 1 DefinitionBlock (AMLFileName, TableSignature, ComplianceRevision, OEMID, TableID, OEMRevision) { TermList } Khai báo mở đầu cho 1 bảng của ACPI (DSDT, FACP,

Ngày đăng: 07/08/2014, 20:22

Từ khóa liên quan

Mục lục

  • I. Câu chuyện mở đầu

  • II. Giới thiệu về DSDT và hướng dẫn patch DSDT cơ bản

    • 1. DSDT là gì? Tại sao phải patch DSDT?

    • 2. Tổng quát về cách patch DSDT

    • 3. Các patch phổ biến trong DSDT

    • III. Cú pháp của ASL (ACPI Control Method Source Language) trong file DSDT.DSL

      • 1. Các cú pháp thông dụng

      • 2. Các tên chuẩn

      • 3. Cặp ngoặc nhọn mô tả một đối tượng

      • 4. Chú thích

      • 5. Các kiểu dữ liệu phổ biến và cách biểu diễn giá trị

        • a. Dữ liệu số nguyên (Integer)

        • b. Môt số hằng số dạng số nguyên

        • c. Dữ liệu xâu (String)

        • d. Kiểu mảng 1 byte (Buffer)

        • e. Kiểu gói dữ liệu (Package)

        • IV. Các bước chuẩn bị để patch DSDT

          • 1. Chuẩn bị

          • 2. Một số kiến thức về địa chỉ phần cứng

          • 3. Hướng dẫn xem địa chỉ trong Device Manager

          • 4. Hướng dẫn xem thông tin trong IORegistryExplorer

          • 5. Đặc điểm của Method _DSM

          • V. Tạo file DSDT.dsl và fix các lỗi đầu tiên

            • 1. Tạo file DSDT.dsl

            • 2. Lưu ý trong cách sử dụng DSDT Editor

Tài liệu cùng người dùng

Tài liệu liên quan