/************************ 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; }
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; }