예제 #1
0
void FAR USBDStrategy()
{
   RPH        far  *pRP;
   USHORT       Cmd;

   _asm
   {
      mov word ptr pRP[0], bx
      mov word ptr pRP[2], es
   }

   Cmd = pRP->Cmd;
#ifdef DEBUG
   dsPrint1( DBG_HLVLFLOW, "USBD: USBDStrategy: Cmd = %x\r\n", Cmd );
#endif

   if (Cmd > MAX_USB_CMD)
   {
      CmdError( pRP );
   }
   else
   {
      /*---------------------*/
      /* Call Worker Routine */
      /*---------------------*/
      (*gStratList[Cmd])(pRP);
   }
#ifdef DEBUG
   dsPrint1( DBG_HLVLFLOW, "USBD: USBDStrategy: Exit: Cmd = %x\r\n", Cmd );
#endif

}
예제 #2
0
void far GameStrategy()
{
   PRPH     pRP;  // Pointer to Request Packet (Header)
   UCHAR    Cmd;  // strategy Command

   _asm
   {  // Strategy routine is called with ES:BX pointing to the Request Packet
      mov   word ptr pRP[0], bx
      mov   word ptr pRP[2], es
   }
   /*
      Request Packet Status field is defined only for Open and Close request packets
      on entry to the Strategy routine (is 0). For all other request packets,
      the Status field is undefined on entry.
   */
   pRP->Status = 0;
   Cmd = pRP->Cmd;

  #ifdef DEBUG
    dsPrint2 (DBG_HLVLFLOW, "GENGAME: Strategy Cmd=%x unit=%x\r\n", Cmd, pRP->Unit);
  #endif

   if (Cmd > CMDInitComplete)
     CmdError (pRP);
   else
     (*gStratList[Cmd])(pRP);

   pRP->Status |= STDON;

  #ifdef DEBUG
    dsPrint1 (DBG_HLVLFLOW, "GENGAME: Strategy S=%x\r\n", pRP->Status);
  #endif
}
예제 #3
0
void CmdError (PRPH pRP)
{
  #ifdef DEBUG
    dsPrint1 (DBG_CRITICAL, "GENGAME: CmdError=%x\r\n", pRP->Cmd);
  #endif

   pRP->Status = STDON | STERR | ERROR_I24_BAD_COMMAND;
}
예제 #4
0
/************************ END OF SPECIFICATIONS ***********************/
void CmdError( RPH FAR *pRP)
{
#ifdef DEBUG
   dsPrint1( DBG_CRITICAL, "USBD: CmdError - Strategy Command = %d\r\n", pRP->Cmd );
#endif

   pRP->Status = STDON + STERR + ERROR_I24_BAD_COMMAND;
   return;
}
예제 #5
0
void USBInitComplete (RPH FAR *pRP)
{
   //LR0612begin
#ifdef DEBUG
   dsPrint1 (DBG_HLVLFLOW, "USBD: USBInitComplete start=%x\r\n", gDelayHostStart);
#endif
   
   if (gDelayHostStart)
   {  // delayed host start
//LR0831      gDelayHostStart = FALSE;
      DevHelp_ArmCtxHook (0, gStartHostHookHandle);
   }
   //LR0612end
   USBAPMRegister(); // 01/20/2000 MB - added to support APM

   pRP->Status = STATUS_DONE;

#ifdef DEBUG
   dsPrint1( DBG_HLVLFLOW, "USBD: USBInitComplete Rc=%x\r\n",pRP->Status );
#endif

   return;
}
예제 #6
0
void IRQSwitch (PRP_GENIOCTL pRP)
{
   USBRB  FAR *pRB = (USBRB FAR *)pRP->ParmPacket;
   SHORT  DevIndex =  (SHORT)pRB->requestData2;
   USHORT awakeCount=0;
   USHORT rc;

#ifdef DEBUG
   dsPrint4 (DBG_IRQFLOW, "USBRESMGR: IRQ %x from Dev[%x], S=%x, s=%x\r\n",
             pRB->requestData1, DevIndex, pRP->rph.Status, pRB->status);
#endif
  switch (pRB->requestData1)
  {
    case RES_IRQ_STRINGLEN:
      GetStringD(DevIndex,pRB->requestData3);
      break;
    case RES_IRQ_STRING:
    case RES_IRQ_CONTROL:
    case RES_IRQ_RWIRQ:
#ifdef DEBUG
   dsPrint1 (DBG_IRQFLOW, "USBRESMGR: IRQ Unblock %x\r\n",
             pRB->requestData3);
#endif
      pRB->requestData1 = RES_IRQ_PROCESSED;
      //DevHelp_Beep(440,100);
      rc = DevHelp_ProcRun(pRB->requestData3,&awakeCount);
#ifdef DEBUG
   dsPrint2 (DBG_IRQFLOW, "USBRESMGR: IRQ Unblock rc=%x, Thread Count = %d\r\n",
             rc, awakeCount);
#endif
      break;
    case RES_IRQ_RWBULK:
      gusCheck++;
      DataRW(pRP);
      break;

    case RES_IRQ_GETDESC:
      break;
  }
}
예제 #7
0
static void IrqRW (PRP_GENIOCTL pRP)
{
  USBRB  FAR *pRB    = (USBRB FAR *)pRP->ParmPacket;
  USHORT usToggleGrp = (pRB->flags &USRB_FLAGS_TTYPE_IN)?0:1;
  PUSB_IORB  pIoRB   = (PUSB_IORB)pRB->requestData2;
  USHORT rc;
  UCHAR  ucEndpoint  = pRB->endPointId &DEV_ENDPT_ADDRMASK;
  USHORT usToggleBit = 1<< ucEndpoint;
  PLIBUSB_IRQ_DATA pIrqData;

#ifdef DEBUG
  dsPrint2 ( DBG_DETAILED, 
            "USBRESMGR: IrqRW to Device[%x], L=%x\r\n",
            pIoRB->pDevice, pRB->buffer1Length);
  dsPrint4 ( DBG_IRQFLOW,
             "USBRESMGR: Endpoint %d Toggle Group %d, Value %0x UpdateBit %0x\r\n",
             pRB->endPointId &DEV_ENDPT_ADDRMASK,
             usToggleGrp,
             pIoRB->pDevice->wToggle[usToggleGrp],
             usToggleBit);
#endif
  // Safty check that the RB wasn't freed and re used while the USB transaction was done
  if (pIoRB->ulID != pRB->requestData3)
  {
    return;
  }

  if(DevHelp_PhysToGDTSelector(pIoRB->pPhysData,
	                           sizeof(LIBUSB_BULK_REQ),
	                           gSelIoRB[SEL_IRQ]))
  {
    DevHelp_Beep(4400,500);
    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);
    return;
  }

  pIrqData = MAKEP(gSelIoRB[SEL_BULK], NULL);

  if (pRP->rph.Status == USB_IDC_RC_IOFAILED)
  {
    DevHelp_Beep(440,500);
    #ifdef DEBUG
      dsPrint1 (DBG_DETAILED, "USBRESMGR: IO failed Status = %d\r\n",
                pRB->status);
    #endif
    if (pRB->status & USRB_STATUS_STALLED)
    {
      ClearStalled (pIoRB->pDevice, ucEndpoint);
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
      pIrqData->usStatus = USB_IORB_STALLED;
    }
    else
      pIrqData->usStatus = USB_IORB_FAILED;

    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);

  }
  else
  {
    // No I/O Errors
    BOOL fChanged=FALSE;
    UCHAR i;

    if (! (pRB->flags & USRB_FLAGS_DET_DTGGLEON))
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Set Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
    }
    else
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Clear Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  &= ~usToggleBit;
    }
    #ifdef DEBUG
      dsPrint1 ( DBG_DETAILED, "USBRESMGR: New Toggle Value %0x\r\n",
                 pIoRB->pDevice->wToggle[usToggleGrp] );
    #endif
    
    for(i = 0; i < pRB->buffer1Length; i++)
    {
      if(pIrqData->ucBufferCurrent[i] != pIrqData->ucBufferLast[i])
        fChanged = TRUE;
      pIrqData->ucBufferCurrent[i] = pIrqData->ucBufferLast[i];
    }
    if(fChanged || pIrqData->usRes==0)
    {
      pIrqData->usRes = 1;
      if(DevHelp_OpenEventSem (pIrqData->ulEventChanged) == 0)  
      {
        DevHelp_PostEventSem (pIrqData->ulEventChanged);
        DevHelp_CloseEventSem (pIrqData->ulEventChanged);
      }
    }
    #ifdef DEBUG
      dsPrint (DBG_DETAILED, "USBRESMGR: Next Buffer\r\n");
    #endif
    ProcessIoRB(pIoRB);
  }
}
예제 #8
0
static void DataRW (PRP_GENIOCTL pRP)
{
  USBRB  FAR *pRB  = (USBRB FAR *)pRP->ParmPacket;
  USHORT usToggleGrp =  (pRB->flags &USRB_FLAGS_TTYPE_IN)?0:1;
  PUSB_IORB  pIoRB = (PUSB_IORB)pRB->requestData2;
  USHORT rc;
  UCHAR  ucEndpoint  = pRB->endPointId &DEV_ENDPT_ADDRMASK;
  USHORT usToggleBit = 1<< ucEndpoint;
  PLIBUSB_BULK_REQ pBulkReq;

#ifdef DEBUG
  dsPrint2 ( DBG_DETAILED, 
            "USBRESMGR: DataRW to Device[%x], L=%x\r\n",
            pIoRB->pDevice, pRB->buffer1Length);
  dsPrint4 ( DBG_IRQFLOW,
             "USBRESMGR: Endpoint %d Toggle Group %d, Value %0x UpdateBit %0x\r\n",
             pRB->endPointId &DEV_ENDPT_ADDRMASK,
             usToggleGrp,
             pIoRB->pDevice->wToggle[usToggleGrp],
             usToggleBit);
#endif
  // Safty check that the RB wasn't freed and re used while the USB transaction was done
  if (pIoRB->ulID != pRB->requestData3)
  {
    DevHelp_Beep(2200,200);
    return;
  }

  if(DevHelp_PhysToGDTSelector(pIoRB->pPhys,
	                           sizeof(LIBUSB_BULK_REQ),
	                           gSelIoRB[SEL_BULK]))
  {
    DevHelp_Beep(4400,500);
    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);
    return;
  }

  pBulkReq = MAKEP(gSelIoRB[SEL_BULK], NULL);

  if (pRP->rph.Status == USB_IDC_RC_IOFAILED)
  {
    DevHelp_Beep(440,500);
    #ifdef DEBUG
      dsPrint1 (DBG_DETAILED, "USBRESMGR: IO failed Status = %d\r\n",
                pRB->status);
    #endif
    if (pRB->status & USRB_STATUS_STALLED)
    {
      ClearStalled (pIoRB->pDevice, ucEndpoint);
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
      pBulkReq->usStatus = USB_IORB_STALLED;
    }
    else
      pBulkReq->usStatus = USB_IORB_FAILED;

    DevHelp_UnLock(pIoRB->ulLockData);
    DevHelp_UnLock(pIoRB->ulLockParam);
    if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
    {
      DevHelp_PostEventSem (pIoRB->ulEventDone);
      DevHelp_CloseEventSem (pIoRB->ulEventDone);
    }
    FreeIoRB(pIoRB);

  }
  else
  {
    // No I/O Errors
    if (! (pRB->flags & USRB_FLAGS_DET_DTGGLEON))
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Set Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  |= usToggleBit;
    }
    else
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Clear Toggle Bit\r\n");
      #endif
      pIoRB->pDevice->wToggle[usToggleGrp]  &= ~usToggleBit;
    }
    #ifdef DEBUG
      dsPrint1 ( DBG_DETAILED, "USBRESMGR: New Toggle Value %0x\r\n",
                 pIoRB->pDevice->wToggle[usToggleGrp] );
    #endif
    pBulkReq->usDataProcessed = pBulkReq->usDataProcessed + pRB->buffer1Length;
    pBulkReq->usDataRemain    = pBulkReq->usDataRemain - pRB->buffer1Length;
    pIoRB->usDataProcessed = pBulkReq->usDataProcessed;
    pIoRB->usDataRemain = pBulkReq->usDataRemain;
    #ifdef DEBUG
      dsPrint3 ( DBG_DETAILED, "USBRESMGR: Processed %d bytes, remaining %d (buffersize %d)\r\n",
                 pBulkReq->usDataProcessed, pBulkReq->usDataRemain, pRB->buffer1Length );
    #endif
    if(pBulkReq->usDataRemain)
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Next Buffer\r\n");
      #endif
      ProcessIoRB(pIoRB);
    }
    else
    {
      #ifdef DEBUG
        dsPrint (DBG_DETAILED, "USBRESMGR: Done\r\n");
      #endif
      pBulkReq->usStatus = USB_IORB_DONE;
      DevHelp_UnLock(pIoRB->ulLockData);
      DevHelp_UnLock(pIoRB->ulLockParam);
      if(DevHelp_OpenEventSem (pIoRB->ulEventDone) == 0)  
      {
        DevHelp_PostEventSem (pIoRB->ulEventDone);
        DevHelp_CloseEventSem (pIoRB->ulEventDone);
      }
      else
      {
        #ifdef DEBUG
          dsPrint (DBG_DETAILED, "USBRESMGR: Open Semaphore failed\r\n");
        #endif
      }
      FreeIoRB(pIoRB);
    }
  }
  
}
예제 #9
0
/************************ END OF SPECIFICATIONS ***********************/
void USBInit( RPH FAR *pRP )
{
   PRPINITOUT      pRPO;          /* output request packet far pointer */
   PRPINITIN       pRPI;          /* input request packet far pointer */
   UINT            ctrlID;
   KeyData         keyData[3]={"V",CFSTR_TYPE_DEC,0,0,
      "REQ:",CFSTR_TYPE_STRING,0,0,
      "I13",CFSTR_TYPE_DEC,0,0}; // 31/05/1999 MB
   PSZ             cmdLine;
   ULONG           cmdRStatus, errColumn;
   USHORT          cmdRc;

#ifdef   DEBUG
   dsPrint(DBG_HLVLFLOW, "USBD: USBInit started\r\n");
#endif

   pRP->Status = STATUS_DONE;
   if (ghDriver) // initialization already passed
      return;

   pRPI = (PRPINITIN) pRP;
   pRPO = (PRPINITOUT) pRP;

   Device_Help = ((PRPINITIN)pRP)->DevHlpEP;  /* save devhlp entry point */

   // process CONFIG.SYS BASEDEV= line parameters
   cmdLine=(PSZ) MAKEP( SELECTOROF(pRPI->InitArgs),
                        OFFSETOF(((PDDD_PARM_LIST)pRPI->InitArgs)->cmd_line_args) );
   cmdRStatus=ProcessConfigString(cmdLine, sizeof(keyData)/sizeof(keyData[0]), (KeyData FAR *)&keyData);
   cmdRc=LOUSHORT(cmdRStatus); errColumn=(ULONG)HIUSHORT(cmdRStatus);
   switch (cmdRc)  // set cmd line processing errors
   {
   case CFSTR_UNKWN_KEYS:
      SetLongValue( gVMessages[INIT_MESSAGE_UNKNOWNKWD], errColumn );
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_UNKNOWNKWD, gMessageCount, MAX_INIT_MESSAGE_COUNT );
      break;
   case CFSTR_CONVERR:
      SetLongValue( gVMessages[INIT_MESSAGE_INVNUMERIC], errColumn );
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_INVNUMERIC, gMessageCount, MAX_INIT_MESSAGE_COUNT );
      break;
   default:
      break;
   }
   if (keyData[1].value &&  // check for HCD layer drivers
       !CheckHCDDriversLoaded( cmdLine, LOUSHORT(keyData[1].value), HIUSHORT(keyData[1].value) ))
   {
      pRP->Status = STATUS_DONE | STERR | ERROR_I24_QUIET_INIT_FAIL; // 05/16/2000 MB - exit code changed to quiet exit code
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_NO_HCD, gMessageCount, MAX_INIT_MESSAGE_COUNT );
   }
   gVerbose= keyData[0].keyStatus!=CFSTR_STATUS_NOTFOUND;

   gDelayHostStart = keyData[2].keyStatus!=CFSTR_STATUS_NOTFOUND; // 31/05/1999 MB
   if(gDelayHostStart && (pRP->Status == STATUS_DONE) )  // 05/16/2000 MB - fixed error code processing
   {
      USHORT         ctxOffset;  
      USHORT         rc;

      ctxOffset=(USHORT)(LONG)(StartHostCtxHookRtn); // IRQ processing thread
      rc = DevHelp_AllocateCtxHook((NPFN)ctxOffset, &gStartHostHookHandle);

      if (rc)
      {
         pRP->Status = STATUS_DONE | STERR | STATUS_ERR_UNKCMD;
         gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_SETCTXFAILED, gMessageCount, MAX_INIT_MESSAGE_COUNT );
#ifdef DEBUG
      dsPrint(DBG_CRITICAL, " USBD: USBDInit failed to allocate CTX hook routine\r\n");
#endif
      }
   }

   /*---------------------------------------------------*/
   /* Register device driver with resource manager      */
   /*---------------------------------------------------*/
   if (pRP->Status == STATUS_DONE)
      RegisterUSBD();

   if (pRP->Status == STATUS_DONE)
   {
      //	initialize local structures
      setmem((PSZ)&gHostControllers,0,sizeof(gHostControllers));
      setmem((PSZ)&gClassDrivers,0,sizeof(gClassDrivers));
      setmem((PSZ)&gDevices,0,sizeof(gDevices));
      setmem((PSZ)&gHubs,0,sizeof(gHubs));
      for (ctrlID=1; ctrlID<gMaxControllers; ctrlID++)
      {
         gSetAddress[ctrlID]=gSetAddress[0];
         gSetConfiguration[ctrlID]=gSetConfiguration[0];
         gDeviceStruct[ctrlID]=gDeviceStruct[0];
         gGetConfiguration[ctrlID]=gGetConfiguration[0];
         gGetHubConfigurationLength[ctrlID]=gGetHubConfigurationLength[0];
      }
   }

   if (pRP->Status == STATUS_DONE)
   {
      SetLongValue( gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MajorVer );   
      SetLongValue( gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MinorVer );   
      gMessageCount=AddToMsgArray( gMessageIDs, INIT_MESSAGE_LOADED, gMessageCount, MAX_INIT_MESSAGE_COUNT );
      pRPO->CodeEnd = ((USHORT) &USBInit) - 1;         /* set end of code segment */
      pRPO->DataEnd = ((USHORT) &gInitDataStart) - 1;  /* set end of data segment */
   }
   else
   {
      pRPO->CodeEnd = 0;          /* set end of code segment */
      pRPO->DataEnd = 0;       /* set end of data segment */
   }

   TTYWrite(gVMessages, gMessageIDs, gMessageCount);

#ifdef   DEBUG
   dsPrint1(DBG_HLVLFLOW, "USBD: USBInit ended. Status %x\r\n", pRP->Status);
#endif
   return;
}
예제 #10
0
void JOYInit()
{
   KeyData keyData[2] = {"V",       CFSTR_TYPE_DEC, 0, 0,
      "DEVICE:", CFSTR_TYPE_DEC, 0, 0};
   PSZ    kbdCmdLine;
   ULONG  cmdRStatus, errColumn;
   USHORT cmdRc, i;

#ifdef DEBUG
   dsPrint (DBG_HLVLFLOW, "USBJOY: Init Entry\r\n");
#endif

   pRP->Status = STATUS_DONE;

   if (ghDriver)
     return;  // initialization already passed
   Device_Help = ((PRPINITIN)pRP)->DevHlpEP; // save DevHlp Entry Point

   kbdCmdLine = (PSZ)MAKEP (SELECTOROF (((PRPINITIN)pRP)->InitArgs),
                            OFFSETOF   (((PRPINITIN)pRP)->InitArgs));
   cmdRStatus = ProcessConfigString (kbdCmdLine, 2, (KeyData FAR *)&keyData);
   cmdRc      = LOUSHORT (cmdRStatus);
   errColumn  = (ULONG)HIUSHORT (cmdRStatus);

   switch (cmdRc)
   {
     case CFSTR_UNKWN_KEYS:
        SetLongValue (gVMessages[INIT_MESSAGE_UNKNOWNKWD], errColumn);
        gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_UNKNOWNKWD, gMessageCount, MAX_INIT_MESSAGE_COUNT);
      break;
     case CFSTR_CONVERR:
       SetLongValue (gVMessages[INIT_MESSAGE_INVNUMERIC], errColumn );
       gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_INVNUMERIC, gMessageCount, MAX_INIT_MESSAGE_COUNT);
   }

   gVerbose   = (BYTE)(keyData[0].keyStatus != CFSTR_STATUS_NOTFOUND);
   if (keyData[1].keyStatus == CFSTR_STATUS_OK)
      gDevice = (keyData[1].value < MAX_JOYS)? (BYTE)keyData[1].value : (BYTE)NULL;
   else gDevice = NULL;

   if (DevHelp_AttachDD ("USBHID$ ", (NPBYTE)&gIDCTable)) // obtain USBHID's IDC entry point
   {
      pRP->Status |= STERR;
      gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_NO_HID, gMessageCount, MAX_INIT_MESSAGE_COUNT);
      #ifdef DEBUG
         dsPrint (DBG_HLVLFLOW, "USBJOY: Init Faild to Attach to USBHID$ \r\n");
      #endif
   }
   else
   {
     gpHIDIDC  = (PUSBIDCEntry)gIDCTable.ProtIDCEntry;
     gdsHIDIDC = gIDCTable.ProtIDC_DS;
   }

   if (pRP->Status == STATUS_DONE)
   {
      RegisterJOY();                                              // register driver with RM

      gNoOfJOYs = 0;
      for (i = 0; i < MAX_JOYS; i++)
        gJOY[i].active = 0;

      ((PRPINITOUT)pRP)->CodeEnd = ((USHORT)&JOYInit);        // set end of code segment
      ((PRPINITOUT)pRP)->DataEnd = ((USHORT)&gInitDataStart); // set end of data segment
      SetLongValue (gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MajorVer);
      SetLongValue (gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDriverStruct.MinorVer);
      SetLongValue (gVMessages[INIT_MESSAGE_LOADED], (ULONG)gDevice);
      gMessageCount = AddToMsgArray (gMessageIDs, INIT_MESSAGE_LOADED, gMessageCount, MAX_INIT_MESSAGE_COUNT);
   }
   else
   {
      ((PRPINITOUT)pRP)->CodeEnd = 0;
      ((PRPINITOUT)pRP)->DataEnd = 0;
   }
   if (gVerbose) TTYWrite (gVMessages, gMessageIDs, gMessageCount);

#ifdef DEBUG
   dsPrint1 (DBG_HLVLFLOW, "USBJOY: Init Status = %x\r\n", pRP->Status);
#endif
   return;
}