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

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.  *  ======== sio_usbtest.c ========
  11.  * 
  12.  *  This example demonstrates the use of the USB IOM driver with SIO APIs by 
  13.  *  using the DIO class driver with a User-Defined device USB mini-driver.
  14.  *  This is the loopback application where data is read 
  15.  *  from an input SIO stream, then sent back via an output SIO stream.
  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 coded based IOM device driver.
  22.  *  * DIO objects, which links the UDEV object. Channel Parameters are
  23.  *      configured here for each USB channel used.
  24.  *  * A TSK object, with the function to run set to the function myUsbTask
  25.  *    defined in this file.
  26.  *  * A LOG named trace for debug and status output.
  27.  *  * A SEM object used to block until the USB bus is connected.
  28.  */
  29. #include <std.h>
  30. #include <c5509_usb.h>
  31. #include <log.h>
  32. #include <sio.h>
  33. #include <sys.h>
  34. #define SIOBUFSIZE 256  /* SIO buffer size */
  35. /*
  36.  *  USB buffer size is one word greater than data size because the first word
  37.  *    is used to save actual transfer length(in bytes) for the USB peripheral.
  38.  *  If needed, applications can used this first field to read the USB byte
  39.  *    count sent from the host.
  40.  */
  41. #define USBBUFSIZE (SIOBUFSIZE + 1)  /* USB actual buffer size */
  42. extern LOG_Obj trace;
  43. extern SEM_Obj usbDeviceConnect;
  44. /* Function prototype */
  45. static Void createStreams();
  46. /*
  47.  * Stream handles.
  48.  */
  49. static SIO_Handle inStream, outStream;
  50. /*
  51.  * Application function that gets called when USB bus is connected.
  52.  */
  53. static C5509_USB_AppCallback deviceConnectCb = {
  54.     (C5509_USB_TappCallback)SEM_post,  /* fxn */
  55.     &usbDeviceConnect   /* arg. semaphore handle to post when/if connected */
  56. };
  57. Void main()
  58. {
  59.     LOG_printf(&trace, "test started");
  60. }
  61. /*
  62.  * ======== createStreams ========
  63.  */
  64. static Void createStreams()
  65. {
  66.     SIO_Attrs attrs;    
  67.     attrs = SIO_ATTRS;
  68.     attrs.model = SIO_ISSUERECLAIM;
  69.     /* create bulk type dsp input stream for USB endpoint #2 */
  70.     inStream = SIO_create("/dioUsb2", SIO_INPUT, SIOBUFSIZE, &attrs);
  71.     if (inStream == NULL) {
  72.         SYS_abort("Create input stream FAILED.");
  73.     }
  74.     /* create bulk type dsp output stream for USB endpoint #2 */
  75.     outStream = SIO_create("/dioUsb2", SIO_OUTPUT, SIOBUFSIZE, &attrs);
  76.     if (outStream == NULL) {
  77.         SYS_abort("Create output stream FAILED.");
  78.     }
  79.     /* connect USB device to the host */ 
  80.     SIO_ctrl(outStream, C5509_USB_DEVICECONNECT, &deviceConnectCb );
  81.      
  82.     SEM_pend(&usbDeviceConnect, SYS_FOREVER);/* block until bus is connected */
  83. }
  84. /*
  85.  * ======== myUsbTask ========
  86.  * This function copies from the input stream to the output stream.  
  87.  */
  88. Void myUsbTask()
  89. {
  90.     Int nmadus;
  91.     Ptr inbuf0, inbuf1, outbuf0, outbuf1;
  92.     /* create I/O streams */
  93.     createStreams();
  94.     
  95.     /*
  96.      * Both input and output streams are created double buffered for performance.
  97.      * Initially, allocate stream buffers and issue 2 empty buffers to input stream. Then
  98.      *  reclaim two full input buffers and issue them to the output stream. 
  99.      */
  100.     inbuf0 = MEM_calloc(0, USBBUFSIZE, 0);
  101.     inbuf1 = MEM_calloc(0, USBBUFSIZE, 0);
  102.     outbuf0 = MEM_calloc(0, USBBUFSIZE, 0);
  103.     outbuf1 = MEM_calloc(0, USBBUFSIZE, 0);
  104.     if (inbuf0 == NULL || inbuf1 == NULL || 
  105.             outbuf0 == NULL || outbuf1 == NULL) {
  106.         SYS_abort("MEM_calloc failed.");
  107.     } 
  108.     /* Prime the input stream with two empty buffers */
  109.     if (SIO_issue(inStream, inbuf0, SIO_bufsize(inStream), NULL) != SYS_OK) {
  110.         SYS_abort("Error issuing buffer to the input stream");
  111.     }
  112.     if (SIO_issue(inStream, inbuf1, SIO_bufsize(inStream), NULL) != SYS_OK) {
  113.         SYS_abort("Error issuing buffer to the input stream");
  114.     }
  115.     /* Reclaim 1st full buffer from input stream and process */
  116.     if ((nmadus = SIO_reclaim(inStream, (Ptr *)&inbuf0, NULL)) < 0) {
  117.         SYS_abort("Error reclaiming full buffer from the input stream");
  118.     }
  119.     
  120.     /* Issue the full buffer to the output stream */
  121.     if (SIO_issue(outStream, inbuf0, nmadus, NULL) != SYS_OK) {
  122.         SYS_abort("Error issuing buffer to the output stream");
  123.     }
  124.     /* Issue another empty buffer to input stream. */
  125.     if (SIO_issue(inStream, outbuf0, SIO_bufsize(inStream), NULL) != SYS_OK) {
  126.         SYS_abort("Error issuing buffer to the input stream");
  127.     }
  128.     /* Reclaim 2nd full buffer from input stream and process */
  129.     if ((nmadus = SIO_reclaim(inStream, (Ptr *)&inbuf0, NULL)) < 0) {
  130.         SYS_abort("Error reclaiming full buffer from the input stream");
  131.     }
  132.     /* Issue another empty buffer to input stream. */
  133.     if (SIO_issue(inStream, outbuf1, SIO_bufsize(inStream), NULL) != SYS_OK) {
  134.         SYS_abort("Error issuing buffer to the input stream");
  135.     }
  136.     /* Issue the full buffer to the output stream. */
  137.     if (SIO_issue(outStream, inbuf0, nmadus, NULL) != SYS_OK) {
  138.         SYS_abort("Error issuing buffer to the output stream");
  139.     }  
  140.     /* 
  141.      *  Now, both streams have two buffers and we have echod back
  142.      *   two full buffers of data.
  143.      *   Loop forever .
  144.      */
  145.     for (;;) {
  146.         /* Reclaim buffer with data from the input stream */
  147.         if ((nmadus = SIO_reclaim(inStream, (Ptr *)&inbuf0, NULL)) < 0) {
  148.             SYS_abort("Error reclaiming full buffer from the input stream");
  149.         }
  150.         /* Reclaim empty buffer from the output stream to be reused */
  151.         if (SIO_reclaim(outStream, (Ptr *)&outbuf0, NULL) < 0) {
  152.             SYS_abort("Error reclaiming empty buffer from the output stream");
  153.         }
  154.         /*
  155.          * Do any data processing here.
  156.          *  Note: The first word of inbuf0 buffer contains the actual 
  157.          *     USB data byte count.
  158.          */
  159.         /* Issue buffer to the output stream */
  160.         if (SIO_issue(outStream, inbuf0, nmadus, NULL) != SYS_OK) {
  161.      
  162.             SYS_abort("Error issuing full buffer to the output stream");
  163.         }
  164.         /* Issue an empty buffer to the input stream */
  165.         if (SIO_issue(inStream, outbuf0, SIO_bufsize(inStream), NULL) != SYS_OK) {
  166.             SYS_abort("Error issuing empty buffer to the input stream");
  167.         }
  168.     }
  169. }