summaryrefslogtreecommitdiff
path: root/pofx/WDF/Driver/MultiComp/driver/HwSim.c
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /pofx/WDF/Driver/MultiComp/driver/HwSim.c
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'pofx/WDF/Driver/MultiComp/driver/HwSim.c')
-rw-r--r--pofx/WDF/Driver/MultiComp/driver/HwSim.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/pofx/WDF/Driver/MultiComp/driver/HwSim.c b/pofx/WDF/Driver/MultiComp/driver/HwSim.c
new file mode 100644
index 00000000..b3c04d86
--- /dev/null
+++ b/pofx/WDF/Driver/MultiComp/driver/HwSim.c
@@ -0,0 +1,251 @@
+/*++
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+ THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
+ KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
+ PURPOSE.
+
+Module Name:
+
+ HwSim.c
+
+Abstract:
+ This module implements a simple hardware simulator that simulates reading of
+ data from the device's components. In this sample, the "data" that is read
+ is simply the bitwise complement of the component number. In other words,
+ the data for component number 'X' is simply '~X'.
+
+ The hardware simulator also verifies that when a component is read, the
+ device is in D0 and the component is in F0. If not, it breaks into the
+ debugger.
+
+Environment:
+
+ Kernel mode
+
+--*/
+
+#include "HwSim.h"
+#include "HwSim.tmh"
+
+NTSTATUS
+HwSimInitialize(
+ _In_ WDFDEVICE Device
+ )
+/*++
+Routine Description:
+
+ This routine initializes the hardware simulator
+
+Arguments:
+
+ Device - Handle to the framework device object
+
+Return Value:
+
+ An NTSTATUS value representing success or failure of the function.
+
+--*/
+{
+ NTSTATUS status;
+ WDF_OBJECT_ATTRIBUTES objectAttributes;
+ PHWSIM_CONTEXT devCtx;
+
+ //
+ // Allocate our context for this device
+ //
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&objectAttributes,
+ HWSIM_CONTEXT);
+ status = WdfObjectAllocateContext((WDFOBJECT) Device,
+ &objectAttributes,
+ (PVOID*) &devCtx);
+ if (FALSE == NT_SUCCESS(status)) {
+ Trace(TRACE_LEVEL_ERROR,
+ "%!FUNC! - WdfObjectAllocateContext failed with %!status!",
+ status);
+ goto exit;
+ }
+
+ devCtx->FirstD0Entry = TRUE;
+
+ status = STATUS_SUCCESS;
+
+exit:
+ return status;
+}
+
+VOID
+HwSimD0Entry(
+ _In_ WDFDEVICE Device
+ )
+/*++
+Routine Description:
+
+ This routine simulates the device entering D0
+
+Arguments:
+
+ Device - Handle to the framework device object
+
+Return Value:
+
+ None
+
+--*/
+{
+ PHWSIM_CONTEXT devCtx;
+ ULONG i;
+
+ devCtx = HwSimGetDeviceContext(Device);
+
+ if (devCtx->FirstD0Entry) {
+ devCtx->FirstD0Entry = FALSE;
+
+ //
+ // Put all components in F0
+ //
+ for (i=0; i < COMPONENT_COUNT; i++) {
+ devCtx->ComponentFState[i] = 0;
+ }
+ }
+
+ devCtx->DevicePoweredOn = TRUE;
+
+ return;
+}
+
+VOID
+HwSimD0Exit(
+ _In_ WDFDEVICE Device
+ )
+/*++
+Routine Description:
+
+ This routine simulates the device exiting D0
+
+Arguments:
+
+ Device - Handle to the framework device object
+
+Return Value:
+
+ None
+
+--*/
+{
+ PHWSIM_CONTEXT devCtx;
+
+ devCtx = HwSimGetDeviceContext(Device);
+
+ devCtx->DevicePoweredOn = FALSE;
+
+ return;
+}
+
+VOID
+HwSimFStateChange(
+ _In_ WDFDEVICE Device,
+ _In_ ULONG Component,
+ _In_ ULONG State
+ )
+/*++
+Routine Description:
+
+ This routine simulates a component changing its F-state
+
+Arguments:
+
+ Device - Handle to the framework device object
+
+ Component - Index of the component whose F-state is changing
+
+ State - New F-state for the component
+
+Return Value:
+
+ None
+
+--*/
+{
+ PHWSIM_CONTEXT devCtx;
+
+ devCtx = HwSimGetDeviceContext(Device);
+
+ //
+ // The caller should have ensured that this routine is called only when the
+ // device is powered on. Verify this. If false, we'll generate a verifier
+ // breakpoint.
+ //
+ if (FALSE == devCtx->DevicePoweredOn) {
+ Trace(TRACE_LEVEL_ERROR,
+ "%!FUNC! - Expected device to be powered on, but it was not.");
+ WdfVerifierDbgBreakPoint();
+ }
+
+ //
+ // Put the component in the requested F-state
+ //
+ devCtx->ComponentFState[Component] = State;
+ return;
+}
+
+ULONG
+HwSimReadComponent(
+ _In_ WDFDEVICE Device,
+ _In_ ULONG Component
+ )
+/*++
+Routine Description:
+
+ This routine simulates the reading of data from a component
+
+Arguments:
+
+ Device - Handle to the framework device object
+
+ Component - Component from which data is being read
+
+Return Value:
+
+ A ULONG value representing the data that was read from the component
+
+--*/
+{
+ ULONG componentData;
+ PHWSIM_CONTEXT devCtx;
+
+ devCtx = HwSimGetDeviceContext(Device);
+
+ //
+ // The caller should have ensured that this routine is called only when the
+ // device is powered on. Verify this. If false, we'll generate a verifier
+ // breakpoint.
+ //
+ if (FALSE == devCtx->DevicePoweredOn) {
+ Trace(TRACE_LEVEL_ERROR,
+ "%!FUNC! - Expected device to be powered on, but it was not.");
+ WdfVerifierDbgBreakPoint();
+ }
+
+ //
+ // The caller should have ensured that this routine is called only when the
+ // component is in F0. Verify this. If false, we'll generate a verifier
+ // breakpoint.
+ //
+ if (0 != devCtx->ComponentFState[Component]) {
+ Trace(TRACE_LEVEL_ERROR,
+ "%!FUNC! - Expected component %d to be in F0, but it was in F%d.",
+ Component,
+ devCtx->ComponentFState[Component]);
+ WdfVerifierDbgBreakPoint();
+ }
+
+ //
+ // In this sample, component data is just a bit-wise complement of the
+ // component number.
+ //
+ componentData = ~Component;
+ return componentData;
+}