本帖最后由 yearjinheng 于 2017-7-28 21:47 编辑
10)借助刚才整理后的字段,进行不同的处理。
【8位字段,及8位字段以下】 以整型数据的形式被存取 AppleACPIPlatform能8位字段,及8位字段以下能正常读取,所以不用理会!
【16位字段处理】 以整型数据的形式被存取 通常拆分为2个字节
16字段(B1DT,B1CY,RTEP,BET2,B1TM,BAPV,BARC,BADC,BADV,BAFC,B1CR)红色表示只调用了一处,紫色表示只被调用了2处
由于16字段较多,这里不一一举例,只列出一个例子,大家要学会灵活贯通。 BET2, 16, —> B0ET,8,B1ET,8, //把BET2的16位拆分为2个字节 被调用BET2的16字段(BET2) 一般1-2处,或许更多,看情况而定
在声明字段那里,对字段进行拆分: Store (B1CH, IFCH) —> Store (B1B4 (BC0H, BC1H, BC2H, BC3H), IFCH) //把被调用B1CH两处拆分为2个字节 处理补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] into Scope label \_SB.PCI0.LPCB.H_EC code_regex BET2,\s+16, replace_matched begin B0ET,8,B1ET,8, end;
解释: [backcolor=rgba(47, 47, 47, 0.0470588)] into Scope label \_SB.PCI0.LPCB.H_EC:into(针对 )\_SB.PCI0.LPCB.H_EC中方法为H_EC这个范围里面 [backcolor=rgba(47, 47, 47, 0.0470588)] code_regex :匹配(搜索) [backcolor=rgba(47, 47, 47, 0.0470588)] BET2,\s+16,:被搜索的匹配的内容 [backcolor=rgba(47, 47, 47, 0.0470588)] replace_matched:替换匹配 begin B0ET,8,B1ET,8, end:替换掉的内容 //把BET2拆成两部分,命名的名字应该为4个字符(名字一定要好记,而且不要重复其他DSDT或SSDT地方,否则会发生错误。)
再整体地理解一下这个补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] 整体的含义: \_SB.PCI0.LPCB.H_EC {} 的范围里,搜索“BET2,\s+16”, 如果有,就把它替换为“B0ET,8,B1ET,8,” 。
被调用的字段那里,对字段进行拆分: Return (BET2) —> Return (B1B2 (B0ET, B1ET)) //把被调用B1CH两处拆分为2个字节 处理补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] into method label SMTF code_regex BET2 replaceall_matched begin B1B2(B0ET,B1ET) end; [backcolor=rgba(47, 47, 47, 0.0470588)] into method label GSBI code_regex BET2 replaceall_matched begin B1B2(B0ET,B1ET) end;
解释第一个被调用到的字段拆分命名处理: [backcolor=rgba(47, 47, 47, 0.0470588)] into method label SMTF:into(针对 )method为SMTF这个方法范围里面 [backcolor=rgba(47, 47, 47, 0.0470588)] code_regex :匹配(搜索) BET2:被搜索的匹配的内容 [backcolor=rgba(47, 47, 47, 0.0470588)] replace_matched:替换匹配 [backcolor=rgba(47, 47, 47, 0.0470588)] begin B1B2(B0ET,B1ET) end:替换掉的内容
再整体地理解一下这两段补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] 整体的含义: 在method为SMTF这个范围里面,搜索“BET2,\s+16”, ,如果有,就把它替换为“B0ET,8,B1ET,8,” 。
1)第一处: 未处理: Method (SMTF, 1, NotSerialized) { If (LEqual (Arg0, Zero)) { Return (BET2) }
If (LEqual (Arg0, One)) { Return (Zero) }
Return (Zero) } 打入补丁后: Method (SMTF, 1, NotSerialized) { If (LEqual (Arg0, Zero)) { Return (B1B2 (B0ET, B1ET)) }
If (LEqual (Arg0, One)) { Return (Zero) }
Return (Zero) }
2)第二处: 未处理: Method (GSBI, 1, NotSerialized) { Store (BET2, IFAF) //未处理前 } 打入补丁后: Method (GSBI, 1, NotSerialized) { Store (B1B2 (B0ET, B1ET), IFAF) //把被调用B1CH两处拆分为4个字节 }
【32位字段处理】 以整型数据的形式被存取 32字段(B1CH) 在声明字段那里,对字段进行拆分: B1CH, 32, —> BC0H,8,BC1H,8,BC2H,8,BC3H,8, //把32位拆分为4个字节 处理补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] into Scope label \_SB.PCI0.LPCB.H_EC code_regex B1CH,\s+32, replace_matched begin BC0H,8,BC1H,8,BC2H,8,BC3H,8, end;
解释: [backcolor=rgba(47, 47, 47, 0.0470588)] into Scope label \_SB.PCI0.LPCB.H_EC:into(针对 )\_SB.PCI0.LPCB.H_EC这个范围里面 [backcolor=rgba(47, 47, 47, 0.0470588)] code_regex :匹配(搜索) [backcolor=rgba(47, 47, 47, 0.0470588)] B1CH,\s+32,:被搜索的匹配的内容 [backcolor=rgba(47, 47, 47, 0.0470588)] replace_matched:替换匹配 begin BC0H,8,BC1H,8,BC2H,8,BC3H,8,end:替换掉的内容 //把BET2拆成两部分,命名的名字应该为4个字符(名字一定要好记,而且不要重复其他DSDT或SSDT地方,否则会发生错误。)
再整体地理解一下这个补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] 整体的含义: \_SB.PCI0.LPCB.H_EC {} 的范围里,搜索“B1CH,\s+32,” ,如果有,就把它替换为“BC0H,8,BC1H,8,BC2H,8,BC3H,8,” 。
被调用的字段那里,对字段进行拆分:一般1-2处,或许更多,看情况而定 Return (BET2) —> Return (B1B2 (B0ET, B1ET)) //把被调用B1CH两处拆分为4个字节
处理补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] into method label _BIF code_regex B1CH replaceall_matched begin B1B4(BC0H,BC1H,BC2H,BC3H) end; [backcolor=rgba(47, 47, 47, 0.0470588)] into method label GSBI code_regex B1CH replaceall_matched begin B1B4(BC0H,BC1H,BC2H,BC3H) end;
解释第一个被调用到的字段拆分命名处理: [backcolor=rgba(47, 47, 47, 0.0470588)] into method label _BIF:into(针对 )method为_BIF这个方法范围里面 [backcolor=rgba(47, 47, 47, 0.0470588)] code_regex :匹配(搜索) B1CH:被搜索的匹配的内容 [backcolor=rgba(47, 47, 47, 0.0470588)] replace_matched:替换匹配 [backcolor=rgba(47, 47, 47, 0.0470588)] begin B1B4(BC0H,BC1H,BC2H,BC3H)end:替换掉的内容
再整体地理解一下这两段补丁: [backcolor=rgba(47, 47, 47, 0.0470588)] 整体的含义: 在method为_BIF这个范围里面,搜索“B1CH”, ,如果有,就把它替换为“B1B4(BC0H,BC1H,BC2H,BC3H)” 。
1)第一处:
第一处: 未处理: Method (GSBI, 1, NotSerialized) { Store (B1CH, IFCH) //未处理前 } 打入补丁后: Method (GSBI, 1, NotSerialized) { Store (B1B4 (BC0H, BC1H, BC2H, BC3H), IFCH) //把被调用B1CH两处拆分为4个字节 }
第二处: 未处理: Method (_BIF, 0, NotSerialized) { If (LEqual (B1CH, 0x0050694C)) //未处理前 } 打入补丁后: Method (_BIF, 0, NotSerialized) { If (LEqual (B1B4 (BC0H, BC1H, BC2H, BC3H), 0x0050694C)) //把被调用B1CH两处拆分为4个字节 }
【以下为32位字段以上的处理】 关于偏移量怎么算,我刚发了一个贴,大伙可以参考下。 [教程]关于电量补丁大于32位字段补丁偏移计算
目前帖子还是编辑,等待完善!
读一下内容前需了解
1)处理32为以上的字段的方法。这些字段不用拆分,只要给这个方法传递一下字段的偏移量和字段的长度就可以了。修改32位以上字段的另一个重点,是明确字段所在的偏移量。
这个方法接受两个参数(偏移量,字段长度),其中,字段长度是8的整数倍 例如: RECB(0x98, 64) // RECB(偏移量, 字段长度) 读取EC缓存 WECB (0x1C, 256, FB4) // WECB(偏移量, 字段长度,未处理前的前参数 ) 写入EC缓存
2)关于 Store ( ) 的操作:Store (前参数,后参数) 需要特别说明,Store的操作顺序是 从左到右 的。
例如: Store (Arg0, ENCR) (ENCR是16位的情况) 操作说明:从左到右,也就是,是把 Arg0 的值,“写到” ENCR 里,这时。操作就和“读”不一样了。需要改为: Store (ShiftRight(Arg0,8),ENC2) (ENC2是16位拆分后的第二个) Store (Arg0,ENC1) (ENC1是16位拆分后的第一个)
所以,对于字段在括号右边。也就是这样是写入操作。补丁如下:
into method label SMRW code_regex Store\s\(Arg3,\s\\_SB.PCI0.LPCB.EC0. ENCR\) replaceall_matched begin Store(ShiftRight(Arg3,8),\\_SB.PCI0.LPCB.EC0. ENC2)\nStore(Arg3, \\_SB.PCI0.LPCB.EC0. ENC1) end;
说明:\s表示1个空白符。搜索匹配的那里,括号 和 斜杠 前面,都需要用 反斜杠 转义。要替换的代码那里,括号不需要 反斜杠转义,斜杠 仍然需要反斜杠转义 。\n 是换行符,意思是另起一行。 |
Store (Arg0, ENCR) 修改为 Store (ShiftRight(Arg0,8),ENC2) Store (Arg0,ENC1)
关于 Store (xxxx, xxxx ),字段在前 是读取操作,字段在后 是写入操作。
【64位字段处理】 大于32位的数据,会以缓存(Buffer)的形式被存取 未打补丁前: 被调用64位字段(SMD0) Offset (0x8F), //(基地址) B1MA, 64, // 从基地址起 ,为0x8F Store (B1MA, IFMN) —> Store (RECB(0x8F, 64), IFMN) //字段B1MA在前 是读取操作 处理补丁: [backcolor=rgba(47, 47, 47, 0.0470588)]into method label GSBI code_regex B1MA replaceall_matched begin RECB(0x8F, 64) end; 解释: RECB:读取EC缓存 0x8F:“B1MA, 64 ”字段中的偏移量 64:表示B1MA的字段长度 被调用64位字段(SMD0) Offset (0x98), //(基地址) B1MA, 64, // 从基地址起 ,为0x98 Store (B2MA, IFMN) —> Store (RECB(0x98, 64), IFMN) //字段B2MA在前 是读取操作 处理补丁: [backcolor=rgba(47, 47, 47, 0.0470588)]into method label GSBI code_regex B2MA replaceall_matched begin RECB(0x98, 64) end; 解释: RECB:读取EC缓存 0x98:“B2MA, 64 ”字段中的偏移量 64:表示B2MA的字段长度
已打补丁后: Store (B1MA, IFMN) —> Store (RECB(0x8F, 64), IFMN) 打补丁之后为:Store (RECB (0x8F, 0x40), IFMN) // 0x40是套入公式后已计算好的值
Store (B2MA, IFMN) —> Store (RECB(0x98, 64), IFMN)
打补丁之后为:Store (RECB (0x98, 0x40), IFDN) // 0x40是套入公式后已计算好的值
|