[ros-diffs] [sir_richard] 46543: [COMPBATT]: Mini-class driver interface work: CompBattDisableStatusNotify, CompBattQueryTag, CompBattRecalculateTag, CompBattGetBatteryInformation.

sir_richard at svn.reactos.org sir_richard at svn.reactos.org
Mon Mar 29 04:02:07 CEST 2010


Author: sir_richard
Date: Mon Mar 29 04:02:07 2010
New Revision: 46543

URL: http://svn.reactos.org/svn/reactos?rev=46543&view=rev
Log:
[COMPBATT]: Mini-class driver interface work: CompBattDisableStatusNotify, CompBattQueryTag, CompBattRecalculateTag, CompBattGetBatteryInformation.

Modified:
    trunk/reactos/drivers/bus/acpi/compbatt/compbatt.c
    trunk/reactos/drivers/bus/acpi/compbatt/compbatt.h
    trunk/reactos/drivers/bus/acpi/compbatt/comppnp.c

Modified: trunk/reactos/drivers/bus/acpi/compbatt/compbatt.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/compbatt/compbatt.c?rev=46543&r1=46542&r2=46543&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/compbatt/compbatt.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/compbatt/compbatt.c [iso-8859-1] Mon Mar 29 04:02:07 2010
@@ -81,12 +81,41 @@
     return STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS
+VOID
 NTAPI
 CompBattRecalculateTag(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    PCOMPBATT_BATTERY_DATA BatteryData;
+    ULONG Tag;
+    PLIST_ENTRY ListHead, NextEntry;
+    if (CompBattDebug & 0x100) DbgPrint("CompBatt: ENTERING CompBattRecalculateTag\n");
+
+    /* Loop the battery list */
+    ExAcquireFastMutex(&DeviceExtension->Lock);
+    ListHead = &DeviceExtension->BatteryList;
+    NextEntry = ListHead->Flink;
+    while (NextEntry != ListHead)
+    {
+        /* Get the battery information and check if it has a tag */
+        BatteryData = CONTAINING_RECORD(NextEntry, COMPBATT_BATTERY_DATA, BatteryLink);
+        if (BatteryData->Flags & COMPBATT_TAG_ASSIGNED)
+        {
+            /* Generate the next tag and exit */
+            Tag = DeviceExtension->NextTag;
+            DeviceExtension->Flags |= COMPBATT_TAG_ASSIGNED;
+            DeviceExtension->Tag = Tag;
+            DeviceExtension->NextTag = Tag + 1;
+            break;
+       }
+       
+       /* No tag for this device extension, clear it */
+       DeviceExtension->Tag = 0;
+       NextEntry = NextEntry->Flink;
+    }
+    
+    /* We're done */ 
+    ExReleaseFastMutex(&DeviceExtension->Lock);
+    if (CompBattDebug & 0x100) DbgPrint("CompBatt: EXITING CompBattRecalculateTag\n");
 }
 
 NTSTATUS
@@ -118,16 +147,61 @@
 CompBattQueryTag(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
                  OUT PULONG Tag)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    PAGED_CODE();
+    if (CompBattDebug & 0x100) DbgPrint("CompBatt: ENTERING QueryTag\n");
+
+    /* Was a tag assigned? */
+    if (!(DeviceExtension->Flags & COMPBATT_TAG_ASSIGNED))
+    {
+        /* Assign one */
+        CompBattRecalculateTag(DeviceExtension);
+    }
+      
+    /* Do we have a tag now? */
+    if ((DeviceExtension->Flags & COMPBATT_TAG_ASSIGNED) && (DeviceExtension->Tag))
+    {
+        /* Return the tag */
+        *Tag = DeviceExtension->Tag;
+        Status = STATUS_SUCCESS;
+    }
+    else
+    {
+        /* No tag */
+        *Tag = 0;
+        Status = STATUS_NO_SUCH_DEVICE;
+    }
+    
+    /* Return status */
+    if (CompBattDebug & 0x100) DbgPrint("CompBatt: EXITING QueryTag\n");
+    return Status;
 }
 
 NTSTATUS
 NTAPI
 CompBattDisableStatusNotify(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    PCOMPBATT_BATTERY_DATA BatteryData;
+    PLIST_ENTRY ListHead, NextEntry;
+    if (CompBattDebug & 0x100) DbgPrint("CompBatt: ENTERING DisableStatusNotify\n");
+
+    /* Loop the battery list */
+    ExAcquireFastMutex(&DeviceExtension->Lock);
+    ListHead = &DeviceExtension->BatteryList;
+    NextEntry = ListHead->Flink;
+    while (NextEntry != ListHead)
+    {
+        /* Get the battery information and clear capacity data */
+        BatteryData = CONTAINING_RECORD(NextEntry, COMPBATT_BATTERY_DATA, BatteryLink);
+        BatteryData->WaitStatus.LowCapacity = 0;
+        BatteryData->WaitStatus.HighCapacity = 0x7FFFFFFF;
+        NextEntry = NextEntry->Flink;
+    }
+
+    /* Done */
+    ExReleaseFastMutex(&DeviceExtension->Lock);
+    if (CompBattDebug & 0x100) DbgPrint("CompBatt: EXITING DisableStatusNotify\n");
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -161,11 +235,158 @@
 
 NTSTATUS
 NTAPI
-CompBattGetBatteryInformation(OUT PBATTERY_INFORMATION BatteryInformation,
+CompBattGetBatteryInformation(OUT PBATTERY_INFORMATION BatteryInfo,
                               IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status = STATUS_SUCCESS;
+    BATTERY_QUERY_INFORMATION InputBuffer;
+    PCOMPBATT_BATTERY_DATA BatteryData;
+    PLIST_ENTRY ListHead, NextEntry;
+    if (CompBattDebug & 1) DbgPrint("CompBatt: ENTERING GetBatteryInformation\n");
+    
+    /* Set defaults */
+    BatteryInfo->DefaultAlert1 = 0;
+    BatteryInfo->DefaultAlert2 = 0;
+    BatteryInfo->CriticalBias = 0;
+    
+    /* Loop the battery list */
+    ExAcquireFastMutex(&DeviceExtension->Lock);
+    ListHead = &DeviceExtension->BatteryList;
+    NextEntry = ListHead->Flink;
+    while (NextEntry != ListHead)
+    {
+        /* Try to acquire the remove lock */
+        BatteryData = CONTAINING_RECORD(NextEntry, COMPBATT_BATTERY_DATA, BatteryLink);
+        if (NT_SUCCESS(IoAcquireRemoveLock(&BatteryData->RemoveLock, 0)))
+        {
+            /* Now release the device lock since the battery can't go away */
+            ExReleaseFastMutex(&DeviceExtension->Lock);
+            
+            /* Build the query */
+            InputBuffer.BatteryTag = BatteryData->Tag;
+            InputBuffer.InformationLevel = BatteryInformation;
+            InputBuffer.AtRate = 0;
+            
+            /* Make sure the battery has a tag */
+            if (BatteryData->Tag)
+            {
+                /* Do we already have the data? */
+                if (!(BatteryData->Flags & COMPBATT_BATTERY_INFORMATION_PRESENT))
+                {
+                    /* Send the IOCTL to query the information */
+                    RtlZeroMemory(&BatteryData->BatteryInformation,
+                                  sizeof(BatteryData->BatteryInformation));
+                    Status = BatteryIoctl(IOCTL_BATTERY_QUERY_INFORMATION,
+                                          BatteryData->DeviceObject,
+                                          &InputBuffer,
+                                          sizeof(InputBuffer),
+                                          &BatteryData->BatteryInformation,
+                                          sizeof(BatteryData->BatteryInformation),
+                                          0);
+                    if (!NT_SUCCESS(Status))
+                    {
+                        /* Fail if the query had a problem */
+                        if (Status == STATUS_DEVICE_REMOVED) Status = STATUS_NO_SUCH_DEVICE;
+                        ExAcquireFastMutex(&DeviceExtension->Lock);
+                        IoReleaseRemoveLock(&BatteryData->RemoveLock, 0);
+                        break;
+                    }
+                    
+                    /* Next time we can use the static copy */
+                    BatteryData->Flags |= COMPBATT_BATTERY_INFORMATION_PRESENT;
+                    if (CompBattDebug & 2)
+                        DbgPrint("CompBattGetBatteryInformation: Read individual BATTERY_INFORMATION\n"
+                                 "--------  Capabilities = %x\n--------  Technology = %x\n"
+                                 "--------  Chemistry[4] = %x\n--------  DesignedCapacity = %x\n"
+                                 "--------  FullChargedCapacity = %x\n--------  DefaultAlert1 = %x\n"
+                                 "--------  DefaultAlert2 = %x\n--------  CriticalBias = %x\n"
+                                 "--------  CycleCount = %x\n",
+                                 BatteryData->BatteryInformation.Capabilities,
+                                 BatteryData->BatteryInformation.Technology,
+                                 BatteryData->BatteryInformation.Chemistry,
+                                 BatteryData->BatteryInformation.DesignedCapacity,
+                                 BatteryData->BatteryInformation.FullChargedCapacity,
+                                 BatteryData->BatteryInformation.DefaultAlert1,
+                                 BatteryData->BatteryInformation.DefaultAlert2,
+                                 BatteryData->BatteryInformation.CriticalBias,
+                                 BatteryData->BatteryInformation.CycleCount);
+                }
+
+                /* Combine capabilities */
+                BatteryInfo->Capabilities |= BatteryData->BatteryInformation.Capabilities;
+                
+                /* Add-on capacity */
+                if (BatteryData->BatteryInformation.DesignedCapacity != BATTERY_UNKNOWN_CAPACITY)
+                {
+                    BatteryInfo->DesignedCapacity += BatteryData->BatteryInformation.DesignedCapacity;
+                }
+
+                /* Add on fully charged capacity */
+                if (BatteryData->BatteryInformation.FullChargedCapacity != BATTERY_UNKNOWN_CAPACITY)
+                {
+                    BatteryInfo->FullChargedCapacity += BatteryData->BatteryInformation.FullChargedCapacity;
+                }
+                
+                /* Choose the highest alert */
+                BatteryInfo->DefaultAlert1 = max(BatteryInfo->DefaultAlert1,
+                                                 BatteryData->BatteryInformation.DefaultAlert1);
+
+                /* Choose the highest alert */
+                BatteryInfo->DefaultAlert2 = max(BatteryInfo->DefaultAlert2,
+                                                 BatteryData->BatteryInformation.DefaultAlert2);
+                
+                /* Choose the highest critical bias */
+                BatteryInfo->CriticalBias = max(BatteryInfo->CriticalBias,
+                                                BatteryData->BatteryInformation.CriticalBias);
+            }
+            
+            /* Re-acquire the device extension lock and release the remove lock */
+            ExAcquireFastMutex(&DeviceExtension->Lock);
+            IoReleaseRemoveLock(&BatteryData->RemoveLock, 0);
+        }
+        
+        /* Next entry */
+        NextEntry = NextEntry->Flink;
+    }
+    
+    /* We are done with the list, check if the information was queried okay */ 
+    ExReleaseFastMutex(&DeviceExtension->Lock);
+    if (NT_SUCCESS(Status))
+    {
+        /* If there's no fully charged capacity, use the design capacity */
+        if (!BatteryInfo->FullChargedCapacity)
+        {
+            BatteryInfo->FullChargedCapacity = BatteryInfo->DesignedCapacity;
+        }
+        
+        /* Print out final combined data */
+        if (CompBattDebug & 2)
+            DbgPrint("CompBattGetBatteryInformation: Returning BATTERY_INFORMATION\n"
+                     "--------  Capabilities = %x\n--------  Technology = %x\n"
+                     "--------  Chemistry[4] = %x\n--------  DesignedCapacity = %x\n"
+                     "--------  FullChargedCapacity = %x\n--------  DefaultAlert1 = %x\n"
+                     "--------  DefaultAlert2 = %x\n--------  CriticalBias = %x\n"
+                     "--------  CycleCount = %x\n",
+                     BatteryInfo->Capabilities,
+                     BatteryInfo->Technology,
+                     BatteryInfo->Chemistry,
+                     BatteryInfo->DesignedCapacity,
+                     BatteryInfo->FullChargedCapacity,
+                     BatteryInfo->DefaultAlert1,
+                     BatteryInfo->DefaultAlert2,
+                     BatteryInfo->CriticalBias,
+                     BatteryInfo->CycleCount);
+                     
+        /* Copy the data into the device extension */
+        RtlCopyMemory(&DeviceExtension->BatteryInformation,
+                      BatteryInfo,
+                      sizeof(DeviceExtension->BatteryInformation));
+        DeviceExtension->Flags |= COMPBATT_BATTERY_INFORMATION_PRESENT;
+    }
+    
+    /* We are done */
+    if (CompBattDebug & 1) DbgPrint("CompBatt: EXITING GetBatteryInformation\n");
+    return Status;
 }
 
 NTSTATUS
@@ -209,13 +430,12 @@
     DriverObject->DriverExtension->AddDevice = CompBattAddDevice;
     
     /* Register other handlers */
-    DriverObject->MajorFunction[0] = CompBattOpenClose;
-    DriverObject->MajorFunction[2] = CompBattOpenClose;
-    DriverObject->MajorFunction[14] = CompBattIoctl;
-    DriverObject->MajorFunction[22] = CompBattPowerDispatch;
-    DriverObject->MajorFunction[23] = CompBattSystemControl;
-    DriverObject->MajorFunction[27] = CompBattPnpDispatch;
-    
+    DriverObject->MajorFunction[IRP_MJ_CREATE] = CompBattOpenClose;
+    DriverObject->MajorFunction[IRP_MJ_CLOSE] = CompBattOpenClose;
+    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CompBattIoctl;
+    DriverObject->MajorFunction[IRP_MJ_POWER] = CompBattPowerDispatch;
+    DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = CompBattSystemControl;
+    DriverObject->MajorFunction[IRP_MJ_PNP] = CompBattPnpDispatch;
     return STATUS_SUCCESS;
 }
 

Modified: trunk/reactos/drivers/bus/acpi/compbatt/compbatt.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/compbatt/compbatt.h?rev=46543&r1=46542&r2=46543&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/compbatt/compbatt.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/compbatt/compbatt.h [iso-8859-1] Mon Mar 29 04:02:07 2010
@@ -11,6 +11,9 @@
 #include <batclass.h>
 #include <debug.h>
 #include <wdmguid.h>
+
+#define COMPBATT_BATTERY_INFORMATION_PRESENT    0x04
+#define COMPBATT_TAG_ASSIGNED                   0x80
 
 typedef struct _COMPBATT_BATTERY_DATA
 {
@@ -137,6 +140,18 @@
     OUT PFILE_OBJECT *FileObject,
     OUT PDEVICE_OBJECT *DeviceObject
 );
+
+NTSTATUS
+NTAPI
+BatteryIoctl(
+    IN ULONG IoControlCode, 
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PVOID InputBuffer,
+    IN ULONG InputBufferLength,
+    IN PVOID OutputBuffer,
+    IN ULONG OutputBufferLength,
+    IN BOOLEAN InternalDeviceIoControl
+);
                                
 extern ULONG CompBattDebug;
 

Modified: trunk/reactos/drivers/bus/acpi/compbatt/comppnp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/compbatt/comppnp.c?rev=46543&r1=46542&r2=46543&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/compbatt/comppnp.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/compbatt/comppnp.c [iso-8859-1] Mon Mar 29 04:02:07 2010
@@ -59,6 +59,9 @@
             ExReleaseFastMutex(&DeviceExtension->Lock);
             return BatteryData;
         }
+        
+        /* Next */
+        NextEntry = NextEntry->Flink;
     }
     
     /* Done */
@@ -92,6 +95,9 @@
             Found = TRUE;
             break;
         }
+
+        /* Next */
+        NextEntry = NextEntry->Flink;
     }
     
     /* Release the lock and return search status */




More information about the Ros-diffs mailing list