📄 usrusbtool.c
字号:
*ppCmd = GetHexToken (*ppCmd, &endpoint, -1);
*ppCmd = GetHexToken (*ppCmd, &length, USB_MIN_CTRL_PACKET_SIZE);
/* Validate parameters */
if (nodeId == -1 || endpoint == -1)
{
fprintf (fout, "Must specify a node id and endpoint.\n");
return RET_CONTINUE;
}
if (length > sizeof (bfr))
{
fprintf (fout, "Length must be %d or less.\n", (int) sizeof (bfr));
return RET_CONTINUE;
}
/* Create a pipe to talk to this endpoint */
if ((s = usbdPipeCreate (usbdClientHandle, (GENERIC_HANDLE) nodeId, (UINT16) endpoint, 0, 0,
USB_XFRTYPE_INTERRUPT, USB_DIR_IN, length, length, INT_PIPE_SRVC_INTERVAL,
&handle)) != OK)
{
fprintf (fout, "usbdPipeCreate() returned %d\n", s);
return RET_CONTINUE;
}
/* Create thread to watch for keypress */
enterPressed = FALSE;
if (OSS_THREAD_CREATE (enterThread, (pVOID) fout, OSS_PRIORITY_INHERIT, "tEnter",
&thread) != OK)
goto pipe_done;
while (!enterPressed)
{
/* initialize IRP */
memset (&irp, 0, sizeof (irp));
irp.irpLen = sizeof (irp);
irp.userCallback = irpCallback;
irp.transferLen = length;
irp.bfrCount = 1;
irp.bfrList [0].pid = USB_PID_IN;
irp.bfrList [0].pBfr = bfr;
irp.bfrList [0].bfrLen = length;
irpCallbackInvoked = FALSE;
if ((s = usbdTransfer (usbdClientHandle, handle, &irp)) != OK)
{
fprintf (fout, "usbdTransfer() returned %d\n", s);
break;
}
while (!enterPressed && !irpCallbackInvoked)
OSS_THREAD_SLEEP (1);
if (irpCallbackInvoked)
{
if (irp.result != OK)
{
fprintf (fout, "irp.result == %d\n", irp.result);
break;
}
fprintf (fout, "actLen = %d: ", irp.bfrList [0].actLen);
displayMem (irp.bfrList [0].actLen, bfr, fout);
}
else
{
if ((s = usbdTransferAbort (usbdClientHandle, handle, &irp))
!= OK)
{
fprintf (fout, "usbdTransferAbort() returned %d\n", s);
break;
}
/* wait for the callback to be invoked */
while (!irpCallbackInvoked)
OSS_THREAD_SLEEP (1);
}
}
OSS_THREAD_DESTROY (thread);
pipe_done:
if ((s = usbdPipeDestroy (usbdClientHandle, handle)) != OK)
{
fprintf (fout, "usbdPipeDestroy() returned %d\n", s);
return RET_CONTINUE;
}
return RET_CONTINUE;
}
#ifdef INCLUDE_USB_KEYBOARD
/*************************************************************************
*
* cmdKbdInit - initializes USB keyboard SIO driver
*
* RETURNS: RET_CONTINUE
*/
LOCAL UINT16 cmdKbdInit
(
pVOID Param, /* Generic parameter passed down */
char **ppCmd, /* Ptr to remainder of cmd line */
FILE *fin, /* stream for input (if any) */
FILE *fout /* stream for output (if any) */
)
{
if (usbKeyboardDevInit () == OK)
fprintf (fout, "usbKeyboardDevInit() returned OK\n");
else
fprintf (fout, "usbKeyboardDevInit() returned ERROR\n");
return RET_CONTINUE;
}
/*************************************************************************
*
* cmdKbdDown - shuts down USB keyboard SIO driver
*
* RETURNS: RET_CONTINUE
*/
LOCAL UINT16 cmdKbdDown
(
pVOID Param, /* Generic parameter passed down */
char **ppCmd, /* Ptr to remainder of cmd line */
FILE *fin, /* stream for input (if any) */
FILE *fout /* stream for output (if any) */
)
{
if (usbKeyboardDevShutdown () == OK)
fprintf (fout, "usbKeyboardDevShutdown() returned OK\n");
else
fprintf (fout, "usbKeyboardDevShutdown() returned ERROR\n");
return RET_CONTINUE;
}
/*************************************************************************
*
* kbdAttachCallback - receives callbacks from USB keyboard SIO driver
*
* RETURNS: N/A
*/
LOCAL SIO_CHAN *pKbdSioChan;
LOCAL VOID kbdAttachCallback
(
pVOID arg, /* caller-defined argument */
SIO_CHAN *pChan, /* pointer to affected SIO_CHAN */
UINT16 attachCode /* defined as USB_KBD_xxxx */
)
{
FILE *fout = (FILE *) arg;
fprintf (fout, "pChan = %p, attach code = %s\n", pChan,
(attachCode == USB_KBD_ATTACH) ? "USB_KBD_ATTACH" : "USB_KBD_REMOVE");
if (attachCode == USB_KBD_ATTACH)
{
if (pKbdSioChan == NULL)
{
if (usbKeyboardSioChanLock (pChan) != OK)
fprintf (fout, "usbKeyboardSioChanLock() returned ERROR\n");
else
pKbdSioChan = pChan;
}
else
{
fprintf (fout, "Another channel already in use, ignored.\n");
}
}
else
{
if (pChan == pKbdSioChan)
{
if (usbKeyboardSioChanUnlock (pChan) != OK)
fprintf (fout, "usbKeyboardSioChanUnlock() returned ERROR\n");
pKbdSioChan = NULL;
}
}
}
/*************************************************************************
*
* cmdKbdPoll - Polls keyboard SIO driver for input
*
* RETURNS: RET_CONTINUE
*/
LOCAL UINT16 cmdKbdPoll
(
pVOID Param, /* Generic parameter passed down */
char **ppCmd, /* Ptr to remainder of cmd line */
FILE *fin, /* stream for input (if any) */
FILE *fout /* stream for output (if any) */
)
{
THREAD_HANDLE thread;
char inChar;
/* register for callbacks */
pKbdSioChan = NULL;
if (usbKeyboardDynamicAttachRegister (kbdAttachCallback, (pVOID) fout) != OK)
{
fprintf (fout, "usbKeyboardDynamicAttachRegister() returned ERROR\n");
return RET_CONTINUE;
}
/* Poll for input or until user presses CTRL-Z on USB keyboard or
* [enter] on main keyboard. */
/* Create thread to watch for keypress */
enterPressed = FALSE;
if (OSS_THREAD_CREATE (enterThread, (pVOID) fout, OSS_PRIORITY_INHERIT, "tEnter",
&thread) != OK)
goto pipe_done;
fprintf (fout, "Press CTRL-Z to terminate polling.\n");
while (!enterPressed)
{
if (pKbdSioChan != NULL)
{
if ((*pKbdSioChan->pDrvFuncs->pollInput) (pKbdSioChan, &inChar) == OK)
{
fprintf (fout, "ASCII %3d", inChar);
if (inChar >= 32)
fprintf (fout, " '%c'", inChar);
fprintf (fout, "\n");
if (inChar == CTRL_Z)
{
fprintf (fout, "Stopped by CTRL-Z\n");
break;
}
}
}
OSS_THREAD_SLEEP (1);
}
OSS_THREAD_DESTROY (thread);
pipe_done:
/* unregister */
if (usbKeyboardDynamicAttachUnRegister (kbdAttachCallback, (pVOID) fout) != OK)
fprintf (fout, "usbKeyboardDynamicAttachUnRegister() returned ERROR\n");
return RET_CONTINUE;
}
#endif /*INCLUDE_USB_KEYBOARD*/
#ifdef INCLUDE_USB_MOUSE
/*************************************************************************
*
* showMouseState
*
* RETURNS: N/A
*/
LOCAL long mouseX;
LOCAL long mouseY;
LOCAL VOID showMouseState
(
FILE *fout,
UINT8 buttons
)
{
fprintf (fout, "\rx:%5ld y:%5ld B1:%3.3s B2:%3.3s B3:%3.3s",
mouseX, mouseY,
(buttons & MOUSE_BUTTON_1) == 0 ? "UP " : "DWN",
(buttons & MOUSE_BUTTON_2) == 0 ? "UP " : "DWN",
(buttons & MOUSE_BUTTON_3) == 0 ? "UP " : "DWN");
}
/*************************************************************************
*
* signExtend - extends sign from char to long
*
* RETURNS: sign-extended long value
*/
LOCAL long signExtend
(
char value
)
{
if ((value & 0x80) != 0)
return value | 0xffffff00;
return value;
}
/*************************************************************************
*
* mseRptCallback - invoked when reports received from mouse
*
* RETURNS: OK
*/
LOCAL STATUS mseRptCallback
(
void *arg,
pHID_MSE_BOOT_REPORT pReport
)
{
FILE *fout = (FILE *) arg;
long xChange = signExtend (pReport->xDisplacement);
long yChange = signExtend (pReport->yDisplacement);
mouseX += xChange;
mouseY += yChange;
showMouseState (fout, pReport->buttonState);
return OK;
}
/*************************************************************************
*
* mseAttachCallback - receives callbacks from USB mouse SIO driver
*
* RETURNS: N/A
*/
LOCAL SIO_CHAN *pMseSioChan;
LOCAL VOID mseAttachCallback
(
pVOID arg, /* caller-defined argument */
SIO_CHAN *pChan, /* pointer to affected SIO_CHAN */
UINT16 attachCode /* defined as USB_KBD_xxxx */
)
{
FILE *fout = (FILE *) arg;
fprintf (fout, "pChan = %p, attach code = %s\n", pChan,
(attachCode == USB_MSE_ATTACH) ? "USB_MSE_ATTACH" : "USB_MSE_REMOVE");
if (attachCode == USB_MSE_ATTACH)
{
if (pMseSioChan == NULL)
{
if (usbMouseSioChanLock (pChan) != OK)
fprintf (fout, "usbMouseSioChanLock() returned ERROR\n");
else
{
pMseSioChan = pChan;
/* Register for report callbacks */
if (pMseSioChan != NULL)
{
if ((*pMseSioChan->pDrvFuncs->callbackInstall) (pMseSioChan,
SIO_CALLBACK_PUT_MOUSE_REPORT,
(STATUS (*) (void *, ...)) mseRptCallback,
fout) != OK)
{
fprintf (fout, "callbackInstall() returned ERROR.\n");
}
}
}
}
else
{
fprintf (fout, "Another channel already in use, ignored.\n");
}
}
else
{
if (pChan == pMseSioChan)
{
if (usbMouseSioChanUnlock (pChan) != OK)
fprintf (fout, "usbMouseSioChanUnlock() returned ERROR\n");
pMseSioChan = NULL;
}
}
}
/*************************************************************************
*
* cmdMouseTest - Tests mouse SIO driver for input
*
* RETURNS: RET_CONTINUE
*/
LOCAL UINT16 cmdMouseTest
(
pVOID Param, /* Generic parameter passed down */
char **ppCmd, /* Ptr to remainder of cmd line */
FILE *fin, /* stream for input (if any) */
FILE *fout /* stream for output (if any) */
)
{
THREAD_HANDLE thread;
/* Initialize usbMouseLib. */
if (usbMouseDevInit () != OK)
{
fprintf (fout, "usbMouseDevInit() returned ERROR\n");
return RET_CONTINUE;
}
/* register for attach callbacks */
pMseSioChan = NULL;
mouseX = 0;
mouseY = 0;
if (usbMouseDynamicAttachRegister (mseAttachCallback, (pVOID) fout) != OK)
{
fprintf (fout, "usbMouseDynamicAttachRegister() returned ERROR\n");
goto mouseDown;
}
/* Wait for use to press [enter] to terminate test. */
/* Create thread to watch for keypress */
enterPressed = FALSE;
if (OSS_THREAD_CREATE (enterThread, (pVOID) fout, OSS_PRIORITY_INHERIT, "tEnter",
&thread) != OK)
{
fprintf (fout, "Failed to create tEnter thread.\n");
goto mouseUnreg;
}
/* Wait for mouse to be attached */
while (pMseSioChan == NULL)
{
if (enterPressed)
goto threadDone;
OSS_THREAD_SLEEP (1);
}
/* Let background threads show mouse state */
showMouseState (fout, 0);
while (!enterPressed)
OSS_THREAD_SLEEP (1);
fprintf (fout, "\n");
threadDone:
OSS_THREAD_DESTROY (thread);
mouseUnreg:
/* unregister for attach callbacks */
if (usbMouseDynamicAttachUnRegister (mseAttachCallback, (pVOID) fout) != OK)
fprintf (fout, "usbMouseDynamicAttachUnRegister() returned ERROR\n");
/* Terminate report callbacks */
if (pMseSioChan != NULL)
if ((*pMseSioChan->pDrvFuncs->callbackInstall) (pMseSioChan,
SIO_CALLBACK_PUT_MOUSE_REPORT, NULL, NULL) != OK)
{
fprintf (fout, "callbackInstall() returned ERROR.\n");
}
mouseDown:
if (usbMouseDevShutdown () != OK)
fprintf (fout, "usbMouseDevShutdown() returned ERROR\n");
return RET_CONTINUE;
}
#endif /*INCLUDE_USB_KEYBOARD*/
#ifdef INCLUDE_USB_PRINTER
/*************************************************************************
*
* closeTxFile - closes any open print tx file
*
* RETURNS: N/A
*/
LOCAL VOID closeTxFile (void)
{
txCharCount = 0;
if (txFile != NULL)
{
fclose (txFile);
txFile = NULL;
}
}
/*************************************************************************
*
* prnTxCallback - feeds characters to USB printer SIO driver
*
* RETURNS: OK
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -