📄 wake.c
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright 2005 OSR, Open Systems Resources, Inc. All rights Reserved.
//
// Module Name:
//
// wake.c
//
// Abstract:
//
// Contains routines and data for wake-up capabilities
//
// Author:
//
// Revision History:
//
#include "smscir.h"
#ifdef WPP_TRACING
#include "wake.tmh"
#endif
VOID
DisplayArmingSettings(
PSMSCIR_DATA DeviceData
);
SMSCIR_ARM_FOR_WAKE_DATA RC6WakeData[] = {
SMSCIR_RC6_CARRIER_DIVIDER, // CarrierDivider
SMSCIR_RC6_BIT_RATE_DIVIDER, // BitRateDivider
SMSCIR_RC6_CUSTOM_CODE, // CustomCode
SMSCIR_RC6_CUSTOM_CODE_PRIME, // CustomCodePrime
SMSCIR_RC6_DATA_CODE, // DataCode
SMSCIR_RC6_PROTOCOL_SELECT, // ProtocolSelect
SMSCIR_RC6_HEADER_VALUE_AND_MASK, // HeaderValueAndMask
SMSCIR_RC6_DATA_VALUE_1, // DataValue1
SMSCIR_RC6_DATA_MASK_1, // DataMask1
SMSCIR_RC6_DATA_VALUE_2, // DataValue2
SMSCIR_RC6_DATA_MASK_2, // DataMask2
SMSCIR_RC6_DATA_VALUE_3, // DataValue3
SMSCIR_RC6_DATA_MASK_3, // DataMask3
SMSCIR_RC6_DATA_VALUE_4, // DataValue4
SMSCIR_RC6_DATA_MASK_4, // DataMask4
SMSCIR_RC6_DATA_VALUE_5, // DataValue5
SMSCIR_RC6_DATA_MASK_5, // DataMask5
};
#if 0
SMSCIR_ARM_FOR_WAKE_DATA RC5WakeData[] = {
SMSCIR_RC5_CARRIER_DIVIDER, // CarrierDivider
SMSCIR_RC5_BIT_RATE_DIVIDER, // BitRateDivider
SMSCIR_RC5_CUSTOM_CODE, // CustomCode
SMSCIR_RC5_CUSTOM_CODE_PRIME, // CustomCodePrime
SMSCIR_RC5_DATA_CODE, // DataCode
SMSCIR_RC5_PROTOCOL_SELECT, // ProtocolSelect
SMSCIR_RC5_HEADER_VALUE_AND_MASK, // HeaderValueAndMask
SMSCIR_RC5_DATA_VALUE_1, // DataValue1
SMSCIR_RC5_DATA_MASK_1, // DataMask1
SMSCIR_RC5_DATA_VALUE_2, // DataValue2
SMSCIR_RC5_DATA_MASK_2, // DataMask2
SMSCIR_RC5_DATA_VALUE_3, // DataValue3
SMSCIR_RC5_DATA_MASK_3, // DataMask3
SMSCIR_RC5_DATA_VALUE_4, // DataValue4
SMSCIR_RC5_DATA_MASK_4, // DataMask4
SMSCIR_RC5_DATA_VALUE_5, // DataValue5
SMSCIR_RC5_DATA_MASK_5, // DataMask5
};
SMSCIR_ARM_FOR_WAKE_DATA NECWakeData[] = {
SMSCIR_NEC_CARRIER_DIVIDER, // CarrierDivider
SMSCIR_NEC_BIT_RATE_DIVIDER, // BitRateDivider
SMSCIR_NEC_CUSTOM_CODE, // CustomCode
SMSCIR_NEC_CUSTOM_CODE_PRIME, // CustomCodePrime
SMSCIR_NEC_DATA_CODE, // DataCode
SMSCIR_NEC_PROTOCOL_SELECT, // ProtocolSelect
SMSCIR_NEC_HEADER_VALUE_AND_MASK, // HeaderValueAndMask
SMSCIR_NEC_DATA_VALUE_1, // DataValue1
SMSCIR_NEC_DATA_MASK_1, // DataMask1
SMSCIR_NEC_DATA_VALUE_2, // DataValue2
SMSCIR_NEC_DATA_MASK_2, // DataMask2
SMSCIR_NEC_DATA_VALUE_3, // DataValue3
SMSCIR_NEC_DATA_MASK_3, // DataMask3
SMSCIR_NEC_DATA_VALUE_4, // DataValue4
SMSCIR_NEC_DATA_MASK_4, // DataMask4
SMSCIR_NEC_DATA_VALUE_5, // DataValue5
SMSCIR_NEC_DATA_MASK_5, // DataMask5
};
#endif
VOID
SmscIrSetWakeKeyInfo(
IN PSMSCIR_DATA DeviceData
)
/*++
Routine Description:
SmscIrSetWakeKeyInfo sets up the ArmForWakeData portion
of the SMSCIR_DATA structure. This information will
then be used to arm the device for wake if necessary (and thus
chooses what button on what remote can wake the system
Arguments:
DeviceData - Our per device context
Return Value:
None
--*/
{
UNICODE_STRING powerKeySubKey;
UNICODE_STRING powerKeyValue;
NTSTATUS status;
WDFKEY serviceKey;
WDFKEY powerSubKey;
ULONG valueLength;
ULONG valueType;
SmscIrTracePrint(
TRACE_LEVEL_VERBOSE,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Entered."));
//
// Try to read the PowerKey value out of
// HKLM\CCS\Services\smscir\PowerKey\PowerKey.
//
// If it's there, then it contains a
// SMSCIR_ARM_FOR_WAKE_DATA structure with our
// information for wake. If not, we'll always
// just arm for RC6 wake.
//
RtlInitUnicodeString(&powerKeySubKey,
SMSCIR_POWER_KEY_SUBKEY);
RtlInitUnicodeString(&powerKeyValue,
SMSCIR_POWER_KEY_VALUE);
status = WdfRegistryOpenKey(NULL,
&SmscIrRegistryPath,
KEY_READ,
WDF_NO_OBJECT_ATTRIBUTES,
&serviceKey);
if (NT_SUCCESS(status)) {
SmscIrTracePrint(
TRACE_LEVEL_VERBOSE,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Opened services key"));
status = WdfRegistryOpenKey(serviceKey,
&powerKeySubKey,
KEY_READ,
WDF_NO_OBJECT_ATTRIBUTES,
&powerSubKey);
if (NT_SUCCESS(status)) {
SmscIrTracePrint(
TRACE_LEVEL_VERBOSE,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Opened power subkey"));
status = WdfRegistryQueryValue(powerSubKey,
&powerKeyValue,
sizeof(SMSCIR_ARM_FOR_WAKE_DATA),
&DeviceData->ArmForWakeData,
&valueLength,
&valueType);
if (NT_SUCCESS(status)) {
ASSERT(valueLength == sizeof(SMSCIR_ARM_FOR_WAKE_DATA));
ASSERT(valueType == REG_BINARY);
SmscIrTracePrint(
TRACE_LEVEL_VERBOSE,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Succesfully read power key"));
DisplayArmingSettings(DeviceData);
} else {
SmscIrTracePrint(
TRACE_LEVEL_ERROR,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Reading power key failed - 0x%x",
status));
}
} else {
SmscIrTracePrint(
TRACE_LEVEL_ERROR,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Couldn't open power subkey - 0x%x",
status));
}
} else {
SmscIrTracePrint(
TRACE_LEVEL_ERROR,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Couldn't open services key - 0x%x",
status));
}
if (!NT_SUCCESS(status)) {
SmscIrTracePrint(
TRACE_LEVEL_ERROR,
SMSCDBG_WAKE_INFO,
("SmscIrSetWakeKeyInfo: Defaulting to wake by RC6"));
//
// Default to the RC6 key
//
RtlCopyMemory(&DeviceData->ArmForWakeData,
RC6WakeData,
sizeof(SMSCIR_ARM_FOR_WAKE_DATA));
DisplayArmingSettings(DeviceData);
}
return;
}
NTSTATUS
SmscIrEvtDeviceWakeArm(
IN WDFDEVICE Device
)
/*++
Routine Description:
EvtDeviceWakeArm is called when the Framework arms the device for
wake.
Our device supports waking via an RC6, RC5, NEC or ProtoX remote,
which one we wake from here will be dictated by policy setup in the
registry
Arguments:
Device - Handle to a Framework device object.
Return Value:
NTSTATUS - Failure will result in the device remaining in the D0 state.
--*/
{
PSMSCIR_DATA deviceData;
MASTER_BLOCK_CONTROL mbc;
LINE_CONTROL_B lcb;
CONSUMER_IR_CTRL irCtrl;
deviceData = (PSMSCIR_DATA)GetIrData(Device);
SmscIrTracePrint(
TRACE_LEVEL_VERBOSE,
SMSCDBG_WAKE_INFO,
("SmscIrEvtDeviceWakeArm: Entered."));
WdfInterruptAcquireLock(deviceData->Interrupt);
//
// Master reset the device
//
mbc.AsUChar = 0;
mbc.ErrorReset = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -