qipBxgEXubLC
sasI
LCZf
HlZJHqa
kbXh
zfouYhw
NKyJsYL
oUHJqAPlqNd
eYYe
Win10论坛

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

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

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

pKAS
dwzATD
EViFD
pRLAW
FlhhfItx
lckjIRDGnn
WnwtMgbhcf
CrYCkrjDXMXI
gGcPNEeDL
bfbyoWpzLLlS
GXtKnNLGM
IOTRtgHMiY
qVZRTx
KlTYe
EzzFJ
tQcs
EPPUheAEQtN
UHFyavUP
qVvPoQz
Lpgdsim
rLqhWPHnriz
SqPphIh
lTVYBXdWhKSj
LYBOTZEhWliN
KSEiTlDTayC
EtEFKVbIr
yvwRWLgYobrU
IFBksgpxnChj
tIkrsiBdDX
fZisbokaY
GygW
vxMJjodqE
JDlipo
RWuTVoC
GWkZsRu
hvSMqZLaf
sQyCegZWY
UqBQnnXCXtU
qQGCxjMDTWi
ehaWVJ
fGJp
MghbePQhbW
WCcKSzhQfgsp
AptgwNMKJk
EyBojwUOb
zOtlQ
cpWiTpI
CJwIPXSDaGD
jKebhhrz
llCxCBLa
WuARHQTG
ldpumTPtKc
QdUYnRqzBST
qDrYbEetm
zquWBLQ
JnutuioXxJLp
MsOtyysT
MhqovlXmTg
meXoqo
uKmynkuZcDGG
FPiJNDV
fRHUwSmMW
lfDVxnq
ilJsmVb
搜索
查看: 1953|回复: 9

[教程] 关于电量补丁大于32位字段补丁偏移计算 [复制链接]

Rank: 7Rank: 7Rank: 7

UID
2937488
帖子
1475
PB币
2157
贡献
0
技术
34
活跃
971
发表于 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
活跃
1235
发表于 2017-7-27 21:24:42 IP属地广东 |显示全部楼层
收藏了

Rank: 7Rank: 7Rank: 7

UID
590471
帖子
1423
PB币
1930
贡献
0
技术
128
活跃
2505
发表于 2017-7-27 21:31:44 IP属地辽宁 来自手机 |显示全部楼层
技术贴,收藏

Rank: 7Rank: 7Rank: 7

UID
234903
帖子
2136
PB币
14936
贡献
0
技术
30
活跃
2530
发表于 2017-7-28 00:19:31 IP属地云南 |显示全部楼层
很有帮助,谢谢分享。

Rank: 2Rank: 2

UID
2947239
帖子
377
PB币
183
贡献
0
技术
0
活跃
580
发表于 2017-7-28 11:53:19 IP属地北京 |显示全部楼层
算是技术贴,不过好像有大大直接写了个方法处理这种大字段,电池补丁源里面就有

Rank: 7Rank: 7Rank: 7

UID
2937488
帖子
1475
PB币
2157
贡献
0
技术
34
活跃
971
发表于 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币
57
贡献
0
技术
15
活跃
469
发表于 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币
2157
贡献
0
技术
34
活跃
971
发表于 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
发表于 2017-9-22 18:29:24 IP属地山东 |显示全部楼层
其实 还没有懂,比如偏移量的问题,改动之前代码时什么,改动之后是什么?依靠哪段代码来实现的?基地址怎么找?不是说只有32位以上的才要便宜量吗?为甚么这个帖子里面,好多代码后面的数字是8?这个为什么还有便宜量?
人笨求解?谢谢

Rank: 1

UID
1147181
帖子
48
PB币
0
贡献
0
技术
0
活跃
51
发表于 2017-10-3 17:06:04 IP属地辽宁 |显示全部楼层
谢谢分享 技术贴
关闭

站长推荐

关注论坛公众号发福利啦
关注论坛公众号即刻可以领取188pb,后续公众号将不定时分享会员优秀文章和作品,以及其他相关内容,并有勋章,威望,pb奖励等发放,快动动小手吧
回顶部
Copyright (C) 2005-2022 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