⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wake.c

📁 ir 驱动程序源代码,make成功了,有兴趣的朋友可以看看
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -