dio_cbDynamic.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.  *  ======== dio_cbDynamic.c ========
  11.  *  Dynamic Callback based implementation of DIO.
  12.  *
  13.  */
  14. #include <std.h>
  15. #include <dev.h>
  16. #include <mem.h>
  17. #include <sys.h>
  18. #include <iom.h>
  19. #include <dio.h>
  20. static Int      DIO_cbDynamicClose(DEV_Handle device);
  21. static Int      DIO_cbDynamicOpen(DEV_Handle device, String name);
  22. /*
  23.  *  Dynamic Callback based version of function table.
  24.  */
  25. DEV_Fxns DIO_cbDynamicFxns = {
  26.     DIO_cbDynamicClose,         /* close */
  27.     DIO_ctrl,                   /* ctrl */
  28.     DIO_cbIdle,                 /* idle */
  29.     DIO_cbIssue,                /* issue */
  30.     DIO_cbDynamicOpen,          /* open */
  31.     DIO_cbReady,                /* ready */
  32.     DIO_cbReclaim               /* reclaim */
  33. };
  34. static DIO_Handle mkPort(DEV_Handle device, String name);
  35. static Void rmPort(DIO_Handle dio);
  36. /*
  37.  *  ======== mkPort ========
  38.  *  Creates a DIO object and binds the controller.
  39.  */
  40. static DIO_Handle mkPort(DEV_Handle device, String name)
  41. {
  42.     DIO_Params *params = (DIO_Params *)device->params;
  43.     DEV_Callback  *callback = (DEV_Callback *)device->callback;
  44.     DIO_Handle dio;
  45.     DEV_Device  *entry;
  46.     Uns         mode;
  47.     Int         status;
  48.     /* callback must not be NULL if using this version of DIO */
  49.     if (callback == NULL) {
  50.         return (NULL);
  51.     }
  52.     
  53.     /* params must contain name of mini-driver */
  54.     if (params == NULL) {
  55.         return (NULL);
  56.     }
  57.     
  58.     /*
  59.      * check to see that name of mini-driver matches one in the device table
  60.      * and its type is of DEV_IOMTYPE.
  61.      */
  62.     (void)DEV_match(params->name, &entry);
  63.     if (entry == NULL || entry->type != DEV_IOMTYPE) {
  64.         return (NULL);
  65.     }
  66.     /* allocate 0-initialized dio object */
  67.     if ((dio = MEM_calloc(0, sizeof(DIO_Obj), 0)) == MEM_ILLEGAL) {
  68.         return (NULL);
  69.     }
  70.     /* initialize the DIO callback values */
  71.     dio->context.cb = *callback;
  72.     dio->fxns = (IOM_Fxns *)entry->fxns;
  73.     mode = (device->mode == DEV_INPUT) ? IOM_INPUT : IOM_OUTPUT;
  74.     /* create a channel from the mini-driver */
  75.     status = dio->fxns->mdCreateChan(&dio->chanp, entry->devp, name, mode,
  76.                 params->chanParams, DIO_cbCallback, device); 
  77.     if (status != IOM_COMPLETED) {
  78.         rmPort(dio);
  79.         return (NULL);
  80.     }
  81.     return (dio);
  82. }
  83. /*
  84.  *  ======== rmPort ========
  85.  *  Remove a DIO object and cleans up
  86.  */
  87. static Void rmPort(DIO_Handle dio)
  88. {
  89.     /* if chanp not NULL, must delete mini-driver channel */
  90.     if (dio->chanp != NULL) {
  91.         dio->fxns->mdDeleteChan(dio->chanp);
  92.     }
  93.     MEM_free(0, dio, sizeof(DIO_Obj));
  94. }
  95. /*
  96.  *  ======== DIO_cbDynamicClose ========
  97.  *  DIO_cbDynamicClose() can only be called if the user knows that 
  98.  *  all frames have been reclaimed and there are no pending frames.
  99.  */
  100. static Int DIO_cbDynamicClose(DEV_Handle device)
  101. {
  102.     DIO_Handle dio = (DIO_Handle)device->object;
  103.     rmPort(dio);
  104.     return (SYS_OK);
  105. }
  106. /*
  107.  *  ======== DIO_cbDynamicOpen ========
  108.  */
  109. static Int DIO_cbDynamicOpen(DEV_Handle device, String name)
  110. {
  111.     /* allocates DIO_Obj and creates mini-driver channel */
  112.     if ((device->object = (Ptr)mkPort(device, name)) != NULL) {
  113.         return (SYS_OK);
  114.     }
  115.     else {
  116.         return (SYS_EBADIO);
  117.     }
  118. }