pci.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 126 行

C
126
字号
//------------------------------------------------------------------------------
//
//  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-2000 Microsoft Corporation.  All rights reserved.
//  
//------------------------------------------------------------------------------
#include <windows.h>
#include <ceddk.h>
#include <wdm.h>

#undef TEXT
#define TEXT                                     
#define NKDbgPrintfW    EdbgOutputDebugString

#define PCI_TYPE1_ADDRESS       0x0CF8
#define PCI_TYPE1_DATA          0x0CFC

//---------------------------------------------------------------------
// Bit fields as specified in the Host-PCI bridge specification (430HX)
//
typedef struct  _TYPE1_PCI_ADDRESS {
    union {
        struct {
            ULONG   Reserved:2;
            ULONG   Register:6;
            ULONG   Function:3;
            ULONG   Device:5;
            ULONG   Bus:8;
            ULONG   Reserved2:7;
            ULONG   ConfigurationAccess:1;
        } bits;
        ULONG   AsULONG;
    } u;
} TYPE1_PCI_ADDRESS, *PTYPE1_PCI_ADDRESS;



// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
ULONG
PCI_Type1_Configuration(
    ULONG BusNumber,
    ULONG SlotNumber,
    PVOID Buffer,
    ULONG Offset,
    ULONG Length,
    BOOL  fSet
    )
{
    PULONG              pBuffer;
    int                 registerOffset, endOffset;
    TYPE1_PCI_ADDRESS   type1Address;
    ULONG               DeviceNumber, FunctionNumber;

    if (BusNumber >= PCI_MAX_BUS) {
        return (0);
    }

    DeviceNumber   = ((PCI_SLOT_NUMBER*) &SlotNumber)->u.bits.DeviceNumber;
    FunctionNumber = ((PCI_SLOT_NUMBER*) &SlotNumber)->u.bits.FunctionNumber;

    if (DeviceNumber >= PCI_MAX_DEVICES) {
        return (0);
    }

    registerOffset = Offset / sizeof(ULONG);
    endOffset = registerOffset + (Length + sizeof(ULONG) - 1) / sizeof(ULONG);
    pBuffer = Buffer;

    type1Address.u.AsULONG = 0;
    type1Address.u.bits.ConfigurationAccess = 1;
    type1Address.u.bits.Bus = BusNumber;
    type1Address.u.bits.Device = DeviceNumber;
    type1Address.u.bits.Function = FunctionNumber;

    for ( ; registerOffset < endOffset; registerOffset++ ) {
        type1Address.u.bits.Register = registerOffset;
        WRITE_PORT_ULONG((PULONG) PCI_TYPE1_ADDRESS, type1Address.u.AsULONG);
        if (fSet) {
            WRITE_PORT_ULONG((PULONG) PCI_TYPE1_DATA, *pBuffer++);
        } else {
            *pBuffer++ = READ_PORT_ULONG((PULONG) PCI_TYPE1_DATA);
        }
    }

    return (Length);
}



// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
ULONG
PCIGetBusDataByOffset(
    IN ULONG BusNumber,
    IN ULONG SlotNumber,
    IN PVOID Buffer,
    IN ULONG Offset,
    IN ULONG Length
    )
{
    return (PCI_Type1_Configuration(BusNumber, SlotNumber,
                                    Buffer, Offset, Length, FALSE));
}



// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
ULONG
PCISetBusDataByOffset(
    IN ULONG BusNumber,
    IN ULONG SlotNumber,
    IN PVOID Buffer,
    IN ULONG Offset,
    IN ULONG Length
    )
{
    return (PCI_Type1_Configuration(BusNumber, SlotNumber,
                                    Buffer, Offset, Length, TRUE));
}

⌨️ 快捷键说明

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