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

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_cb.c ========
  11.  *  Callback 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_cbIdle(DEV_Handle device, Bool flush);
  22. Int     DIO_cbIssue(DEV_Handle device);
  23. Bool    DIO_cbReady(DEV_Handle device, SEM_Handle sem);
  24. Int     DIO_cbReclaim(DEV_Handle device);
  25. Void    DIO_cbCallback(Ptr devp, DEV_Frame *frame);
  26. /*
  27.  *  ======== DIO_cbCallback ========
  28.  */
  29. Void DIO_cbCallback(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.         dio->context.cb.fxn(dio->context.cb.arg0,
  36.             dio->context.cb.arg1);
  37.     }
  38. }
  39. /*
  40.  *  ======== DIO_cbIdle ========
  41.  *  DIO_cbIdle() simply return SYS_OK
  42.  *  which means it really is a NOP.
  43.  */
  44. Int DIO_cbIdle(DEV_Handle device, Bool flush)
  45. {
  46.     return (SYS_OK);
  47. }
  48. /*
  49.  *  ======== DIO_cbIssue ========
  50.  */
  51. Int DIO_cbIssue(DEV_Handle device)
  52. {
  53.     DIO_Handle dio = (DIO_Handle)device->object;
  54.     DEV_Frame   *frame;
  55.     Int         status;
  56.     frame = QUE_get(device->todevice);
  57.     frame->cmd = (device->mode == DEV_INPUT) ? IOM_READ : IOM_WRITE;
  58.     frame->status = IOM_PENDING;
  59.     status = dio->fxns->mdSubmitChan(dio->chanp, frame);
  60.     if (status < 0) {
  61.         return (SYS_EBADIO);
  62.     }
  63.     else {
  64.         if (status == IOM_COMPLETED) {
  65.             DIO_cbCallback(device, frame);
  66.         }
  67.     
  68.         return (SYS_OK);
  69.     }
  70. }
  71. /*
  72.  *  ======== DIO_cbReady ========
  73.  */
  74. Bool DIO_cbReady(DEV_Handle device, SEM_Handle sem)
  75. {
  76.     return (!(QUE_empty(device->fromdevice)));
  77. }
  78. /*
  79.  *  ======== DIO_cbReclaim ========
  80.  *  This function is expecting at least one buffer ready to be
  81.  *  processed from the fromdevice queue.
  82.  *  If there are no buffers ready then it will return an error.
  83.  *  If more than one buffer is ready, it will call the callback function.
  84.  */
  85. Int DIO_cbReclaim(DEV_Handle device)
  86. {
  87.     DIO_Handle  dio = (DIO_Handle)device->object;
  88.     QUE_Handle  queElem;
  89.     queElem = device->fromdevice->next;
  90.     if (queElem == device->fromdevice) {
  91.         return (SYS_EBADIO);
  92.     }
  93.     if (queElem->next != device->fromdevice) {
  94.         dio->context.cb.fxn(dio->context.cb.arg0,
  95.             dio->context.cb.arg1);
  96.     }
  97.     return (SYS_OK);
  98. }