Contribute
Register

[Guide] How to patch DSDT for working battery status

Logic bug with charging/discharging status (AC adapter detection)

power plug in -> 100% charging -> Battery mode change

dsdt edit ???


Device (H_EC)
{
Name (_HID, EisaId ("PNP0C09") /* Embedded Controller Device */) // _HID: Hardware ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x0062, // Range Minimum
0x0062, // Range Maximum
0x00, // Alignment
0x01, // Length
)
IO (Decode16,
0x0066, // Range Minimum
0x0066, // Range Maximum
0x00, // Alignment
0x01, // Length
)
})
Name (ECON, Zero)
Name (ECST, Zero)
Method (_GPE, 0, NotSerialized) // _GPE: General Purpose Events
{
Store (GGPE (0x02040010), Local0)
Return (Local0)
}

Method (_REG, 2, NotSerialized) // _REG: Region Availability
{
If (LAnd (LEqual (Arg0, 0x03), LEqual (Arg1, One)))
{
Store (One, ECON) /* \_SB_.PCI0.LPCB.H_EC.ECON */
Acquire (MUTX, 0xFFFF)
Store (One, ECN0) /* \_SB_.PCI0.LPCB.H_EC.ECN0 */
Release (MUTX)
}

If (LNot (^^^GFX0.GLID))
{
Store (One, LIDS) /* External reference */
Notify (LID0, 0x80) // Status Change
}
}

OperationRegion (ERAM, EmbeddedControl, Zero, 0xFF)
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0xB0),
IF00, 8,
IF01, 8,
IF10, 8,
IF11, 8,
IF20, 8,
IF21, 8,
IF30, 8,
IF31, 8,
IF40, 8,
IF41, 8,
IF50, 8,
IF51, 8,
IF60, 8,
IF61, 8,
IF70, 8,
IF71, 8,
IF80, 8,
IF81, 8,
ST00, 8,
ST01, 8,
ST10, 8,
ST11, 8,
ST20, 8,
ST21, 8,
ST30, 8,
ST31, 8,
PSTA, 8,
ECN0, 8,
DT1, 8,
DT2, 8,
CTMP, 8,
LCDL, 8,
OSSI, 8,
IBT1, 8,
IBT2, 8,
WTMS, 8,
AWT0, 8,
AWT1, 8,
AWT2, 8,
LSTE, 8,
WKRS, 8
}

OperationRegion (CMD0, SystemIO, 0x68, One)
Field (CMD0, ByteAcc, NoLock, Preserve)
{
CMDR, 8
}

Method (ECMD, 1, Serialized)
{
If (\ECON)
{
While (CMDR)
{
Stall (0x14)
}

Store (Arg0, CMDR) /* \_SB_.PCI0.LPCB.H_EC.CMDR */
}
}

Method (_Q10, 0, NotSerialized) // _Qxx: EC Query
{
^^^GFX0.GHDS (Zero)
Sleep (0x02EE)
}

Method (_QB3, 0, NotSerialized) // _Qxx: EC Query
{
Notify (BAT0, 0x80) // Status Change
Notify (BAT0, 0x81) // Information Change
Notify (AC0, 0x80) // Status Change
}

Method (_QBA, 0, NotSerialized) // _Qxx: EC Query
{
Store (Zero, LIDS) /* External reference */
Notify (LID0, 0x80) // Status Change
}

Method (_QBB, 0, NotSerialized) // _Qxx: EC Query
{
Store (One, LIDS) /* External reference */
Notify (LID0, 0x80) // Status Change
}

Method (_QC3, 0, NotSerialized) // _Qxx: EC Query
{
P8XH (Zero, 0xC3)
Store (0xFF, GTS) /* \_SB_.PCI0.LPCB.GTS_ */
Store (0xC3, SSMI) /* \_SB_.PCI0.LPCB.SSMI */
}

Method (_QC4, 0, NotSerialized) // _Qxx: EC Query
{
P8XH (Zero, 0xC2)
Store (0x0A, GTS) /* \_SB_.PCI0.LPCB.GTS_ */
Store (0xC2, SSMI) /* \_SB_.PCI0.LPCB.SSMI */
}

Method (_QC0, 0, NotSerialized) // _Qxx: EC Query
{
}

Method (_QC1, 0, NotSerialized) // _Qxx: EC Query
{
BRTN (0x86)
P8XH (Zero, 0x86)
}

Method (_QC2, 0, NotSerialized) // _Qxx: EC Query
{
BRTN (0x87)
P8XH (Zero, 0x87)
}
}

Device (AC0)
{
Name (_HID, "ACPI0003" /* Power Source Device */) // _HID: Hardware ID
Name (_PCL, Package (0x01) // _PCL: Power Consumer List
{
LPCB
})
Method (_PSR, 0, NotSerialized) // _PSR: Power Source
{
If (LEqual (^^H_EC.ECON, One))
{
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (Zero)
}

If (LEqual (Local0, 0x81))
{
Return (One)
}

If (LEqual (Local0, 0x83))
{
Return (One)
}

Return (Zero)
}
Else
{
Return (Zero)
}
}
}

Device (BAT0)
{
Name (_HID, EisaId ("PNP0C0A") /* Control Method Battery */) // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (PAK1, Package (0x0D)
{
Zero,
0x0708,
0x0708,
Zero,
0x2B5C,
0xB4,
0x5A,
0x10,
0x08,
" ",
"00002",
"LiIon",
"LENGDA"
})
Name (PAK2, Package (0x0D)
{
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF,
Zero,
0xFFFFFFFF,
Zero,
Zero,
Zero,
Zero,
" ",
"00002",
"LiIon",
"LENGDA"
})
Method (_BIF, 0, NotSerialized) // _BIF: Battery Information
{
If (LEqual (^^H_EC.ECON, One))
{
Store (B1B2 (^^H_EC.IF00, ^^H_EC.IF01), Index (PAK1, Zero))
Store (B1B2 (^^H_EC.IF10, ^^H_EC.IF11), Index (PAK1, One))
Store (B1B2 (^^H_EC.IF20, ^^H_EC.IF21), Index (PAK1, 0x02))
Store (B1B2 (^^H_EC.IF30, ^^H_EC.IF31), Index (PAK1, 0x03))
Store (B1B2 (^^H_EC.IF40, ^^H_EC.IF41), Index (PAK1, 0x04))
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (PAK1) /* \_SB_.PCI0.LPCB.BAT0.PAK1 */
}

If (LEqual (Local0, 0x83))
{
Return (PAK1) /* \_SB_.PCI0.LPCB.BAT0.PAK1 */
}

If (LEqual (Local0, 0x81))
{
Return (PAK2) /* \_SB_.PCI0.LPCB.BAT0.PAK2 */
}

Return (PAK2) /* \_SB_.PCI0.LPCB.BAT0.PAK2 */
}
Else
{
Return (PAK2) /* \_SB_.PCI0.LPCB.BAT0.PAK2 */
}
}

Name (BFB0, Package (0x04)
{
Zero,
Zero,
Zero,
Zero
})
Name (BFB1, Package (0x04)
{
Zero,
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF
})
Method (_BST, 0, NotSerialized) // _BST: Battery Status
{
If (LEqual (^^H_EC.ECON, One))
{
Store (B1B2 (^^H_EC.ST00, ^^H_EC.ST01), Index (BFB0, Zero))
Store (B1B2 (^^H_EC.ST10, ^^H_EC.ST11), Index (BFB0, One))
Store (B1B2 (^^H_EC.ST20, ^^H_EC.ST21), Index (BFB0, 0x02))
Store (B1B2 (^^H_EC.ST30, ^^H_EC.ST31), Index (BFB0, 0x03))
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (BFB0) /* \_SB_.PCI0.LPCB.BAT0.BFB0 */
}

If (LEqual (Local0, 0x83))
{
Return (BFB0) /* \_SB_.PCI0.LPCB.BAT0.BFB0 */
}

If (LEqual (Local0, 0x81))
{
Return (BFB1) /* \_SB_.PCI0.LPCB.BAT0.BFB1 */
}

Return (BFB1) /* \_SB_.PCI0.LPCB.BAT0.BFB1 */
}
Else
{
Return (BFB1) /* \_SB_.PCI0.LPCB.BAT0.BFB1 */
}


}

Name (_PCL, Package (0x01) // _PCL: Power Consumer List
{
LPCB
})
Method (_STA, 0, NotSerialized) // _STA: Status
{
If (LEqual (^^H_EC.ECON, One))
{
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (0x1F)
}

If (LEqual (Local0, 0x83))
{
Return (0x1F)
}

If (LEqual (Local0, 0x81))
{
Return (0x0F)
}

Return (0x0F)
}
Else
{
Return (0x0F)
}
}
}
}
 

Attachments

  • DSDT.aml
    132.3 KB · Views: 213
Logic bug with charging/discharging status (AC adapter detection)

power plug in -> 100% charging -> Battery mode change

dsdt edit ???


Device (H_EC)
{
Name (_HID, EisaId ("PNP0C09") /* Embedded Controller Device */) // _HID: Hardware ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x0062, // Range Minimum
0x0062, // Range Maximum
0x00, // Alignment
0x01, // Length
)
IO (Decode16,
0x0066, // Range Minimum
0x0066, // Range Maximum
0x00, // Alignment
0x01, // Length
)
})
Name (ECON, Zero)
Name (ECST, Zero)
Method (_GPE, 0, NotSerialized) // _GPE: General Purpose Events
{
Store (GGPE (0x02040010), Local0)
Return (Local0)
}

Method (_REG, 2, NotSerialized) // _REG: Region Availability
{
If (LAnd (LEqual (Arg0, 0x03), LEqual (Arg1, One)))
{
Store (One, ECON) /* \_SB_.PCI0.LPCB.H_EC.ECON */
Acquire (MUTX, 0xFFFF)
Store (One, ECN0) /* \_SB_.PCI0.LPCB.H_EC.ECN0 */
Release (MUTX)
}

If (LNot (^^^GFX0.GLID))
{
Store (One, LIDS) /* External reference */
Notify (LID0, 0x80) // Status Change
}
}

OperationRegion (ERAM, EmbeddedControl, Zero, 0xFF)
Field (ERAM, ByteAcc, NoLock, Preserve)
{
Offset (0xB0),
IF00, 8,
IF01, 8,
IF10, 8,
IF11, 8,
IF20, 8,
IF21, 8,
IF30, 8,
IF31, 8,
IF40, 8,
IF41, 8,
IF50, 8,
IF51, 8,
IF60, 8,
IF61, 8,
IF70, 8,
IF71, 8,
IF80, 8,
IF81, 8,
ST00, 8,
ST01, 8,
ST10, 8,
ST11, 8,
ST20, 8,
ST21, 8,
ST30, 8,
ST31, 8,
PSTA, 8,
ECN0, 8,
DT1, 8,
DT2, 8,
CTMP, 8,
LCDL, 8,
OSSI, 8,
IBT1, 8,
IBT2, 8,
WTMS, 8,
AWT0, 8,
AWT1, 8,
AWT2, 8,
LSTE, 8,
WKRS, 8
}

OperationRegion (CMD0, SystemIO, 0x68, One)
Field (CMD0, ByteAcc, NoLock, Preserve)
{
CMDR, 8
}

Method (ECMD, 1, Serialized)
{
If (\ECON)
{
While (CMDR)
{
Stall (0x14)
}

Store (Arg0, CMDR) /* \_SB_.PCI0.LPCB.H_EC.CMDR */
}
}

Method (_Q10, 0, NotSerialized) // _Qxx: EC Query
{
^^^GFX0.GHDS (Zero)
Sleep (0x02EE)
}

Method (_QB3, 0, NotSerialized) // _Qxx: EC Query
{
Notify (BAT0, 0x80) // Status Change
Notify (BAT0, 0x81) // Information Change
Notify (AC0, 0x80) // Status Change
}

Method (_QBA, 0, NotSerialized) // _Qxx: EC Query
{
Store (Zero, LIDS) /* External reference */
Notify (LID0, 0x80) // Status Change
}

Method (_QBB, 0, NotSerialized) // _Qxx: EC Query
{
Store (One, LIDS) /* External reference */
Notify (LID0, 0x80) // Status Change
}

Method (_QC3, 0, NotSerialized) // _Qxx: EC Query
{
P8XH (Zero, 0xC3)
Store (0xFF, GTS) /* \_SB_.PCI0.LPCB.GTS_ */
Store (0xC3, SSMI) /* \_SB_.PCI0.LPCB.SSMI */
}

Method (_QC4, 0, NotSerialized) // _Qxx: EC Query
{
P8XH (Zero, 0xC2)
Store (0x0A, GTS) /* \_SB_.PCI0.LPCB.GTS_ */
Store (0xC2, SSMI) /* \_SB_.PCI0.LPCB.SSMI */
}

Method (_QC0, 0, NotSerialized) // _Qxx: EC Query
{
}

Method (_QC1, 0, NotSerialized) // _Qxx: EC Query
{
BRTN (0x86)
P8XH (Zero, 0x86)
}

Method (_QC2, 0, NotSerialized) // _Qxx: EC Query
{
BRTN (0x87)
P8XH (Zero, 0x87)
}
}

Device (AC0)
{
Name (_HID, "ACPI0003" /* Power Source Device */) // _HID: Hardware ID
Name (_PCL, Package (0x01) // _PCL: Power Consumer List
{
LPCB
})
Method (_PSR, 0, NotSerialized) // _PSR: Power Source
{
If (LEqual (^^H_EC.ECON, One))
{
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (Zero)
}

If (LEqual (Local0, 0x81))
{
Return (One)
}

If (LEqual (Local0, 0x83))
{
Return (One)
}

Return (Zero)
}
Else
{
Return (Zero)
}
}
}

Device (BAT0)
{
Name (_HID, EisaId ("PNP0C0A") /* Control Method Battery */) // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (PAK1, Package (0x0D)
{
Zero,
0x0708,
0x0708,
Zero,
0x2B5C,
0xB4,
0x5A,
0x10,
0x08,
" ",
"00002",
"LiIon",
"LENGDA"
})
Name (PAK2, Package (0x0D)
{
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF,
Zero,
0xFFFFFFFF,
Zero,
Zero,
Zero,
Zero,
" ",
"00002",
"LiIon",
"LENGDA"
})
Method (_BIF, 0, NotSerialized) // _BIF: Battery Information
{
If (LEqual (^^H_EC.ECON, One))
{
Store (B1B2 (^^H_EC.IF00, ^^H_EC.IF01), Index (PAK1, Zero))
Store (B1B2 (^^H_EC.IF10, ^^H_EC.IF11), Index (PAK1, One))
Store (B1B2 (^^H_EC.IF20, ^^H_EC.IF21), Index (PAK1, 0x02))
Store (B1B2 (^^H_EC.IF30, ^^H_EC.IF31), Index (PAK1, 0x03))
Store (B1B2 (^^H_EC.IF40, ^^H_EC.IF41), Index (PAK1, 0x04))
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (PAK1) /* \_SB_.PCI0.LPCB.BAT0.PAK1 */
}

If (LEqual (Local0, 0x83))
{
Return (PAK1) /* \_SB_.PCI0.LPCB.BAT0.PAK1 */
}

If (LEqual (Local0, 0x81))
{
Return (PAK2) /* \_SB_.PCI0.LPCB.BAT0.PAK2 */
}

Return (PAK2) /* \_SB_.PCI0.LPCB.BAT0.PAK2 */
}
Else
{
Return (PAK2) /* \_SB_.PCI0.LPCB.BAT0.PAK2 */
}
}

Name (BFB0, Package (0x04)
{
Zero,
Zero,
Zero,
Zero
})
Name (BFB1, Package (0x04)
{
Zero,
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF
})
Method (_BST, 0, NotSerialized) // _BST: Battery Status
{
If (LEqual (^^H_EC.ECON, One))
{
Store (B1B2 (^^H_EC.ST00, ^^H_EC.ST01), Index (BFB0, Zero))
Store (B1B2 (^^H_EC.ST10, ^^H_EC.ST11), Index (BFB0, One))
Store (B1B2 (^^H_EC.ST20, ^^H_EC.ST21), Index (BFB0, 0x02))
Store (B1B2 (^^H_EC.ST30, ^^H_EC.ST31), Index (BFB0, 0x03))
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (BFB0) /* \_SB_.PCI0.LPCB.BAT0.BFB0 */
}

If (LEqual (Local0, 0x83))
{
Return (BFB0) /* \_SB_.PCI0.LPCB.BAT0.BFB0 */
}

If (LEqual (Local0, 0x81))
{
Return (BFB1) /* \_SB_.PCI0.LPCB.BAT0.BFB1 */
}

Return (BFB1) /* \_SB_.PCI0.LPCB.BAT0.BFB1 */
}
Else
{
Return (BFB1) /* \_SB_.PCI0.LPCB.BAT0.BFB1 */
}


}

Name (_PCL, Package (0x01) // _PCL: Power Consumer List
{
LPCB
})
Method (_STA, 0, NotSerialized) // _STA: Status
{
If (LEqual (^^H_EC.ECON, One))
{
Store (^^H_EC.PSTA, Local0)
And (Local0, 0x83, Local0)
If (LEqual (Local0, 0x82))
{
Return (0x1F)
}

If (LEqual (Local0, 0x83))
{
Return (0x1F)
}

If (LEqual (Local0, 0x81))
{
Return (0x0F)
}

Return (0x0F)
}
Else
{
Return (0x0F)
}
}
}
}

Did you update your copy of ACPIBatteryManager.kext?
 

Attachments

  • 스크린샷 2016-12-06 오후 11.50.36.png
    스크린샷 2016-12-06 오후 11.50.36.png
    31.4 KB · Views: 143
  • 스크린샷 2016-12-06 오후 11.52.39.png
    스크린샷 2016-12-06 오후 11.52.39.png
    115 KB · Views: 131
  • dsdt.zip
    62 KB · Views: 112
Back
Top