gio_usbtest.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
  9. /* 
  10.  *  ======== gio_usbtest.c ========
  11.  * 
  12.  *  This example demonstrates the use of the USB IOM driver with GIO APIs and
  13.  *    USB mini-driver.
  14.  *  This is the loopback application where data is read 
  15.  *    from an input GIO channel, then sent back via an output channel.
  16.  *
  17.  *  The following objects need to be created in the DSP/BIOS
  18.  *  configuration for this application:
  19.  *
  20.  *  * A UDEV object, which links in a user device driver. In this
  21.  *      case the UDEV is the USB IOM device driver.
  22.  *  * A TSK object, with the function to run the function defined in this file.
  23.  *  * A LOG named trace for debug and status output.
  24.  *  * A SEM object used to block until the USB bus is connected. See
  25.  *      GIO_control(readChan, C5509_USB_DEVICECONNECT,...); */
  26. #include <std.h>
  27. #include <gio.h>
  28. #include <iom.h>
  29. #include <log.h>
  30. #include <sem.h>
  31. #include <sys.h>
  32. #include <c5509_usb.h>
  33. #define DATASIZE    32             /* data size in madus */
  34. #define USBBUFSIZE (DATASIZE + 1)  /* first word reserved for transfer size */
  35. /* 
  36.  * statically configured objects 
  37.  */
  38. extern LOG_Obj trace;
  39. extern SEM_Obj usbDeviceConnect; /* sem posted when host enumerates bus */
  40. Void main()
  41. {
  42.     LOG_printf(&trace, "test started");
  43. }
  44. /*
  45.  *  ======== myUsbTask ========
  46.  *  This task is set by cdb config tool to start IO
  47.  */
  48. Void myUsbTask()
  49. {
  50.     Int status;
  51.     Uns usbBuf[USBBUFSIZE];
  52.     Uns requestSize;
  53.     GIO_Handle readChan, writeChan;
  54.     C5509_USB_AppCallback deviceConnectCb = {
  55.         (C5509_USB_TappCallback)SEM_post,
  56.         &usbDeviceConnect   /* semaphore to post when connected */
  57.     };
  58.     C5509_USB_StateInfo info;
  59.     /* create bulk type dsp input channel for USB OUT(from host) endpoint #2 */
  60.     readChan = GIO_create( "/udevUsb2", IOM_INPUT, NULL, NULL, NULL);
  61.     if (readChan == NULL) {
  62.         SYS_abort("Create input channel FAILED.");
  63.     }
  64.      
  65.     /* create bulk type dsp output channel for USB IN(to host) endpoint #2 */
  66.     writeChan = GIO_create( "/udevUsb2", IOM_OUTPUT, NULL, NULL, NULL);
  67.     
  68.     if (writeChan == NULL ) {
  69.         SYS_abort("Create output channel FAILED.");
  70.     }
  71.     /*
  72.      * Connect the device to the host.
  73.      *  The deviceConnectCb Fxn(SEM_post) will get called with arg(sem handle)
  74.      *  when connection is made(host enumerated bus) or immediately called if
  75.      *  bus is already connected.
  76.      */ 
  77.     GIO_control(readChan, C5509_USB_DEVICECONNECT, &deviceConnectCb);
  78.     SEM_pend(&usbDeviceConnect, SYS_FOREVER);/* block until bus is connected */
  79.     GIO_control(readChan, C5509_USB_GETSTATEINFO, &info);
  80.     LOG_printf(&trace, "current USB config # = %dn", info.usbCurConfig);
  81.     for (;;) {
  82.         requestSize = DATASIZE;  /* data request size */
  83.         
  84.         /* wait for data on this channel */ 
  85.         status = GIO_read(readChan, &usbBuf, &requestSize);
  86.         if (status != IOM_COMPLETED) {
  87.             SYS_abort("GIO_read FAILED.");
  88.         }
  89.         /*
  90.          * Do any data processing here.
  91.          *  Note: The first field of usbBuf contains the actual 
  92.          *    USB data byte count. This count field is used by the USB device.
  93.          */
  94.         /* echo data back to host */
  95.         status = GIO_write(writeChan, &usbBuf, &requestSize);              
  96.         if (status != IOM_COMPLETED) {
  97.             SYS_abort("GIO_write FAILED.");
  98.         }
  99.     }
  100. }