📄 pci_diag.c
字号:
/************************************************************************
* File: pci_diag.c
*
* Sample user-mode diagnostics application for accessing PCI
* devices using WinDriver's API.
* Code was generated by DriverWizard v7.01.
*
* Copyright (c) 2003 - 2005 Jungo Ltd. http://www.jungo.com
*************************************************************************/
#include <stdio.h>
#include "wdc_lib.h"
#include "wdc_defs.h"
#include "utils.h"
#include "status_strings.h"
#include "samples/shared/diag_lib.h"
#include "samples/shared/wdc_diag_lib.h"
#include "samples/shared/pci_regs.h"
#include "pci_lib.h"
/*************************************************************
General definitions
*************************************************************/
/* Error messages display */
#define PCI_ERR printf
/*************************************************************
Global variables
*************************************************************/
/* User's input command */
static CHAR gsInput[256];
/* --------------------------------------------------
PCI configuration registers information
-------------------------------------------------- */
/* Configuration registers information array */
const WDC_REG gPCI_CfgRegs[] = {
{ WDC_AD_CFG_SPACE, PCI_VID, WDC_SIZE_16, WDC_READ_WRITE, "VID", "Vendor ID" },
{ WDC_AD_CFG_SPACE, PCI_DID, WDC_SIZE_16, WDC_READ_WRITE, "DID", "Device ID" },
{ WDC_AD_CFG_SPACE, PCI_CR, WDC_SIZE_16, WDC_READ_WRITE, "CMD", "Command" },
{ WDC_AD_CFG_SPACE, PCI_SR, WDC_SIZE_16, WDC_READ_WRITE, "STS", "Status" },
{ WDC_AD_CFG_SPACE, PCI_REV, WDC_SIZE_32, WDC_READ_WRITE, "RID_CLCD", "Revision ID & Class Code" },
{ WDC_AD_CFG_SPACE, PCI_CCSC, WDC_SIZE_8, WDC_READ_WRITE, "SCC", "Sub Class Code" },
{ WDC_AD_CFG_SPACE, PCI_CCBC, WDC_SIZE_8, WDC_READ_WRITE, "BCC", "Base Class Code" },
{ WDC_AD_CFG_SPACE, PCI_CLSR, WDC_SIZE_8, WDC_READ_WRITE, "CALN", "Cache Line Size" },
{ WDC_AD_CFG_SPACE, PCI_LTR, WDC_SIZE_8, WDC_READ_WRITE, "LAT", "Latency Timer" },
{ WDC_AD_CFG_SPACE, PCI_HDR, WDC_SIZE_8, WDC_READ_WRITE, "HDR", "Header Type" },
{ WDC_AD_CFG_SPACE, PCI_BISTR, WDC_SIZE_8, WDC_READ_WRITE, "BIST", "Built-in Self Test" },
{ WDC_AD_CFG_SPACE, PCI_BAR0, WDC_SIZE_32, WDC_READ_WRITE, "BADDR0", "Base Address 0" },
{ WDC_AD_CFG_SPACE, PCI_BAR1, WDC_SIZE_32, WDC_READ_WRITE, "BADDR1", "Base Address 1" },
{ WDC_AD_CFG_SPACE, PCI_BAR2, WDC_SIZE_32, WDC_READ_WRITE, "BADDR2", "Base Address 2" },
{ WDC_AD_CFG_SPACE, PCI_BAR3, WDC_SIZE_32, WDC_READ_WRITE, "BADDR3", "Base Address 3" },
{ WDC_AD_CFG_SPACE, PCI_BAR4, WDC_SIZE_32, WDC_READ_WRITE, "BADDR4", "Base Address 4" },
{ WDC_AD_CFG_SPACE, PCI_BAR5, WDC_SIZE_32, WDC_READ_WRITE, "BADDR5", "Base Address 5" },
{ WDC_AD_CFG_SPACE, PCI_CIS, WDC_SIZE_32, WDC_READ_WRITE, "CIS", "CardBus CIS Pointer" },
{ WDC_AD_CFG_SPACE, PCI_SVID, WDC_SIZE_16, WDC_READ_WRITE, "SVID", "Sub-system Vendor ID" },
{ WDC_AD_CFG_SPACE, PCI_SDID, WDC_SIZE_16, WDC_READ_WRITE, "SDID", "Sub-system Device ID" },
{ WDC_AD_CFG_SPACE, PCI_EROM, WDC_SIZE_32, WDC_READ_WRITE, "EROM", "Expansion ROM Base Address" },
{ WDC_AD_CFG_SPACE, PCI_CAP, WDC_SIZE_8, WDC_READ_WRITE, "NEW_CAP", "New Capabilities Pointer" },
{ WDC_AD_CFG_SPACE, PCI_ILR, WDC_SIZE_32, WDC_READ_WRITE, "INTLN", "Interrupt Line" },
{ WDC_AD_CFG_SPACE, PCI_IPR, WDC_SIZE_32, WDC_READ_WRITE, "INTPIN", "Interrupt Pin" },
{ WDC_AD_CFG_SPACE, PCI_MGR, WDC_SIZE_32, WDC_READ_WRITE, "MINGNT", "Minimum Required Burst Period" },
{ WDC_AD_CFG_SPACE, PCI_MLR, WDC_SIZE_32, WDC_READ_WRITE, "MAXLAT", "Maximum Latency" },
};
#define PCI_CFG_REGS_NUM sizeof(gPCI_CfgRegs) / sizeof(WDC_REG)
/* TODO: For read-only or write-only registers, change the direction field of
the relevant registers in gPCI_CfgRegs to WDC_READ or WDC_WRITE. */
/* NOTE: You can define additional configuration registers in gPCI_CfgRegs. */
const WDC_REG *gpPCI_CfgRegs = gPCI_CfgRegs;
/* -----------------------------------------------
PCI run-time registers information
----------------------------------------------- */
/* Run-time registers information array */
/* const WDC_REG gPCI_Regs[]; */
const WDC_REG *gpPCI_Regs = NULL;
/* TODO: You can remove the comment from the gPCI_Regs array declaration and
fill the array with run-time registers information for your device,
in which case be sure to set gpPCI_Regs to point to gPCI_Regs. */
#define PCI_REGS_NUM 0
/*************************************************************
Static functions prototypes
*************************************************************/
/* -----------------------------------------------
Main diagnostics menu
----------------------------------------------- */
static void MenuMain(WDC_DEVICE_HANDLE *phDev);
static void TestMain(void);
static void Write_com(unsigned int command);
static void Write_word(unsigned int data);
static unsigned int Read_word(void);
/* -----------------------------------------------
Device find, open and close
----------------------------------------------- */
static WDC_DEVICE_HANDLE DeviceFindAndOpen(DWORD dwVendorId, DWORD dwDeviceId);
static BOOL DeviceFind(DWORD dwVendorId, DWORD dwDeviceId, WD_PCI_SLOT *pSlot);
static WDC_DEVICE_HANDLE DeviceOpen(const WD_PCI_SLOT *pSlot);
static void DeviceClose(WDC_DEVICE_HANDLE hDev);
/* -----------------------------------------------
Read/write memory and I/O addresses
----------------------------------------------- */
static void MenuReadWriteAddr(WDC_DEVICE_HANDLE hDev);
static void SetAddrSpace(WDC_DEVICE_HANDLE hDev, PDWORD pdwAddrSpace);
static void TestSequence(WDC_DEVICE_HANDLE hDev);
/* -----------------------------------------------
Read/write the configuration space
----------------------------------------------- */
static void MenuReadWriteCfgSpace(WDC_DEVICE_HANDLE hDev);
/* -----------------------------------------------
Read/write the run-time registers
----------------------------------------------- */
static void MenuReadWriteRegs(WDC_DEVICE_HANDLE hDev);
/* -----------------------------------------------
Interrupt handling
----------------------------------------------- */
static void MenuInterrupts(WDC_DEVICE_HANDLE hDev);
static void DiagIntHandler(WDC_DEVICE_HANDLE hDev, PCI_INT_RESULT *pIntResult);
/* ----------------------------------------------------
Plug-and-play and power management events handling
---------------------------------------------------- */
static void MenuEvents(WDC_DEVICE_HANDLE hDev);
static void DiagEventHandler(WDC_DEVICE_HANDLE hDev, DWORD dwAction);
/*************************************************************
Functions implementation
*************************************************************/
int main(void)
{
WDC_DEVICE_HANDLE hDev = NULL;
DWORD dwStatus;
printf("\n");
printf("PCI diagnostic utility.\n");
printf("Application accesses hardware using " WD_PROD_NAME ".\n");
/* Initialize the PCI library */
dwStatus = PCI_LibInit();
if (WD_STATUS_SUCCESS != dwStatus)
{
PCI_ERR("pci_diag: Failed to initialize the PCI library: %s",
PCI_GetLastErr());
return dwStatus;
}
/*---------------------------------------------------------------------*/
/*板卡测试部分*/
TestMain();
/*---------------------------------------------------------------------*/
/* Find and open a PCI device (by default ID) */
//if (PCI_DEFAULT_VENDOR_ID)
// hDev = DeviceFindAndOpen(PCI_DEFAULT_VENDOR_ID, PCI_DEFAULT_DEVICE_ID);
/* Display main diagnostics menu for communicating with the device */
//MenuMain(&hDev);
/* Perform necessary cleanup before exiting the program */
//if (hDev)
// DeviceClose(hDev);
/* End the test */
dwStatus = PCI_LibUninit();
if (WD_STATUS_SUCCESS != dwStatus)
PCI_ERR("pci_diag: Failed to uninit the PCI library: %s", PCI_GetLastErr());
return dwStatus;
}
/* -----------------------------------------------
Main diagnostics menu
----------------------------------------------- */
/* Main menu options */
enum {
MENU_MAIN_SCAN_PCI_BUS = 1,
MENU_MAIN_FIND_AND_OPEN,
MENU_MAIN_RW_ADDR,
MENU_MAIN_RW_CFG_SPACE,
MENU_MAIN_RW_REGS,
MENU_MAIN_ENABLE_DISABLE_INT,
MENU_MAIN_EVENTS,
MENU_MAIN_EXIT = DIAG_EXIT_MENU,
};
/* Main diagnostics menu */
static void MenuMain(WDC_DEVICE_HANDLE *phDev)
{
DWORD option;
do
{
printf("\n");
printf("PCI main menu\n");
printf("--------------\n");
printf("%d. Scan PCI bus\n", MENU_MAIN_SCAN_PCI_BUS);
printf("%d. Find and open a PCI device\n", MENU_MAIN_FIND_AND_OPEN);
if (*phDev)
{
printf("%d. Read/write memory and IO addresses on the device\n",
MENU_MAIN_RW_ADDR);
printf("%d. Read/write the device's configuration space\n",
MENU_MAIN_RW_CFG_SPACE);
if (PCI_REGS_NUM)
{
printf("%d. Read/write the run-time registers\n",
MENU_MAIN_RW_REGS);
}
printf("%d. Enable/disable the device's interrupts\n",
MENU_MAIN_ENABLE_DISABLE_INT);
printf("%d. Register/unregister plug-and-play and power management "
"events\n", MENU_MAIN_EVENTS);
}
printf("%d. Exit\n", MENU_MAIN_EXIT);
if (DIAG_INPUT_FAIL == DIAG_GetMenuOption(&option,
*phDev ? MENU_MAIN_EVENTS : MENU_MAIN_FIND_AND_OPEN))
{
continue;
}
switch (option)
{
case MENU_MAIN_EXIT: /* Exit menu */
break;
case MENU_MAIN_SCAN_PCI_BUS: /* Scan PCI bus */
WDC_DIAG_PciDevicesInfoPrintAll(FALSE);
break;
case MENU_MAIN_FIND_AND_OPEN: /* Find and open a PCI device */
if (*phDev)
DeviceClose(*phDev);
*phDev = DeviceFindAndOpen(0, 0);
break;
case MENU_MAIN_RW_ADDR: /* Read/write memory and I/O addresses */
MenuReadWriteAddr(*phDev);
break;
case MENU_MAIN_RW_CFG_SPACE: /* Read/Write the PCI configuration space */
MenuReadWriteCfgSpace(*phDev);
break;
case MENU_MAIN_RW_REGS: /* Read/write the run-time registers */
if (PCI_REGS_NUM)
MenuReadWriteRegs(*phDev);
else
printf("Invalid selection\n");
break;
case MENU_MAIN_ENABLE_DISABLE_INT: /* Enable/disable interrupts */
MenuInterrupts(*phDev);
break;
case MENU_MAIN_EVENTS: /* Register/unregister plug-and-play and power management events */
MenuEvents(*phDev);
break;
}
} while (MENU_MAIN_EXIT != option);
}
/* -----------------------------------------------
Device find, open and close
----------------------------------------------- */
/* Find and open a PCI device */
static WDC_DEVICE_HANDLE DeviceFindAndOpen(DWORD dwVendorId, DWORD dwDeviceId)
{
WD_PCI_SLOT slot;
if (!DeviceFind(dwVendorId, dwDeviceId, &slot))
return NULL;
return DeviceOpen(&slot);
}
/* Find a PCI device */
static BOOL DeviceFind(DWORD dwVendorId, DWORD dwDeviceId, WD_PCI_SLOT *pSlot)
{
DWORD dwStatus;
DWORD i, dwNumDevices;
WDC_PCI_SCAN_RESULT scanResult;
if (dwVendorId == 0)
{
if (DIAG_INPUT_SUCCESS != DIAG_InputDWORD((PVOID)&dwVendorId,
"Enter vendor ID", TRUE, 0, 0))
{
return FALSE;
}
if (DIAG_INPUT_SUCCESS != DIAG_InputDWORD((PVOID)&dwDeviceId,
"Enter device ID", TRUE, 0, 0))
{
return FALSE;
}
}
BZERO(scanResult);
dwStatus = WDC_PciScanDevices(dwVendorId, dwDeviceId, &scanResult);
if (WD_STATUS_SUCCESS != dwStatus)
{
PCI_ERR("DeviceFind: Failed scanning the PCI bus.\n"
"Error: 0x%lx - %s\n", dwStatus, Stat2Str(dwStatus));
return FALSE;
}
dwNumDevices = scanResult.dwNumDevices;
if (!dwNumDevices)
{
PCI_ERR("No matching device was found for search criteria "
"(Vendor ID 0x%lX, Device ID 0x%lX)\n",
dwVendorId, dwDeviceId);
return FALSE;
}
printf("\n");
printf("Found %ld matching device%s [ Vendor ID 0x%lX%s, Device ID 0x%lX%s ]:\n",
dwNumDevices, dwNumDevices > 1 ? "s" : "",
dwVendorId, dwVendorId ? "" : " (ALL)",
dwDeviceId, dwDeviceId ? "" : " (ALL)");
for (i = 0; i < dwNumDevices; i++)
{
printf("\n");
printf("%2ld. Vendor ID: 0x%lX, Device ID: 0x%lX\n",
i + 1,
scanResult.deviceId[i].dwVendorId,
scanResult.deviceId[i].dwDeviceId);
WDC_DIAG_PciDeviceInfoPrint(&scanResult.deviceSlot[i], FALSE);
}
printf("\n");
if (dwNumDevices > 1)
{
sprintf(gsInput, "Select a device (1 - %ld): ", dwNumDevices);
i = 0;
if (DIAG_INPUT_SUCCESS != DIAG_InputDWORD((PVOID)&i,
gsInput, FALSE, 1, dwNumDevices))
{
return FALSE;
}
}
*pSlot = scanResult.deviceSlot[i - 1];
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -