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

📄 request.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
📖 第 1 页 / 共 3 页
字号:
/*++
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.
Copyright (c) 1995-1998  Microsoft Corporation

Module Name:

    request.c

Abstract:

    This file implements the IrDA Serial IR NDIS MAC driver set and query
    information handlers. This is provided as a sample to platform writers 
    and is expected to be able to be used without modification on most (if
    not all) hardware platforms.

Functions:

    IrsirQueryInformation
    IrsirsetInformation
    
    IrsirpNdisRequest
    IrsirpSetSpeed

Notes:


--*/

#include "irsirp.h"

#define MAX(a,b) (((a) >= (b)) ? (a) : (b))

//
// Internal structure for performing asynchronous requests.
//

typedef struct _IRSIR_REQUEST
{
    PIR_DEVICE   pIrDevice;
    NDIS_REQUEST NdisRequest;
} IRSIR_REQUEST, *PIRSIR_REQUEST;

//
// Worker prototypes.
//

static DWORD
IrsirpNdisRequest(
    LPVOID pvRequest
    );

static NDIS_STATUS
IrsirpSetSpeed(
    PIR_DEVICE pIrDevice,
    DWORD      dwRequestedBPS
    );

//
// Static data.
//

static const char 
// v_lpszVendorDesc[] = "Serial Infrared (COM) Port";
v_lpszVendorDesc[] = "VrFIR Port";

static const UINT 
v_rgSupportedOids[] = 
{
    //
    // General required OIDs.
    //

    //                                     Query        Set       Bytes
    //                                   supported   supported   required
    //                                  ----------- ----------- ----------

    OID_GEN_SUPPORTED_LIST,             // Query                    Arr(4)
    OID_GEN_HARDWARE_STATUS,            // Query                    4
    OID_GEN_MEDIA_SUPPORTED,            // Query                    Arr(4)
    OID_GEN_MEDIA_IN_USE,               // Query                    Arr(4)
    OID_GEN_MAXIMUM_LOOKAHEAD,          // Query                    4
    OID_GEN_MAXIMUM_FRAME_SIZE,         // Query                    4
    OID_GEN_LINK_SPEED,                 // Query                    4
    OID_GEN_TRANSMIT_BUFFER_SPACE,      // Query                    4
    OID_GEN_RECEIVE_BUFFER_SPACE,       // Query                    4
    OID_GEN_TRANSMIT_BLOCK_SIZE,        // Query                    4
    OID_GEN_RECEIVE_BLOCK_SIZE,         // Query                    4
    OID_GEN_VENDOR_ID,                  // Query                    4
    OID_GEN_VENDOR_DESCRIPTION,         // Query                    variable
    OID_GEN_VENDOR_DRIVER_VERSION,      // Query                    2
//  OID_GEN_CURRENT_PACKET_FILTER,      // Query        Set         4
    OID_GEN_CURRENT_LOOKAHEAD,          // Query        Set         4
    OID_GEN_DRIVER_VERSION,             // Query                    2
    OID_GEN_MAXIMUM_TOTAL_SIZE,         // Query                    4
    OID_GEN_PROTOCOL_OPTIONS,           //              Set         4
    OID_GEN_MAC_OPTIONS,                // Query                    4
    OID_GEN_MEDIA_CONNECT_STATUS,       // Query                    4
    OID_GEN_MAXIMUM_SEND_PACKETS,       // Query                    4
    OID_GEN_VENDOR_DRIVER_VERSION,      // Query                    4

    //
    // Required statistical OIDs.
    //

    OID_GEN_XMIT_OK,                    // Query                    4
    OID_GEN_RCV_OK,                     // Query                    4
    OID_GEN_XMIT_ERROR,                 // Query                    4
    OID_GEN_RCV_ERROR,                  // Query                    4
    OID_GEN_RCV_NO_BUFFER,              // Query                    4

    //
    // Infrared-specific OIDs.
    //

    OID_IRDA_RECEIVING,                 // Query                    4
    OID_IRDA_TURNAROUND_TIME,           // Query                    4
    OID_IRDA_SUPPORTED_SPEEDS,          // Query                    Arr(4)
    OID_IRDA_LINK_SPEED,                // Query        Set         4
    OID_IRDA_MEDIA_BUSY,                // Query        Set         4
    OID_IRDA_EXTRA_RCV_BOFS,            // Query                    4
    OID_IRDA_REACQUIRE_HW_RESOURCES,    //              Set         4
    OID_IRDA_RELEASE_HW_RESOURCES       // Query                    4
};

/*++

 Function:       IrsirQueryInformation

 Description:    Queries the caps and status of the miniport.

 Arguments:

    hContext    - Handle to miniport context. (PIR_DEVICE).
    
    Oid         - System defined OID_Xxx.
    
    lpvBuf      - Where to return Oid specific information.
    
    cbBuf       - Size of lpvBuf in bytes.
    
    lpcbWritten - Number of bytes written to lpvBuf.
    
    lpcbNeeded  - Additional bytes required if cbBuf less than the information
                  to write to the buffer.

 Returns:

    NDIS_STATUS Code.
            
        Success - NDIS_STATUS_SUCCESS.
        
                  NDIS_STATUS_PENDING:
                    Will complete asynchronously and call 
                    NdisMQueryInformationComplete.

        Failure - NDIS_STATUS_INVALID_OID:
                    Don't recognize the OID.

                  NDIS_STATUS_INVALID_LENGTH:
                    lpvBuf does not match length for OID.

                  NDIS_STATUS_NOT_ACCEPTED:                      
                    Failure.
                    
                  NDIS_STATUS_NOT_SUPPORTED:
                    Do not support optional OID.
                    
                  NDIS_STATUS_RESOURCES:
                    Failure resources allocation.    

 Comments:

 See v_rgSupportedOids array for supported OIDs.

--*/

NDIS_STATUS
IrsirQueryInformation(
    IN  NDIS_HANDLE hContext,
    IN  NDIS_OID    Oid,
    IN  PVOID       lpvBuf,
    IN  ULONG       cbBuf,
    OUT PULONG      lpcbWritten,
    OUT PULONG      lpcbNeeded
    )
{
    PIR_DEVICE  pIrDevice = (PIR_DEVICE)hContext;
    NDIS_STATUS status    = NDIS_STATUS_SUCCESS;
    ULONG       cbNeeded;
    DWORD       dwSpeedMask;

    ASSERT(lpvBuf != NULL);
    ASSERT(lpcbWritten != NULL);
    ASSERT(lpcbNeeded != NULL);

    DEBUGMSG(ZONE_QUERYINFO,
             (TEXT("+IrsirQueryInformation(0x%.8X, 0x%.8X, 0x%.8X, %d, ")
              TEXT("0x%.8X, 0x%.8X)\r\n"),
              hContext, Oid, lpvBuf, cbBuf, lpcbWritten, lpcbNeeded)
             );
    
    //
    // First thing: Figure out required buffer size. Most OIDs require
    // just a UINT, but there are exceptions.
    //

    switch (Oid)
    {
        case OID_GEN_SUPPORTED_LIST:
            cbNeeded = sizeof(v_rgSupportedOids);
            break;
            
        case OID_GEN_DRIVER_VERSION:
        case OID_GEN_VENDOR_DRIVER_VERSION:
            cbNeeded = sizeof(USHORT);
            break;

        case OID_GEN_VENDOR_DESCRIPTION:
            cbNeeded = sizeof(v_lpszVendorDesc);
            break;

        case OID_IRDA_SUPPORTED_SPEEDS:
            dwSpeedMask = pIrDevice->dwSupportedSpeedsMask;

            for (cbNeeded = 0; dwSpeedMask != 0; cbNeeded += sizeof(UINT))
            {
                // This clears the lowest set bit in the dwSpeedMask var.
                dwSpeedMask &= (dwSpeedMask - 1);
            }
            break;

        default:
            cbNeeded = sizeof(UINT);
            break;
    }

    //
    // Return if the buffer provided is not large enough.
    //

    if (cbBuf < cbNeeded)
    {
        *lpcbNeeded  = cbNeeded - cbBuf;
        *lpcbWritten = 0;
        status = NDIS_STATUS_INVALID_LENGTH;
        goto done;
    }

    // 
    // Do real work.
    //

    *lpcbWritten = cbNeeded;
    *lpcbNeeded  = 0;

    switch (Oid)
    {
        //
        // General OIDs.
        //

        case OID_GEN_SUPPORTED_LIST:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_SUPPORTED_LIST\r\n"))); 
            NdisMoveMemory(lpvBuf, (PVOID)v_rgSupportedOids, cbNeeded);
            break;

        case OID_GEN_HARDWARE_STATUS:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_HARDWARE_STATUS\r\n"))); 
            // If we can be called with a context, the we are ready to rumble.
            *(UINT *)lpvBuf = NdisHardwareStatusReady;
            break;

        case OID_GEN_MEDIA_SUPPORTED:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_SUPPORTED\r\n"))); 
            *(UINT *)lpvBuf = NdisMediumIrda;
            break;

        case OID_GEN_MEDIA_IN_USE:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_IN_USE\r\n"))); 
            *(UINT *)lpvBuf = NdisMediumIrda;
            break;

        case OID_GEN_MAXIMUM_LOOKAHEAD:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_LOOKAHEAD\r\n"))); 
            *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
            break;

        case OID_GEN_MAXIMUM_FRAME_SIZE:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_FRAME_SIZE\r\n"))); 
            *(UINT *)lpvBuf = MAX_I_DATA_SIZE;
            break;

        case OID_GEN_LINK_SPEED:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_LINK_SPEED\r\n"))); 
            // Link speed in 100 bps.
            *(UINT *)lpvBuf = (UINT)(v_rgSupportedBaudRates[NUM_BAUDRATES - 1].dwBPS/100);
            break;

        case OID_GEN_TRANSMIT_BUFFER_SPACE:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BUFFER_SPACE\r\n"))); 
            // We can buffer data, so make it one NDIS packet size.
            *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
            break;

        case OID_GEN_RECEIVE_BUFFER_SPACE:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BUFFER_SPACE\r\n"))); 
            // We can buffer data, so make it one NDIS packet size.
            *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
            break;

        case OID_GEN_TRANSMIT_BLOCK_SIZE:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BLOCK_SIZE\r\n"))); 
            // We can buffer data, so make it one IR packet size.
            *(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;
            break;

        case OID_GEN_RECEIVE_BLOCK_SIZE:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BLOCK_SIZE\r\n"))); 
            // We can buffer data, so make it one IR packet size.
            *(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;
            break;

        case OID_GEN_VENDOR_ID:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_ID\r\n"))); 
            *(UINT *)lpvBuf = 0x00ffffff;
            break;

        case OID_GEN_VENDOR_DRIVER_VERSION:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DRIVER_VERSION\r\n"))); 
            *(USHORT *)lpvBuf = MAKEWORD(IRSIR_MINOR_VERSION, IRSIR_MAJOR_VERSION);
            break;

        case OID_GEN_VENDOR_DESCRIPTION:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DESCRIPTION\r\n"))); 
            NdisMoveMemory(lpvBuf, v_lpszVendorDesc, cbNeeded);
            break;

//      case OID_GEN_CURRENT_PACKET_FILTER:
//          DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_PACKET_FILTER\r\n"))); 
//          *(UINT *)lpvBuf = NDIS_PACKET_TYPE_PROMISCUOUS;
//          break;

        case OID_GEN_CURRENT_LOOKAHEAD:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_LOOKAHEAD\r\n"))); 
            *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
            break;

        case OID_GEN_DRIVER_VERSION:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_DRIVER_VERSION\r\n"))); 
            *(USHORT *)lpvBuf = MAKEWORD(NDIS_MINOR_VERSION, NDIS_MAJOR_VERSION);
            break;

        case OID_GEN_MAXIMUM_TOTAL_SIZE:
            DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_TOTAL_SIZE\r\n"))); 
            *(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
            break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -