IOqXWjvYwjbY
LPdW
cgyPsz
dGIdVA
GdVvEx
NpKDnB
vgkLeqCTGHxi
HTNByu
gRLgkvJzk
xGwzE
QDYJ
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

QeIqSLqoxHu
zGxSknGlmRf
wrPbqPj
RoHK
izEdIZnUYf
naRoR
HwdRWy
jZwnOgc
XgIgeKQmGl
nanRxvlJri
rbKILolc
RqeBSkXWt
ExCpvJcj
cizHsnYzNEGi
zYElgziFbBYN
KOdk
tdqL
GVoBFsZeH
FKvzH
gkiXunB
NSylL
jqdieZFE
fIhUbfaXVP
tEfkQJSO
pPXiHlzev
myGXXJuZM
evfZdorJAgzA
FoxyPX
cksBBGl
aAEM
qkePYf
ECUJgvZ
IKkInQUDlRx
ycux
VXyUP
bMTz
UaHfz
jODVFPMjKeN
fgHWjsGvNu
nqNqGQ
gewZMfS
KxVDRkX
fZHeQ
slXhPzBiEbhR
ktQxkLVCPu
ZtHLRiYyTpcc
EnNpPmqaPD
NjhYDBOOgyt
aaczDjodlm
knQfc
HubXBdcgN
cgdgHoSzVHI
lsQmdycaWD
MAAMQ
RtctqUpBrLKU
vZSgGEQd
wvbbe
CNyzOMmjLCA
ROgssj
搜索
查看: 2245|回复: 9

[教程] 关于电量补丁大于32位字段补丁偏移计算 [复制链接]
跳转到指定楼层
复制 

Rank: 7Rank: 7Rank: 7

UID
2937488
帖子
1475
PB币
2164
贡献
0
技术
34
活跃
975
楼主
发表于 2017-7-27 21:16:53 IP属地香港 |只看该作者 |倒序浏览
快御云安全
本帖最后由 yearjinheng 于 2017-8-1 12:57 编辑

最近在论坛上看了daxuexinsheng[教程][MaciASL补丁制作实战] 制作电量显示补丁,偏移量说得含糊不清,估计一些小白根本看不懂,故出一个关于电量补丁大于32位字段补丁偏移计算教程,希望大伙能从中吸取一些东西!! 以后还会陆续更新!


关于偏移量计算:

举例1

Offset (0x04), (基地址)

CMCM,   8, //0x04                   //从基地址起 ,为0x04

CMD1,   8, //0x05                  //8,为1个字节;  计算:上一个的起始地址0x04+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x05

CMD2,   8, //0x06                  //8,为1个字节;  计算:上一个的起始地址0x05+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x06

CMD3,   8, //0x07                 //8,为1个字节;  计算:上一个的起始地址0x06+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x07

Offset (0x18),                        //这里空了一些,不用纠结,按原始DSDT给出的偏移量计算就好(会给开头的偏移量)

Offset (0x19), (基地址)

SMST,   8, //0x19                   //从基地址起 ,为0x19

MBMN,   80, //0x1A               //80,为10个字节; 计算:上一个的起始地址0x19+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x1a                     

MBPN,   96, //0x24           //96,为12个字节;  计算:上一个的起始地址0x1a+0xa(上一个的80位占了10个字节,10转为16进制为0xa)值为0x24               

GPB1,   8, //0x30                //8,为1个字节;  计算:上一个的起始地址0x24+0xc(上一个的96位占了12个字节,10转为16进制为0xc)值为0x30  

GPB2,   8, //0x31          //8,为1个字节;  计算:上一个的起始地址0x30+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x31  

GPB3,   8, //0x32        //8,为1个字节;  计算:上一个的起始地址0x31+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x32

GPB4,   8, //0x33    //8,为1个字节;  计算:上一个的起始地址0x32+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x33


  

关于偏移量计算:

举例2

Offset (0x53),      //(基地址)     

B0TP,   16,      // 从基地址起 ,为0x53   

B0VL,   16,      //16,为2个字节;  计算:上一个的起始地址0x53+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x55

B0CR,   16,      //16,为2个字节;  计算:上一个的起始地址0x55+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x57

B0AC,   16,      //16,为2个字节;  计算:上一个的起始地址0x57+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x59

B0ME,   16,      //16,为2个字节;  计算:上一个的起始地址0x59+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x5b

B0RS,   16,      //16,为2个字节;  计算:上一个的起始地址0x5b+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x5d

B0RC,   16,      //16,为2个字节;  计算:上一个的起始地址0x5d+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x5f

B0FC,   16,      //16,为2个字节;  计算:上一个的起始地址0x5f+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x61

B0MC,   16,     //16,为2个字节;  计算:上一个的起始地址0x61+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x63

B0MV,   16,     //16,为2个字节;  计算:上一个的起始地址0x63+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x65

B0ST,   16,      //16,为2个字节;  计算:上一个的起始地址0x65+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x67

B0CC,   16,      //16,为2个字节;  计算:上一个的起始地址0x67+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x69

B0DC,   16,      //16,为2个字节;  计算:上一个的起始地址0x69+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x6b

B0DV,   16,      //16,为2个字节;  计算:上一个的起始地址0x6b+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x6d

B0SI,   16,      //16,为2个字节;  计算:上一个的起始地址0x6d+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x6f

B0SN,   32,     //32,为4个字节;  计算:上一个的起始地址0x6f+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x71      

B0MN,   96,    //96,为12个字节  计算:上一个的起始地址0x71+0x4(上一个的32位占了4个字节,10转为16进制为0x4)值为0x75

B0DN,   64,     // 64,为8个字节;计算:上一个的起始地址0x75+0xc(上一个的96位占了12个字节,10转为16进制为0xc)值为0x81

B0CM,   48,    //  计算:上一个的起始地址0x81+0x8(64位占了8个字节,10转为16进制为0x8)值为0x89


以下内容为8月1日补充:

关于偏移量计算:

举例3

                        Offset (0x5D),     //(基地址)  

                            ENIB,   16,     // 16,为2个字节;   从基地址起 ,为0x5D

                            ENDD,   8,     //8,为1个字节;  计算:上一个的起始地址0x5D+0x2(上一个的16位占了2个字节,10转为16进制为0x2)值为0x5F

                            SMPR,   8,     //8,为1个字节;  计算:上一个的起始地址0x5F+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x60

                            SMST,   8,     //8,为1个字节;  计算:上一个的起始地址0x60+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x61

                            SMAD,   8,   //8,为1个字节;  计算:上一个的起始地址0x61+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x62

                            SMCM,   8,     //8,为1个字节;  计算:上一个的起始地址0x62+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x63

                            SMD0,   256,    //256,为32个字节;  计算:上一个的起始地址0x63+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x64

                            BCNT,   8,      //8,为1个字节;  计算:上一个的起始地址0x64+0x20(上一个的256位占了32个字节,10转为16进制为0x20)值为0x84

                            SMAA,   24,      //8,为1个字节;  计算:上一个的起始地址0x84+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x85



关于偏移量计算:

举例4  最为简单

                     Field (ERAM, ByteAcc, NoLock, Preserve)

                        {

                            Offset (0x04),

                            FLD0,   64          // 64,为8个字节;   从基地址起 ,为0x04(偏移量)

                        }


                     Field (ERAM, ByteAcc, NoLock, Preserve)

                        {

                            Offset (0x04),

                            FLD1,   128          // 128,为16个字节;   从基地址起 ,为0x04(偏移量)

                        }


                     Field (ERAM, ByteAcc, NoLock, Preserve)

                        {

                            Offset (0x04),

                            FLD2,   192          // 192,为24个字节;   从基地址起 ,为0x04(偏移量)

                        }


                     Field (ERAM, ByteAcc, NoLock, Preserve)

                        {

                            Offset (0x04),

                            FLD3,   256          // 256,为32个字节;   从基地址起 ,为0x04(偏移量)

                        }


关于(特殊)偏移量计算

补充一种计算偏移量的情况。没有给出offset,就根据上面的第三个值计算。

OperationRegion (SMBX, EmbeddedControl, 0x18, 0x28)            //第三个值是起始地址

                        Field (SMBX, ByteAcc, NoLock, Preserve)

                        {

                            PRTC,   8,      //8,为1个字节;  上面第三个值是起始地址0x18

                            SSTS,   5,      //计算:上一个的起始地址0x18+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x19

                                ,   1,

                            ALFG,   1,

                            CDFG,   1,      //上面 5+1+1+1才凑够8位(1字节)

                            ADDR,   8,    //8,为1个字节;计算:上一个的起始地址0x19+0x1(上面 5+1+1+1才凑够8位占了1个字节,10转为16进制为0x1)值为0x19     0x1A

                            CMDB,   8, //8,为1个字节;  计算:上一个的起始地址0x1A+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x1B   

                            BDAT,   256, //256,为32个字节;计算:上一个的起始地址0x1B+0x1(上一个的8位占了1个字节,10转为16进制为0x1)值为0x1C

                            BCNT,   8,

                                ,   1,

                            ALAD,   7,

                            ALD0,   8,

                            ALD1,   8


                        }


2

查看全部评分

Rank: 5Rank: 5Rank: 5

UID
4634221
帖子
690
PB币
872
贡献
0
技术
0
活跃
1239
沙发
发表于 2017-7-27 21:24:42 IP属地广东 |只看该作者
收藏了

Rank: 7Rank: 7Rank: 7

UID
590471
帖子
1440
PB币
1928
贡献
0
技术
129
活跃
2729
板凳
发表于 2017-7-27 21:31:44 IP属地辽宁 来自手机 |只看该作者
技术贴,收藏

Rank: 7Rank: 7Rank: 7

UID
234903
帖子
2596
PB币
16884
贡献
0
技术
30
活跃
3006
4F
发表于 2017-7-28 00:19:31 IP属地云南 |只看该作者
很有帮助,谢谢分享。

Rank: 2Rank: 2

UID
2947239
帖子
383
PB币
189
贡献
0
技术
0
活跃
602
5F
发表于 2017-7-28 11:53:19 IP属地北京 |只看该作者
算是技术贴,不过好像有大大直接写了个方法处理这种大字段,电池补丁源里面就有

Rank: 7Rank: 7Rank: 7

UID
2937488
帖子
1475
PB币
2164
贡献
0
技术
34
活跃
975
6F
发表于 2017-7-28 11:58:15 IP属地广东 |只看该作者
benbentk 发表于 2017-7-28 11:53
算是技术贴,不过好像有大大直接写了个方法处理这种大字段,电池补丁源里面就有

  //==============添加读写缓存的方法=======================
# add utility methods to read/write buffers from/to \_SB.PCI0.LPCB.H_EC                 
into method label RE1B parent_label \_SB.PCI0.LPCB.H_EC remove_entry;
into method label RECB parent_label \_SB.PCI0.LPCB.H_EC remove_entry;           
into Scope label \_SB.PCI0.LPCB.H_EC insert
begin
Method (RE1B, 1, NotSerialized)\n                     
{\n
    OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
    Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
    Return(BYTE)\n
}\n
Method (RECB, 2, Serialized)\n                                                                                     //RECB代表了” Read EC Buffer”,读取EC缓存
// Arg0 - offset in bytes from zero-based \_SB.PCI0.LPCB.H_EC\n
// Arg1 - size of buffer in bits\n
{\n
    ShiftRight(Arg1, 3, Arg1)\n
    Name(TEMP, Buffer(Arg1) { })\n
    Add(Arg0, Arg1, Arg1)\n
    Store(0, Local0)\n
    While (LLess(Arg0, Arg1))\n
    {\n
        Store(RE1B(Arg0), Index(TEMP, Local0))\n
        Increment(Arg0)\n
        Increment(Local0)\n
    }\n
    Return(TEMP)\n
}\n
end;
  //==============添加写入缓存的方法=======================
into method label WE1B parent_label \_SB.PCI0.LPCB.H_EC remove_entry;               
into method label WECB parent_label \_SB.PCI0.LPCB.H_EC remove_entry;
into Scope label \_SB.PCI0.LPCB.H_EC insert
begin
Method (WE1B, 2, NotSerialized)\n
{\n
    OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
    Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
    Store(Arg1, BYTE)\n
}\n
Method (WECB, 3, Serialized)\n                                                                                     //RECB代表了” Write EC Buffer”,写入EC缓存
// Arg0 - offset in bytes from zero-based EC\n
// Arg1 - size of buffer in bits\n
// Arg2 - value to write\n
{\n
    ShiftRight(Arg1, 3, Arg1)\n
    Name(TEMP, Buffer(Arg1) { })\n
    Store(Arg2, TEMP)\n
    Add(Arg0, Arg1, Arg1)\n
    Store(0, Local0)\n
    While (LLess(Arg0, Arg1))\n
    {\n
        WE1B(Arg0, DerefOf(Index(TEMP, Local0)))\n
        Increment(Arg0)\n
        Increment(Local0)\n
    }\n
}\n

Rank: 2Rank: 2

UID
930810
帖子
245
PB币
56
贡献
0
技术
15
活跃
473
7F
发表于 2017-9-7 10:25:54 IP属地山东 |只看该作者
yearjinheng 发表于 2017-7-28 11:58
//==============添加读写缓存的方法=======================
# add utility methods to read/write b ...

有了这两个method,也得算偏移量才能用吧?小白不懂,卡在这里了

Rank: 7Rank: 7Rank: 7

UID
2937488
帖子
1475
PB币
2164
贡献
0
技术
34
活跃
975
8F
发表于 2017-9-7 20:23:51 IP属地广东 |只看该作者
billgao2 发表于 2017-9-7 10:25
有了这两个method,也得算偏移量才能用吧?小白不懂,卡在这里了

大于32的字符都要按照偏移来算

Rank: 1

UID
4827880
帖子
55
PB币
-33
贡献
0
技术
0
活跃
53
9F
发表于 2017-9-22 18:29:24 IP属地山东 |只看该作者
其实 还没有懂,比如偏移量的问题,改动之前代码时什么,改动之后是什么?依靠哪段代码来实现的?基地址怎么找?不是说只有32位以上的才要便宜量吗?为甚么这个帖子里面,好多代码后面的数字是8?这个为什么还有便宜量?
人笨求解?谢谢

Rank: 1

UID
1147181
帖子
48
PB币
0
贡献
0
技术
0
活跃
51
10F
发表于 2017-10-3 17:06:04 IP属地辽宁 |只看该作者
谢谢分享 技术贴
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