Ejemplo n.º 1
0
Archivo: init.c Proyecto: basecq/q2dos
/*-------------------------------------------------------------------
  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 */
Ejemplo n.º 2
0
//----------------------------------------------------------------------
// 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;
}