📄 pci_diag.c
字号:
MENU_RW_CFG_SPACE_READ_ALL_REGS,
MENU_RW_CFG_SPACE_READ_REG,
MENU_RW_CFG_SPACE_WRITE_REG,
MENU_RW_CFG_SPACE_EXIT = DIAG_EXIT_MENU,
};
/* Display read/write configuration space menu */
static void MenuReadWriteCfgSpace(WDC_DEVICE_HANDLE hDev)
{
DWORD option;
do {
/* Display pre-defined registers' information */
if (PCI_CFG_REGS_NUM)
{
printf("\n");
printf("Configuration registers:\n");
printf("------------------------\n");
WDC_DIAG_RegsInfoPrint(gpPCI_CfgRegs, PCI_CFG_REGS_NUM,
WDC_DIAG_REG_PRINT_ALL & ~WDC_DIAG_REG_PRINT_ADDR_SPACE);
}
printf("\n");
printf("Read/write the device's configuration space\n");
printf("--------------------------------------------\n");
printf("%d. Read from an offset\n", MENU_RW_CFG_SPACE_READ_OFFSET);
printf("%d. Write to an offset\n", MENU_RW_CFG_SPACE_WRITE_OFFSET);
if (PCI_CFG_REGS_NUM)
{
printf("%d. Read all configuration registers defined for the device (see list above)\n",
MENU_RW_CFG_SPACE_READ_ALL_REGS);
printf("%d. Read from a named register\n", MENU_RW_CFG_SPACE_READ_REG);
printf("%d. Write to a named register\n", MENU_RW_CFG_SPACE_WRITE_REG);
}
printf("%d. Exit menu\n", MENU_RW_CFG_SPACE_EXIT);
printf("\n");
if (DIAG_INPUT_FAIL == DIAG_GetMenuOption(&option,
PCI_CFG_REGS_NUM ? MENU_RW_CFG_SPACE_WRITE_REG :
MENU_RW_CFG_SPACE_WRITE_OFFSET))
{
continue;
}
switch (option)
{
case MENU_RW_CFG_SPACE_EXIT: /* Exit menu */
break;
case MENU_RW_CFG_SPACE_READ_OFFSET: /* Read from a configuration space offset */
WDC_DIAG_ReadWriteBlock(hDev, WDC_READ, WDC_AD_CFG_SPACE);
break;
case MENU_RW_CFG_SPACE_WRITE_OFFSET: /* Write to a configuration space offset */
WDC_DIAG_ReadWriteBlock(hDev, WDC_WRITE, WDC_AD_CFG_SPACE);
break;
case MENU_RW_CFG_SPACE_READ_ALL_REGS:
WDC_DIAG_ReadRegsAll(hDev, gpPCI_CfgRegs, PCI_CFG_REGS_NUM, TRUE);
break;
case MENU_RW_CFG_SPACE_READ_REG: /* Read from a configuration register */
WDC_DIAG_ReadWriteReg(hDev, gpPCI_CfgRegs, PCI_CFG_REGS_NUM, WDC_READ, TRUE);
break;
case MENU_RW_CFG_SPACE_WRITE_REG: /* Write to a configuration register */
WDC_DIAG_ReadWriteReg(hDev, gpPCI_CfgRegs, PCI_CFG_REGS_NUM, WDC_WRITE, TRUE);
break;
}
} while (MENU_RW_CFG_SPACE_EXIT != option);
}
/* -----------------------------------------------
Read/write the run-time registers
----------------------------------------------- */
/* Read/write the run-time registers menu options */
enum {
MENU_RW_REGS_READ_ALL = 1,
MENU_RW_REGS_READ_REG,
MENU_RW_REGS_WRITE_REG,
MENU_RW_REGS_EXIT = DIAG_EXIT_MENU,
};
/* Display read/write run-time registers menu */
static void MenuReadWriteRegs(WDC_DEVICE_HANDLE hDev)
{
DWORD option;
if (!PCI_REGS_NUM)
{
printf("There are currently no pre-defined run-time registers\n");
return;
}
do {
/* Display pre-defined registers' information */
printf("\n");
printf("PCI run-time registers:\n");
printf("--------------------------\n");
WDC_DIAG_RegsInfoPrint(gpPCI_Regs, PCI_REGS_NUM, WDC_DIAG_REG_PRINT_ALL);
printf("\n");
printf("Read/write the PCI run-time registers\n");
printf("-----------------------------------------\n");
printf("%d. Read all run-time registers defined for the device (see list above)\n",
MENU_RW_REGS_READ_ALL);
printf("%d. Read from a specific register\n", MENU_RW_REGS_READ_REG);
printf("%d. Write to a specific register\n", MENU_RW_REGS_WRITE_REG);
printf("%d. Exit menu\n", MENU_RW_REGS_EXIT);
printf("\n");
if (DIAG_INPUT_FAIL == DIAG_GetMenuOption(&option,
MENU_RW_REGS_WRITE_REG))
{
continue;
}
switch (option)
{
case MENU_RW_REGS_EXIT: /* Exit menu */
break;
case MENU_RW_REGS_READ_ALL:
WDC_DIAG_ReadRegsAll(hDev, gpPCI_Regs, PCI_REGS_NUM, FALSE);
break;
case MENU_RW_REGS_READ_REG: /* Read from a register */
WDC_DIAG_ReadWriteReg(hDev, gpPCI_Regs, PCI_REGS_NUM, WDC_READ, FALSE);
break;
case MENU_RW_REGS_WRITE_REG: /* Write to a register */
WDC_DIAG_ReadWriteReg(hDev, gpPCI_Regs, PCI_REGS_NUM, WDC_WRITE, FALSE);
break;
}
} while (MENU_RW_REGS_EXIT != option);
}
/* -----------------------------------------------
Interrupt handling
----------------------------------------------- */
/* Interrupts menu options */
enum {
MENU_INT_ENABLE_DISABLE = 1,
MENU_INT_EXIT = DIAG_EXIT_MENU,
};
/* Enable/Disable interrupts menu */
static void MenuInterrupts(WDC_DEVICE_HANDLE hDev)
{
DWORD option;
BOOL fIntEnable;
/* TODO: You can remove this message after you have modified the
implementation of PCI_IntEnable() in pci_lib.c to correctly
acknowledge the interrupts (see guidelines in PCI_IntEnable()) */
printf("\n");
printf("WARNING!!!\n");
printf("----------\n");
printf("Your hardware has level sensitive interrupts.\n");
printf("Before enabling the interrupts, you must first modify the source code\n"
"of PCI_IntEnable(), in the file pci_lib.c, to correctly acknowledge\n"
"interrupts when they occur (as dictated by the hardware's specifications)\n");
do
{
fIntEnable = !PCI_IntIsEnabled(hDev);
printf("\n");
printf("Interrupts\n");
printf("-----------\n");
printf("%d. %s interrupts\n", MENU_INT_ENABLE_DISABLE,
fIntEnable ? "Enable" : "Disable");
printf("%d. Exit menu\n", MENU_INT_EXIT);
printf("\n");
if (DIAG_INPUT_FAIL == DIAG_GetMenuOption(&option,
MENU_RW_ADDR_WRITE))
{
continue;
}
switch (option)
{
case MENU_INT_EXIT: /* Exit menu */
break;
case MENU_INT_ENABLE_DISABLE: /* Enable/disable interrupts */
if (fIntEnable)
{
if (WD_STATUS_SUCCESS == PCI_IntEnable(hDev, DiagIntHandler))
printf("Interrupts enabled\n");
else
PCI_ERR("Failed enabling interrupts: %s", PCI_GetLastErr());
}
else
{
if (WD_STATUS_SUCCESS == PCI_IntDisable(hDev))
printf("Interrupts disabled\n");
else
PCI_ERR("Failed disabling interrupts: %s", PCI_GetLastErr());
}
break;
}
} while (MENU_INT_EXIT != option);
}
/*------------------------Test the card-------------------------------*/
static void TestMain(void)
{
WDC_DEVICE_HANDLE hDev = NULL;
unsigned char NumDevice,NumAddr,ReadAdd,WriteAdd,i,k;
int keyd,skeyd,ErrTimes=0,Eeprom_data,j,write_delay;
BYTE bData=0,bData_temp;
UINT32 u32Data=0;
DWORD dwStatus;
int Data_tab[0x40]=
{0x9050,0x10b5,0x0680,0x0000,0x0000,0x0618,0x0000,0x0100,//0f
0xffff,0xfff0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,//1f
0x0000,0x0000,0x0000,0x0001,0x0000,0x0000,0x0000,0x0000,//2f
0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0001,//3f
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,//4f
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1103,//5f
0x1f60,0x9000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,//6f
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,//7f
};
WD_PCI_SLOT *pSlotWrite,*pSlotRead;
WDC_PCI_SCAN_RESULT scanResult;
WD_PCI_CARD_INFO deviceInfo;
WD_ITEMS Item;
printf("\n\n 板卡测试程序 \n\n");
BZERO(scanResult);
BZERO(deviceInfo);
if(WDC_PciScanDevices(0x10b5,0x9050,&scanResult)==0)
printf(" *************PCI初始化完成!**************\n\n");
else return;
NumDevice =(unsigned char) scanResult.dwNumDevices;
printf(" >>发现 %d 块PCI扩展卡\n",NumDevice);
//init
for(i=0;i<NumDevice;i++)
{
deviceInfo.pciSlot=scanResult.deviceSlot[i];//1表示第一块卡
WDC_PciGetDeviceInfo(&deviceInfo);
for(j=0;j<=4;j++)
{
Item = deviceInfo.Card.Item[j];
if((Item.item==2)&(Item.I.Mem.dwBar==2)) break;// memory bar2
}
//Item = deviceInfo.Card.Item[4]; //2表率M地址
fprintf(stdout," Card %d in Slot %d : [BAR %ld] base 0x%lX,size 0x%lX\n",
i+1,deviceInfo.pciSlot.dwSlot,Item.I.Mem.dwBar,
Item.I.Mem.dwPhysicalAddr,Item.I.Mem.dwBytes);
}
printf("\n >请选择读操作卡号:");scanf("%d",&keyd);
ReadAdd=keyd; if((keyd<0)||(keyd>NumDevice)) {printf("Error!");return;}
printf(" >请选择写操作卡号:");scanf("%d",&keyd);
WriteAdd=keyd; if((keyd<0)||(keyd>NumDevice)) {printf("Error!");return;}
printf(" >请选择测试地址范围(字节):");scanf("%d",&keyd);
NumAddr=keyd;
//--------------------===============
pSlotWrite=&scanResult.deviceSlot[WriteAdd-1];
pSlotRead =&scanResult.deviceSlot[ReadAdd-1];
hDev=DeviceOpen(pSlotRead);
WDC_WriteAddr32(hDev, 0, 0x28, 0x20);// 修改命令字
WDC_WriteAddr32(hDev, 0, 0x4c, 0x0103);
WDC_WriteAddr32(hDev, 0, 0x50, 0x17609000);
dwStatus=WDC_ReadAddr8(hDev, 2, 0, &bData);//初始化Cpld
DeviceClose(hDev);
hDev=DeviceOpen(pSlotWrite);
WDC_WriteAddr32(hDev, 0, 0x28, 0x20);// 修改命令字
WDC_WriteAddr32(hDev, 0, 0x4c, 0x0103);
WDC_WriteAddr32(hDev, 0, 0x50, 0x17609000);
dwStatus=WDC_ReadAddr8(hDev, 2, 0, &bData);//初始化Cpld
DeviceClose(hDev);
if(dwStatus==0)
printf("\n *************扩展卡初始化完成!**************\n");
else
printf("\n -------------扩展卡初始化错误!---------------\n");
printf("\n 1 监听中断模式\n");
printf(" 2 连续读写模式\n");
printf(" 3 自动检错模式\n");
printf(" 4 配置 EEprom \n");
printf(" 9 退出\n\n");
printf(" >请选择:");
scanf("%d",&keyd);
if(keyd==1)
{
hDev=DeviceOpen(pSlotRead);
while(getchar()!='9') //监听中断
{
printf(" >等待中----------------\n");
while(1)
{
WDC_ReadAddr32(hDev, 0, 0x4c, &u32Data);
if(u32Data&0x04)
{
for(i=0;i<NumAddr;i++)
{
dwStatus=WDC_ReadAddr8(hDev, 2, i, &bData);
if (WD_STATUS_SUCCESS == dwStatus)
{
printf("%s 0x%0*lX %s offset 0x%0*lX in BAR %ld \n",
(WDC_READ == 1) ? "Read" : "Write", 2,(UINT32)bData,
(WDC_READ == 1) ? "from" : " to ",2,i,2);
}
else
{
printf("Error1! (Read Error)\n");
return;
}
}
if(WDC_WriteAddr32(hDev, 0, 0x4c, (u32Data|0x400)))
{
printf("Error2! (Write Error)\n");
return;
}
break;
}
}
printf(" >回车键继续,输入 9 退出\n");
}
DeviceClose(hDev);
}
else if(keyd==2)
{
while(getchar()!='9')
{
for(i=0;i<NumAddr;i++)
{
hDev=DeviceOpen(pSlotWrite);
bData=rand()%0x100;
dwStatus=WDC_WriteAddr8(hDev, 2,i+((ReadAdd==WriteAdd)?4:0), bData);//连续写
if (WD_STATUS_SUCCESS == dwStatus)
{
printf("%s 0x%0*lX %s 0x%0*lX in BAR%ld of Card%d ",
(WDC_READ == 0) ? "Read" : "Write", 2,(UINT32)bData,
(WDC_READ == 0) ? "from" : "to",2,i+((ReadAdd==WriteAdd)?4:0), 2,WriteAdd);
}
DeviceClose(hDev);
hDev=DeviceOpen(pSlotRead);
dwStatus=WDC_ReadAddr8(hDev, 2, i, &bData); //连续读
if (WD_STATUS_SUCCESS == dwStatus)
{
printf("%s 0x%0*lX %s 0x%0*lX in BAR%ld of Card%d\n",
(WDC_READ == 1) ? "Read" : "Write", 2,(UINT32)bData,
(WDC_READ == 1) ? "from" : " to ",2,i, 2,ReadAdd);
}
DeviceClose(hDev);
}
printf(" >回车键继续,输入 9 退出\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -