📄 pci_diag.c
字号:
}
else if(keyd==3)
{
printf(" >运行中----------------\n");
while(1)
{
for(i=0;i<2;i++)
{
hDev=DeviceOpen(pSlotWrite);
bData=rand()%0x100;
dwStatus=WDC_WriteAddr8(hDev, 2,i+4, bData);//连续写
DeviceClose(hDev);
hDev=DeviceOpen(pSlotRead);
dwStatus=WDC_ReadAddr8(hDev, 2, i+2, &bData_temp); //连续读
DeviceClose(hDev);
if(bData!=bData_temp)
{
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+4, 2,WriteAdd);
printf("%s 0x%0*lX %s 0x%0*lX in BAR%ld of Card%d\n",
(WDC_READ == 1) ? "Read" : "Write", 2,(UINT32)bData_temp,
(WDC_READ == 1) ? "from" : " to ",2,i+2, 2,ReadAdd);
if(++ErrTimes%20==0)
{
printf("Error3! (Verify Error)\n");
printf("The totale error times=%d\n\n",ErrTimes);
return;
}
}
}
//printf(" >回车键继续,输入 9 退出\n");
}
}
else if(keyd==4)
{
hDev=DeviceOpen(pSlotRead);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //CS=0
bData&=0xFD;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //CS选中
bData|=0x02;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
printf("\n");
printf(" 1 读配置芯片\n");
printf(" 2 写配置芯片\n");
printf(" 9 退出\n\n");
printf(" >请选择:");
scanf("%d",&skeyd);
if(skeyd==1)
{
Eeprom_data=0x180|0x00;//comand read
for(i=0;i<9;i++)
{
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //din=x
bData=(((Eeprom_data<<i)&0x0100)==0)?(bData&0xFB):(bData|0x04);
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
}
for(k=0;k<0x40;k++)
{
Eeprom_data=0;//读
for(i=0;i<16;i++)
{
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData);
Eeprom_data<<=1;
Eeprom_data+=((bData&0x08)==0)?0:1;
}
if(k%8==0)
{
printf("\n 0x%2x: ",k*2);
}
printf("0x%4x,",Eeprom_data);
}
printf("\n");
}
else if(skeyd==2)
{
Eeprom_data=0x130;//comand write_en
for(i=0;i<9;i++)
{
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //din=x
bData=(((Eeprom_data<<i)&0x0100)==0)?(bData&0xFB):(bData|0x04);
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
}
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //CS=0
bData&=0xFD;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //CS选中
bData|=0x02;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
printf(" >请输入板卡编号:");
scanf("%x",&Eeprom_data);
Data_tab[4]=Eeprom_data|0xA000;
for(k=0;k<0x40;k++)
{
Eeprom_data=0x140|k;//comand Write
for(i=0;i<9;i++)
{
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //din=x
bData=(((Eeprom_data<<i)&0x0100)==0)?(bData&0xFB):(bData|0x04);
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<2000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<2000;j++);//delay
}
Eeprom_data=Data_tab[k];//写
for(i=0;i<16;i++)
{
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //din=x
bData=(((Eeprom_data<<i)&0x8000)==0)?(bData&0xFB):(bData|0x04);
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<2000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<2000;j++);//delay
}
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //CS=0
bData&=0xFD;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<2000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(write_delay=0;write_delay<10;write_delay++)
{
for(j=0;j<60000;j++);//delay
}
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //CS选中
bData|=0x02;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
if(k%8==0)
{
printf("\n 0x%2x: ",k*2);
}
printf("0x%4x,",Eeprom_data);
}
printf("\n");
}
else ;
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=0
bData&=0xFE;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //CS选中
bData&=0xFD;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
for(j=0;j<1000;j++);//delay
WDC_ReadAddr8(hDev, 0, 0x53, &bData); //clk=1
bData|=0x01;
WDC_WriteAddr8(hDev, 0, 0x53, bData);
DeviceClose(hDev);
}
else
{
printf("\n ------------- 测试安全退出! ---------------\n");
}
//con
};
/***********************************************************/
static void Write_com(unsigned int command)
{
};
static void Write_word(unsigned int data)
{
};
static unsigned int Read_word(void)
{
};
/* Diagnostics interrupt handler routine */
static void DiagIntHandler(WDC_DEVICE_HANDLE hDev, PCI_INT_RESULT *pIntResult)
{
/* TODO: You can modify this function in order to implement your own
diagnostics interrupt handler routine */
printf("Got interrupt number %ld\n", pIntResult->dwCounter);
}
/* ----------------------------------------------------
Plug-and-play and power management events handling
---------------------------------------------------- */
/* Events menu options */
enum {
MENU_EVENTS_REGISTER_UNREGISTER = 1,
MENU_EVENTS_EXIT = DIAG_EXIT_MENU,
};
/* Register/unregister Plug-and-play and power management events */
static void MenuEvents(WDC_DEVICE_HANDLE hDev)
{
DWORD option;
BOOL fRegister;
do
{
fRegister = !PCI_EventIsRegistered(hDev);
printf("\n");
printf("Plug-and-play and power management events\n");
printf("------------------------------------------\n");
printf("%d. %s events\n", MENU_EVENTS_REGISTER_UNREGISTER,
fRegister ? "Register" : "Unregister");
printf("%d. Exit menu\n", MENU_EVENTS_EXIT);
printf("\n");
if (DIAG_INPUT_FAIL == DIAG_GetMenuOption(&option,
MENU_EVENTS_REGISTER_UNREGISTER))
{
continue;
}
switch (option)
{
case MENU_EVENTS_EXIT: /* Exit menu */
break;
case MENU_EVENTS_REGISTER_UNREGISTER: /* Register/unregister events */
if (fRegister)
{
if (WD_STATUS_SUCCESS == PCI_EventRegister(hDev, DiagEventHandler))
printf("Events registered\n");
else
PCI_ERR("Failed to register events. Last error:\n%s", PCI_GetLastErr());
}
else
{
if (WD_STATUS_SUCCESS == PCI_EventUnregister(hDev))
printf("Events unregistered\n");
else
PCI_ERR("Failed to unregister events. Last Error:\n%s", PCI_GetLastErr());
}
break;
}
} while (MENU_EVENTS_EXIT != option);
}
/* Plug-and-play and power management events handler routine */
static void DiagEventHandler(WDC_DEVICE_HANDLE hDev, DWORD dwAction)
{
/* TODO: You can modify this function in order to implement your own
diagnostics events handler routine */
printf("\nReceived event notification (device handle 0x%p): ", hDev);
switch (dwAction)
{
case WD_INSERT:
printf("WD_INSERT\n");
break;
case WD_REMOVE:
printf("WD_REMOVE\n");
break;
case WD_POWER_CHANGED_D0:
printf("WD_POWER_CHANGED_D0\n");
break;
case WD_POWER_CHANGED_D1:
printf("WD_POWER_CHANGED_D1\n");
break;
case WD_POWER_CHANGED_D2:
printf("WD_POWER_CHANGED_D2\n");
break;
case WD_POWER_CHANGED_D3:
printf("WD_POWER_CHANGED_D3\n");
break;
case WD_POWER_SYSTEM_WORKING:
printf("WD_POWER_SYSTEM_WORKING\n");
break;
case WD_POWER_SYSTEM_SLEEPING1:
printf("WD_POWER_SYSTEM_SLEEPING1\n");
break;
case WD_POWER_SYSTEM_SLEEPING2:
printf("WD_POWER_SYSTEM_SLEEPING2\n");
break;
case WD_POWER_SYSTEM_SLEEPING3:
printf("WD_POWER_SYSTEM_SLEEPING3\n");
break;
case WD_POWER_SYSTEM_HIBERNATE:
printf("WD_POWER_SYSTEM_HIBERNATE\n");
break;
case WD_POWER_SYSTEM_SHUTDOWN:
printf("WD_POWER_SYSTEM_SHUTDOWN\n");
break;
default:
printf("0x%lx\n", dwAction);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -