论坛上随处可见。到处充斥着修改dsdt的软件。比如。dsdt auto pactor(但其中有好多坛友提出,自己的主板型号里面都没有)。dsdt se (此软件集修改和修复于一身,我也汉化dsdt se了一下,下面有下载地址)。还有dsdt edit& auto fix/patcher,具体的名字可能写错(注意:在mac下,如要用dsdt edit生成dsl文件或者转换aml文件、编译、修复dsdt文件。首先是将dsdt文件放到一个英文文件夹中,也可以将其放到桌面上。打开即可。否则容易出现打开空白的现象)。而且dsdt edit在mac下有bug。里面的大括号很容易让人以为错误。不要随便修改;而且,不管在mac下或者win下都得需要java软件。而且在win下如要运行dsdtse。有时候双击打开没反应。而在任务管理器里面却会显示其进程正在运行。大多数会员见其都会束手无策,大家只要照着这样做即可:首先用管理员模式运行CMD命令行,然后找到DSDTParser.jar文件所在的文件夹,手动输入命令:java -jar DSDTParser.jar 来运行,这样就能顺利读取系统DSDT信息了。。 而且,论坛上虽有讲解dsdt手动修改的帖子。但一般都沉水了,一般的会员耐不住每一层楼爬楼去看贴的复杂心情,希望有高手指点一二,还有,这方面修改dsdt的帖子比较分散,于是就有了本帖的诞生,其实我只是将所有看过的修改dsdt的帖子予以归纳和修正,里面很多内容都转自其他的帖子。也许会涉及别人的自主信息,如有不当之处,请多多见谅,下面我也会写出文章出处的,废话不多说,下面咱来讲讲dsdt在编译过程中一般情况下遇到的问题,以及如何修改及常见的修改方法:
1.Remarks 的修改 :
dsdt.dsl 2254: Name (_T_0, Zero) Remark 5110 - Use of compiler reserved name ^ (_T_0)
例子: If (LEqual (_T_0, 0x03)) { SIT3 (PRM0, PRM1, PRM2) } Else { If (LEqual (_T_0, 0x04)) ………………
} 将其中的 _T_0 都改为 T_0 即可 或者 将_T_0 改为 T0_0 好了 25个 Remarks 消失了。 2. Warnings 的修改 这个错误有很多种类。 第一种: dsdt.dsl 7668: Method (TGET, 1, NotSerialized) Warning 1087 - ^ Not all control paths return a value (TGET)
第二种 dsdt.dsl 7827: Store (FGET (Local0), Local1) Warning 1092 - ^ Called method may not always return a value先来第一种: 例子: Method (FGET, 1, NotSerialized) { If (LEqual (Arg0, Zero)) { Return (^^SIOR.HWF1 ()) } If (LEqual (Arg0, One)) { Return (^^SIOR.HWF2 ()) } If (LEqual (Arg0, 0x02)) { Return (^^SIOR.HWF3 ()) } }
有两种改法一种是:在末 加入 Return (Zero) 一种是在末尾加入 Else { Return(Package(0x02){0x00, 0x00}) } 也就是 Method (FGET, 1, NotSerialized) { If (LEqual (Arg0, Zero)) { Return (^^SIOR.HWF1 ()) } If (LEqual (Arg0, One)) { Return (^^SIOR.HWF2 ()) } If (LEqual (Arg0, 0x02)) { Return (^^SIOR.HWF3 ()) } Return (Zero) }
或者 Method (FGET, 1, NotSerialized) { If (LEqual (Arg0, Zero)) { Return (^^SIOR.HWF1 ()) } If (LEqual (Arg0, One)) { Return (^^SIOR.HWF2 ()) } If (LEqual (Arg0, 0x02)) { Return (^^SIOR.HWF3 ()) } Else { Return(Package(0x02){0x00, 0x00}) } }
两种都能解决 Warnings 但是究竟用那个? 爬文中 例子都是 用第二中 由于最先看到的是第一种方法所以 两个都尝试了一下。 也希望众多坛友们多多尝试,并不是说出现错误一味的删除就会减少错误,有时候会带来更多的错误和警告。一般情况下。出现第二种错误是伴随着第一种错误的出现而发生的。当把第一种错误通过上面的方法修改之后,第二种警告就会消失。 3.一下三种情况大致类似。大家可以依葫芦画瓢。将其修改: dsdt.dsl 1101: Add (Local0, 0x02) Warning 1105 - ^ Result is not used, operator has no effect
采用把 (Local0, 0x02)改为 (Local0, 0x02, Local0)即可解决
dsdt.dsl 1193: And (CAPB, 0xFFFFFFFC) Warning 1104 - ^ Result is not used, operator has no effect
这种问题就把“And (CAPB, 0xFFFFFFFC)"改为"And (CAPB, 0xFFFFFFFC,CAPB)" dsdt.dsl 1238: Method (_OSC, 5, NotSerialized) Warning 1076 - ^ Reserved method has too many arguments (_OSC requires 4)
这种问题就把_OSC后面的5改成4即可 以上几种错误,仅仅是dsdt的简单修改。 其实dsdt编译出现错误,大多情况下是缺少返回值 return(zero)或者定义的变量不存在,也许你定义的变量不是C能识别的变量。比如在全局变量调用中就容易发生问题。好 下面是其他情况的集中修改: 1.dsdt.dsl 330: Method (_CST, 0, NotSerialized) Warning 1087 - ^ Not all control paths return a value (_CST) dsdt.dsl 330: Method (_CST, 0, NotSerialized) Warning 1080 - ^ Reserved method must return a value (_CST)
这种类型的问题就需要在Method这个函数的根括号下加上Return(Zero) 2.dsdt.dsl 9048: Method (_GTF, 0, NotSerialized) Warning 1087 - ^ Not all control paths return a value (_GTF) dsdt.dsl 9048: Method (_GTF, 0, NotSerialized) Warning 1080 - ^ Reserved method must return a value (_GTF) 这种类型的问题需要在Method这个函数的根目录下加上:
Else { Return (Zero) } Return (Zero) 3.dsdt.dsl 9850: Method (_GTM, 0, NotSerialized) Warning 1087 - ^ Not all control paths return a value (_GTM) dsdt.dsl 9850: Method (_GTM, 0, NotSerialized) Warning 1080 - ^ Reserved method must return a value (_GTM) 这种类型的问题同上 4.dsdt.dsl 612: Return(Package(0x02){0x00, 0x00}) Warning 1099 - ^ Statement is unreachable |