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

📄 pci_diag.c

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