home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / windr440.zip / windrive.zip / WinDriver / samples / shared / pci_diag_lib.c < prev    next >
C/C++ Source or Header  |  2000-03-30  |  9KB  |  308 lines

  1. ////////////////////////////////////////////////////////////////
  2. // File - PCI_DIAG_LIB.C
  3. //
  4. // Utility functions for printing card information,
  5. // detecting PCI cards, and accessing PCI configuration
  6. // registers.
  7. // 
  8. ////////////////////////////////////////////////////////////////
  9.  
  10. #include "../../include/windrvr.h"
  11. #ifdef _USE_SPECIFIC_KERNEL_DRIVER_
  12.     #undef WD_Open
  13.     #define WD_Open WD_OpenKernelHandle
  14.     #if defined(UNIX)
  15.         #undef WD_FUNCTION
  16.         #define WD_FUNCTION(wFuncNum,h,pParam,dwSize,fWait) \
  17.             ((ULONG) ioctl((int)(h), wFuncNum, pParam))
  18.     #endif
  19. #endif
  20. #include "pci_diag_lib.h"
  21. #include "print_struct.h"
  22. #include <stdio.h>
  23.  
  24. // input of command from user
  25. static char line[256];
  26.  
  27. BOOL PCI_Get_WD_handle(HANDLE *phWD)
  28. {
  29.     WD_VERSION ver;
  30.  
  31.     *phWD = WD_Open();
  32.  
  33.     // Check whether handle is valid and version OK
  34.     if (*phWD==INVALID_HANDLE_VALUE) 
  35.     {
  36.         printf("Failed opening " WD_PROD_NAME " device\n");
  37.         return FALSE;
  38.     }
  39.  
  40.     BZERO(ver);
  41.     WD_Version(*phWD,&ver);
  42.     if (ver.dwVer<WD_VER) 
  43.     {
  44.         printf("Incorrect " WD_PROD_NAME " version\n");
  45.         WD_Close (*phWD);
  46.         *phWD = INVALID_HANDLE_VALUE;
  47.         return FALSE;
  48.     }
  49.  
  50.     return TRUE;
  51. }
  52.  
  53. void PCI_Print_card_info(WD_PCI_SLOT pciSlot)
  54. {
  55.     HANDLE hWD;
  56.     WD_PCI_CARD_INFO pciCardInfo;
  57.  
  58.     if (!PCI_Get_WD_handle(&hWD))
  59.         return;
  60.  
  61.     BZERO(pciCardInfo);
  62.     pciCardInfo.pciSlot = pciSlot;
  63.     WD_PciGetCardInfo (hWD, &pciCardInfo);
  64.  
  65.     WD_CARD_print(&pciCardInfo.Card, "   ");
  66.  
  67.     WD_Close (hWD);
  68. }
  69.  
  70. void PCI_Print_all_cards_info() 
  71. {
  72.     HANDLE hWD;
  73.     int i;
  74.     WD_PCI_SCAN_CARDS pciScan;
  75.     WD_PCI_SLOT pciSlot;
  76.     WD_PCI_ID   pciId;
  77.  
  78.     if (!PCI_Get_WD_handle(&hWD)) 
  79.         return;
  80.  
  81.     BZERO(pciScan);
  82.     pciScan.searchId.dwVendorId = 0;
  83.     pciScan.searchId.dwDeviceId = 0;
  84.  
  85.     printf ("Pci bus scan:\n\n");
  86.     WD_PciScanCards (hWD,&pciScan);
  87.  
  88.     for (i=0; i<(int)pciScan.dwCards; i++)
  89.     {
  90.         CHAR tmp[100];
  91.         pciId = pciScan.cardId[i];
  92.         pciSlot = pciScan.cardSlot[i];
  93.         printf("Bus %d Slot %d Function %d, VendorID %04x DeviceID %04x\n",
  94.             pciSlot.dwBus, pciSlot.dwSlot, pciSlot.dwFunction, pciId.dwVendorId,
  95.             pciId.dwDeviceId);
  96.  
  97.         PCI_Print_card_info(pciSlot);
  98.         printf("Press Enter to continue to next slot\n");
  99.         gets (tmp);
  100.     }
  101.     WD_Close (hWD);
  102. }
  103.  
  104. DWORD PCI_ReadBytes(HANDLE hWD, WD_PCI_SLOT pciSlot, DWORD dwOffset, 
  105.     DWORD dwBytes)
  106. {
  107.     WD_PCI_CONFIG_DUMP pciCnf;
  108.     DWORD dwVal = 0;
  109.     
  110.     BZERO(pciCnf);
  111.     pciCnf.pciSlot = pciSlot;
  112.     pciCnf.pBuffer = &dwVal;
  113.     pciCnf.dwOffset = dwOffset;
  114.     pciCnf.dwBytes = dwBytes;
  115.     pciCnf.fIsRead = TRUE;
  116.     WD_PciConfigDump(hWD,&pciCnf);
  117.     return dwVal;
  118. }
  119.  
  120. void PCI_WriteBytes(HANDLE hWD, WD_PCI_SLOT pciSlot, DWORD dwOffset, 
  121.     DWORD dwBytes, DWORD dwData)
  122. {
  123.     WD_PCI_CONFIG_DUMP pciCnf;
  124.     
  125.     BZERO(pciCnf);
  126.     pciCnf.pciSlot = pciSlot;
  127.     pciCnf.pBuffer = &dwData;
  128.     pciCnf.dwOffset = dwOffset;
  129.     pciCnf.dwBytes = dwBytes;
  130.     pciCnf.fIsRead = FALSE;
  131.     WD_PciConfigDump(hWD,&pciCnf);
  132. }
  133.  
  134. void PCI_EditConfigReg(WD_PCI_SLOT pciSlot)
  135. {
  136.     HANDLE hWD;
  137.     struct 
  138.     {
  139.         CHAR *name;
  140.         DWORD dwOffset;
  141.         DWORD dwBytes;
  142.         DWORD dwVal;
  143.     } fields[30];
  144.  
  145.     int cmd;
  146.     int i;
  147.  
  148.     if (!PCI_Get_WD_handle (&hWD)) 
  149.         return;
  150.  
  151.     i = 0;
  152.     fields[i].name = "VID"; fields[i].dwOffset = 0x0; fields[i++].dwBytes = 2;
  153.     fields[i].name = "DID"; fields[i].dwOffset = 0x2; fields[i++].dwBytes = 2;
  154.     fields[i].name = "CMD"; fields[i].dwOffset = 0x4; fields[i++].dwBytes = 2;
  155.     fields[i].name = "STS"; fields[i].dwOffset = 0x6; fields[i++].dwBytes = 2;
  156.     fields[i].name = "RID"; fields[i].dwOffset = 0x8; fields[i++].dwBytes = 1;
  157.     fields[i].name = "CLCD"; fields[i].dwOffset = 0x9; fields[i++].dwBytes = 3;
  158.     fields[i].name = "CALN"; fields[i].dwOffset = 0xc; fields[i++].dwBytes = 1;
  159.     fields[i].name = "LAT"; fields[i].dwOffset = 0xd; fields[i++].dwBytes = 1;
  160.     fields[i].name = "HDR"; fields[i].dwOffset = 0xe; fields[i++].dwBytes = 1;
  161.     fields[i].name = "BIST"; fields[i].dwOffset = 0xf; fields[i++].dwBytes = 1;
  162.     fields[i].name = "BADDR0"; fields[i].dwOffset = 0x10; fields[i++].dwBytes = 4;
  163.     fields[i].name = "BADDR1"; fields[i].dwOffset = 0x14; fields[i++].dwBytes = 4;
  164.     fields[i].name = "BADDR2"; fields[i].dwOffset = 0x18; fields[i++].dwBytes = 4;
  165.     fields[i].name = "BADDR3"; fields[i].dwOffset = 0x1c; fields[i++].dwBytes = 4;
  166.     fields[i].name = "BADDR4"; fields[i].dwOffset = 0x20; fields[i++].dwBytes = 4;
  167.     fields[i].name = "BADDR5"; fields[i].dwOffset = 0x24; fields[i++].dwBytes = 4;
  168.     fields[i].name = "EXROM"; fields[i].dwOffset = 0x30; fields[i++].dwBytes = 4;
  169.     fields[i].name = "INTLN"; fields[i].dwOffset = 0x3c; fields[i++].dwBytes = 1;
  170.     fields[i].name = "INTPIN"; fields[i].dwOffset = 0x3d; fields[i++].dwBytes = 1;
  171.     fields[i].name = "MINGNT"; fields[i].dwOffset = 0x3e; fields[i++].dwBytes = 1;
  172.     fields[i].name = "MAXLAT"; fields[i].dwOffset = 0x3f; fields[i++].dwBytes = 1;
  173.     fields[i].name = NULL; fields[i].dwOffset = 0; fields[i++].dwBytes = 0;
  174.     fields[i].name = NULL; fields[i].dwOffset = 0; fields[i++].dwBytes = 0;
  175.     do
  176.     {
  177.         int row;
  178.         int col;
  179.  
  180.         printf ("\n");
  181.         printf ("Edit PCI configuration registers\n");
  182.         printf ("--------------------------------\n");
  183.         for (row = 0; row<=10; row++)
  184.         {
  185.             for (col = 0; col <=1; col++)
  186.             {
  187.                 if (col==0) i = row;
  188.                 else i = row + 10;
  189.  
  190.                 if (row==10 && col==0)
  191.                 {
  192.                     printf("%26s","");
  193.                 }
  194.                 else
  195.                 {
  196.                     DWORD dwVal;
  197.                     dwVal = PCI_ReadBytes(hWD, pciSlot, fields[i].dwOffset, 
  198.                         fields[i].dwBytes);
  199.                     fields[i].dwVal = dwVal;
  200.                     printf ("%2d. %6s : %0*x %*s    ",i+1, fields[i].name, 
  201.                         fields[i].dwBytes*2, fields[i].dwVal, 
  202.                         8-fields[i].dwBytes*2, "");
  203.                 }
  204.                 if (col==1) printf ("\n");
  205.             }
  206.         }
  207.  
  208.         printf ("99. Back to main menu\n");
  209.         printf ("Choose register to read from / write to, or 99 to exit: ");
  210.         cmd = 0;
  211.         gets(line);
  212.         sscanf(line, "%d",&cmd);
  213.         if (cmd>=1 && cmd <=21)
  214.         {
  215.             i = cmd-1;
  216.             printf ("Enter value to write to %s register (or 'X' to cancel): ",
  217.                 fields[i].name);
  218.             gets (line);
  219.             if (toupper (line[0])!='X')
  220.             {
  221.                 DWORD dwVal;
  222.                 dwVal = 0;
  223.                 sscanf(line,"%x",&dwVal);
  224.                 if ((dwVal>0xff && fields[i].dwBytes==1)|| 
  225.                     (dwVal>0xffff && fields[i].dwBytes==2)|| 
  226.                     (dwVal>0xffffff && fields[i].dwBytes==3))
  227.                 {
  228.                     printf ("Error: value to big for register\n");
  229.                 }
  230.                 else
  231.                 {
  232.                     PCI_WriteBytes(hWD, pciSlot, fields[i].dwOffset, 
  233.                         fields[i].dwBytes, dwVal);
  234.                 }
  235.             }
  236.         }
  237.     } while (cmd!=99);
  238.  
  239.     WD_Close (hWD);
  240. }
  241.  
  242. BOOL PCI_ChooseCard(WD_PCI_SLOT *ppciSlot)
  243. {
  244.     BOOL fHasCard;
  245.     WD_PCI_SCAN_CARDS pciScan;
  246.     DWORD dwVendorID, dwDeviceID;
  247.     HANDLE hWD;
  248.     DWORD i;
  249.  
  250.     if (!PCI_Get_WD_handle (&hWD)) 
  251.         return FALSE;
  252.  
  253.     fHasCard = FALSE;
  254.  
  255.     for (;!fHasCard;) 
  256.     {
  257.         dwVendorID = 0;
  258.         printf ("Enter VendorID: ");
  259.         gets (line);
  260.         sscanf (line, "%x",&dwVendorID);
  261.         if (dwVendorID==0) 
  262.             break;
  263.  
  264.         printf ("Enter DeviceID: ");
  265.         gets (line);
  266.         sscanf (line, "%x",&dwDeviceID);
  267.  
  268.         BZERO(pciScan);
  269.         pciScan.searchId.dwVendorId = dwVendorID;
  270.         pciScan.searchId.dwDeviceId = dwDeviceID;
  271.         WD_PciScanCards (hWD, &pciScan);
  272.         if (pciScan.dwCards==0) // Find at least one card
  273.         {
  274.             printf("Could not find PCI card\n");
  275.         }
  276.         else if (pciScan.dwCards==1)
  277.         {
  278.             *ppciSlot = pciScan.cardSlot[0];
  279.             fHasCard = TRUE;
  280.         }
  281.         else
  282.         {
  283.             printf("Found %d matching PCI cards\n", pciScan.dwCards);
  284.             printf("Select card (1-%d): ", pciScan.dwCards);
  285.             i = 0;
  286.             gets (line);
  287.             sscanf (line, "%d",&i);
  288.             if (i>=1 && i <=pciScan.dwCards)
  289.             {
  290.                 *ppciSlot = pciScan.cardSlot[i-1];
  291.                 fHasCard = TRUE;
  292.             }
  293.             else printf ("Choice out of range\n");
  294.         }
  295.         if (!fHasCard)
  296.         {
  297.             printf ("Do you want to try a different VendorID/DeviceID? ");
  298.             gets (line);
  299.             if (toupper(line[0])!='Y')
  300.                 break;
  301.         }
  302.     }
  303.  
  304.     WD_Close (hWD);
  305.  
  306.     return fHasCard;
  307. }
  308.