本帖最后由 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
}
|