zdshpqIaD
kNSgKeTvgKd
oATQmuRIu
eYJoMTQdh
GUFYgwfKcHm
GfyYJaooFCGA
DZhC
krndSAZDPU
yIGwOcRBVF
PSQWIUmdArA
UdCktNtb
xkrrGip
SHBx
lnIBXNnKDe
zUtJhddiI
rMXoIgL
pteNqLavO
tUmMYkEzJ
otQbxSfk
VvrXxER
tExXcqOj
OXVCcV
lWFzraRjY
pxsgPqr
QNTPG
WMnoXAEQhsf
koitEXYH
JnJGLgsh
SZkOKDtMFb
AmbBO
yDGhx
YVgbEWfP
Invo
LfTlgCX
WHZiPln
qzACRNz
zHPiwcTdeQjD
cbJrCQxnr
VqCEjJhJw
iQeNOHZhq
UFcxcU
bDlSSO
cgmvFjsmu
LLRsgqe
anaMEVrC
wpBU
KCZYn
IydDAajyzE
HFQyPJ
GZAXad
TFaaeodXxL
Oyymm
gOoyoPW
qVEFoEooFe
iPMpYSNwoZWk
PBIEzEICjL
LJgbBpZpjKt
mWVdOtXbAhaJ
BQTZd
UZHAWR
gAfYorJr
teUqoPJffg
xLIIED
ZOUR
vOxojBIGW
UVrCYtlfK
BCmkQVtO
rmIUU
WZVlT
KjKRbtpdonQ
搜索
查看: 6928|回复: 10

[分享] Acer 4741G 修改DSDT for AppleACPIBatteryManager [复制链接] 复制 

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

楼主
发表于 2011-12-13 22:58:08 IP属地广东
快御云安全
    写在前面的话,目前远景论坛流行着两个轻量级的电池信息显示驱动,AppleACPIBatteryManager以及AppleSmartBatteryManager。源码俺看过,这两个驱动的原理非常之简单,说AppleSmartBatteryManager是改了名字的 AppleACPIBatteryManager一点也不为过。和Lion原版的 AppleSmartBatteryManager相比,这两个驱动仅仅实现了很基础的功能,完全依赖于DSDT中描述电池信息的方法_BIF以及电池状态的方法_BST。而原版是一个标准的SMbus Controller驱动,通过驱动Embeded Controller内部的SMbus Controller来读取电池的信息。因此AppleACPIBatteryManager的大部分工作都是由DSDT来完成。因为Mac不兼容ACPI某些多字节赋值的方法,所以如何修改DSDT中电池部分的多字节读取问题,让 AppleACPIBatteryManager正确读取_BIF以及_BST就显得尤为重要。
    提取Acer 4741G的DSDT,找到电池的域,如下图显示。
  1. Device (BAT0)
  2.         {
  3.             Name (_HID, EisaId ("PNP0C0A"))
  4.             Name (_UID, One)
  5.             Method (_PCL, 0, NotSerialized)
  6.             {
  7.                 Return (_SB)
  8.             }
  9.             Name (B0IP, Package (0x0D)
  10.             {
  11.                 One,
  12.                 0xFFFFFFFF,
  13.                 0xFFFFFFFF,
  14.                 One,
  15.                 0xFFFFFFFF,
  16.                 Zero,
  17.                 Zero,
  18.                 0x5A,
  19.                 0x5A,
  20.                 "",
  21.                 "100",
  22.                 "Lion",
  23.                 Zero
  24.             })
  25.             Name (B0SP, Package (0x04)
  26.             {
  27.                 Zero,
  28.                 0xFFFFFFFF,
  29.                 0xFFFFFFFF,
  30.                 0xFFFFFFFF
  31.             })
  32.             Method (_STA, 0, NotSerialized)
  33.             {
  34.                 If (LEqual (B0ST, 0xFF))
  35.                 {
  36.                     If (ECON)
  37.                     {
  38.                         Store (NB0A, Local1)
  39.                         If (NB0N)
  40.                         {
  41.                             Store (Zero, Local1)
  42.                         }
  43.                     }
  44.                     Else
  45.                     {
  46.                         Store (RBEC (0x88), Local0)
  47.                         ShiftRight (Local0, Zero, Local1)
  48.                         And (Local1, One, Local1)
  49.                         If (And (Local0, 0x40))
  50.                         {
  51.                             Store (Zero, Local1)
  52.                         }
  53.                     }
  54.                     Store (Local1, B0ST)
  55.                 }
  56.                 Else
  57.                 {
  58.                     Store (B0ST, Local1)
  59.                 }
  60.                 If (Local1)
  61.                 {
  62.                     Return (0x1F)
  63.                 }
  64.                 Else
  65.                 {
  66.                     Return (0x0F)
  67.                 }
  68.             }
  69.             Method (_BIF, 0, NotSerialized)
  70.             {
  71.                 Store (B0ST, Local6)
  72.                 Store (0x14, Local7)
  73.                 While (LAnd (Local6, Local7))
  74.                 {
  75.                     If (ECON)
  76.                     {
  77.                         Store (NB0S, Local1)
  78.                     }
  79.                     Else
  80.                     {
  81.                         Store (RBEC (0x88), Local1)
  82.                     }
  83.                     If (And (Local1, 0x08))
  84.                     {
  85.                         Store (Zero, Local6)
  86.                     }
  87.                     Else
  88.                     {
  89.                         Sleep (0x01F4)
  90.                         Decrement (Local7)
  91.                     }
  92.                 }
  93.                 Return (GBIF (Zero, B0IP, Local6))
  94.             }
  95.             Method (_BST, 0, NotSerialized)
  96.             {
  97.                 XOr (DerefOf (Index (B0IP, Zero)), One, Local0)
  98.                 If (ECON)
  99.                 {
  100.                     Store (NB0S, Local1)
  101.                 }
  102.                 Else
  103.                 {
  104.                     Store (RBEC (0x88), Local1)
  105.                 }
  106.                 Return (GBST (Zero, Local1, Local0, B0SP))
  107.             }
  108.         }
复制代码
可以看出_BIF函数的主要作用仅仅是返回GBIF函数的返回值,同样_BST函数的主要作用也是仅仅返回GBST函数的返回值。这里都不涉及多字节的读取问题。先看一下GBIF函数
  1. Method (GBIF, 3, NotSerialized)
  2.         {
  3.             Acquire (BATM, 0xFFFF)
  4.             If (Arg2)
  5.             {
  6.                 Store (0xFFFFFFFF, Index (Arg1, One))
  7.                 Store (0xFFFFFFFF, Index (Arg1, 0x02))
  8.                 Store (0xFFFFFFFF, Index (Arg1, 0x04))
  9.                 Store (Zero, Index (Arg1, 0x05))
  10.                 Store (Zero, Index (Arg1, 0x06))
  11.             }
  12.             Else
  13.             {
  14.                 And (Arg0, 0xF0, NBID)
  15.                 Store (BSCM, Local0)
  16.                 XOr (Local0, One, Index (Arg1, Zero))
  17.                 Or (Arg0, One, NBID)
  18.                 If (Local0)
  19.                 {
  20.                     Multiply (BSDC, 0x0A, Local1)
  21.                 }
  22.                 Else
  23.                 {
  24.                     Store (BSDC, Local1)
  25.                 }
  26.                 Store (Local1, Index (Arg1, One))
  27.                 And (Arg0, 0xF0, NBID)
  28.                 If (Local0)
  29.                 {
  30.                     Multiply (BSFC, 0x0A, Local2)
  31.                 }
  32.                 Else
  33.                 {
  34.                     Store (BSFC, Local2)
  35.                 }
  36.                 Store (Local2, Index (Arg1, 0x02))
  37.                 Or (Arg0, One, NBID)
  38.                 Store (BSDV, Index (Arg1, 0x04))
  39.                 Divide (Local2, 0x64, Local7, Local6)
  40.                 Multiply (Local6, 0x07, Local3)
  41.                 Store (Local3, Index (Arg1, 0x05))
  42.                 Multiply (0x05, 0x02, Local4)
  43.                 Add (Local4, One, Local4)
  44.                 Multiply (Local6, Local4, Local4)
  45.                 Divide (Local4, 0x02, Local7, Local4)
  46.                 Store (Local4, Index (Arg1, 0x06))
  47.                 Subtract (Local3, Local4, Index (Arg1, 0x07))
  48.                 Subtract (Local2, Local3, Index (Arg1, 0x08))
  49.                 Store (BSSN, Local7)
  50.                 Name (SERN, Buffer (0x06)
  51.                 {
  52.                     "     "
  53.                 })
  54.                 Store (0x04, Local6)
  55.                 While (Local7)
  56.                 {
  57.                     Divide (Local7, 0x0A, Local5, Local7)
  58.                     Add (Local5, 0x30, Index (SERN, Local6))
  59.                     Decrement (Local6)
  60.                 }
  61.                 Store (SERN, Index (Arg1, 0x0A))
  62.                 Or (Arg0, 0x03, NBID)
  63.                 Store (BSDN, Index (Arg1, 0x09))
  64.                 Or (Arg0, 0x04, NBID)
  65.                 Store (BSCH, Index (Arg1, 0x0B))
  66.                 Or (Arg0, 0x02, NBID)
  67.                 Store (BSMN, Index (Arg1, 0x0C))
  68.             }
  69.             Release (BATM)
  70.             Return (Arg1)
  71.         }
