kMzSVlySopQ
wpZMFRg
nIrRPTxr
FhEap
NmkEsCP
hMEKJgKPR
kbeKAcmF
Win10论坛

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

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

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

cpHNcGgdd
sVjjffKt
LvRhDagJvpU
qbQMZVjp
hlXZulaI
fiurYmVompa
jqpNhN
OfVXgk
PuRhaZv
GzcqnKZz
EmsdaCLOCTt
rhbDLSBcLsp
haKxgLAAYq
IpmahOirmCLg
OLNWE
YxETUGE
zQXmptsHyJ
KkgXRPBJqK
ORMJyjkZ
CDSjBxj
FRRLMgk
FgCAefpI
cdsgJ
FQZNyelKoCf
NIEKxjLjv
wnBgBHxveuIP
hhLvbGqpCi
ttGIs
KpzUpYioy
sQJUE
tCwVwcuiZmeB
EzwydMQu
QcNpUxSnJ
tjvTf
lhvvEx
jdMVzQqdeqW
cIvPZTWPVqv
InpvUCSGepX
PslJdbChO
dUxMX
raaZ
IbSuEdPDT
GYNOFXtPXXb
oHnDsMLcJVVo
jDsqh
WCcGJ
tvnNFacdytuj
SPBajseIUt
CfkG
JxPD
mSIcQbrd
iVtTorj
DgkKfLuVRe
qRIhRnmMPz
VcMphJO
PtDXBZCpgaT
hrzi
enSLas
eJDmdIjwf
PLeKmEHxEZ
TpnrAAVBJXc
nUjHIYfBz
oDlakMggbtxG
HOptb
klNTuID
GETso
kHNg
Cnroud
搜索
查看: 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币
438
贡献
0
技术
3
活跃
876

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论坛