Changeset 414 for branches


Ignore:
Timestamp:
Feb 26, 2013, 3:44:10 AM (12 years ago)
Author:
pr
Message:

ACPI sleep mods. from Steven.

Location:
branches/branch-1-0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/branch-1-0/include/helpers/acpih.h

    r406 r414  
    1111 */
    1212
    13 /*      Copyright (C) 2006 Paul Ratcliffe.
     13/*      Copyright (C) 2006-2013 Paul Ratcliffe.
    1414 *      This file is part of the "XWorkplace helpers" source package.
    1515 *      This is free software; you can redistribute it and/or modify
     
    4040     */
    4141
    42     APIRET APIENTRY AcpiStartApi(ACPI_API_HANDLE *);
     42    // Extracted from acpi.h actype.h etc.
    4343    typedef APIRET APIENTRY ACPISTARTAPI(ACPI_API_HANDLE *);
    4444    typedef ACPISTARTAPI *PACPISTARTAPI;
    4545
    46     APIRET APIENTRY AcpiEndApi(ACPI_API_HANDLE *);
    4746    typedef APIRET APIENTRY ACPIENDAPI(ACPI_API_HANDLE *);
    4847    typedef ACPIENDAPI *PACPIENDAPI;
    4948
    50     APIRET APIENTRY AcpiGoToSleep(ACPI_API_HANDLE *, UCHAR);
    5149    typedef APIRET APIENTRY ACPIGOTOSLEEP(ACPI_API_HANDLE *, UCHAR);
    5250    typedef ACPIGOTOSLEEP *PACPIGOTOSLEEP;
     51
     52    // @@added V1.0.9 (2012-12-10) [slevine]: sync with current ACPI toolkit
     53    typedef ACPI_STATUS APIENTRY ACPITKPREPARETOSLEEP(UINT8);
     54    typedef ACPITKPREPARETOSLEEP *PACPITKPREPARETOSLEEP;
    5355
    5456    typedef APIRET APIENTRY ACPITKGETOBJECTINFOALLOC(ACPI_HANDLE *, PVOID);
     
    8082    #define ORD_ACPITKWALKNAMESPACE 56
    8183    #define ORD_ACPITKEVALUATEOBJECT 50
     84    // @@added V1.0.9 (2012-12-10) [slevine]: sync with current ACPI toolkit
     85    #define ORD_ACPITKPREPARETOSLEEP 89
    8286
    8387#endif
  • branches/branch-1-0/src/helpers/acpih.c

    r410 r414  
    1717
    1818/*
    19  *      Copyright (C) 2006-2012 Paul Ratcliffe.
     19 *      Copyright (C) 2006-2013 Paul Ratcliffe.
    2020 *      This file is part of the "XWorkplace helpers" source package.
    2121 *      This is free software; you can redistribute it and/or modify
     
    6868ACPITKWALKNAMESPACE *pAcpiTkWalkNamespace = NULL;
    6969ACPITKEVALUATEOBJECT *pAcpiTkEvaluateObject = NULL;
     70// @@added V1.0.9 (2012-12-10) [slevine]: additional ACPI support
     71ACPITKPREPARETOSLEEP *pAcpiTkPrepareToSleep = NULL;
    7072
    7173/*
     
    126128            DosQueryProcAddr(G_hmodACPI, ORD_ACPITKEVALUATEOBJECT,
    127129                             NULL, (PFN *) &pAcpiTkEvaluateObject);
     130            // @@added V1.0.9 (2012-12-10) [slevine]: additional ACPI support
     131            DosQueryProcAddr(G_hmodACPI, ORD_ACPITKPREPARETOSLEEP,
     132                             NULL, (PFN *) &pAcpiTkPrepareToSleep);
    128133        }
    129134    }
     
    133138    else
    134139    {
    135         char cTmp;                      // Required to ensure code not optimized away
    136         ULONG ulMemSize, ulMemFlags;
    137 
    138140        G_ulCount++;
    139         /* Force the shutdown function to be in memory.
    140          * This is probably not the best place to do this, but it is the easiest.
    141          * The function code may or may not cross page boundary and older versions
    142          * of acpi32.dll placed the function as the last function in the DLL,
    143          * so we need to check if the page exists before attempting to force it
    144          * into memory.
    145          * @@added V1.0.9 (2012-02-23) [dazarewicz]: additional ACPI support
     141
     142        // @@added V1.0.9 (2012-12-10) [slevine]: use AcpiTkPrepareToSleep rather than workaround
     143        /* This function does not exist in older versions of acpi
     144         * As a result the shutdown attempt will usually hang because
     145         * the required code has not been committed into memory.
    146146         */
    147         cTmp = *((volatile char *)pAcpiGoToSleep); /* Ensure paged in */
    148 
    149         ulMemSize = 1;
    150         if (DosQueryMem(((char *)pAcpiGoToSleep) + 4096, &ulMemSize, &ulMemFlags) == NO_ERROR)
    151         {
    152             if (ulMemFlags & PAG_COMMIT)
    153                 cTmp = *(((volatile char *)pAcpiGoToSleep) + 4096);     /* Ensure paged in */
    154         }
     147        if (pAcpiTkPrepareToSleep)
     148            pAcpiTkPrepareToSleep(ACPI_STATE_S5);
    155149
    156150        return(pAcpiStartApi(phACPI));
     
    178172        pAcpiEndApi = NULL;
    179173        pAcpiGoToSleep = NULL;
     174        // @@added V1.0.9 (2012-12-10) [slevine]: additional ACPI support
     175        pAcpiTkPrepareToSleep = NULL;
    180176    }
    181177}
     
    251247 *@@added V1.0.9 (2012-02-20) [slevine]: code from David Azarewicz
    252248 */
     249
    253250APIRET acpihGetPowerStatus(PAPM pApm, PBOOL pfChanged)
    254251{
     
    260257    BOOL fChanged;
    261258
    262     if (pAcpiTkWalkNamespace == NULL)
    263         return 1;
    264 
    265     if (pApm == NULL)
     259    /* Make sure all the functions we need have valid pointers.
     260     * @@added V1.0.9 (2012-02-25) [dazarewicz]: additional ACPI support
     261     */
     262    if (   (pAcpiTkWalkNamespace == NULL)
     263        || (pAcpiTkGetObjectInfoAlloc == NULL)
     264        || (pAcpiTkGetHandle == NULL)
     265        || (pAcpiTkOsFree == NULL)
     266        || (pAcpiTkEvaluateObject == NULL)
     267        || (pApm == NULL)
     268       )
    266269        return 1;
    267270
     
    292295        Status = pAcpiTkEvaluateObject(G_ahAC, NULL, NULL, &Result);
    293296        if (Status != AE_OK)
    294             ulTmp = 2;
    295         else
    296             if (Object[0].Type != ACPI_TYPE_INTEGER)
    297                 ulTmp = 2;
     297            ulTmp = 2;                  // assume on backup power
     298        else if (Object[0].Type != ACPI_TYPE_INTEGER)
     299            ulTmp = 2;                  // assume on backup power
    298300            else
    299301                ulTmp = (UINT32)OBJECT_VALUE(0);
     
    313315        Result.Length = sizeof(Object);
    314316        Result.Pointer = Object;
     317        // Get battery info
    315318        Status = pAcpiTkEvaluateObject(G_ahBat[uiI], "_BIF", NULL, &Result);
    316319        if (Status != AE_OK)
     
    321324
    322325        Obj = Result.Pointer;
    323         Obj = (ACPI_OBJECT *)Obj[0].Package.Elements;   // _BIF package
     326        Obj = (ACPI_OBJECT *)Obj[0].Package.Elements;   // Battery info package
    324327        LastFull = (UINT32)OBJ_VALUE(2);
    325328        if (LastFull == 0xffffffff)
     
    331334        Result.Length = sizeof(Object);
    332335        Result.Pointer = Object;
     336        // Get battery status
    333337        Status = pAcpiTkEvaluateObject(G_ahBat[uiI], "_BST", NULL, &Result);
    334338        if (Status != AE_OK)
     
    346350
    347351        // If battery units are mWh or mAh
     352        // If not, it is a percentage
    348353        if ((UINT32)OBJ_VALUE(0) != 0xffffffff)
    349354        {
Note: See TracChangeset for help on using the changeset viewer.