复制代码
其中的BSDC,BSFC,BSDV,BSSN,BSDN,BSCH,BSMN均定义成多字节的变量声明
  1. Field (RAM, ByteAcc, Lock, Preserve)
  2.         {
  3.                     Offset (0xE0),
  4.             BSRC,   16,
  5.             BSFC,   16,
  6.             BSPE,   16,
  7.             BSAC,   16,
  8.             BSVO,   16,
  9.                 ,   15,
  10.             BSCM,   1,
  11.             BSCU,   16,
  12.             BSTV,   16
  13.         }
  14.         Field (RAM, ByteAcc, Lock, Preserve)
  15.         {
  16.                     Offset (0xE0),
  17.             BSDC,   16,
  18.             BSDV,   16,
  19.             BSSN,   16
  20.         }
  21.         Field (RAM, ByteAcc, NoLock, Preserve)
  22.         {
  23.                     Offset (0xE0),
  24.             BSMN,   128
  25.         }
  26.         Field (RAM, ByteAcc, NoLock, Preserve)
  27.         {
  28.                     Offset (0xE0),
  29.             BSDN,   128
  30.         }
  31.         Field (RAM, ByteAcc, NoLock, Preserve)
  32.         {
  33.                     Offset (0xE0),
  34.             BSCH,   128
  35.         }
复制代码
因此,直接的Store(BSMN,xxxx)这样普通的ACPI Source Language赋值语句是是不被的Mac所认可的,因此 AppleACPIBatteryManager读取DSDT中这些语句的时候必然出错。导致AppleACPIBatteryManager驱动无法正常得到电池信息。因此我们把上面的变量声明改成下面字节声明
  1. Field (RAM, ByteAcc, Lock, Preserve)
  2.         {
  3.                     Offset (0xE0),
  4.             SRC0,   8,
  5.             SRC1,   8,
  6.             SFC0,   8,
  7.             SFC1,   8,
  8.             SPE0,   8,
  9.             SPE1,   8,
  10.             SAC0,   8,
  11.             SAC1,   8,
  12.             SVO0,   8,
  13.             SVO1,   8,
  14.                 ,   8,
  15.                 ,   7,
  16.             BSCM,   1,
  17.             SCU0,   8,
  18.             SCU1,   8,
  19.             STV0,   8,
  20.             STV1,   8
  21.         }
  22.         Field (RAM, ByteAcc, Lock, Preserve)
  23.         {
  24.                     Offset (0xE0),
  25.             SDC0,   8,
  26.             SDC1,   8,
  27.             SDV0,   8,
  28.             SDV1,   8,
  29.             SSN0,   8,
  30.             SSN1,   8
  31.         }
  32.         Field (RAM, ByteAcc, NoLock, Preserve)
  33.         {
  34.                     Offset (0xE0),
  35.             SMD0,   8,
  36.             SMD1,   8,
  37.             SMD2,   8,
  38.             SMD3,   8,
  39.             SMD4,   8,
  40.             SMD5,   8,
  41.             SMD6,   8,
  42.             SMD7,   8,
  43.             SMD8,   8,
  44.             SMD9,   8,
  45.             SMDA,   8,
  46.             SMDB,   8,
  47.             SMDC,   8,
  48.             SMDD,   8,
  49.             SMDE,   8,
  50.             SMDF,   8
  51.         }
复制代码
一个字变量分成两个xxx0,xxx1字节变量, BSMN、BSDN、BSCH都是EC Space偏移0xE0的地方,所以统一成128/8 = 16个字节变量。GBIF改成如下的样子,主要通过移位、或的操作把两个xxx0,xxx1字节变量放在一个本地变量Localx。另外通过建立中间缓冲Buffer的方法,来存储 SMDX的值。
  1. Method (GBIF, 3, NotSerialized)
  2.         {
  3.             Acquire (BATM, 0xFFFF)
  4.             If (Arg2)
  5.             {
  6.                 Store (0xFFFFFFFF, Index (Arg1, One))
  7.                 Store (0xFFFFFFFF, Index (Arg1, 0x02))
  8.                 Store (0xFFFFFFFF, Index (Arg1, 0x04))
  9.                 Store (Zero, Index (Arg1, 0x05))
  10.                 Store (Zero, Index (Arg1, 0x06))
  11.             }
  12.             Else
  13.             {
  14.                 And (Arg0, 0xF0, NBID)
  15.                 Store (BSCM, Local0)
  16.                 XOr (Local0, One, Index (Arg1, Zero))
  17.                 Or (Arg0, One, NBID)
  18.                 ShiftLeft(SDC1, 8, Local3)
  19.                 Or (SDC0, Local3, Local3)
  20.                 If (Local0)
  21.                 {
  22.                     Multiply (Local3, 0x0A, Local1)
  23.                 }
  24.                 Else
  25.                 {
  26.                     Store (Local3, Local1)
  27.                 }
  28.                 Store (Local1, Index (Arg1, One))
  29.                 And (Arg0, 0xF0, NBID)
  30.                 ShiftLeft(SFC1, 8, Local3)
  31.                 Or (SFC0, Local3, Local3)
  32.                 If (Local0)
  33.                 {
  34.                     Multiply (Local3, 0x0A, Local2)
  35.                 }
  36.                 Else
  37.                 {
  38.                     Store (Local3, Local2)
  39.                 }
  40.                 Store (Local2, Index (Arg1, 0x02))
  41.                 Or (Arg0, One, NBID)
  42.                 ShiftLeft(SDV1, 8, Local3)
  43.                 Or (SDV0, Local3, Local3)
  44.                 Store (Local3, Index (Arg1, 0x04))
  45.                 Divide (Local2, 0x64, Local7, Local6)
  46.                 Multiply (Local6, 0x07, Local3)
  47.                 Store (Local3, Index (Arg1, 0x05))
  48.                 Multiply (0x05, 0x02, Local4)
  49.                 Add (Local4, One, Local4)
  50.                 Multiply (Local6, Local4, Local4)
  51.                 Divide (Local4, 0x02, Local7, Local4)
  52.                 Store (Local4, Index (Arg1, 0x06))
  53.                 Subtract (Local3, Local4, Index (Arg1, 0x07))
  54.                 Subtract (Local2, Local3, Index (Arg1, 0x08))
  55.                 ShiftLeft(SSN1, 8, Local7)
  56.                 Or (SSN0, Local7, Local7)
  57.                 Store (Buffer (0x11)
  58.                 {
  59.                     ""
  60.                 },Local4)
  61.                 Store (0x04, Local6)
  62.                 Store(Zero, Index(Local4, 0x05))
  63.                 While (Local7)
  64.                 {
  65.                     Divide (Local7, 0x0A, Local5, Local7)
  66.                     Add (Local5, 0x30, Index (Local4, Local6))
  67.                     Decrement (Local6)
  68.                 }
  69.                 Store (Local4, Index (Arg1, 0x0A))
  70.                 Store (Zero, Local5)
  71.                 Or (Arg0, 0x03, NBID)
  72.                 If (LNotEqual (SMD0, 0x00)){ Store (SMD0, Index (Local4, Zero)) Increment(Local5) }
  73.                 If (LNotEqual (SMD1, 0x00)){ Store (SMD1, Index (Local4, 0x01)) Increment(Local5) }
  74.                 If (LNotEqual (SMD2, 0x00)){ Store (SMD2, Index (Local4, 0x02)) Increment(Local5) }
  75.                 If (LNotEqual (SMD3, 0x00)){ Store (SMD3, Index (Local4, 0x03)) Increment(Local5) }
  76.                 If (LNotEqual (SMD4, 0x00)){ Store (SMD4, Index (Local4, 0x04)) Increment(Local5) }
  77.                 If (LNotEqual (SMD5, 0x00)){ Store (SMD5, Index (Local4, 0x05)) Increment(Local5) }
  78.                 If (LNotEqual (SMD6, 0x00)){ Store (SMD6, Index (Local4, 0x06)) Increment(Local5) }
  79.                 If (LNotEqual (SMD7, 0x00)){ Store (SMD7, Index (Local4, 0x07)) Increment(Local5) }
  80.                 If (LNotEqual (SMD8, 0x00)){ Store (SMD8, Index (Local4, 0x08)) Increment(Local5) }
  81.                 If (LNotEqual (SMD9, 0x00)){ Store (SMD9, Index (Local4, 0x09)) Increment(Local5) }
  82.                 If (LNotEqual (SMDA, 0x00)){ Store (SMDA, Index (Local4, 0x0A)) Increment(Local5) }
  83.                 If (LNotEqual (SMDB, 0x00)){ Store (SMDB, Index (Local4, 0x0B)) Increment(Local5) }
  84.                 If (LNotEqual (SMDC, 0x00)){ Store (SMDC, Index (Local4, 0x0C)) Increment(Local5) }
  85.                 If (LNotEqual (SMDD, 0x00)){ Store (SMDD, Index (Local4, 0x0D)) Increment(Local5) }
  86.                 If (LNotEqual (SMDE, 0x00)){ Store (SMDE, Index (Local4, 0x0E)) Increment(Local5) }
  87.                 If (LNotEqual (SMDF, 0x00)){ Store (SMDF, Index (Local4, 0x0F)) Increment(Local5) }
  88.                 Store (Zero, Index (Local4, Local5))
  89.                 Store (Local4, Index (Arg1, 0x09))
  90.                 Store (Zero, Local5)
  91.                 Or (Arg0, 0x04, NBID)
  92.                 If (LNotEqual (SMD0, 0x00)){ Store (SMD0, Index (Local4, Zero)) Increment(Local5) }
  93.                 If (LNotEqual (SMD1, 0x00)){ Store (SMD1, Index (Local4, 0x01)) Increment(Local5) }
  94.                 If (LNotEqual (SMD2, 0x00)){ Store (SMD2, Index (Local4, 0x02)) Increment(Local5) }
  95.                 If (LNotEqual (SMD3, 0x00)){ Store (SMD3, Index (Local4, 0x03)) Increment(Local5) }
  96.                 If (LNotEqual (SMD4, 0x00)){ Store (SMD4, Index (Local4, 0x04)) Increment(Local5) }
  97.                 If (LNotEqual (SMD5, 0x00)){ Store (SMD5, Index (Local4, 0x05)) Increment(Local5) }
  98.                 If (LNotEqual (SMD6, 0x00)){ Store (SMD6, Index (Local4, 0x06)) Increment(Local5) }
  99.                 If (LNotEqual (SMD7, 0x00)){ Store (SMD7, Index (Local4, 0x07)) Increment(Local5) }
  100.                 If (LNotEqual (SMD8, 0x00)){ Store (SMD8, Index (Local4, 0x08)) Increment(Local5) }
  101.                 If (LNotEqual (SMD9, 0x00)){ Store (SMD9, Index (Local4, 0x09)) Increment(Local5) }
  102.                 If (LNotEqual (SMDA, 0x00)){ Store (SMDA, Index (Local4, 0x0A)) Increment(Local5) }
  103.                 If (LNotEqual (SMDB, 0x00)){ Store (SMDB, Index (Local4, 0x0B)) Increment(Local5) }
  104.                 If (LNotEqual (SMDC, 0x00)){ Store (SMDC, Index (Local4, 0x0C)) Increment(Local5) }
  105.                 If (LNotEqual (SMDD, 0x00)){ Store (SMDD, Index (Local4, 0x0D)) Increment(Local5) }
  106.                 If (LNotEqual (SMDE, 0x00)){ Store (SMDE, Index (Local4, 0x0E)) Increment(Local5) }
  107.                 If (LNotEqual (SMDF, 0x00)){ Store (SMDF, Index (Local4, 0x0F)) Increment(Local5) }
  108.                 Store (Zero, Index (Local4, Local5))
  109.                 Store (Local4, Index (Arg1, 0x0B))
  110.                 Store (Zero, Local5)
  111.                 Or (Arg0, 0x02, NBID)
  112.                 If (LNotEqual (SMD0, 0x00)){ Store (SMD0, Index (Local4, Zero)) Increment(Local5) }
  113.                 If (LNotEqual (SMD1, 0x00)){ Store (SMD1, Index (Local4, 0x01)) Increment(Local5) }
  114.                 If (LNotEqual (SMD2, 0x00)){ Store (SMD2, Index (Local4, 0x02)) Increment(Local5) }
  115.                 If (LNotEqual (SMD3, 0x00)){ Store (SMD3, Index (Local4, 0x03)) Increment(Local5) }
  116.                 If (LNotEqual (SMD4, 0x00)){ Store (SMD4, Index (Local4, 0x04)) Increment(Local5) }
  117.                 If (LNotEqual (SMD5, 0x00)){ Store (SMD5, Index (Local4, 0x05)) Increment(Local5) }
  118.                 If (LNotEqual (SMD6, 0x00)){ Store (SMD6, Index (Local4, 0x06)) Increment(Local5) }
  119.                 If (LNotEqual (SMD7, 0x00)){ Store (SMD7, Index (Local4, 0x07)) Increment(Local5) }
  120.                 If (LNotEqual (SMD8, 0x00)){ Store (SMD8, Index (Local4, 0x08)) Increment(Local5) }
  121.                 If (LNotEqual (SMD9, 0x00)){ Store (SMD9, Index (Local4, 0x09)) Increment(Local5) }
  122.                 If (LNotEqual (SMDA, 0x00)){ Store (SMDA, Index (Local4, 0x0A)) Increment(Local5) }
  123.                 If (LNotEqual (SMDB, 0x00)){ Store (SMDB, Index (Local4, 0x0B)) Increment(Local5) }
  124.                 If (LNotEqual (SMDC, 0x00)){ Store (SMDC, Index (Local4, 0x0C)) Increment(Local5) }
  125.                 If (LNotEqual (SMDD, 0x00)){ Store (SMDD, Index (Local4, 0x0D)) Increment(Local5) }
  126.                 If (LNotEqual (SMDE, 0x00)){ Store (SMDE, Index (Local4, 0x0E)) Increment(Local5) }
  127.                 If (LNotEqual (SMDF, 0x00)){ Store (SMDF, Index (Local4, 0x0F)) Increment(Local5) }
  128.                 Store (Zero, Index (Local4, Local5))
  129.                 Store (Local4, Index (Arg1, 0x0C))
  130.             }
  131.             Release (BATM)
  132.             Return (Arg1)
  133.         }
