2010-11-30 7 views
6

J'ai utilisé this .NET program pour faire un vidage binaire du registre de Windows au HKLM/Hardware/ACPI/DSDT.Aidez-moi à déchiffrer ce code de langue source ACPI?

Ensuite, en cours d'exécution ASL Compiler Microsoft à ce sujet, je peux obtenir ce Source Langue ACPI:

Scope(\_TZ_) 
{ 
    Name(TBSE, 0xaac) 
    Name(CRT0, 0x0) 
    Name(PSV0, 0x0) 
    ThermalZone(TZS0) 
    { 
     Method(_TMP, 0x0, NotSerialized) 
     { 
      If(\ECON) 
      { 
       Store(\_SB_.PCI0.LPC0.EC0_.THS0, Local0) 
       Store(\_SB_.PCI0.LPC0.EC0_.KCSS, Local1) 
       Store(\_SB_.PCI0.LPC0.EC0_.KOSD, Local2) 
      } 
      Else 
      { 
       Store(RBEC(0x92), Local0) 
       And(Local0, 0x1, Local1) 
       And(Local0, 0x8, Local2) 
       Store(RBEC(0xa8), Local0) 
      } 
      If(Local1) 
      { 
       Add(PSV0, 0x1, Local0) 
      } 
      If(Local2) 
      { 
       If(LNot(LGreater(Local0, CRT0))) 
       { 
        Add(CRT0, 0x2, Local0) 
       } 
      } 
      Return(C2K_(Local0)) 
     } 
     Method(_HOT, 0x0, NotSerialized) 
     { 
      If(LEqual(OSYS, 0x7d6)) 
      { 
       If(\ECON) 
       { 
        Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID) 
        Store(\_SB_.PCI0.LPC0.EC0_.TSC0, Local0) 
       } 
       Else 
       { 
        WBEC(0x1, 0x20) 
        Store(RBEC(0xd1), Local0) 
       } 
       If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e))) 
       { 
        Store(0x78, Local0) 
       } 
       Store(Local0, CRT0) 
       Return(C2K_(Local0)) 
      } 
      Else 
      { 
       Return(C2K_(0x78)) 
      } 
     } 
     Method(_CRT, 0x0, NotSerialized) 
     { 
      If(LNot(LEqual(OSYS, 0x7d6))) 
      { 
       If(\ECON) 
       { 
        Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID) 
        Store(\_SB_.PCI0.LPC0.EC0_.TSC0, Local0) 
       } 
       Else 
       { 
        WBEC(0x1, 0x20) 
        Store(RBEC(0xd1), Local0) 
       } 
       If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e))) 
       { 
        Store(0x78, Local0) 
       } 
       Store(Local0, CRT0) 
       Return(C2K_(Local0)) 
      } 
      Else 
      { 
       Return(C2K_(0x78)) 
      } 
     } 
     Name(_PSL, Package(0x1) 
     { 
      \_PR_.CPU0 
     }) 
     Method(_PSV, 0x0, NotSerialized) 
     { 
      If(\ECON) 
      { 
       Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID) 
       Store(\_SB_.PCI0.LPC0.EC0_.TSP0, Local0) 
      } 
      Else 
      { 
       WBEC(0x1, 0x20) 
       Store(RBEC(0xd0), Local0) 
      } 
      If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e))) 
      { 
       Store(0x5a, Local0) 
      } 
      Store(Local0, PSV0) 
      Return(C2K_(Local0)) 
     } 
     Name(_TC1, 0x4) 
     Name(_TC2, 0x3) 
     Name(_TSP, 0x96) 
     Method(FMAX, 0x0, NotSerialized) 
     { 
      If(\ECON) 
      { 
       Store(0x40, \_SB_.PCI0.LPC0.EC0_.TIID) 
       Store(\_SB_.PCI0.LPC0.EC0_.TSP3, Local0) 
      } 
      Else 
      { 
       WBEC(0x1, 0x40) 
       Store(RBEC(0xd6), Local0) 
      } 
      Return(FSTL(Local0)) 
     } 
     Method(FMIN, 0x0, NotSerialized) 
     { 
      If(\ECON) 
      { 
       Store(0x40, \_SB_.PCI0.LPC0.EC0_.TIID) 
       Store(\_SB_.PCI0.LPC0.EC0_.TSP0, Local0) 
      } 
      Else 
      { 
       WBEC(0x1, 0x40) 
       Store(RBEC(0xd0), Local0) 
      } 
      Return(FSTL(Local0)) 
     } 
     Method(FRSP, 0x0, NotSerialized) 
     { 
      If(\ECON) 
      { 
       Store(\_SB_.PCI0.LPC0.EC0_.FSR1, Local0) 
      } 
      Else 
      { 
       Store(RBEC(0x95), Local0) 
      } 
      Return(FSTL(Local0)) 
     } 
     Method(FSSP, 0x1, NotSerialized) 
     { 
      If(LEqual(Arg0, 0x0)) 
      { 
       If(\ECON) 
       { 
        Store(0x1, \_SB_.PCI0.LPC0.EC0_.FSHC) 
        Sleep(0x64) 
        Store(0xff, \_SB_.PCI0.LPC0.EC0_.FSW1) 
       } 
       Else 
       { 
        Store(RBEC(0x93), Local0) 
        Or(Local0, 0x10, Local0) 
        WBEC(0x93, Local0) 
        Sleep(0x64) 
        WBEC(0x94, 0xff) 
       } 
      } 
      Else 
      { 
       If(\ECON) 
       { 
        Store(0x0, \_SB_.PCI0.LPC0.EC0_.FSHC) 
       } 
       Else 
       { 
        WBEC(0x93, 0x0) 
       } 
      } 
     } 
     Method(FSTL, 0x1, NotSerialized) 
     { 
      If(LOr(LEqual(Arg0, 0x0), LEqual(Arg0, 0xff))) 
      { 
       Store(Zero, Local1) 
      } 
      Else 
      { 
       Divide(0x78000, Arg0, Local0, Local1) 
      } 
      Return(Local1) 
     } 
    } 
    .... 

