Contribute
Register

ACPIBatteryManager on XPS 12 (9Q33) in Yosemite

Status
Not open for further replies.
Good catch. CurrentCapacity definitely seems wrong.

But it seems like CurrentCapacity is correct. Looking at try4.ioreg again and the system.log output:

Code:
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBIF: fDesignCapacity  = 0xd6d8
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBIF: fMaxCapacity     = 0xc706
...
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate     = 0x3465
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 0x4a88
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentVoltage  = 0x1d74
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: Calculating for WATTS
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate = 1788
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 2544
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fAverageRate = 0x73a

fDesignCapacity is 55000, which we determined to be correct. fMaxCapacity is 50950, which seems reasonable. Therefore fCurrentCapacity at 19080 seems to fit (maybe like 37% battery).

Then looking at IOReg, CurrentCapacity is still 0x4a88 = 19080, which is fine. But for some reason, DesignCapacity is 0x1ca5 = 7333 and MaxCapacity is 0x1a89 = 6793, which don't make sense right? So why is it like that in IOReg when AppleSmartBattery is giving the correct values?
 
But it seems like CurrentCapacity is correct. Looking at try4.ioreg again and the system.log output:

Code:
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBIF: fDesignCapacity  = 0xd6d8
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBIF: fMaxCapacity     = 0xc706
...
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate     = 0x3465
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 0x4a88
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentVoltage  = 0x1d74
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: Calculating for WATTS
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate = 1788
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 2544
10/25/14 11:28:35.000 AM kernel[0]: AppleSmartBattery::setBatteryBST: fAverageRate = 0x73a

fDesignCapacity is 55000, which we determined to be correct. fMaxCapacity is 50950, which seems reasonable. Therefore fCurrentCapacity at 19080 seems to fit (maybe like 37% battery).

Then looking at IOReg, CurrentCapacity is still 0x4a88 = 19080, which is fine. But for some reason, DesignCapacity is 0x1ca5 = 7333 and MaxCapacity is 0x1a89 = 6793, which don't make sense right? So why is it like that in IOReg when AppleSmartBattery is giving the correct values?

All values in ioreg should be amps (mAh), not watts (mWh).
 
So in this case the CurrentCapacity wasn't converted to amps?

It appears to me it wasn't. All values in the ioreg should be amps. Your DSDT is reporting in watts. You can see the conversion happening in the log.
 
It appears to me it wasn't. All values in the ioreg should be amps. Your DSDT is reporting in watts. You can see the conversion happening in the log.

OK, I altered the code slightly to move the setCurrentCapacity to after the conversion occurs just as a test:

Code:
@@ -1623,7 +1623,7 @@ IOReturn AppleSmartBattery::setBatteryBST(OSArray *acpibat_bst)
        DEBUG_LOG("AppleSmartBattery::setBatteryBST: fCurrentCapacity = 0x%x\n",        (unsigned int) fCurrentCapacity);
        DEBUG_LOG("AppleSmartBattery::setBatteryBST: fCurrentVoltage  = 0x%x\n",        (unsigned int) fCurrentVoltage);
     
-       setCurrentCapacity(fCurrentCapacity);
+//     setCurrentCapacity(fCurrentCapacity);
        setVoltage(fCurrentVoltage);
 
        if (fCurrentRate == ACPI_UNKNOWN)
@@ -1638,12 +1638,14 @@ IOReturn AppleSmartBattery::setBatteryBST(OSArray *acpibat_bst)
         fCurrentCapacity = (fCurrentCapacity * 1000) / fDesignVoltage;
         DEBUG_LOG("AppleSmartBattery::setBatteryBST: fCurrentRate = %d\n",             (unsigned int) fCurrentRate);
         DEBUG_LOG("AppleSmartBattery::setBatteryBST: fCurrentCapacity = %d\n", (unsigned int) fCurrentCapacity);
+               setCurrentCapacity(fCurrentCapacity);
     }

This seems to at least cause the IOReg to have a saner CurrentCapacity (lower than the MaxCapacity and DesignCapacity at least). The battery still reports as 0%.

New IOReg: View attachment nuudells-try5.ioreg

Code:
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: acpibat_bif size = 13
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fPowerUnit       = 0x0
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fDesignCapacity  = 0xd6d8
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fMaxCapacity     = 0xc706
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fBatteryTech     = 0x1
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fDesignVoltage   = 0x1d4c
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fCapacityWarning = 0x1f4
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fLowWarning      = 0x96
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fDeviceName      = 'PABAS0241231'
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fSerialNumber    = '41167'
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fType            = 'Li-Ion'
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fManufacturer    = 'SANYO'
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBatteryManager::getBatteryBST called
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: acpibat_bst size = 4
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fPowerUnit       = 0x0
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: currentStatus    = 0x2
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate     = 0x4a82
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 0x744a
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentVoltage  = 0x1fae
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: Calculating for WATTS
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate = 2543
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 3969
10/25/14 12:42:51.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fAverageRate = 0x9e7
 
OK, I altered the code slightly to move the setCurrentCapacity to after the conversion occurs just as a test:

OK, that seems like a bug.

Probably added by me recently...

According to ioreg, I see 58%.
 
OK, that seems like a bug.

Probably added by me recently...

According to ioreg, I see 58%.

OK so ioreg looks fine now? Energy Saver still reports battery at 0%, coconut still reports no battery and battery time remaining still doesn't detect the battery.
 
OK so ioreg looks fine now? Energy Saver still reports battery at 0%, coconut still reports no battery and battery time remaining still doesn't detect the battery.

Something else is wrong.
 
OK so ioreg looks fine now? Energy Saver still reports battery at 0%, coconut still reports no battery and battery time remaining still doesn't detect the battery.

FYI: I wrote some code in my ProBook DSDT that will force it to return watts instead of amps...

so it goes like this...
- native methods return amps
- i convert the _BST/_BIF results to watts
- ACPIBatteryManager.kext has more work to do converting back to amps

So far, it is working. But I'll use it for a while.

Plus I need it so I can test better next time (I have no computers that natively return watts).

Oh, I also re-worked the debug output to write more data in decimal. Even I was getting tired of converting from hex to decimal.
 
FYI: I wrote some code in my ProBook DSDT that will force it to return watts instead of amps...

so it goes like this...
- native methods return amps
- i convert the _BST/_BIF results to watts
- ACPIBatteryManager.kext has more work to do converting back to amps

So far, it is working. But I'll use it for a while.

Plus I need it so I can test better next time (I have no computers that natively return watts).

Oh, I also re-worked the debug output to write more data in decimal. Even I was getting tired of converting from hex to decimal.

Awesome! I pulled all your changes and am running again. Definitely helpful to have the values in decimal rather than hex. Here's some sample output:

Code:
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::pollingTimeOut called
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::pollBatteryState: path = 1
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBatteryManager::getBatterySTA called
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatterySTA: battery_status = 0x1f
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBatteryManager::getBatteryBIF called
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBatteryManager::getBatteryBIF: validateObject return 0x0
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: acpibat_bif size = 13
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fPowerUnit       = 0x0
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fDesignCapacity  = 55000
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fMaxCapacity     = 50950
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fBatteryTech     = 0x1
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fDesignVoltage   = 7500
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fCapacityWarning = 500
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fLowWarning      = 150
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fDeviceName      = 'PABAS0241231'
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fSerialNumber    = '41167'
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fType            = 'Li-Ion'
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBIF: fManufacturer    = 'SANYO'
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBatteryManager::getBatteryBST called
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: acpibat_bst size = 4
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fPowerUnit       = 0x0
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: currentStatus    = 0x1
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate     = 8278
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 33230
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentVoltage  = 7952
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: Calculating for WATTS
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentRate = 1103
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fCurrentCapacity = 4430
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery::setBatteryBST: fAverageRate = 1103
10/25/14 7:49:15.000 PM kernel[0]: AppleSmartBattery: Battery is discharging.

I ran the coconutBattery to see if there were any clues and I noticed the debug information screen has "Battery1: 0" and "Battery2: 0" along with the Health1 and Health2 not really coming up with anything. Could that be an area to start looking into?

Code:
Debug information:
Battery1: 0
Battery2: 0
Health1: *** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array
Health1: (null)
Health2: *** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array
Health2: (null)
BatteryID: 1c10e7a0f2064cae550b35e434cd353f
Full1: {
    Amperage = "-1103";
    AtCriticalLevel = 0;
    AtWarnLevel = 0;
    AvgTimeToEmpty = 240;
    AvgTimeToFull = 65535;
    BatteryInstalled = 1;
    BatteryInvalidWakeSeconds = 30;
    BatterySerialNumber = "PABAS0241231-41167";
    BatteryType = "Li-Ion";
    CellVoltage =     (
        1988,
        1988,
        1988,
        1988
    );
    CurrentCapacity = 4430;
    CycleCount = 90;
    DesignCapacity = 7333;
    DeviceName = PABAS0241231;
    ExternalChargeCapable = 0;
    ExternalConnected = 0;
    FirmwareSerialNumber = 266599;
    FullyCharged = 0;
    IOGeneralInterest = "IOCommand is not serializable";
    InstantAmperage = "-1103";
    InstantTimeToEmpty = 240;
    InstantTimeToFull = 65535;
    IsCharging = 0;
    LegacyBatteryInfo =     {
        Amperage = "-1103";
        Capacity = 6793;
        Current = 4430;
        "Cycle Count" = 90;
        Flags = 4;
        Voltage = 7952;
    };
    ManufactureDate = 0;
    Manufacturer = SANYO;
    MaxCapacity = 6793;
    MaxErr = 0;
    PermanentFailureStatus = 0;
    PostChargeWaitSeconds = 120;
    PostDischargeWaitSeconds = 120;
    "Quick Poll" = 0;
    Serial = 41167;
    Temperature = 0;
    TimeRemaining = 240;
    Voltage = 7952;
}
Full1: 36
 
Status
Not open for further replies.
Back
Top