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 + -
显示快捷键?