⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usrusbtool.c

📁 VxWorks BSP for S3C2510A
💻 C
📖 第 1 页 / 共 5 页
字号:

LOCAL STATUS prnTxCallback
    (
    void *callbackParam,
    char *txChar
    )

    {
    /* If no more chars to send, return an error */

    if (txCharCount == 0)
	return ERROR;

    txCharCount--;


    /* Check if running a pattern test or a file dump */

    if (patternTest)
	{
	/* Running a pattern test.  Return the next pattern char */

	if ((nextCharVal & 1) == 0)
	    *txChar = nextCharVal >> 8;
	else
	    *txChar = nextCharVal & 0xff;

	nextCharVal++;
	}
    else
	{
	/* Running a file dump test.  Return the next char from file */

	if (txBfrCount == 0 && txCharCount > 0)
	    {
	    /* Read next buffer from file */

	    txBfrCount = fread (txBfr, sizeof (char), sizeof (txBfr), txFile);
	    txBfrIndex = 0;
	    }

	if (txCharCount == 0 || txBfrCount == 0)
	    {
	    closeTxFile ();
	    txCharCount = 0;
	    }

	if (txBfrCount == 0)
	    return ERROR;

	*txChar = txBfr [txBfrIndex++];
	--txBfrCount;
	}

    return OK;
    }


/*************************************************************************
*
* prnAttachCallback - receives attach callbacks from printer SIO driver
*
* RETURNS: N/A
*/

LOCAL SIO_CHAN *pPrnSioChan;

LOCAL VOID prnAttachCallback
    (
    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_PRN_ATTACH) ? "USB_PRN_ATTACH" : "USB_PRN_REMOVE");

    if (attachCode == USB_PRN_ATTACH)
	{
	if (pPrnSioChan == NULL)
	    {
	    if (usbPrinterSioChanLock (pChan) != OK)
		fprintf (fout, "usbPrinterSioChanLock() returned ERROR\n");
	    else
		{
		pPrnSioChan = pChan;

		if ((*pPrnSioChan->pDrvFuncs->callbackInstall) (pPrnSioChan, 
		    	SIO_CALLBACK_GET_TX_CHAR, 
	 	 	(STATUS  (*) (void *, ...)) prnTxCallback, 
			NULL) != OK)
		    {
		    fprintf (fout, "callbackInstall() returned ERROR.\n");
		    }
		}
	    }
	else
	    {
	    fprintf (fout, "Another channel already in use, ignored.\n");
	    }
	}
    else
	{
	if (pChan == pPrnSioChan)
	    {
	    if (usbPrinterSioChanUnlock (pChan) != OK)
		fprintf (fout, "usbPrinterSioChanUnlock() returned ERROR\n");

	    pPrnSioChan = NULL;
	    }
	}
    }


/*************************************************************************
*
* cmdPrnInit - initializes USB printer SIO driver
*
* RETURNS: RET_CONTINUE
*/

LOCAL BOOL prnInitialized = FALSE;

LOCAL UINT16 cmdPrnInit
    (
    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 (prnInitialized)
	{
	fprintf (fout, "USB printer SIO driver already initialized.\n");
	return RET_CONTINUE;
	}

    if (usbPrinterDevInit () == OK)
	{
	fprintf (fout, "usbPrinterDevInit() returned OK\n");
	prnInitialized = TRUE;

	/* Register for attach notification */

	if (usbPrinterDynamicAttachRegister (prnAttachCallback, (pVOID) fout) != OK)
	    {
	    fprintf (fout, "usbPrinterDynamicAttachRegister() returned ERROR\n");
	    return RET_CONTINUE;
	    }
	}
    else
	fprintf (fout, "usbPrinterDevInit() returned ERROR\n");

    return RET_CONTINUE;
    }


/*************************************************************************
*
* cmdPrnDown - shuts down USB printer SIO driver
*
* RETURNS: RET_CONTINUE
*/

LOCAL UINT16 cmdPrnDown
    (
    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 (!prnInitialized)
	{
	fprintf (fout, "USB printer SIO driver not initialized.\n");
	return RET_CONTINUE;
	}

    prnInitialized = FALSE;
    pPrnSioChan = NULL;

    /* unregister */

    if (usbPrinterDynamicAttachUnRegister (prnAttachCallback, (pVOID) fout) != OK)
	fprintf (fout, "usbPrinterDynamicAttachUnRegister() returned ERROR\n");

    if (usbPrinterDevShutdown () == OK)
	fprintf (fout, "usbPrinterDevShutdown() returned OK\n");
    else
	fprintf (fout, "usbPrinterDevShutdown() returned ERROR\n");

    return RET_CONTINUE;
    }


/*************************************************************************
*
* waitForPrinter - waits for a printer to be connected
*
* RETURNS: OK if printer connected, else ERROR
*/

LOCAL STATUS waitForPrinter 
    (
    FILE *fout
    )

    {
    THREAD_HANDLE thread;
    UINT8 * pBfr;
    USB_PRINTER_CAPABILITIES * pCaps;
    UINT16 idLen;
    UINT8 protocol;
    UINT16 i;


    /* Create thread to watch for keypress */

    enterPressed = FALSE;

    if (OSS_THREAD_CREATE (enterThread, 
			   (pVOID) fout, 
			   OSS_PRIORITY_INHERIT, 
			   "tEnter",
			   &thread) 
			!= OK)
	{
	fprintf (fout, "Error creating thread.\n");
	return ERROR;
	}


    /* Wait for a printer to be attached. */

    if (pPrnSioChan == NULL)
	{
	fprintf (fout, "Waiting for printer to be attached...\n");
	while (!enterPressed && pPrnSioChan == NULL)
	    OSS_THREAD_SLEEP (1);
	}


    /* kill keypress thread */

    OSS_THREAD_DESTROY (thread);

    if (enterPressed)
	return ERROR;

    if ((pBfr = OSS_MALLOC (USB_PRN_MAX_DEVICE_ID_LEN)) == NULL)
        return ERROR;

    pCaps = (USB_PRINTER_CAPABILITIES *) pBfr;

    /* Display the printer characteristics. */
    if ((*pPrnSioChan->pDrvFuncs->ioctl) (pPrnSioChan, 
					  SIO_USB_PRN_DEVICE_ID_GET, 
					  (void *) pBfr) 
					!= OK)
	fprintf (fout, "ioctl (SIO_USB_PRN_DEVICE_ID_GET) returned ERROR.\n");
    else
	{
	idLen = FROM_BIGW (pCaps->length);
	fprintf (fout, "Device ID length = %d\n", idLen);
	fprintf (fout, "Device ID = ");
	for (i = 0; i < idLen - 2; i++)
	    fprintf (fout, "%c", pCaps->caps [i]);
	fprintf (fout, "\n");
	}

    if ((*pPrnSioChan->pDrvFuncs->ioctl) (pPrnSioChan, SIO_USB_PRN_PROTOCOL_GET,
	(void *) &protocol) != OK)
	fprintf (fout, "ioctl (SIO_USB_PRN_PROTOCOL_GET) returned ERROR.\n");
    else
	{
	fprintf (fout, "protocol = 0x%x ", protocol);
	switch (protocol)
	    {
	    case USB_PROTOCOL_PRINTER_UNIDIR:
		fprintf (fout, "(USB_PROTOCOL_PRINTER_UNIDIR)\n");
		break;

	    case USB_PROTOCOL_PRINTER_BIDIR:
		fprintf (fout, "(USB_PROTOCOL_PRINTER_BIDIR)\n");
		break;

	    default:
		fprintf (fout, "(unknown)\n");
		break;
	    }
	}

    OSS_FREE (pBfr);

    return OK;
    }


/*************************************************************************
*
* cmdPrint - performs printer test
*
* RETURNS: RET_CONTINUE
*/

LOCAL UINT16 cmdPrint
    (
    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) */
    )

    {
    long blocks;


    /* Get parameters */

    *ppCmd = GetHexToken (*ppCmd, &blocks, 1);


    /* Wait for a printer to be connected */

    if (waitForPrinter (fout) == OK)
	{
	/* trigger a transmission. */

	patternTest = TRUE;
	nextCharVal = 0;
	txCharCount = blocks * 4096;

	fprintf (fout, "sending %d 4k blocks to printer...\n", (UINT16) blocks);

	if ((*pPrnSioChan->pDrvFuncs->txStartup) (pPrnSioChan) != OK)
	    fprintf (fout, "txStartup() returned ERROR.\n");
	}

    return RET_CONTINUE;
    }


/*************************************************************************
*
* cmdPrintFnm - sends file to printer
*
* RETURNS: RET_CONTINUE
*/

LOCAL UINT16 cmdPrintFnm
    (
    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) */
    )

    {
    char fnm [MAX_CMD_LEN];
    FILE *f;
    long fsize;


    /* Get filename parameter */

    *ppCmd = GetNextToken (*ppCmd, fnm, sizeof (fnm));


    /* Terminate any current dump test */

    closeTxFile ();


    /* Attempt to open file */

    if ((f = fopen (fnm, "rb")) == NULL)
	{
	fprintf (fout, "Unable to open '%s'.\n", fnm);
	return RET_CONTINUE;
	}


    /* Determine file size */

    fseek (f, 0, SEEK_END);
    fsize = ftell (f);

    fprintf (fout, "file '%s' is %ld bytes.\n", fnm, fsize);

    fseek (f, 0, SEEK_SET);


    /* Wait for printer */

    if (waitForPrinter (fout) == OK)
	{
	/* Initiate transmission */

	patternTest = FALSE;
	txFile = f;
	txBfrCount = 0;
	txCharCount = fsize;

	fprintf (fout, "sending %ld bytes to printer...\n", fsize);

	if ((*pPrnSioChan->pDrvFuncs->txStartup) (pPrnSioChan) != OK)
	    {
	    fprintf (fout, "txStartup() returned ERROR.\n");
	    closeTxFile ();
	    }

	/* NOTE: If this path is successful, the file will be closed by
	 * the prnTxCallback().
	 */

	}
    else
	{

	/* Close input file */

	fclose (f);
	}
    
    return RET_CONTINUE;
    }
#endif	/*INCLUDE_USB_PRINTER*/

#ifdef INCLUDE_USB_LOOPBACK
/*************************************************************************
*
* loopbackAttachCallback - receives attach callbacks from USB loopback driver
*
* RETURNS: N/A
*/

LOCAL USB_LOOPBACK_CHAN *pLoopbackChan;

LOCAL VOID loopbackAttachCallback
    (
    pVOID arg,			    /* caller-defined argument */
    USB_LOOPBACK_CHAN *pChan,		    /* pointer to affected USB_LOOPBACK_CHAN */
    UINT16 attachCode		    /* defined as USB_KBD_xxxx */
    )

    {
    FILE *fout = (FILE *) arg;
    UINT8 *pProtocol = NULL;   

    fprintf (fout, "pChan = %p, attach code = %s\n", pChan,
	(attachCode == USB_LOOPBACK_ATTACH) ? "USB_LOOPBACK_ATTACH" : "USB_LOOPBACK_REMOVE");

    if (attachCode == USB_LOOPBACK_ATTACH)
	{
	if (pLoopbackChan == NULL)
	    {
	    if (usbLoopbackChanLock (pChan) != OK)
		fprintf (fout, "usbLoopbackChanLock() returned ERROR\n");
	    else
		{
		pLoopbackChan = pChan;

		/* Here we can query for suuported loopback modes */
		pProtocol = OSS_MALLOC(sizeof (*pProtocol));
		if (pProtocol == NULL)
		{
			fprintf (fout, "USB_LOOPBACK_PROTOCOL_GET:memory alloc failed.\n");
			return;
    }

    /* Display the printer characteristics. */
    if ((*pLoopbackChan->pDrvFuncs->ioctl) (pLoopbackChan,
					  USB_LOOPBACK_PROTOCOL_GET,
					  (void *)pProtocol)
					!= OK)
		{
	     fprintf (fout, "ioctl (USB_LOOPBACK_PROTOCOL_GET) returned ERROR.\n");
    }
    else
	  {
    	fprintf (fout, "\nDevice supports following loopback modes:\n");
      if(USB_IS_CTRL_LOOPBACK_SUPPORTED(*pProtocol))
      fprintf (fout, "Control Loopback\n");
      if(USB_IS_BULK_LOOPBACK_SUPPORTED(*pProtocol))
      fprintf (fout, "Bulk Loopback\n");
      if(USB_IS_INT_LOOPBACK_SUPPORTED(*pProtocol))
      fprintf (fout, "Interrupt Loopback\n");
      if(USB_IS_ISOCH_LOOPBACK_SUPPORTED(*pProtocol))
      fprintf (fout, "Isochronous Loopback\n");
	  }
		}
	    }
	else
	    {
	    fprintf (fout, "Another channel already in use, ignored.\n");
	    }
	}
    else /* USB_LOOPBACK_REMOVE */
	{
	if (pChan == pLoopbackChan)
	    {
	    if (usbLoopbackChanUnlock (pChan) != OK)
		fprintf (fout, "usbLoopbackChanUnlock() returned ERROR\n");
	    pLoopbackChan = NULL;
	    }
	}
    }

/*************************************************************************
*
* cmdLoopbackInit - initializes USB loopback driver
*
* RETURNS: RET_CONTINUE
*/

LOCAL BOOL loopbackInitialized = FALSE;

LOCAL UINT16 cmdLoopbackInit
    (
    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 (loopbackInitialized)
	{
	fprintf (fout, "USB loopback driver already initialized.\n");
	return RET_CONTINUE;
	}

    if (usbLoopbackDevInit () == OK)
	{
	fprintf (fout, "usbLoopbackDevInit() returned OK\n");
	loopbackInitialized = TRUE;

	/* Register for attach notification */

	if (usbLoopbackDynamicAttachRegister (loopbackAttachCallback, (pVOID) fout) != OK)
	    {
	    fprintf (fout, "usbLoopbackDynamicAttachRegister() returned ERROR\n");
	    return RET_CONTINUE;
	    }
	}
    el

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -