Exemplo n.º 1
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;
}
Exemplo n.º 2
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;
}