dio_tsk.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.11.00.00 11-04-03 (ddk-b13)" */
  9. /*
  10.  *  ======== dio_tsk.c ========
  11.  *  SEM based functions of DIO.
  12.  *
  13.  */
  14. #include <std.h>
  15. #include <dev.h>
  16. #include <que.h>
  17. #include <sem.h>
  18. #include <sys.h>
  19. #include <iom.h>
  20. #include <dio.h>
  21. Int     DIO_tskIdle(DEV_Handle device, Bool flush);
  22. Int     DIO_tskIssue(DEV_Handle device);
  23. Bool    DIO_tskReady(DEV_Handle device, SEM_Handle sem);
  24. Int     DIO_tskReclaim(DEV_Handle device);
  25. Void    DIO_tskCallback(Ptr devp, DEV_Frame *frame);
  26. /*
  27.  *  ======== DIO_tskCallback ========
  28.  */
  29. Void DIO_tskCallback(Ptr devp, DEV_Frame *frame)
  30. {
  31.     DEV_Handle  device = (DEV_Handle)devp;
  32.     DIO_Handle  dio = (DIO_Handle)device->object;
  33.     if (frame->cmd == IOM_READ || frame->cmd == IOM_WRITE) {
  34.         QUE_put(device->fromdevice, frame); 
  35.         SEM_post(dio->context.sems.complete);
  36.         /*
  37.          * If semaphore was registered with DIO_ready(), dio->ready will
  38.          * be non-NULL.  In this case, SIO_select() is probably waiting for
  39.          * this semaphore to be posted by the first ready device.
  40.          */
  41.         if (dio->context.sems.ready) {
  42.             SEM_post(dio->context.sems.ready);
  43.         }
  44.     }
  45.     else {
  46.         SEM_post(dio->context.sems.complete);
  47.     }
  48. }
  49. /*
  50.  *  ======== DIO_tskIdle ========
  51.  *  DIO_tskIdle() puts the device back to the state it was in just after
  52.  *  DIO_open() was called.
  53.  */
  54. Int DIO_tskIdle(DEV_Handle device, Bool flush)
  55. {
  56.     DIO_Handle dio = (DIO_Handle)device->object;
  57.     Uns         pendCount = 0;
  58.     DEV_Frame   localFrame;
  59.     Int         status;
  60.     localFrame.status = IOM_PENDING;
  61.     if (device->mode == DEV_INPUT || flush) {
  62.         localFrame.cmd = IOM_ABORT;
  63.     }
  64.     else {
  65.         localFrame.cmd = IOM_FLUSH;
  66.     }
  67.     status = dio->fxns->mdSubmitChan(dio->chanp, &localFrame);
  68.     if (status == IOM_PENDING) {
  69.         for (;;) {
  70.             if (SEM_pend(dio->context.sems.complete, device->timeout)) {
  71.                 /*
  72.                  * Break out of the for loop when the local abort/flush
  73.                  * frame status shows that it is complete.
  74.                  */
  75.                 if (localFrame.status == IOM_COMPLETED) {
  76.                     break;
  77.                 }
  78.                 else {
  79.                     /* keep track of data frame completions */
  80.                     pendCount++;
  81.                 }
  82.             }
  83.             else {
  84.                 return (SYS_ETIMEOUT);
  85.             }
  86.         }
  87.         /* 
  88.          * Update complete semaphore so it corresponds to number of frames
  89.          * on the 'todevice' queue.  'for' loop above may have made the 
  90.          * complete sem count inconsistent.
  91.          */
  92.         while (pendCount--) {
  93.             SEM_post(dio->context.sems.complete);
  94.         }
  95.     }
  96.     return (SYS_OK);
  97. }
  98. /*
  99.  *  ======== DIO_tskIssue ========
  100.  */
  101. Int DIO_tskIssue(DEV_Handle device)
  102. {
  103.     DIO_Handle dio = (DIO_Handle)device->object;
  104.     DEV_Frame   *frame;
  105.     Int         status;
  106.     frame = QUE_get(device->todevice);
  107.     frame->cmd = (device->mode == DEV_INPUT) ? IOM_READ : IOM_WRITE;
  108.     frame->status = IOM_PENDING;
  109.     status = dio->fxns->mdSubmitChan(dio->chanp, frame);
  110.     if (status < 0) {
  111.         return (SYS_EBADIO);
  112.     }
  113.     else {
  114.         if (status == IOM_COMPLETED) {
  115.             QUE_put(device->fromdevice, frame);
  116.             SEM_post(dio->context.sems.complete);
  117.         }
  118.         
  119.         return (SYS_OK);
  120.     }
  121. }
  122. /*
  123.  *  ======== DIO_tskReady ========
  124.  */
  125. Bool DIO_tskReady(DEV_Handle device, SEM_Handle sem)
  126. {
  127.     DIO_Handle  dio = (DIO_Handle)device->object;
  128.     dio->context.sems.ready = sem;
  129.     return (!(QUE_empty(device->fromdevice)));
  130. }
  131. /*
  132.  *  ======== DIO_tskReclaim ========
  133.  */
  134. Int DIO_tskReclaim(DEV_Handle device)
  135. {
  136.     DIO_Handle  dio = (DIO_Handle)device->object;
  137.     /*
  138.      * Wait here if there are no buffers on the device->fromdevice
  139.      * queue.
  140.      */
  141.     if (SEM_pend(dio->context.sems.complete, device->timeout)) {
  142.         return (SYS_OK);
  143.     }
  144.     else {
  145.         return (SYS_ETIMEOUT);
  146.     }
  147. }