⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci_diag.c

📁 PlX9052 调试程序(包括Eeprom配置)
💻 C
📖 第 1 页 / 共 4 页
字号:
	}
    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 + -