Changeset 406 for branches/branch-1-0/src/helpers/acpih.c
- Timestamp:
- Feb 23, 2012, 12:13:33 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/branch-1-0/src/helpers/acpih.c
r380 r406 40 40 #include "setup.h" // code generation and debugging options 41 41 42 #include "helpers\apmh.h" // @@added V1.0.9 (2012-02-20) [slevine] 42 43 #include "helpers\acpih.h" 43 44 #include "helpers\standards.h" … … 51 52 HMODULE G_hmodACPI = NULLHANDLE; 52 53 ULONG G_ulCount = 0; 54 // @@added V1.0.9 (2012-02-20) [slevine]: additional ACPI support, code from David Azarewicz 55 ACPI_HANDLE G_ahAC = 0; 56 #define MAX_BATTERY_COUNT 4 57 ACPI_HANDLE G_ahBat[MAX_BATTERY_COUNT]; 58 ULONG G_uiBatteryCount = 0; 59 ULONG G_uiAlreadyWalked = 0; 53 60 54 61 ACPISTARTAPI *pAcpiStartApi = NULL; … … 56 63 ACPIGOTOSLEEP *pAcpiGoToSleep = NULL; 57 64 65 ACPITKGETOBJECTINFOALLOC *pAcpiTkGetObjectInfoAlloc = NULL; 66 ACPITKGETHANDLE *pAcpiTkGetHandle = NULL; 67 ACPITKOSFREE *pAcpiTkOsFree = NULL; 68 ACPITKWALKNAMESPACE *pAcpiTkWalkNamespace = NULL; 69 ACPITKEVALUATEOBJECT *pAcpiTkEvaluateObject = NULL; 70 58 71 /* 59 72 *@@category: Helpers\Control program helpers\ACPI … … 71 84 72 85 if (!G_hmodACPI) 86 { 73 87 if (!(arc = DosLoadModule(NULL, 74 88 0, … … 100 114 return(arc); 101 115 } 102 } 116 117 // @@added V1.0.9 (2012-02-20) [slevine]: additional ACPI support, code from David Azarewicz 118 DosQueryProcAddr(G_hmodACPI, ORD_ACPITKGETOBJECTINFOALLOC, NULL, (PFN *) &pAcpiTkGetObjectInfoAlloc); 119 DosQueryProcAddr(G_hmodACPI, ORD_ACPITKGETHANDLE, NULL, (PFN *) &pAcpiTkGetHandle); 120 DosQueryProcAddr(G_hmodACPI, ORD_ACPITKOSFREE, NULL, (PFN *) &pAcpiTkOsFree); 121 DosQueryProcAddr(G_hmodACPI, ORD_ACPITKWALKNAMESPACE, NULL, (PFN *) &pAcpiTkWalkNamespace); 122 DosQueryProcAddr(G_hmodACPI, ORD_ACPITKEVALUATEOBJECT, NULL, (PFN *) &pAcpiTkEvaluateObject); 123 } 124 } 103 125 104 126 if (arc) … … 147 169 } 148 170 171 172 /** 173 *@@ AcpiCallbackWidget: 174 * ACPI callback helper for battery and power status queries. 175 * Code provided by David Azarewicz 176 *@@added V1.0.9 (2012-02-20) [slevine]: code from David Azarewicz 177 */ 178 179 #define AE_DEPTH AE_OK 180 181 ACPI_STATUS AcpiCallbackWidget( ACPI_HANDLE ObjHandle, UINT32 NestingLevel, void *Context, void **ReturnValue ) 182 { 183 ACPI_STATUS Status; 184 ACPI_DEVICE_INFO *pDevInfo; 185 186 pDevInfo = NULL; 187 Status = pAcpiTkGetObjectInfoAlloc( ObjHandle, &pDevInfo ); 188 189 if (Status == AE_OK) 190 { 191 if (pDevInfo->Type != ACPI_TYPE_DEVICE) return AE_DEPTH; 192 if (!(pDevInfo->Valid & ACPI_VALID_HID)) return AE_DEPTH; 193 if (!pDevInfo->HardwareId.String ) return AE_DEPTH; 194 195 if (strncmp(pDevInfo->HardwareId.String, "ACPI0003", 8)==0) 196 { /* AC Power */ 197 Status = pAcpiTkGetHandle(ObjHandle, "_PSR", &G_ahAC); 198 if (Status) G_ahAC = 0; 199 return AE_DEPTH; 200 } 201 202 if (strncmp(pDevInfo->HardwareId.String, "PNP0C0A", 7)==0) 203 { /* Smart battery */ 204 if (G_uiBatteryCount >= MAX_BATTERY_COUNT) return AE_DEPTH; 205 G_ahBat[G_uiBatteryCount] = ObjHandle; 206 G_uiBatteryCount++; 207 return AE_DEPTH; 208 } 209 } 210 211 if (pDevInfo) pAcpiTkOsFree(pDevInfo); 212 213 return AE_OK; 214 } 215 216 /** 217 *@@ acpihGetPowerStatus: 218 * Returns power and battery status in caller provided buffers. 219 * Returns zero if success, non-zero if fail. 220 * Code provided by David Azarewicz 221 *@@added V1.0.9 (2012-02-20) [slevine]: code from David Azarewicz 222 */ 223 APIRET acpihGetPowerStatus(PAPM pApm, PBOOL pfChanged) 224 { 225 ACPI_STATUS Status; 226 ACPI_BUFFER Result; 227 ACPI_OBJECT *Obj, Object[20]; 228 UINT32 uiI; 229 ULONG ulTmp, BRemaining, LastFull; 230 BOOL fChanged; 231 232 if (pAcpiTkWalkNamespace==NULL) return 1; 233 if (pApm==NULL) return 1; 234 235 if (!G_uiAlreadyWalked) 236 { 237 Status = pAcpiTkWalkNamespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, AcpiCallbackWidget, pApm, NULL); 238 G_uiAlreadyWalked = 1; 239 } 240 241 fChanged = FALSE; 242 243 // VAC 3.08 long long compatibility support 244 # ifdef INCL_LONGLONG // VAC 3.6.5 - compiler supports long long 245 # define OBJECT_VALUE(index) (Object[index].Integer.Value) 246 # else // VAC 3.08 - compiler does not support long long 247 # define OBJECT_VALUE(index) (Object[index].Integer.Value.ulLo) 248 # endif 249 250 if (G_ahAC) 251 { 252 Result.Length = sizeof(Object); 253 Result.Pointer = Object; 254 Status = pAcpiTkEvaluateObject(G_ahAC, NULL, NULL, &Result); 255 if (Status != AE_OK) ulTmp = 2; 256 if (Object[0].Type != ACPI_TYPE_INTEGER) ulTmp = 2; 257 258 ulTmp = OBJECT_VALUE(0); 259 if (pApm->fUsingAC != ulTmp) 260 { 261 pApm->fUsingAC = ulTmp; 262 fChanged = TRUE; 263 } 264 } 265 266 for (uiI=0; uiI<G_uiBatteryCount; uiI++) 267 { 268 if (G_ahBat[uiI] == 0) continue; 269 270 Result.Length = sizeof(Object); 271 Result.Pointer = Object; 272 Status = pAcpiTkEvaluateObject(G_ahBat[uiI], "_BIF", NULL, &Result); 273 if (Status != AE_OK) 274 { 275 G_ahBat[uiI] = 0; 276 continue; 277 } 278 279 Obj = Result.Pointer; 280 Obj = (ACPI_OBJECT *)Obj[0].Package.Elements; 281 LastFull = (UINT32)OBJECT_VALUE(2); 282 if (LastFull == 0xffffffff) 283 { 284 G_ahBat[uiI] = 0; 285 continue; 286 } 287 288 Result.Length = sizeof(Object); 289 Result.Pointer = Object; 290 Status = pAcpiTkEvaluateObject(G_ahBat[uiI], "_BST", NULL, &Result); 291 if (Status != AE_OK) 292 { 293 G_ahBat[uiI] = 0; 294 continue; 295 } 296 297 Obj = Result.Pointer; 298 Obj = (ACPI_OBJECT *)Obj[0].Package.Elements; 299 300 if (OBJECT_VALUE(2) != 0xffffffff) 301 { 302 BRemaining = (UINT32)OBJECT_VALUE(2); 303 } 304 305 if (OBJECT_VALUE(0) != 0xffffffff) 306 { 307 if (BRemaining > (LastFull >> 1)) // > 50% is high. < 50% is low 308 { 309 ulTmp = 1; // High 310 } 311 else 312 { 313 ulTmp = 2; // Low 314 } 315 316 if (OBJECT_VALUE(0) & 4) 317 { 318 ulTmp = 2; // Critical 319 } 320 // If battery charging - it can't be critical 321 if (OBJECT_VALUE(0) & 2) 322 { 323 ulTmp = 3; // Charging 324 } 325 if (pApm->bBatteryStatus != ulTmp) 326 { 327 pApm->bBatteryStatus = ulTmp; 328 fChanged = TRUE; 329 } 330 } 331 332 ulTmp = (BRemaining*100)/LastFull; 333 if (ulTmp > 100) ulTmp = 100; 334 if (pApm->bBatteryLife != ulTmp) 335 { 336 pApm->bBatteryLife = ulTmp; 337 fChanged = TRUE; 338 } 339 } 340 341 if (pfChanged) *pfChanged = fChanged; 342 pApm->fAlreadyRead = FALSE; 343 344 return 0; 345 346 # undef OBJECT_VALUE 347 } 348 349 /* 350 *@@ acpihHasBattery: 351 * quick'n'dirty helper which returns TRUE only 352 * if ACPI is supported on the system and the 353 * system actually has a battery (i.e. is a laptop). 354 * Code provided by David Azarewicz. 355 * @@added V1.0.9 (2012-02-20) [slevine]: code from David Azarewicz 356 */ 357 BOOL acpihHasBattery(VOID) 358 { 359 BOOL brc = FALSE; 360 ACPI_API_HANDLE hACPI; 361 APM Apm; 362 363 if (!acpihOpen(&hACPI)) 364 { 365 Apm.bBatteryStatus = 0xff; 366 if (!acpihGetPowerStatus(&Apm, NULL)) brc = (Apm.bBatteryStatus != 0xFF); 367 acpihClose(&hACPI); 368 } 369 370 return brc; 371 }
Note:
See TracChangeset
for help on using the changeset viewer.