Je comprends que des morceaux. Le TZ fait référence à un scope dédié aux zones thermiques (je pense). A la lecture du ACPI Spec, je vois que _HOT et _CRT sont des objets OSPM relatifs aux seuils de température.

L'objet _HOT déclare la température critique à laquelle MPCP peut choisir de passer le système dans l'état de sommeil S4, si elle est soutenue; L'objet _CRT déclare la température critique à laquelle OSPM doit effectuer un arrêt critique.

Je suis en pensant que snip du DSDT a quelque chose à voir avec la manipulation de la vitesse du ventilateur d'ordinateur portable en fonction de la température détectée dans la zone thermique 0. Sur cette base, je suppose que FSTL dans ce qui précède est Fan -Set-Level ou quelque chose de similaire, et FMAX et FMIN sont Fan-Max-Speed ​​et -Min-Speed, respectivement. Je pense que C2K est une fonction de conversion en Kelvin. Au-delà, je ne fais que deviner sur la base de suppositions.

Éditer: après un examen plus approfondi, _PSL est la liste passive (selon les spécifications ACPI), qui renvoie une liste de dispositifs de contrôle de température passive. Lorsque les ventilateurs sont considérés comme étant des régulateurs de température "actifs", un exemple de contrôle de température "passif" consisterait à faire baisser la tension ou la vitesse d'un processeur. Donc, je ne suis pas sûr que cette section contrôle le ventilateur du tout. Il pourrait être dédié uniquement au contrôle passif de la température. Ce que j'essaye de faire est de modifier la vitesse de ventilateur d'ordinateur portable qui est utilisée pour différentes températures. Dans certains DSDT, le mappage entre temp et vitesse du ventilateur est dans une petite table soignée, et la modification du mappage est juste une question de changement de quelques nombres. Il ne semble pas qu'il y ait une telle table dans ce fichier ASL, donc je pense qu'il doit y avoir une logique de programme qui fait le mapping.

Quelqu'un peut-il aider à le déchiffrer pour moi?


Ce que j'essaie vraiment de faire, c'est de détendre le ventilateur sur un ordinateur portable HP G60-244dx. Il fonctionne trop fort même lorsque le processeur est inactif, et ... s'il ressemble à mon précédent ordinateur portable HP nc8430, la vitesse du ventilateur est trop élevée. Il est possible d'abaisser la vitesse du ventilateur tout en conservant la même température.

Je pense que pour modifier la vitesse du ventilateur, j'ai besoin de patcher le DSDT, et c'est pourquoi je veux déchiffrer ce qui précède.

Merci beaucoup.


peut-être lié:
Setting an ACPI field in Linux

+0

Ne serait-il pas plus simple de laisser faire [SpeedFan] (http://www.almico.com/speedfan.php) pour vous? – kichik

+0

oui ce serait! si SpeedFan fonctionnait réellement pour ce type de PC. Je l'ai couru et ça me dit le temps, mais ne me laisse pas changer quoi que ce soit. – Cheeso

Répondre

0

suis tombé sur ce tout en essayant le même processus sur mon HP dm1-3100ev. Il n'y a pas de réglage direct de la vitesse du ventilateur, il doit être calculé en code. La plus proche est quelque chose comme les paramètres FMIN et FMAX, respectivement réglés sur 20 et 56 (cela ne ressemble-t-il pas à des limites de température pour les ventilateurs minimum et maximum?). Cela n'a pas fonctionné (HP Coolsense peut-être).

Je vous ferai savoir si je parviens à trouver quelque chose! Editer: J'avais tort, FMIN et FMAX spécifient les vitesses minimum et maximum des ventilateurs: respectivement 2000 et 5600. Malheureusement, changer cela ne fonctionne toujours pas.