复制代码
4

查看全部评分

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

沙发
发表于 2011-12-13 22:58:38 IP属地广东
再看一下_BST函数调用的GBIF函数,同样把字赋值的ASL语句改成字节移位、或赋值给Localx
  1. Method (GBST, 4, NotSerialized)
  2.         {
  3.             If (Arg0)
  4.             {
  5.                 Store (SM1F, Local0)
  6.             }
  7.             Else
  8.             {
  9.                 Store (SM0F, Local0)
  10.             }
  11.             If (Local0)
  12.             {
  13.                 And (Arg1, 0x08, Local0)
  14.                 If (LEqual (Local0, Zero))
  15.                 {
  16.                     Return (Arg3)
  17.                 }
  18.             }
  19.             Acquire (BATM, 0xFFFF)
  20.             If (And (Arg1, 0x02))
  21.             {
  22.                 Store (0x02, Local0)
  23.                 If (And (Arg1, 0x20))
  24.                 {
  25.                     Store (Zero, Local0)
  26.                 }
  27.             }
  28.             Else
  29.             {
  30.                 If (And (Arg1, 0x04))
  31.                 {
  32.                     Store (One, Local0)
  33.                 }
  34.                 Else
  35.                 {
  36.                     Store (Zero, Local0)
  37.                 }
  38.             }
  39.             If (And (Arg1, 0x10))
  40.             {
  41.                 Or (Local0, 0x04, Local0)
  42.             }
  43.             If (And (Arg1, One))
  44.             {
  45.                 And (Arg0, 0xF0, NBID)
  46.                 Store (BSAC, Local1)
  47.                 Store (BSRC, Local2)
  48.                 If (ACST)
  49.                 {
  50.                     If (And (Arg1, 0x20))
  51.                     {
  52.                         Store (BSFC, Local2)
  53.                     }
  54.                 }
  55.                 If (Arg2)
  56.                 {
  57.                     Multiply (Local2, 0x0A, Local2)
  58.                 }
  59.                 Store (BSVO, Local3)
  60.                 If (LGreaterEqual (Local1, 0x8000))
  61.                 {
  62.                     If (And (Local0, One))
  63.                     {
  64.                         Subtract (0x00010000, Local1, Local1)
  65.                     }
  66.                     Else
  67.                     {
  68.                         Store (Zero, Local1)
  69.                     }
  70.                 }
  71.                 Else
  72.                 {
  73.                     If (LEqual (And (Local0, 0x02), Zero))
  74.                     {
  75.                         Store (Zero, Local1)
  76.                     }
  77.                 }
  78.                 If (Arg2)
  79.                 {
  80.                     Multiply (Local3, Local1, Local1)
  81.                     Divide (Local1, 0x03E8, Local7, Local1)
  82.                 }
  83.             }
  84.             Else
  85.             {
  86.                 Store (Zero, Local0)
  87.                 Store (0xFFFFFFFF, Local1)
  88.                 Store (0xFFFFFFFF, Local2)
  89.                 Store (0xFFFFFFFF, Local3)
  90.             }
  91.             Store (Local0, Index (Arg3, Zero))
  92.             Store (Local1, Index (Arg3, One))
  93.             Store (Local2, Index (Arg3, 0x02))
  94.             Store (Local3, Index (Arg3, 0x03))
  95.             Release (BATM)
  96.             Return (Arg3)
  97.         }
复制代码
修改后变成如下这个样子
  1. Method (GBST, 4, NotSerialized)
  2.         {
  3.             If (Arg0)
  4.             {
  5.                 Store (SM1F, Local0)
  6.             }
  7.             Else
  8.             {
  9.                 Store (SM0F, Local0)
  10.             }
  11.             If (Local0)
  12.             {
  13.                 And (Arg1, 0x08, Local0)
  14.                 If (LEqual (Local0, Zero))
  15.                 {
  16.                     Return (Arg3)
  17.                 }
  18.             }
  19.             Acquire (BATM, 0xFFFF)
  20.             If (And (Arg1, 0x02))
  21.             {
  22.                 Store (0x02, Local0)
  23.                 If (And (Arg1, 0x20))
  24.                 {
  25.                     Store (Zero, Local0)
  26.                 }
  27.             }
  28.             Else
  29.             {
  30.                 If (And (Arg1, 0x04))
  31.                 {
  32.                     Store (One, Local0)
  33.                 }
  34.                 Else
  35.                 {
  36.                     Store (Zero, Local0)
  37.                 }
  38.             }
  39.             If (And (Arg1, 0x10))
  40.             {
  41.                 Or (Local0, 0x04, Local0)
  42.             }
  43.             If (And (Arg1, One))
  44.             {
  45.                 And (Arg0, 0xF0, NBID)
  46.                 ShiftLeft(SAC1, 8, Local1)
  47.                 Or (SAC0, Local1, Local1)
  48.                 ShiftLeft(SRC1, 8, Local2)
  49.                 Or (SRC0, Local2, Local2)
  50.                 If (ACST)
  51.                 {
  52.                     If (And (Arg1, 0x20))
  53.                     {
  54.                         ShiftLeft(SFC1, 8, Local2)
  55.                         Or (SFC0, Local2, Local2)
  56.                     }
  57.                 }
  58.                 If (Arg2)
  59.                 {
  60.                     Multiply (Local2, 0x0A, Local2)
  61.                 }
  62.                 ShiftLeft(SVO1, 8, Local3)
  63.                 Or (SVO0, Local3, Local3)
  64.                 If (LGreaterEqual (Local1, 0x8000))
  65.                 {
  66.                     If (And (Local0, One))
  67.                     {
  68.                         Subtract (0x00010000, Local1, Local1)
  69.                     }
  70.                     Else
  71.                     {
  72.                         Store (Zero, Local1)
  73.                     }
  74.                 }
  75.                 Else
  76.                 {
  77.                     If (LEqual (And (Local0, 0x02), Zero))
  78.                     {
  79.                         Store (Zero, Local1)
  80.                     }
  81.                 }
  82.                 If (Arg2)
  83.                 {
  84.                     Multiply (Local3, Local1, Local1)
  85.                     Divide (Local1, 0x03E8, Local7, Local1)
  86.                 }
  87.             }
  88.             Else
  89.             {
  90.                 Store (Zero, Local0)
  91.                 Store (0xFFFFFFFF, Local1)
  92.                 Store (0xFFFFFFFF, Local2)
  93.                 Store (0xFFFFFFFF, Local3)
  94.             }
  95.             Store (Local0, Index (Arg3, Zero))
  96.             Store (Local1, Index (Arg3, One))
  97.             Store (Local2, Index (Arg3, 0x02))
  98.             Store (Local3, Index (Arg3, 0x03))
  99.             Release (BATM)
  100.             Return (Arg3)
  101.         }
复制代码
自此所有修改完毕,保存DSDT,编译得到dsdt.aml。替换原来的dsdt.aml。把AppleACPIBatteryManager放在/E/E,重启,进入Mac,用Kext Wizzard修复权限,再次重新启动。就会发现电池所有的信息显示正常了。
2

查看全部评分

地平线

Rank: 5Rank: 5Rank: 5

UID
1517273
帖子
1146
PB币
459
贡献
0
技术
157
活跃
0
板凳
发表于 2011-12-13 23:26:51 IP属地湖北
谢谢分享!4741的机油有福了哈。4750G我也改过了,三个位置还是四个位置记不太清楚了,貌似有一个多月了,呵呵,正常加载。

Rank: 9

UID
2262203
帖子
724
PB币
434
贡献
0
技术
3
活跃
882

7周年庆典勋章

4F
发表于 2011-12-14 09:01:12 IP属地广东
不知道 smd0-f 这段代码 有何功能,之前修改时没有添加也可以正确显示。
昨天添加上去也没见有何不同 。

UID
420320
帖子
220
PB币
1776
贡献
0
技术
30
活跃
8
5F
发表于 2011-12-14 09:27:43 IP属地广东
学习一下。有时间再弄吧。

Rank: 9

UID
1254657
帖子
454
PB币
398
贡献
0
技术
3
活跃
39

