- 积分
- 1002
- 最后登录
- 2023-10-13
- 精华
- 0
- 阅读权限
- 40
- 主题
- 14
- UID
- 1544652
- 帖子
- 134
- PB币
- 52
- 威望
- 158
- 贡献
- 0
- 技术
- 42
- 活跃
- 222
- UID
- 1544652
- 帖子
- 134
- PB币
- 52
- 贡献
- 0
- 技术
- 42
- 活跃
- 222
|
楼主
发表于 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,找到电池的域,如下图显示。- Device (BAT0)
- {
- Name (_HID, EisaId ("PNP0C0A"))
- Name (_UID, One)
- Method (_PCL, 0, NotSerialized)
- {
- Return (_SB)
- }
- Name (B0IP, Package (0x0D)
- {
- One,
- 0xFFFFFFFF,
- 0xFFFFFFFF,
- One,
- 0xFFFFFFFF,
- Zero,
- Zero,
- 0x5A,
- 0x5A,
- "",
- "100",
- "Lion",
- Zero
- })
- Name (B0SP, Package (0x04)
- {
- Zero,
- 0xFFFFFFFF,
- 0xFFFFFFFF,
- 0xFFFFFFFF
- })
- Method (_STA, 0, NotSerialized)
- {
- If (LEqual (B0ST, 0xFF))
- {
- If (ECON)
- {
- Store (NB0A, Local1)
- If (NB0N)
- {
- Store (Zero, Local1)
- }
- }
- Else
- {
- Store (RBEC (0x88), Local0)
- ShiftRight (Local0, Zero, Local1)
- And (Local1, One, Local1)
- If (And (Local0, 0x40))
- {
- Store (Zero, Local1)
- }
- }
- Store (Local1, B0ST)
- }
- Else
- {
- Store (B0ST, Local1)
- }
- If (Local1)
- {
- Return (0x1F)
- }
- Else
- {
- Return (0x0F)
- }
- }
- Method (_BIF, 0, NotSerialized)
- {
- Store (B0ST, Local6)
- Store (0x14, Local7)
- While (LAnd (Local6, Local7))
- {
- If (ECON)
- {
- Store (NB0S, Local1)
- }
- Else
- {
- Store (RBEC (0x88), Local1)
- }
- If (And (Local1, 0x08))
- {
- Store (Zero, Local6)
- }
- Else
- {
- Sleep (0x01F4)
- Decrement (Local7)
- }
- }
- Return (GBIF (Zero, B0IP, Local6))
- }
- Method (_BST, 0, NotSerialized)
- {
- XOr (DerefOf (Index (B0IP, Zero)), One, Local0)
- If (ECON)
- {
- Store (NB0S, Local1)
- }
- Else
- {
- Store (RBEC (0x88), Local1)
- }
- Return (GBST (Zero, Local1, Local0, B0SP))
- }
- }
复制代码 可以看出_BIF函数的主要作用仅仅是返回GBIF函数的返回值,同样_BST函数的主要作用也是仅仅返回GBST函数的返回值。这里都不涉及多字节的读取问题。先看一下GBIF函数- Method (GBIF, 3, NotSerialized)
- {
- Acquire (BATM, 0xFFFF)
- If (Arg2)
- {
- Store (0xFFFFFFFF, Index (Arg1, One))
- Store (0xFFFFFFFF, Index (Arg1, 0x02))
- Store (0xFFFFFFFF, Index (Arg1, 0x04))
- Store (Zero, Index (Arg1, 0x05))
- Store (Zero, Index (Arg1, 0x06))
- }
- Else
- {
- And (Arg0, 0xF0, NBID)
- Store (BSCM, Local0)
- XOr (Local0, One, Index (Arg1, Zero))
- Or (Arg0, One, NBID)
- If (Local0)
- {
- Multiply (BSDC, 0x0A, Local1)
- }
- Else
- {
- Store (BSDC, Local1)
- }
- Store (Local1, Index (Arg1, One))
- And (Arg0, 0xF0, NBID)
- If (Local0)
- {
- Multiply (BSFC, 0x0A, Local2)
- }
- Else
- {
- Store (BSFC, Local2)
- }
- Store (Local2, Index (Arg1, 0x02))
- Or (Arg0, One, NBID)
- Store (BSDV, Index (Arg1, 0x04))
- Divide (Local2, 0x64, Local7, Local6)
- Multiply (Local6, 0x07, Local3)
- Store (Local3, Index (Arg1, 0x05))
- Multiply (0x05, 0x02, Local4)
- Add (Local4, One, Local4)
- Multiply (Local6, Local4, Local4)
- Divide (Local4, 0x02, Local7, Local4)
- Store (Local4, Index (Arg1, 0x06))
- Subtract (Local3, Local4, Index (Arg1, 0x07))
- Subtract (Local2, Local3, Index (Arg1, 0x08))
- Store (BSSN, Local7)
- Name (SERN, Buffer (0x06)
- {
- " "
- })
- Store (0x04, Local6)
- While (Local7)
- {
- Divide (Local7, 0x0A, Local5, Local7)
- Add (Local5, 0x30, Index (SERN, Local6))
- Decrement (Local6)
- }
- Store (SERN, Index (Arg1, 0x0A))
- Or (Arg0, 0x03, NBID)
- Store (BSDN, Index (Arg1, 0x09))
- Or (Arg0, 0x04, NBID)
- Store (BSCH, Index (Arg1, 0x0B))
- Or (Arg0, 0x02, NBID)
- Store (BSMN, Index (Arg1, 0x0C))
- }
- Release (BATM)
- Return (Arg1)
- }
复制代码 其中的BSDC,BSFC,BSDV,BSSN,BSDN,BSCH,BSMN均定义成多字节的变量声明- Field (RAM, ByteAcc, Lock, Preserve)
- {
- Offset (0xE0),
- BSRC, 16,
- BSFC, 16,
- BSPE, 16,
- BSAC, 16,
- BSVO, 16,
- , 15,
- BSCM, 1,
- BSCU, 16,
- BSTV, 16
- }
- Field (RAM, ByteAcc, Lock, Preserve)
- {
- Offset (0xE0),
- BSDC, 16,
- BSDV, 16,
- BSSN, 16
- }
- Field (RAM, ByteAcc, NoLock, Preserve)
- {
- Offset (0xE0),
- BSMN, 128
- }
- Field (RAM, ByteAcc, NoLock, Preserve)
- {
- Offset (0xE0),
- BSDN, 128
- }
- Field (RAM, ByteAcc, NoLock, Preserve)
- {
- Offset (0xE0),
- BSCH, 128
- }
复制代码 因此,直接的Store(BSMN,xxxx)这样普通的ACPI Source Language赋值语句是是不被的Mac所认可的,因此 AppleACPIBatteryManager读取DSDT中这些语句的时候必然出错。导致AppleACPIBatteryManager驱动无法正常得到电池信息。因此我们把上面的变量声明改成下面字节声明- Field (RAM, ByteAcc, Lock, Preserve)
- {
- Offset (0xE0),
- SRC0, 8,
- SRC1, 8,
- SFC0, 8,
- SFC1, 8,
- SPE0, 8,
- SPE1, 8,
- SAC0, 8,
- SAC1, 8,
- SVO0, 8,
- SVO1, 8,
- , 8,
- , 7,
- BSCM, 1,
- SCU0, 8,
- SCU1, 8,
- STV0, 8,
- STV1, 8
- }
- Field (RAM, ByteAcc, Lock, Preserve)
- {
- Offset (0xE0),
- SDC0, 8,
- SDC1, 8,
- SDV0, 8,
- SDV1, 8,
- SSN0, 8,
- SSN1, 8
- }
- Field (RAM, ByteAcc, NoLock, Preserve)
- {
- Offset (0xE0),
- SMD0, 8,
- SMD1, 8,
- SMD2, 8,
- SMD3, 8,
- SMD4, 8,
- SMD5, 8,
- SMD6, 8,
- SMD7, 8,
- SMD8, 8,
- SMD9, 8,
- SMDA, 8,
- SMDB, 8,
- SMDC, 8,
- SMDD, 8,
- SMDE, 8,
- SMDF, 8
- }
复制代码 一个字变量分成两个xxx0,xxx1字节变量, BSMN、BSDN、BSCH都是EC Space偏移0xE0的地方,所以统一成128/8 = 16个字节变量。GBIF改成如下的样子,主要通过移位、或的操作把两个xxx0,xxx1字节变量放在一个本地变量Localx。另外通过建立中间缓冲Buffer的方法,来存储 SMDX的值。
- Method (GBIF, 3, NotSerialized)
- {
- Acquire (BATM, 0xFFFF)
- If (Arg2)
- {
- Store (0xFFFFFFFF, Index (Arg1, One))
- Store (0xFFFFFFFF, Index (Arg1, 0x02))
- Store (0xFFFFFFFF, Index (Arg1, 0x04))
- Store (Zero, Index (Arg1, 0x05))
- Store (Zero, Index (Arg1, 0x06))
- }
- Else
- {
- And (Arg0, 0xF0, NBID)
- Store (BSCM, Local0)
- XOr (Local0, One, Index (Arg1, Zero))
- Or (Arg0, One, NBID)
- ShiftLeft(SDC1, 8, Local3)
- Or (SDC0, Local3, Local3)
- If (Local0)
- {
- Multiply (Local3, 0x0A, Local1)
- }
- Else
- {
- Store (Local3, Local1)
- }
- Store (Local1, Index (Arg1, One))
- And (Arg0, 0xF0, NBID)
- ShiftLeft(SFC1, 8, Local3)
- Or (SFC0, Local3, Local3)
- If (Local0)
- {
- Multiply (Local3, 0x0A, Local2)
- }
- Else
- {
- Store (Local3, Local2)
- }
- Store (Local2, Index (Arg1, 0x02))
- Or (Arg0, One, NBID)
- ShiftLeft(SDV1, 8, Local3)
- Or (SDV0, Local3, Local3)
- Store (Local3, Index (Arg1, 0x04))
- Divide (Local2, 0x64, Local7, Local6)
- Multiply (Local6, 0x07, Local3)
- Store (Local3, Index (Arg1, 0x05))
- Multiply (0x05, 0x02, Local4)
- Add (Local4, One, Local4)
- Multiply (Local6, Local4, Local4)
- Divide (Local4, 0x02, Local7, Local4)
- Store (Local4, Index (Arg1, 0x06))
- Subtract (Local3, Local4, Index (Arg1, 0x07))
- Subtract (Local2, Local3, Index (Arg1, 0x08))
- ShiftLeft(SSN1, 8, Local7)
- Or (SSN0, Local7, Local7)
- Store (Buffer (0x11)
- {
- ""
- },Local4)
- Store (0x04, Local6)
- Store(Zero, Index(Local4, 0x05))
- While (Local7)
- {
- Divide (Local7, 0x0A, Local5, Local7)
- Add (Local5, 0x30, Index (Local4, Local6))
- Decrement (Local6)
- }
- Store (Local4, Index (Arg1, 0x0A))
- Store (Zero, Local5)
- Or (Arg0, 0x03, NBID)
- If (LNotEqual (SMD0, 0x00)){ Store (SMD0, Index (Local4, Zero)) Increment(Local5) }
- If (LNotEqual (SMD1, 0x00)){ Store (SMD1, Index (Local4, 0x01)) Increment(Local5) }
- If (LNotEqual (SMD2, 0x00)){ Store (SMD2, Index (Local4, 0x02)) Increment(Local5) }
- If (LNotEqual (SMD3, 0x00)){ Store (SMD3, Index (Local4, 0x03)) Increment(Local5) }
- If (LNotEqual (SMD4, 0x00)){ Store (SMD4, Index (Local4, 0x04)) Increment(Local5) }
- If (LNotEqual (SMD5, 0x00)){ Store (SMD5, Index (Local4, 0x05)) Increment(Local5) }
- If (LNotEqual (SMD6, 0x00)){ Store (SMD6, Index (Local4, 0x06)) Increment(Local5) }
- If (LNotEqual (SMD7, 0x00)){ Store (SMD7, Index (Local4, 0x07)) Increment(Local5) }
- If (LNotEqual (SMD8, 0x00)){ Store (SMD8, Index (Local4, 0x08)) Increment(Local5) }
- If (LNotEqual (SMD9, 0x00)){ Store (SMD9, Index (Local4, 0x09)) Increment(Local5) }
- If (LNotEqual (SMDA, 0x00)){ Store (SMDA, Index (Local4, 0x0A)) Increment(Local5) }
- If (LNotEqual (SMDB, 0x00)){ Store (SMDB, Index (Local4, 0x0B)) Increment(Local5) }
- If (LNotEqual (SMDC, 0x00)){ Store (SMDC, Index (Local4, 0x0C)) Increment(Local5) }
- If (LNotEqual (SMDD, 0x00)){ Store (SMDD, Index (Local4, 0x0D)) Increment(Local5) }
- If (LNotEqual (SMDE, 0x00)){ Store (SMDE, Index (Local4, 0x0E)) Increment(Local5) }
- If (LNotEqual (SMDF, 0x00)){ Store (SMDF, Index (Local4, 0x0F)) Increment(Local5) }
- Store (Zero, Index (Local4, Local5))
- Store (Local4, Index (Arg1, 0x09))
- Store (Zero, Local5)
- Or (Arg0, 0x04, NBID)
- If (LNotEqual (SMD0, 0x00)){ Store (SMD0, Index (Local4, Zero)) Increment(Local5) }
- If (LNotEqual (SMD1, 0x00)){ Store (SMD1, Index (Local4, 0x01)) Increment(Local5) }
- If (LNotEqual (SMD2, 0x00)){ Store (SMD2, Index (Local4, 0x02)) Increment(Local5) }
- If (LNotEqual (SMD3, 0x00)){ Store (SMD3, Index (Local4, 0x03)) Increment(Local5) }
- If (LNotEqual (SMD4, 0x00)){ Store (SMD4, Index (Local4, 0x04)) Increment(Local5) }
- If (LNotEqual (SMD5, 0x00)){ Store (SMD5, Index (Local4, 0x05)) Increment(Local5) }
- If (LNotEqual (SMD6, 0x00)){ Store (SMD6, Index (Local4, 0x06)) Increment(Local5) }
- If (LNotEqual (SMD7, 0x00)){ Store (SMD7, Index (Local4, 0x07)) Increment(Local5) }
- If (LNotEqual (SMD8, 0x00)){ Store (SMD8, Index (Local4, 0x08)) Increment(Local5) }
- If (LNotEqual (SMD9, 0x00)){ Store (SMD9, Index (Local4, 0x09)) Increment(Local5) }
- If (LNotEqual (SMDA, 0x00)){ Store (SMDA, Index (Local4, 0x0A)) Increment(Local5) }
- If (LNotEqual (SMDB, 0x00)){ Store (SMDB, Index (Local4, 0x0B)) Increment(Local5) }
- If (LNotEqual (SMDC, 0x00)){ Store (SMDC, Index (Local4, 0x0C)) Increment(Local5) }
- If (LNotEqual (SMDD, 0x00)){ Store (SMDD, Index (Local4, 0x0D)) Increment(Local5) }
- If (LNotEqual (SMDE, 0x00)){ Store (SMDE, Index (Local4, 0x0E)) Increment(Local5) }
- If (LNotEqual (SMDF, 0x00)){ Store (SMDF, Index (Local4, 0x0F)) Increment(Local5) }
- Store (Zero, Index (Local4, Local5))
- Store (Local4, Index (Arg1, 0x0B))
- Store (Zero, Local5)
- Or (Arg0, 0x02, NBID)
- If (LNotEqual (SMD0, 0x00)){ Store (SMD0, Index (Local4, Zero)) Increment(Local5) }
- If (LNotEqual (SMD1, 0x00)){ Store (SMD1, Index (Local4, 0x01)) Increment(Local5) }
- If (LNotEqual (SMD2, 0x00)){ Store (SMD2, Index (Local4, 0x02)) Increment(Local5) }
- If (LNotEqual (SMD3, 0x00)){ Store (SMD3, Index (Local4, 0x03)) Increment(Local5) }
- If (LNotEqual (SMD4, 0x00)){ Store (SMD4, Index (Local4, 0x04)) Increment(Local5) }
- If (LNotEqual (SMD5, 0x00)){ Store (SMD5, Index (Local4, 0x05)) Increment(Local5) }
- If (LNotEqual (SMD6, 0x00)){ Store (SMD6, Index (Local4, 0x06)) Increment(Local5) }
- If (LNotEqual (SMD7, 0x00)){ Store (SMD7, Index (Local4, 0x07)) Increment(Local5) }
- If (LNotEqual (SMD8, 0x00)){ Store (SMD8, Index (Local4, 0x08)) Increment(Local5) }
- If (LNotEqual (SMD9, 0x00)){ Store (SMD9, Index (Local4, 0x09)) Increment(Local5) }
- If (LNotEqual (SMDA, 0x00)){ Store (SMDA, Index (Local4, 0x0A)) Increment(Local5) }
- If (LNotEqual (SMDB, 0x00)){ Store (SMDB, Index (Local4, 0x0B)) Increment(Local5) }
- If (LNotEqual (SMDC, 0x00)){ Store (SMDC, Index (Local4, 0x0C)) Increment(Local5) }
- If (LNotEqual (SMDD, 0x00)){ Store (SMDD, Index (Local4, 0x0D)) Increment(Local5) }
- If (LNotEqual (SMDE, 0x00)){ Store (SMDE, Index (Local4, 0x0E)) Increment(Local5) }
- If (LNotEqual (SMDF, 0x00)){ Store (SMDF, Index (Local4, 0x0F)) Increment(Local5) }
- Store (Zero, Index (Local4, Local5))
- Store (Local4, Index (Arg1, 0x0C))
- }
- Release (BATM)
- Return (Arg1)
- }
复制代码 |
-
4
查看全部评分
-
|