[Tut] Patch fan control ThinkPad T420/T420s

kientux11/02/2015
  • kientux
    Thành viên
    Tham gia:
    10/01/2014
    Bài viết:
    12
    Lượt thích:
    Địa chỉ:
    #1

    Với các máy ko phải Macintosh thì hầu hết DSDT chỉ được viết cho Windows hay GNU/Linux, dẫn đến nhiều lỗi hay hệ điều hành hoạt động không tối ưu khi chạy Mac OS. Một trong số đó là việc điều khiển tốc độ quạt dựa theo nhiệt độ CPU.

    Với máy mình, ThinkPad T420s, khi chạy Mac OS, quạt luôn quay khoảng 3500 – 4000 RPM (trong khi max là ~ 5500 RPM), kể cả khi nhiệt độ lên tới ~ 80 độ C, khả năng tản nhiệt rất kém. Bài viết sau đây sẽ hướng dẫn cách patch DSDT để chỉnh fan speed tùy ý theo CPU temp, giúp máy bớt nóng hơn, đồng thời quạt đỡ ồn hơn khi idle. Sau khi patch, máy full load giảm khoảng 8 – 10 độ, từ ~ 80 -> 70 độ.

    Note: Title là dành cho T420/T420s, tuy nhiên khả năng cao là vẫn đúng cho ThinkPad nói chung, thậm chí áp dụng cho một số dòng máy khác, vậy nên thay vì chỉ hướng dẫn cách làm thì mình sẽ giải thích từng bước, khi áp dụng cho máy khác cũng sẽ dễ dàng hơn. Những mục trong thẻ [ QUOTE ] màu hồng là giải thích, khuyến khích đọc.

    Note 2: Các bước lấy DSDT, mở nó bằng cái gì, patch xong sử dụng nó ra sao,.. sẽ không được đề cập.


    Note 3: Bài viết được viết trên kinh nghiệm cá nhân, kiến thức ko chuyên, lượm nhặt trên internet, nên có thể từ ngữ, định nghĩa, giải thích,… không được chính xác. Nếu thấy sai sót mọi người cứ góp ý để sửa chữa.

    Note 4: Máy tao chạy chuẩn cmnr/Đm thằng thớt trông ngứa mắt thế/Tao éo thích patch có làm sao không/… ==> Bấm nút BACK là quyền công dân :bz

    Lảm nhảm vậy đủ rồi, bắt đầu thôi.

    I. Patch đọc tốc độ quạt

    Bước này thực ra không cần khi control fan speed, tuy nhiên không xem được tốc độ thì sao biết patch đúng hay không.

    T420/T420s đã có một topic khá chi tiết trên insanelymac tại đây: Lenovo ThinkPad T420 with UEFI Only
    kèm theo DSDT được patch cẩn thận, trong đó đã có patch đọc fan speed (chưa có control fan speed, chỉ có kiểu control “thủ công” là nhấn nút ThinkVantage thì quay max quạt – nguyên thủy quá). Nếu sử dụng luôn DSDT này thì bỏ qua các bước trong phần I này, hoặc đọc tiếp nếu thích.

    Mở DSDT lên, dùng chức năng Search để tìm Device (EC) (Embedded Controller) (nằm trong _SB.PCI0.LPC), thêm vào đoạn code sau ở ngay phía sau block Field (ECOR, ByteAcc, NoLock, Preserve) {..} đầu tiên:
    Field (ECOR, ByteAcc, NoLock, Preserve)
    {
    Offset (0x84),
    HFN1, 8,
    HFN2, 8
    }[/CODE]

    Kết quả nhận được như sau:

    [CENTER][img]http://i.imgur.com/55vkqYP.png[/img]
    [/CENTER]
    [I]Giải thích:[/I]

    [FONT=Courier New]Offset (0x84)[/FONT] là vị trí của EC register ứng với tốc độ quạt, [FONT=Courier New]HFN1[/FONT] và [FONT=Courier New]HFN2[/FONT] là 2 register đó. Mặc định là [FONT=Courier New]HFN1, 16 [/FONT](16 bit register) tuy nhiên nên tách thành 8 bit register để tương thích tốt với Mac OS.

    ——————————————————————————

    Tiếp theo tìm [FONT=Courier New]Device (SMCD)[/FONT] ([B]S[/B]ystem [B]M[/B]onitor and [B]C[/B]ontroll [B]D[/B]evice) cũng trong _SB.PCI0.LPC, thường nằm luôn phía trên [FONT=Courier New]Device (EC)[/FONT], thêm vào đoạn code sau:

    [CODE]Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }[/CODE]

    kết quả:

    [CENTER][img]http://i.imgur.com/ANTISMt.png[/img][/CENTER]

    [I]Giải thích:[/I]

    Ta thấy dòng:
    [CODE]Name (_HID, “MON0000”)[/CODE]
    là để kext FakeSMC đọc được vị trí của [FONT=Courier New]Device (SMCD)[/FONT] này, dựa vào id [FONT=Courier New]MON0000[/FONT], mở Info.plist của nó ra sẽ thấy.

    Đoạn code sử dụng method FAN0 để lưu giá trị 2 register HFN1, HFN2 vào Local0 rồi trả về Local0. FakeSMC dựa vào method này để đọc Local0 và hiển thị fan speed.

    [FONT=Courier New]^^EC.HFN1[/FONT] nghĩa là trong cùng Scope đó ([FONT=Courier New]^^[/FONT]), ở [FONT=Courier New]Device (EC)[/FONT], register [FONT=Courier New]HFN1[/FONT].

    ——————————————————————————

    Ở đây có sử dụng method B1B2 để “tổng hợp” HFN1, HFN2 thành 1 giá trị duy nhất, do vậy ta cần tạo method này. Thêm đoạn sau:

    [CODE]Method (B1B2, 2, NotSerialized)
    {
    Return (Or (Arg0, ShiftLeft (Arg1, 0x08)))
    }[/CODE]

    vào trước kí tự } cuối cùng của DSDT.

    [CENTER][img]http://i.imgur.com/BG7S3IF.png[/img][/CENTER]

    [I]Giải thích:[/I]

    Đầu vào là Arg0 và Arg1, đầu tiên shift left 8 lần Arg1, sau đó OR cái kết quả với Arg0, cuối cùng là trả về giá trị nhận được. Code hơi tắt.

    “Shift left, OR là cái éo gì??” => Trang bị chút kiến thức lập trình + đọc [URL=’http://www.acpi.info/spec.htm’%5DACPI Specification[/URL]

    ——————————————————————————

    Vậy là xong bước đọc fan speed. Công đoạn loằng ngoằng còn ở phía sau. Pha một cốc cafe và đọc tiếp.

    [B][SIZE=6]II. Patch điều khiển tốc độ quạt[/SIZE][/B]

    Phần này mình sẽ lấy các giá trị dựa theo nhu cầu của mình (temp bao nhiêu thì fan speed bao nhiêu). Mình khuyên các bạn nên vọc trước phần mềm [B]TPFanControl[/B] bên Windows để định hình được các giá trị phù hợp với máy. Còn ko thì cứ bịa ra thấy hợp thì lấy thôi.

    Mọi việc sẽ chỉ ở nằm trong [FONT=Courier New]Device (SMCD)[/FONT].

    Đầu tiên mở [FONT=Courier New]Device (EC)[/FONT] (wtf, mọi việc nằm trong SMCD lại bắt mở EC?!). Trong cái [FONT=Courier New]Field (ECOR, ByteAcc, NoLock, Preserve) {..}[/FONT] đầu tiên, sẽ thấy một register là [FONT=Courier New]HFSP[/FONT] ([B]H[/B]??? [B]F[/B]an [B]SP[/B]eed, hình như offset là 0x2F). Đó chính là register để set giá trị tốc độ quạt (thằng trên là get, thằng này là set).

    Tiếp theo là phải biết mình cần set fan speed như nào đã. Đây là các giá trị của mình:

    [CODE]Level=42 0
    Level=45 3
    Level=50 4
    Level=55 5
    Level=60 7
    Level=70 64[/CODE]

    dựa theo TPFanControl.

    Fan speed trong DSDT có các giá trị như sau:

    [CODE]0 = Không quay (obviously)
    7 = Max speed
    64 = Disengaged mode – Absolute maxium speed, nhanh hơn cả 7, quay hết công suất
    128 = BIOS mode – để OS tự điều khiển theo DSDT như không patch
    Các giá trị khác chia đều từ 0 đến 7.[/CODE]

    Vậy theo như trên sẽ là

    [CODE]Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là [B]máy mát chứ không phải máy yên tĩnh[/B]. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm [FONT=Courier New]Method (TCPU)[/FONT] vào [FONT=Courier New]Device (SMCD)[/FONT]

    [CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]Field (ECOR, ByteAcc, NoLock, Preserve)
    {
    Offset (0x84),
    HFN1, 8,
    HFN2, 8
    }[/CODE]

    Kết quả nhận được như sau:

    55vkqYP.png

    Giải thích:

    Offset (0x84) là vị trí của EC register ứng với tốc độ quạt, HFN1HFN2 là 2 register đó. Mặc định là HFN1, 16 (16 bit register) tuy nhiên nên tách thành 8 bit register để tương thích tốt với Mac OS.



    Tiếp theo tìm Device (SMCD) (System Monitor and Controll Device) cũng trong _SB.PCI0.LPC, thường nằm luôn phía trên Device (EC), thêm vào đoạn code sau:

    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }[/CODE]

    kết quả:

    [CENTER][img]http://i.imgur.com/ANTISMt.png[/img][/CENTER]

    [I]Giải thích:[/I]

    Ta thấy dòng:
    [CODE]Name (_HID, “MON0000”)[/CODE]
    là để kext FakeSMC đọc được vị trí của [FONT=Courier New]Device (SMCD)[/FONT] này, dựa vào id [FONT=Courier New]MON0000[/FONT], mở Info.plist của nó ra sẽ thấy.

    Đoạn code sử dụng method FAN0 để lưu giá trị 2 register HFN1, HFN2 vào Local0 rồi trả về Local0. FakeSMC dựa vào method này để đọc Local0 và hiển thị fan speed.

    [FONT=Courier New]^^EC.HFN1[/FONT] nghĩa là trong cùng Scope đó ([FONT=Courier New]^^[/FONT]), ở [FONT=Courier New]Device (EC)[/FONT], register [FONT=Courier New]HFN1[/FONT].

    ——————————————————————————

    Ở đây có sử dụng method B1B2 để “tổng hợp” HFN1, HFN2 thành 1 giá trị duy nhất, do vậy ta cần tạo method này. Thêm đoạn sau:

    [CODE]Method (B1B2, 2, NotSerialized)
    {
    Return (Or (Arg0, ShiftLeft (Arg1, 0x08)))
    }[/CODE]

    vào trước kí tự } cuối cùng của DSDT.

    [CENTER][img]http://i.imgur.com/BG7S3IF.png[/img][/CENTER]

    [I]Giải thích:[/I]

    Đầu vào là Arg0 và Arg1, đầu tiên shift left 8 lần Arg1, sau đó OR cái kết quả với Arg0, cuối cùng là trả về giá trị nhận được. Code hơi tắt.

    “Shift left, OR là cái éo gì??” => Trang bị chút kiến thức lập trình + đọc [URL=’http://www.acpi.info/spec.htm’%5DACPI Specification[/URL]

    ——————————————————————————

    Vậy là xong bước đọc fan speed. Công đoạn loằng ngoằng còn ở phía sau. Pha một cốc cafe và đọc tiếp.

    [B][SIZE=6]II. Patch điều khiển tốc độ quạt[/SIZE][/B]

    Phần này mình sẽ lấy các giá trị dựa theo nhu cầu của mình (temp bao nhiêu thì fan speed bao nhiêu). Mình khuyên các bạn nên vọc trước phần mềm [B]TPFanControl[/B] bên Windows để định hình được các giá trị phù hợp với máy. Còn ko thì cứ bịa ra thấy hợp thì lấy thôi.

    Mọi việc sẽ chỉ ở nằm trong [FONT=Courier New]Device (SMCD)[/FONT].

    Đầu tiên mở [FONT=Courier New]Device (EC)[/FONT] (wtf, mọi việc nằm trong SMCD lại bắt mở EC?!). Trong cái [FONT=Courier New]Field (ECOR, ByteAcc, NoLock, Preserve) {..}[/FONT] đầu tiên, sẽ thấy một register là [FONT=Courier New]HFSP[/FONT] ([B]H[/B]??? [B]F[/B]an [B]SP[/B]eed, hình như offset là 0x2F). Đó chính là register để set giá trị tốc độ quạt (thằng trên là get, thằng này là set).

    Tiếp theo là phải biết mình cần set fan speed như nào đã. Đây là các giá trị của mình:

    [CODE]Level=42 0
    Level=45 3
    Level=50 4
    Level=55 5
    Level=60 7
    Level=70 64[/CODE]

    dựa theo TPFanControl.

    Fan speed trong DSDT có các giá trị như sau:

    [CODE]0 = Không quay (obviously)
    7 = Max speed
    64 = Disengaged mode – Absolute maxium speed, nhanh hơn cả 7, quay hết công suất
    128 = BIOS mode – để OS tự điều khiển theo DSDT như không patch
    Các giá trị khác chia đều từ 0 đến 7.[/CODE]

    Vậy theo như trên sẽ là

    [CODE]Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là [B]máy mát chứ không phải máy yên tĩnh[/B]. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm [FONT=Courier New]Method (TCPU)[/FONT] vào [FONT=Courier New]Device (SMCD)[/FONT]

    [CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }[/CODE]

    kết quả:

    ANTISMt.png

    Giải thích:

    Ta thấy dòng:
    Name (_HID, “MON0000”)[/CODE]
    là để kext FakeSMC đọc được vị trí của [FONT=Courier New]Device (SMCD)[/FONT] này, dựa vào id [FONT=Courier New]MON0000[/FONT], mở Info.plist của nó ra sẽ thấy.

    Đoạn code sử dụng method FAN0 để lưu giá trị 2 register HFN1, HFN2 vào Local0 rồi trả về Local0. FakeSMC dựa vào method này để đọc Local0 và hiển thị fan speed.

    [FONT=Courier New]^^EC.HFN1[/FONT] nghĩa là trong cùng Scope đó ([FONT=Courier New]^^[/FONT]), ở [FONT=Courier New]Device (EC)[/FONT], register [FONT=Courier New]HFN1[/FONT].

    ——————————————————————————

    Ở đây có sử dụng method B1B2 để “tổng hợp” HFN1, HFN2 thành 1 giá trị duy nhất, do vậy ta cần tạo method này. Thêm đoạn sau:

    [CODE]Method (B1B2, 2, NotSerialized)
    {
    Return (Or (Arg0, ShiftLeft (Arg1, 0x08)))
    }[/CODE]

    vào trước kí tự } cuối cùng của DSDT.

    [CENTER][img]http://i.imgur.com/BG7S3IF.png[/img][/CENTER]

    [I]Giải thích:[/I]

    Đầu vào là Arg0 và Arg1, đầu tiên shift left 8 lần Arg1, sau đó OR cái kết quả với Arg0, cuối cùng là trả về giá trị nhận được. Code hơi tắt.

    “Shift left, OR là cái éo gì??” => Trang bị chút kiến thức lập trình + đọc [URL=’http://www.acpi.info/spec.htm’%5DACPI Specification[/URL]

    ——————————————————————————

    Vậy là xong bước đọc fan speed. Công đoạn loằng ngoằng còn ở phía sau. Pha một cốc cafe và đọc tiếp.

    [B][SIZE=6]II. Patch điều khiển tốc độ quạt[/SIZE][/B]

    Phần này mình sẽ lấy các giá trị dựa theo nhu cầu của mình (temp bao nhiêu thì fan speed bao nhiêu). Mình khuyên các bạn nên vọc trước phần mềm [B]TPFanControl[/B] bên Windows để định hình được các giá trị phù hợp với máy. Còn ko thì cứ bịa ra thấy hợp thì lấy thôi.

    Mọi việc sẽ chỉ ở nằm trong [FONT=Courier New]Device (SMCD)[/FONT].

    Đầu tiên mở [FONT=Courier New]Device (EC)[/FONT] (wtf, mọi việc nằm trong SMCD lại bắt mở EC?!). Trong cái [FONT=Courier New]Field (ECOR, ByteAcc, NoLock, Preserve) {..}[/FONT] đầu tiên, sẽ thấy một register là [FONT=Courier New]HFSP[/FONT] ([B]H[/B]??? [B]F[/B]an [B]SP[/B]eed, hình như offset là 0x2F). Đó chính là register để set giá trị tốc độ quạt (thằng trên là get, thằng này là set).

    Tiếp theo là phải biết mình cần set fan speed như nào đã. Đây là các giá trị của mình:

    [CODE]Level=42 0
    Level=45 3
    Level=50 4
    Level=55 5
    Level=60 7
    Level=70 64[/CODE]

    dựa theo TPFanControl.

    Fan speed trong DSDT có các giá trị như sau:

    [CODE]0 = Không quay (obviously)
    7 = Max speed
    64 = Disengaged mode – Absolute maxium speed, nhanh hơn cả 7, quay hết công suất
    128 = BIOS mode – để OS tự điều khiển theo DSDT như không patch
    Các giá trị khác chia đều từ 0 đến 7.[/CODE]

    Vậy theo như trên sẽ là

    [CODE]Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là [B]máy mát chứ không phải máy yên tĩnh[/B]. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm [FONT=Courier New]Method (TCPU)[/FONT] vào [FONT=Courier New]Device (SMCD)[/FONT]

    [CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]Name (_HID, “MON0000”)[/CODE]
    là để kext FakeSMC đọc được vị trí của Device (SMCD) này, dựa vào id MON0000, mở Info.plist của nó ra sẽ thấy.

    Đoạn code sử dụng method FAN0 để lưu giá trị 2 register HFN1, HFN2 vào Local0 rồi trả về Local0. FakeSMC dựa vào method này để đọc Local0 và hiển thị fan speed.

    ^^EC.HFN1 nghĩa là trong cùng Scope đó (^^), ở Device (EC), register HFN1.



    Ở đây có sử dụng method B1B2 để “tổng hợp” HFN1, HFN2 thành 1 giá trị duy nhất, do vậy ta cần tạo method này. Thêm đoạn sau:

    Method (B1B2, 2, NotSerialized)
    {
    Return (Or (Arg0, ShiftLeft (Arg1, 0x08)))
    }[/CODE]

    vào trước kí tự } cuối cùng của DSDT.

    [CENTER][img]http://i.imgur.com/BG7S3IF.png[/img][/CENTER]

    [I]Giải thích:[/I]

    Đầu vào là Arg0 và Arg1, đầu tiên shift left 8 lần Arg1, sau đó OR cái kết quả với Arg0, cuối cùng là trả về giá trị nhận được. Code hơi tắt.

    “Shift left, OR là cái éo gì??” => Trang bị chút kiến thức lập trình + đọc [URL=’http://www.acpi.info/spec.htm’%5DACPI Specification[/URL]

    ——————————————————————————

    Vậy là xong bước đọc fan speed. Công đoạn loằng ngoằng còn ở phía sau. Pha một cốc cafe và đọc tiếp.

    [B][SIZE=6]II. Patch điều khiển tốc độ quạt[/SIZE][/B]

    Phần này mình sẽ lấy các giá trị dựa theo nhu cầu của mình (temp bao nhiêu thì fan speed bao nhiêu). Mình khuyên các bạn nên vọc trước phần mềm [B]TPFanControl[/B] bên Windows để định hình được các giá trị phù hợp với máy. Còn ko thì cứ bịa ra thấy hợp thì lấy thôi.

    Mọi việc sẽ chỉ ở nằm trong [FONT=Courier New]Device (SMCD)[/FONT].

    Đầu tiên mở [FONT=Courier New]Device (EC)[/FONT] (wtf, mọi việc nằm trong SMCD lại bắt mở EC?!). Trong cái [FONT=Courier New]Field (ECOR, ByteAcc, NoLock, Preserve) {..}[/FONT] đầu tiên, sẽ thấy một register là [FONT=Courier New]HFSP[/FONT] ([B]H[/B]??? [B]F[/B]an [B]SP[/B]eed, hình như offset là 0x2F). Đó chính là register để set giá trị tốc độ quạt (thằng trên là get, thằng này là set).

    Tiếp theo là phải biết mình cần set fan speed như nào đã. Đây là các giá trị của mình:

    [CODE]Level=42 0
    Level=45 3
    Level=50 4
    Level=55 5
    Level=60 7
    Level=70 64[/CODE]

    dựa theo TPFanControl.

    Fan speed trong DSDT có các giá trị như sau:

    [CODE]0 = Không quay (obviously)
    7 = Max speed
    64 = Disengaged mode – Absolute maxium speed, nhanh hơn cả 7, quay hết công suất
    128 = BIOS mode – để OS tự điều khiển theo DSDT như không patch
    Các giá trị khác chia đều từ 0 đến 7.[/CODE]

    Vậy theo như trên sẽ là

    [CODE]Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là [B]máy mát chứ không phải máy yên tĩnh[/B]. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm [FONT=Courier New]Method (TCPU)[/FONT] vào [FONT=Courier New]Device (SMCD)[/FONT]

    [CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]Method (B1B2, 2, NotSerialized)
    {
    Return (Or (Arg0, ShiftLeft (Arg1, 0x08)))
    }[/CODE]

    vào trước kí tự } cuối cùng của DSDT.

    BG7S3IF.png

    Giải thích:

    Đầu vào là Arg0 và Arg1, đầu tiên shift left 8 lần Arg1, sau đó OR cái kết quả với Arg0, cuối cùng là trả về giá trị nhận được. Code hơi tắt.

    “Shift left, OR là cái éo gì??” => Trang bị chút kiến thức lập trình + đọc ACPI Specification



    Vậy là xong bước đọc fan speed. Công đoạn loằng ngoằng còn ở phía sau. Pha một cốc cafe và đọc tiếp.

    II. Patch điều khiển tốc độ quạt

    Phần này mình sẽ lấy các giá trị dựa theo nhu cầu của mình (temp bao nhiêu thì fan speed bao nhiêu). Mình khuyên các bạn nên vọc trước phần mềm TPFanControl bên Windows để định hình được các giá trị phù hợp với máy. Còn ko thì cứ bịa ra thấy hợp thì lấy thôi.

    Mọi việc sẽ chỉ ở nằm trong Device (SMCD).

    Đầu tiên mở Device (EC) (wtf, mọi việc nằm trong SMCD lại bắt mở EC?!). Trong cái Field (ECOR, ByteAcc, NoLock, Preserve) {..} đầu tiên, sẽ thấy một register là HFSP (H??? Fan SPeed, hình như offset là 0x2F). Đó chính là register để set giá trị tốc độ quạt (thằng trên là get, thằng này là set).

    Tiếp theo là phải biết mình cần set fan speed như nào đã. Đây là các giá trị của mình:

    Level=42 0
    Level=45 3
    Level=50 4
    Level=55 5
    Level=60 7
    Level=70 64[/CODE]

    dựa theo TPFanControl.

    Fan speed trong DSDT có các giá trị như sau:

    [CODE]0 = Không quay (obviously)
    7 = Max speed
    64 = Disengaged mode – Absolute maxium speed, nhanh hơn cả 7, quay hết công suất
    128 = BIOS mode – để OS tự điều khiển theo DSDT như không patch
    Các giá trị khác chia đều từ 0 đến 7.[/CODE]

    Vậy theo như trên sẽ là

    [CODE]Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là [B]máy mát chứ không phải máy yên tĩnh[/B]. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm [FONT=Courier New]Method (TCPU)[/FONT] vào [FONT=Courier New]Device (SMCD)[/FONT]

    [CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]Level=42 0
    Level=45 3
    Level=50 4
    Level=55 5
    Level=60 7
    Level=70 64[/CODE]

    dựa theo TPFanControl.

    Fan speed trong DSDT có các giá trị như sau:

    0 = Không quay (obviously)
    7 = Max speed
    64 = Disengaged mode – Absolute maxium speed, nhanh hơn cả 7, quay hết công suất
    128 = BIOS mode – để OS tự điều khiển theo DSDT như không patch
    Các giá trị khác chia đều từ 0 đến 7.[/CODE]

    Vậy theo như trên sẽ là

    [CODE]Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là [B]máy mát chứ không phải máy yên tĩnh[/B]. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm [FONT=Courier New]Method (TCPU)[/FONT] vào [FONT=Courier New]Device (SMCD)[/FONT]

    [CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]0 = Không quay (obviously)
    7 = Max speed
    64 = Disengaged mode – Absolute maxium speed, nhanh hơn cả 7, quay hết công suất
    128 = BIOS mode – để OS tự điều khiển theo DSDT như không patch
    Các giá trị khác chia đều từ 0 đến 7.[/CODE]

    Vậy theo như trên sẽ là

    Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là [B]máy mát chứ không phải máy yên tĩnh[/B]. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm [FONT=Courier New]Method (TCPU)[/FONT] vào [FONT=Courier New]Device (SMCD)[/FONT]

    [CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]Chiều tăng:

    Khi temp chưa quá 45 -> không quay
    Khi temp vượt 45 -> speed 3
    Khi temp vượt 50 -> speed 4
    Khi temp vượt 55 -> speed 5
    Khi temp vượt 60 -> speed 7
    Khi temp vượt 70 -> absolute max speed

    Chiều giảm:

    Khi temp vẫn quá 60 -> absolute max speed
    Khi temp hạ về 60 -> speed 7
    Khi temp hạ về 55 -> speed 5
    Khi temp hạ về 50 -> speed 4
    Khi temp hạ về 45 -> speed 3
    Khi temp hạ về 42 -> không quay[/CODE]

    Như vậy, nhu cầu của mình là máy mát chứ không phải máy yên tĩnh. Chỉ cần trên 45 là nó quay tầm 2500 RPM rồi, và khi nhiệt độ lên cao, quạt sẽ tăng tốc khá nhanh để giảm ngay nhiệt độ xuống. Ban đầu đọc thì lằng nhằng, cứ ngâm cứu đi sẽ hiểu và tùy chỉnh theo ý thích của mình.

    Tiếp theo là áp dụng cái list trên vào DSDT. Cần thêm Method (TCPU) vào Device (SMCD)

    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    [I]Giải thích:[/I]

    Method này lấy giá trị của [FONT=Courier New]^^EC.TMP0[/FONT], là [B]nhiệt độ của CPU Heatsink[/B], lưu vào [FONT=Courier New]Local0[/FONT] rồi trả về [FONT=Courier New]Local0[/FONT].
    Đoạn [FONT=Courier New]// Controlling here[/FONT] chính là nơi ta xử lý fan speed dựa theo [FONT=Courier New]TMP0[/FONT] hay [FONT=Courier New]Local0[/FONT].

    Code hoàn chỉnh:

    [CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]
    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)

    // Controlling here

    Return (Local0)
    }
    }
    [/CODE]

    Giải thích:

    Method này lấy giá trị của ^^EC.TMP0, là nhiệt độ của CPU Heatsink, lưu vào Local0 rồi trả về Local0.
    Đoạn // Controlling here chính là nơi ta xử lý fan speed dựa theo TMP0 hay Local0.

    Code hoàn chỉnh:

    Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec) { Store (Zero, ^^EC.HFSP) } If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    [I]Giải thích:[/I]

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    [FONT=Courier New]LLessEqual[/FONT] = Nhỏ hơn hoặc bằng
    [FONT=Courier New]LGreaterEqual[/FONT] = Lớn hơn hoặc bằng

    [CENTER][img]http://i.imgur.com/qHSxdgT.png[/img][/CENTER]

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    [SIZE=6][B]III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)[/B][/SIZE]

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái [FONT=Courier New]Device (SMCD)[/FONT]. [FONT=Courier New]Method (TCPU)[/FONT] đọc nhiệt độ [B]CPU Heatsink[/B] là [FONT=Courier New]TMP0[/FONT], sau đó mới control fan speed. Bởi vậy [B]nếu [FONT=Courier New]TMP0[/FONT] không được đọc, sẽ chẳng có đoạn nào là control fanspeed[/B] nữa cả. Chính vì vậy, [B][COLOR=#ff0000]bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink[/COLOR][/B]. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    [CENTER][img]http://i.imgur.com/wYnnyNc.png[/img][/CENTER]

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    [CENTER][img]http://i.imgur.com/ENQHEIm.png[/img][/CENTER]

    [SIZE=6][B]IV. Kết thúc tutorial. Đôi lời muốn nói [/B][/SIZE][SIZE=4]nhanh để đi ngủ.[/SIZE]

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    [SIZE=5][COLOR=#0080ff]Chúc mừng năm mới – Happy new year[/COLOR][/SIZE] :)[CODE]Device (SMCD)
    {
    Name (_HID, “MON0000”)
    Method (FAN0, 0, NotSerialized)
    {
    Store (B1B2 (^^EC.HFN1, ^^EC.HFN2), Local0)
    Return (Local0)
    }

    Method (TCPU, 0, NotSerialized)
    {
    Store (^^EC.TMP0, Local0)
    If (LLessEqual (Local0, 0x2A)) // Nếu temp <= 42 độ C (dec)
    {
    Store (Zero, ^^EC.HFSP)
    }

    If (LGreaterEqual (Local0, 0x46)) // Nếu temp >= 70 độ C (dec) ..
    {
    Store (0x40, ^^EC.HFSP) // thì gán speed 64 (dec) vào HFSP
    }
    Else // hoặc ..
    {
    If (LGreaterEqual (Local0, 0x3C)) // Nếu temp >= 60 độ C (dec) ..
    {
    Store (0x07, ^^EC.HFSP) // thì gán speed 7 (dec) vào HFSP
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x37)) // Nếu temp >= 55 độ C (dec)
    {
    Store (0x05, ^^EC.HFSP) // thì gán speed 5 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x32)) // Nếu temp >= 50 độ C (dec)
    {
    Store (0x04, ^^EC.HFSP) // thì gán speed 4 (dec) vào HFSP ..
    }
    Else
    {
    If (LGreaterEqual (Local0, 0x2D)) // Nếu temp >= 45 độ C (dec) ..
    {
    Store (0x03, ^^EC.HFSP) // thì gán speed 3 (dec) vào HFSP
    }
    }
    }
    }
    }

    Return (Local0)
    }
    }[/CODE]

    Giải thích:

    Có gì thì giải thích trong code cả rồi. Ở đây, các giá trị ở hệ cơ số 10 decimal đều phải được đổi sang hệ cơ số 16 heximal (0x2A = 42, 0x46 = 70…)

    LLessEqual = Nhỏ hơn hoặc bằng
    LGreaterEqual = Lớn hơn hoặc bằng

    qHSxdgT.png

    Cuối cùng compile DSDT, nếu làm đúng sẽ ko có lỗi nào cả, lưu nó lại và sử dụng.
    Bước II kết thúc ở đây. Đừng vội, còn bước III nữa.

    III. Cài đặt 1 app theo dõi nhiệt độ CPU (iStats hoặc HWMonitor)

    Cái này hầu hết anh em có cài. Dĩ nhiên là để theo dõi xem patch chuẩn hay chưa rồi. Tuy nhiên, hãy để ý cái Device (SMCD). Method (TCPU) đọc nhiệt độ CPU HeatsinkTMP0, sau đó mới control fan speed. Bởi vậy nếu TMP0 không được đọc, sẽ chẳng có đoạn nào là control fanspeed nữa cả. Chính vì vậy, bắt buộc cần 1 app để đọc giá trị nhiệt độ CPU, và phải là CPU Heatsink. Thích bật, tắt cái nào thì tùy, riêng CPU Heatsink là phải có.

    Với HWMonitor, vào Preferences của nó ném cái CPU Heatsink sang MENUBAR ITEMS.

    wYnnyNc.png

    Với iStats, vào mục Sensors, kéo cái CPU Heatsink lên SENSORS TO SHOW MENUBAR (thằng này thì mặc định thế).

    ENQHEIm.png

    IV. Kết thúc tutorial. Đôi lời muốn nói nhanh để đi ngủ.

    Rất mừng vì mọi người đã đọc được đến đây trước khi close tab. Chúc mọi người h@ck vui vẻ và h@ck mát mẻ. (Subforum hackintosh mà lại censor từ h4ck là sao?)

    Chúc mừng năm mới – Happy new year :)

  • Ẩn danh
    Khách
    Tham gia:
    Bài viết:
    0
    Lượt thích:
    Địa chỉ:
    #15

    lâu lắm mới thấy bác tái xuất.

    kientux
    Thành viên
    Tham gia:
    10/01/2014
    Bài viết:
    12
    Lượt thích:
    Địa chỉ:
    #16

    @pikachu wrote:

    Tái xuất đâu, vẫn nằm vùng theo dõi anh em thôi mà :D

    Plague Doctor
    Thành viên
    Tham gia:
    25/12/2013
    Bài viết:
    145
    Lượt thích:
    Địa chỉ:
    #17
    kientux, post: 88650, member: 430 wrote:
    Note 4: Máy tao chạy chuẩn cmnr/Đm thằng thớt trông ngứa mắt thế/Tao éo thích patch có làm sao không/… ==> Bấm nút BACK là quyền công dân :bz

    Cứng gớm nhỉ

    DuongTH
    Thành viên
    Tham gia:
    18/07/2014
    Bài viết:
    1846
    Lượt thích:
    Địa chỉ:
    #18

    @kientux wrote:

    tình hình là nghiên cứu cái topic của thớt để patch FAN cho Asus.
    cũng hiểu là
    EC.HFSP nó sẽ gọi đến cái method HFSP ở EC.

    thớt có thể lộ hàng cho mình xin nội dung của cái method ấy được không nhỉ?

    Đương nhiên trên DSDT của con máy mình nó cũng khác về cái tên nhưng cái kiểu gọi này thì mình tự comparite sang được. thấy cái method làm chức năng ấy bên DSDT của mình nó viết rối rắm quá nên muốn tham khảo bên đấy xem ntn.

    imlucasnguyen
    Thành viên
    Tham gia:
    26/09/2014
    Bài viết:
    30
    Lượt thích:
    Địa chỉ:
    #19

    Dùng B1B2 để “tổng hợp” HFN1, HFN2.
    Cho em hỏi tại sao phải tổng hợp 2 cái đấy ạ? Vì nhiều máy chỉ có 1 quạt thì thế nào?

    kientux
    Thành viên
    Tham gia:
    10/01/2014
    Bài viết:
    12
    Lượt thích:
    Địa chỉ:
    #20
    DuongTH, post: 92484, member: 14762 wrote:
    tình hình là nghiên cứu cái topic của thớt để patch FAN cho Asus.
    cũng hiểu là
    EC.HFSP nó sẽ gọi đến cái method HFSP ở EC.

    thớt có thể lộ hàng cho mình xin nội dung của cái method ấy được không nhỉ?

    Đương nhiên trên DSDT của con máy mình nó cũng khác về cái tên nhưng cái kiểu gọi này thì mình tự comparite sang được. thấy cái method làm chức năng ấy bên DSDT của mình nó viết rối rắm quá nên muốn tham khảo bên đấy xem ntn.
    Giờ mới vào đọc được. Bạn chú ý mình nói là register HFSP chứ không phải method. Register thì nó chỉ là 1 cái name mà qua đó máy đọc giá trị thôi chứ không phải hàm nên không có nội dung. Register thì đặc trưng bởi offset, mà ở đây với HFSP nó là 0x2F. Bạn tìm đến offset đó là thấy.

    imlucasnguyen, post: 97601, member: 24218 wrote:
    Dùng B1B2 để “tổng hợp” HFN1, HFN2.
    Cho em hỏi tại sao phải tổng hợp 2 cái đấy ạ? Vì nhiều máy chỉ có 1 quạt thì thế nào?
    2 cái đó không phải ứng với số quạt bạn ạ. Nó là 2 giá trị để tính toán ra tốc độ quạt, và B1B2 như là cái máy tính. Dễ hiểu thì HFN1 là số 1, HFN2 là số 2, còn B1B2 là phép cộng.
    Cứ Từ Từ
    Thành viên
    Tham gia:
    21/08/2014
    Bài viết:
    18
    Lượt thích:
    Địa chỉ:
    #21

    lỗi này là gì vậy bác @[USER=430]kientux[/USER] ?
    e làm theo tất cả các bước đấy =D

    kientux
    Thành viên
    Tham gia:
    10/01/2014
    Bài viết:
    12
    Lượt thích:
    Địa chỉ:
    #22
    Cứ Từ Từ, post: 138438, member: 18911 wrote:
    lỗi này là gì vậy bác @[USER=430]kientux[/USER] ?
    e làm theo tất cả các bước đấy =D
    Có thể là bạn thiếu một dấu } ở đâu đấy rồi.
  • Diễn đàn ‘Kiến thức cơ bản’ đã không còn cho phép tạo chủ đề và phản hồi mới.