7周年庆典勋章

6F
发表于 2011-12-14 10:31:42 IP属地广东
感谢核桃精益求精地追求完美所做的努力。

喜欢看闪电的孩子

Rank: 7Rank: 7Rank: 7

UID
1573519
帖子
292
PB币
2014
贡献
0
技术
17
活跃
439

7周年庆典勋章

7F
发表于 2011-12-16 13:27:41 IP属地浙江
核桃很认真,作为4741用户感谢你。

Rank: 1

UID
1586969
帖子
88
PB币
374
贡献
0
技术
0
活跃
98
8F
发表于 2011-12-16 13:39:56 IP属地广东
非常感谢核桃的努力。
机友们有福音了。

Rank: 5Rank: 5Rank: 5

UID
475744
帖子
362
PB币
31
贡献
0
技术
9
活跃
73
9F
发表于 2011-12-16 13:53:57 IP属地江苏
实在是牛逼,天书啊~~~

Rank: 9

UID
1254657
帖子
454
PB币
398
贡献
0
技术
3
活跃
39

7周年庆典勋章

10F
发表于 2011-12-17 10:18:24 IP属地广东
cserft真谦虚...,核桃真牛...

Rank: 5Rank: 5Rank: 5

UID
2194259
帖子
671
PB币
34
贡献
0
技术
41
活跃
716
11F
发表于 2011-12-17 10:43:14 IP属地湖北
楼主能不能上传一个,你改好的,dsdt,我的也是4741的
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