登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

lgjmfyx的博客

享受生活每一天

 
 
 

日志

 
 

ACPI问题,DSDT解决  

2008-10-26 18:35:25|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

2007年9月4日 星期二

如果你的系统有电源管理方面的问题,比如关机、挂起,笔记本电池等等, 或者是硬件传感器方面的问题,如CPU温度检测,风扇状态控制等,你可以考虑一下 是否是你的ACPI(Advanced Configuration and Power Interface)出了问题。

快速应用

我们需要一个软件来处理dsdt,Intel提供了一个工具叫做 iasl(下载的是较小的 Unix Build Environment):

生成的可执行文件iasl,可以拷贝出来单独使用。

得到系统当前使用的dsdt,生成asl文件dsdt.dsl:

编译dsdt.dsl文件:

iasl -sa dsdt.dsl

根据输出的Error,Warning信息修改dsdt.dsl文件,再次编译,直到

使用新的dsdt.aml代替BIOS中的版本:

cp /boot/initrd.img-2.6.20-16-generic /boot/initrd.img-2.6.20-16-generic-bak
sudo cp dsdt.aml /etc/initramfs-tools/DSDT.aml
sudo update-initramfs -u -k all

常见DSDT语法

在实例讲解怎样出错之前,我们先来了解一下DSDT文件的语法

One对象有了个新名字SWIT

将0x02存储到Local0标示的一段内存中。

Method (INCS, 1, NotSerialized)

定义一个函数INCS,INCS带1个参数等等。函数名也可以是规范中定义的一个对象名。

Multiply (Local0, 0x04, Local1)

Local0中的数据乘以0x04,结果保存在Local1

CreateDWordField (BUF1, Local2, CAPB)

为标示为BUF1的一段内存中第Local2个字节开始的4个字节(Dword:Double word)命名为CAPB

将CAPB中的值和0xFFFFFFFC按位与后,保存在CAPB中

DSDT的修改

这是一件令人头痛的事,我所能做的,只是依据编译时的错误(警告)信息,参考 《ACPI规范》 , 做一些语法上的修正。

错误信息:

dsdt.dsl 323: Method (_CST, 0, NotSerialized)
Warning 1086 - ^ Not all control paths return a value (_CST)

查看323行开始的一段代码:

Method (_CST, 0, NotSerialized)
{
If (CSMD) {}
Else
{
...
}
}

我把Else分句去掉了,但保留分句中的内容不变。这样整个语意不变,而相应的Warning去掉了。

错误信息:

dsdt.dsl 1177: Method (_OSC, 5, NotSerialized)
Warning 1075 - ^ Reserved method has too many arguments (_OSC requires 4)

很清楚,_OSC的参数是4个,把Method中的5改作4即可。

错误信息:

dsdt.dsl 1193: And (CAPB, 0xFFFFFFFC)
Warning 1104 - ^ Result is not used, operator has no effect

查阅规范,And还可有第3个参数,用以存放比较后的值,我直接改为:

And (CAPB, 0xFFFFFFFC, CAPB)

我完全没把握这个改动是否恰当,因为它改变了内存中CAPB标示的一段内容

错误信息:

dsdt.dsl 1935: Method (INCS, 1, NotSerialized)
Warning 1086 - ^ Not all control paths return a value (INCS)

查看相应的代码:

Method (INCS, 1, NotSerialized)
{
If (...)
{...}
...
IF (...)
{...}
}

这里的错误是,如果所有If都不满足,Method将没有返回值。因为我不知道前面的If中为什么是那些值,我在最后添加了个Return(Zero),随便返回了个Zero对象,也不知是否会被正确处理。但至少,编译又少了个Warning

许多Error或Warning是相关连的,解决1个往往连带消除好几个。 比如1个Not all control paths return a value类警告的修正, 会连带消除相关的Reserved method must return a value 和Called method may not always return a value警告

其它一些相关的资源

而Ubuntu的 HowTo 则参考了上面的教程。

我在 这里 还发现了一个和我一模一样的dsdt。去它的论坛上 问 了一下。回说论坛刚被黑过,所有附件都丢失了,估计原始帖除了这个附件,也没有什么实质性内容。

BenQ S73U似乎也有类似问题,而且 它的dsdt 和我的很相像。

后记

当然ACPI还有个操作系统的支持问题。事实上,因为我的神舟L205T总是死不瞑目,关机时不能关闭电源,我开始找寻ACPI问题的解决办法,到现在,编译了自己的dsdt,问题依旧,我看Ubuntu的这个 bug报告 ,难兄难弟还真是不少。现在看来,内核的ACPI支持部分出了问题,可能性更大一点,毕竟MS Windows下关机正常。




引文来源  摩托日记: ACPI问题,DSDT解决
  评论这张
 
阅读(2228)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018