Asus Notebook - Fan-Control ACPI - Schreiben in EC-RAM?

  • Hallo zusammen,

    ich möchte das Thema Fan-Control bei Asus Laptops (in meinem Fall speziell der UX310UAK) noch einmal aufrollen. Der auch bei niedrigen Temperaturen ständig mitlaufende Lüfter nervt schon sehr.


    Aktueller Stand

    • Unter Linux habe ich es z. B. mit NBFC schon hinbekommen, eine sinnvolle Lüftercharakteristik zu definieren
    • Der hier beschriebene SSDT-Patch funktioniert bei meinem Modell nicht, da die verwendeten Methoden (z. B. QMOD) nicht mehr vorliegen bzw. Asus allgemein die Lüftersteuerung geändert hat.
    • Zufällig bin ich auf diese Posts gestoßen, welche für mich sehr vielversprechend klingen: https://github.com/daringer/as…44#issuecomment-307589414

    Ich suche eine Möglichkeit um

    • zunächst einen EC RAM Dump zu machen (das kann ich zur Not aber natürlich auch von einem Linux aus tun), um daraus die Register zu suchen, welche die Kennline bzw. Temperaturen definieren
    • dIe im o. g. Github Verlauf dargestellten acpi_calls in mein System einzubinden. Ich stelle mir vor, dass dies eigentlich recht einfach gehen müsste, jedoch bin ich planlos bezüglich der Herangehensweise.

      \_SB.PCI0.LPCB.EC0.WRAM 0x537 0x2d

      \_SB.PCI0.LPCB.EC0.WRAM 0x538 0x30

      \_SB.PCI0.LPCB.EC0.WRAM 0x539 0x33

      \_SB.PCI0.LPCB.EC0.WRAM 0x53a 0x37

      \_SB.PCI0.LPCB.EC0.WRAM 0x53b 0x3a


    In der DSDT wird WRAM durchaus verwendet, z. B:


    Hat jemand von euch eine Idee, wie ich einen Aufruf dieser WRAM Methode mit entsprechenden Parametern implementieren kann? Ich hätte jetzt aus dem Bauch heraus gesagt, dass das in eine SSDT muss, jedoch bräuchte ich dafür Hilfe.

    Vielen Dank im Voraus!

  • Holz_Michel

    Hat den Titel des Themas von „Asus Zenbook UX310UAK - Fan-Control - Schreiben in EC-RAM?“ zu „Asus Notebook - Fan-Control ACPI - Schreiben in EC-RAM?“ geändert.
  • Hallo zusammen,
    hier ein kleines Update:

    Unter Linux kann ich einfach diese Befehle als Script ausführen und habe dann mit Hilfe des acpi_call Pakets eine perfekte Lüftersteuerung.

    Wenn jemand eine Idee hat, wie ich diese funktionierenden ACPI Calls in MacOS, OC oder in eine SSDT einbauen kann, wäre ich sehr glücklich.

    Shell-Script: set_kennlinie.sh
    1. #!/bin/bash
    2. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x537 0x3C' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
    3. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x538 0x3E' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
    4. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x539 0x40' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
    5. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x540 0x44' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
    6. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x541 0x48' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
    7. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x542 0x4C' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
    8. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x543 0x50' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
    9. echo '\_SB.PCI0.LPCB.EC0.WRAM 0x544 0x54' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call

    Ich kann mir sehr gut vorstellen, dass diese Vorgehensweise für eine Vielzahl von Asus Notebooks funktionieren wird.

    Wenn noch weitere Infos benötigt werden, kann ich diese natürlich sehr gern nachliefern.
    Vielen Dank!

  • Naja Du braucht unter macOS etwas das die Calls triggert damit da was passiert es muss also irgendetwas her das vereinfacht gesprochen sagt wenn der Temperatursensor den Wert X liefert denn setze den Wert Y für die Drehzahl des Lüfters. Von sich aus passiert das nicht da macOS ja nunmal einen SMC erwartet und das darüber regeln würde (AppleSMC.kext). Hier muss man ansetzen. Es gab eine ähnliche Problematik damals bei den alten Thinkpads (T60/T61) schau Dir mal das hier an: Temperaturabhängige Lüftersteuerung für Lenovo T6X - T4XX (möglicherweise auch andere Notebooks) ich könnte mir vorstellen das sich eine ähnliche Lösung auch mit dem Asus realisieren lässt.

  • Guten Abend griven ,

    vielen Dank für die Antwort. Ich muss glaube ich dazu sagen, dass die Lüftersteuerung durchaus temperaturabhängig funktioniert. Und das mit exakt gleichen Kennlinien in Windows, Linux und MacOS.

    Daher fällt es mir sehr schwer zu verstehen, dass der EC hier außer Gefecht ist.

    In der DSDT gibt es keine explizite Funktion zum direkten Setzen einer Drehzahl. Da die "hardwareseitige" Steuerung grundsätzlich funktioniert und ich nur einen „Offset" der Kennline brauche, würde ich gerne einmal probieren, ob es mit macOS nicht vielleicht auch ausreicht, wenn ich diese 5 Werte im EC RAM setze.

    Ein einmaliges Setzen z. B. beim oder nach dem Systemstart würde völlig ausreichen.


    Ich würde das wirklich gern experimentell ausprobieren, mach dann natürlich auch eine Doku davon. Jedoch fehlt mir das letzte Puzzlestück: Wo und wie kann ich diese Calls als „Init“ in eine SSDT oder sonst wohin einbinden, sodass sie beim Start gesetzt werden?


    Vielen Dank noch einmal!

  • Okay das ist dann doch aber auch eine komplett andere Kiste oder nicht? Wenn der Lüfter doch rauf und runter regelt dann ist es vermutlich eher so das die definierte Lüfterkurve "blöd" eingestellt ist oder sehe ich das falsch?

    Wie sieht denn \_SB.PCI0.LPCB.EC0 in Deiner DSDT aus?

  • Hi,

    habe leider erst nächstes Wochenende wieder Zugriff auf den Laptop.

    Genau, ich sehe es ebenfalls so, dass nur die Kurve anders eingestellt werden muss. Nichts anderes mache ich in Linux über die oben genannten Calls, denn die WRAM Methode von Asus erlaubt ein Überschreiben der Kennlinie.

    Die Kurve wird über die Werte im EC RAM definiert und zwar ab Adresse 0x537. Die Werte entsprechen der HEX Schreibweise der jeweiligen Temperatur. In 0x537 steht standardmäßig z. B. 35 Grad als unterster Punkt, wird der Wert höher gesetzt, wird das Verhalten sofort besser.
    Ich finde das so eigentlich recht elegant gemacht, denn damit kann man das Management zu hoher Temperaturen einfach der Programmierung von Asus überlassen und nur „untenrum“ etwas nachjustieren.

    Vielen Dank

    Dateien

    • DSDT.aml

      (177,62 kB, 55 Mal heruntergeladen, zuletzt: )
  • dann nimm doch die wram-methode, kopier sie in eine ssdt, bearbeite die werte, und benenne die originalmethode in der dsdt per rename-patch um. sollte so eigentlich klappen.

    ersthilfe vor ort für altes zeugs (-> laptops) 8)

    berliner häckinTosh.stammTisch am 3.monatsmittwoch im maxFish/kunsthaus ACUD

    der stammtisch in berlin ist WIEDER DA!! nächster termin voraussichtlich: mittwoch 15.9.21, 19.00 uhr

  • Was grt schreibt war nämlich auch meine Idee :)

    Allerdings ist es mit der WRAM Methode nicht getan denn die "schreibt" nur die Werte:


    Man müsste sich jetzt durch die DSDT wühlen und mal gucken von wo aus die WRAM Methode aufgerufen wird. Ein heißer Kandidat hierfür scheint mir die Methode WMNB zu sein.

  • dann könnte man die WRAM in ruhe lassen, und müsste dafür den "zuspieler" der die infos/werte beinhaltet, in die ssdt stecken und original umbenennen. seh ich das richtig?

    ersthilfe vor ort für altes zeugs (-> laptops) 8)

    berliner häckinTosh.stammTisch am 3.monatsmittwoch im maxFish/kunsthaus ACUD

    der stammtisch in berlin ist WIEDER DA!! nächster termin voraussichtlich: mittwoch 15.9.21, 19.00 uhr

  • So würde ich das zumindest denken, ja :)

    In der DSDT sind allerdings keine Calls auf die in Post #2 erwähnten Stellen zu finden. Möglich wäre nun das es dafür generell schon eine SSDT gibt ist aber ohne den gesamten ACPI Tabellensatz zu haben schwer bis nicht zu sagen.

  • Hallo und erstmal herzlichen Dank für eure Antworten. Das geht wirklich in die Richtung, die Ich mir vorgestellt habe.

    Mit dem „einfach in die SSDT kopieren“ hört es bei mir auf, denn mir fehlt jetzt die Ahnung, wann welcher Code in einer SSDT ausgeführt wird. Ich glaube was ihr sagt passt zu dem Gedanken von mir, dass ich noch irgend ein Init-Event oder sonst etwas brauche. WRAM ist für mein Verständnis einfach nur ein allgemeiner „Write RAM“ (es gibt auch RRAM ;) ) und wird nur glaube ich 2 mal sonst in der DSDT verwendet.

    Hatte mir schon überlegt, einen der Fn-Keys zu opfern und den als „set Fan Kennlinien Button“ zu verwenden, wenn es kein Init- oder „On Boot“ Event gibt. Auch sowas müsste doch machbar und relativ einfach sein, oder?

    Wie kann ich euch den vollständigen ACPI Tabellensatz zur Verfügung stellen? Die DSDT habe ich mit einem Linux Tool ausgeschrieben, dessen Name mir gerade nicht mehr einfällt.

  • Hallo zusammen und frohe Ostern.

    Ich habe jetzt folgende SSDT erstellt, in OC unter ACPI gelegt und natürlich auch in der config.plist auf "enabled" gestellt.

    Allerdings sieht es so aus, als würde das Ganze nicht funktionieren. Compilen lies die SSDT sich mit 0 Errors. Kann es sein, dass die Calls nicht "aufgerufen" werden? Brauche ich noch irgendetwas "drum-herum"? Mein Werk sieht auch fast etwas zu einfach aus ;)


    Ich hänge noch eine SSDT an, in der die WRAM Methode ebenfalls genutzt wird.

    Vielen Dank im Voraus

    Dateien

  • Kommt das jetzt direkt aus der DSDT oder wo hast Du die Calls jetzt her? Weil damit das funktioniert muss das was original da ist aus dem Weg andernfalls wird das in der SSDT nicht verwendet...

  • Ich habe nirgends in den ACPI tables etwas gefunden, das die Fan-Kurve setzt. Ich denke das kommt irgendwie schon vorher vom BIOS, sprich der EC-RAM wird mit Werten vorbefüllt, die dann in der DSDT und auch in SSDTs nicht mehr explizit gesetzt werden.
    Sprich die SSDT ist komplett selber erstellt.

    Ich weiß ja welche Werte ich wo hinschreiben möchte und ASUS gibt mir sogar eine Function dazu -> WRAM.

    Ich habe gerade mit der gleichen OC-Config testhalber mal ein Live-Linux gestartet. Interessanterweise scheinen die Änderungen hier zu greifen, wenn ich die EC-RAM Werte auslese bekomme ich genau das, was ich in der SSDT gesetzt habe (und der Lüfter ist still).
    Ob das nur Zufall war möchte ich noch prüfen, werde einfach mal andere Zahlen in die SSDT schreiben und schauen, was Linux ausliest.

    EDIT: Es ist wohl tatsächlich so, dass meine SSDT funktioniert - zumindest unter Linux. Ich habe in der SSDT nun testhalber andere Zahlen eingetragen, mit OC wieder Linux gebootet und die Werte per acpi_call ausgelesen - Meine eingetragenen Werte wurden angezeigt.

    Die Frage wäre dann immer noch: Was macht macOS hier anders?

    UPDATE:
    Habe es finally hinbekommen ;)

    Anscheinend hat das mit der SSDT alleine für MacOS nicht ausgereicht. Ich habe jetzt von RehabMan den ACPIDebug.kext zusammen mit IOIO im Einsatz. Jetzt kann ich wie in Linux über die Befehlszeile einen ACPI Call auf Methoden innerhalb der SSDT für ACPIDebug machen. Deshalb musste ich meine Calls noch zusätzlich in die SSDT-RMDT.aml mit aufnehmen.
    Mit dem call

    ioio -s org_rehabman_ACPIDebug dbg0 1

    kann ich jetzt ein sofortiges Schreiben meiner in der SSDT-RMDT definierten Kennline erreichen.
    Bei Gelegenheit und nach einer gewissen Testphase folgt eine ausführliche Doku ;)

    2 Mal editiert, zuletzt von Holz_Michel ()