dio_tskDynamic.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_tskDynamic.c ========
  11.  *  Dynamic SEM based implementation of DIO.
  12.  * 
  13.  */
  14. #include <std.h>
  15. #include <dev.h>
  16. #include <mem.h>
  17. #include <sem.h>
  18. #include <sys.h>
  19. #include <iom.h>
  20. #include <dio.h>
  21. static Int      DIO_tskDynamicClose(DEV_Handle device);
  22. static Int      DIO_tskDynamicOpen(DEV_Handle device, String name);
  23. /*
  24.  *  Dynamic SEM based version of function table.
  25.  */
  26. DEV_Fxns DIO_tskDynamicFxns = {
  27.     DIO_tskDynamicClose,        /* close */
  28.     DIO_ctrl,                   /* ctrl */
  29.     DIO_tskIdle,                /* idle */
  30.     DIO_tskIssue,               /* issue */
  31.     DIO_tskDynamicOpen,         /* open */
  32.     DIO_tskReady,               /* ready */
  33.     DIO_tskReclaim              /* reclaim */
  34. };
  35. static DIO_Handle mkPort(DEV_Handle device, String name);
  36. static Void rmPort(DIO_Handle dio);
  37. /*
  38.  *  ======== mkPort ========
  39.  *  Creates a DIO object and binds the controller.
  40.  */
  41. static DIO_Handle mkPort(DEV_Handle device, String name)
  42. {
  43.     DIO_Params *params = (DIO_Params *)device->params;
  44.     DIO_Handle dio;
  45.     DEV_Device  *entry;
  46.     Uns         mode;
  47.     Int         status;
  48.     /* params should contain name of mini-driver */
  49.     if (params == NULL) {
  50.         return (NULL);
  51.     }
  52.     
  53.     /*
  54.      * check to see that name of mini-driver matches one in the device table
  55.      * and its type is of DEV_IOMTYPE.
  56.      */
  57.     (void)DEV_match(params->name, &entry);
  58.     if (entry == NULL || entry->type != DEV_IOMTYPE) {
  59.         return (NULL);
  60.     }
  61.     /* allocate 0-initialized dio object */
  62.     if ((dio = MEM_calloc(0, sizeof(DIO_Obj), 0)) == MEM_ILLEGAL) {
  63.         return (NULL);
  64.     }
  65.     /*
  66.      * Tasks will pend on dio->complete if there are no available frames on
  67.      * the fromdevice queue.
  68.      */
  69.     dio->context.sems.complete = SEM_create(0, NULL);
  70.     /* make sure SEM_create() succeeded ... */
  71.     if (dio->context.sems.complete == NULL) {
  72.         MEM_free(0, dio, sizeof(DIO_Obj));     /* free dio object */
  73.         return (NULL);
  74.     }
  75.     dio->fxns = (IOM_Fxns *)entry->fxns;
  76.     mode = (device->mode == DEV_INPUT) ? IOM_INPUT : IOM_OUTPUT;
  77.     /* create a channel from the mini-driver */
  78.     status = dio->fxns->mdCreateChan(&dio->chanp, entry->devp, name, mode,
  79.                 params->chanParams, DIO_tskCallback, device); 
  80.     if (status != IOM_COMPLETED) {
  81.         rmPort(dio);
  82.         return (NULL);
  83.     }
  84.     return (dio);
  85. }
  86. /*
  87.  *  ======== rmPort ========
  88.  *  Removes a DIO object and cleans up
  89.  */
  90. static Void rmPort(DIO_Handle dio)
  91. {
  92.     /* if chanp not NULL, must delete mini-driver channel */
  93.     if (dio->chanp != NULL) {
  94.         dio->fxns->mdDeleteChan(dio->chanp);
  95.     }
  96.     /* remove the semaphore ... */
  97.     SEM_delete(dio->context.sems.complete);
  98.     /* and finally the object */
  99.     MEM_free(0, dio, sizeof(DIO_Obj));
  100. }
  101. /*
  102.  *  ======== DIO_tskDynamicClose ========
  103.  *  DIO_tskIdle() should be called before DIO_tskDynamicClose().
  104.  */
  105. static Int DIO_tskDynamicClose(DEV_Handle device)
  106. {
  107.     DIO_Handle  dio = (DIO_Handle)device->object;
  108.     /*
  109.      * All frames should have been returned by mini-driver since SIO should
  110.      * have already called DIO_idle().
  111.      */
  112.     rmPort(dio);
  113.     return (SYS_OK);
  114. }
  115. /*
  116.  *  ======== DIO_tskDynamicOpen ========
  117.  */
  118. static Int DIO_tskDynamicOpen(DEV_Handle device, String name)
  119. {
  120.     /* allocates DIO_Obj and creates mini-driver channel */
  121.     if ((device->object = (Ptr)mkPort(device, name)) != NULL) {
  122.         return (SYS_OK);
  123.     }
  124.     else {
  125.         return (SYS_EBADIO);
  126.     }
  127. }