/*------------------------------------------------------------------- Function: initClose Date: 10/17 Implementor(s): jdt Library: init Description: Unmap all hardware and set library to unitialized state Arguments: none Return: none -------------------------------------------------------------------*/ void initClose( void ) { if ( libInitialized ) { unsigned i; for ( i = 0; i < numDevicesInSystem; i++ ) { /* Insert unmap code here */ /* FIXME!!!! */ } pciClose(); libInitialized = FXFALSE; } } /* initClose */
//---------------------------------------------------------------------- // MAIN Program //---------------------------------------------------------------------- int main(int argc, char **argv) { // FxU32 vendorID = 0x1002; // ATI // FxU32 deviceID = 0x4758; // Mach64 int configSpace = 0, loop = 0; FxU32 vendorID = _3DFX_PCI_ID; // 3Dfx FxU32 deviceID = 0xFFFF; // any card FxI32 sizeOfCard = 0x1000000; // 16 Mbytes FxU32 deviceNumber; FxU32 instance = 0; FxU32 *sst, addr,data; CmdCode cmd = CMD_SCAN; //------------------------------------------------------------------ // parse the command line while (--argc > 0 && **++argv == '-') { char *token, *ctmp; for (token = argv[0] + 1; *token; token++) switch (*token) { case '?': usage(); break; case 'b': // set the baseAddress of the card to this value sscanf(GETARG,"%i",&addr); cmd = CMD_BASE; break; case 'c': configSpace = 1; break; case 'd': // override default deviceID sscanf(GETARG,"%i",&deviceID); break; case 'i': // override default instance sscanf(GETARG,"%i",&instance); break; case 'l': loop = 1; break; case 'r': cmd = CMD_READ; sscanf(GETARG,"%i",&addr); break; case 's': cmd = CMD_STATUS; break; case 'v': // override default deviceID sscanf(GETARG,"%i",&vendorID); break; case 'w': cmd = CMD_WRITE; sscanf(GETARG,"%i",&addr); sscanf(GETARG,"%i",&data); break; default: fprintf(stderr,"illegal option %c\n", *token); break; } } if (argc > 2) usage(); if (argc > 0) { sscanf(argv[0],"%i",&addr); if (argc > 1) { cmd = CMD_WRITE; sscanf(argv[1],"%i",&data); } else cmd = CMD_READ; } // if scanning or status, then do it and exit. if (cmd == CMD_SCAN) { cmdScan(); return 0; } if (cmd == CMD_STATUS) { // display PCI status if (pciFindCard(vendorID, deviceID, &deviceNumber)) cmdStatus(deviceNumber, vendorID == _3DFX_PCI_ID); else { fprintf(stderr, "error: could not find card 0x%04x,0x%04x.\n", vendorID, deviceID); exit(2); } return 0; } if (cmd == CMD_BASE) sizeOfCard = -1; // hack //------------------------------------------------------------------ // find and map the card into virtual memory //sst = pciMapCard(vendorID,deviceID,sizeOfCard, &deviceNumber); sst = pciMapCardMulti(vendorID,deviceID,sizeOfCard, &deviceNumber, instance, 0); if (sst == NULL) { fprintf(stderr, "error: could not find card 0x%04x,0x%04x.\n", vendorID, deviceID); exit(2); } //------------------------------------------------------------------ // execute the requested action switch(cmd) { case CMD_BASE: // change the base address of the card pciSetConfigData( PCI_BASE_ADDRESS_0, deviceNumber, &addr ); break; case CMD_READ: // read a DWORD if (addr & 0x3) { fprintf(stderr,"unaligned accesses NYI, addr=0x%x\n",addr); exit(4); } addr >>= 2; // make it a dword index data = sst[addr]; fprintf(stdout,"read 0x%08x(%d) from 0x%x\n",data,data,addr<<2); while (loop) data = sst[addr]; break; case CMD_WRITE: // write a DWORD if (addr & 0x3) { fprintf(stderr,"unaligned accesses NYI, addr=0x%x\n",addr); exit(4); } if (configSpace) { int i; for (i=0; i<sizeof(pciRegArray)/sizeof(*pciRegArray); i++) { if (pciRegArray[i]->regAddress == addr) { if (pciRegArray[i]->rwFlag == READ_ONLY) { fprintf(stderr,"cannot write READ_ONLY address\n"); exit(5); } pciSetConfigData( *pciRegArray[i], deviceNumber, &data ); goto found; } } fprintf(stderr,"config address register 0x%x descriptor not found\n",addr); exit(6); found: ; } else { addr >>= 2; // make it a dword index do {sst[addr] = data;} while (loop); } break; default: usage(); } //---------------------------------------------------------------------- // cleanup: unmap the card, close down the PCI bus and return pciUnmapPhysical( (unsigned long)sst, sizeOfCard ); if ( !pciClose() ) { fprintf(stderr, pciGetErrorString()); exit(3); } return 0; }