dio_cbStatic.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.10.00.23 07-02-03 (ddk-b12)" */
  9. /*
  10.  *  ======== dio_cbStatic.c ========
  11.  *  Static Callback based implementation of DIO
  12.  *
  13.  */
  14. #include <std.h>
  15. #include <dev.h>
  16. #include <sys.h>
  17. #include <iom.h>
  18. #include <dio.h>
  19. static Int      DIO_cbStaticClose(DEV_Handle device);
  20. static Int      DIO_cbStaticOpen(DEV_Handle device, String name);
  21. /*
  22.  *  Static Callback based version of function table.
  23.  */
  24. DEV_Fxns DIO_cbStaticFxns = {
  25.     DIO_cbStaticClose,          /* close */
  26.     DIO_ctrl,                   /* ctrl */
  27.     DIO_cbIdle,                 /* idle */
  28.     DIO_cbIssue,                /* issue */
  29.     DIO_cbStaticOpen,           /* open */
  30.     DIO_cbReady,                /* ready */
  31.     DIO_cbReclaim               /* reclaim */
  32. };
  33. static DIO_Handle mkPort(DEV_Handle device, String name);
  34. extern far Int DIO_NUMCBSTATIC;         /* Number of Callback based DIO */
  35. extern far DIO_Obj DIO_CBTABLE[];       /* Table of Callback based 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.     static Int  numUsed = 0;
  49.     /* supports only the number of statically created callback based DIO */
  50.     if (numUsed >= DIO_NUMCBSTATIC) {
  51.         SYS_error("DIO", SYS_EBADIO);
  52.         return (NULL);
  53.     }
  54.     /* callback must not be NULL if using this version of DIO */
  55.     if (callback == NULL) {
  56.         return (NULL);
  57.     }
  58.     
  59.     /* must be connected to some driver of type DEV_IOMTYPE */
  60.     if (params == NULL) {
  61.         return (NULL);
  62.     }
  63.     
  64.     /*
  65.      * check to see that name of mini-driver matches one in the device table
  66.      * and its type is of DEV_IOMTYPE.
  67.      */
  68.     (void)DEV_match(params->name, &entry);
  69.     if (entry == NULL || entry->type != DEV_IOMTYPE) {
  70.         return (NULL);
  71.     }
  72.     /* allocate dio object */
  73.     dio = &DIO_CBTABLE[numUsed++];
  74.     /* initialize the DIO callback structure */
  75.     dio->context.cb = *callback;
  76.     dio->fxns = (IOM_Fxns *)entry->fxns;
  77.     mode = (device->mode == DEV_INPUT) ? IOM_INPUT : IOM_OUTPUT;
  78.     /* create a channel from the mini-driver */
  79.     status = dio->fxns->mdCreateChan(&dio->chanp, entry->devp, name, mode,
  80.                 params->chanParams, DIO_cbCallback, device); 
  81.     if (status != IOM_COMPLETED) {
  82.         return (NULL);
  83.     }
  84.     return (dio);
  85. }
  86. /*
  87.  *  ======== DIO_cbStaticClose ========
  88.  *  DIO_cbStaticClose() should never be called.
  89.  */
  90. static Int DIO_cbStaticClose(DEV_Handle device)
  91. {
  92.     return (SYS_EBADIO);
  93. }
  94. /*
  95.  *  ======== DIO_cbStaticOpen ========
  96.  */
  97. static Int DIO_cbStaticOpen(DEV_Handle device, String name)
  98. {
  99.     /* allocates DIO_Obj and creates mini-driver channel */
  100.     if ((device->object = (Ptr)mkPort(device, name)) != NULL) {
  101.         return (SYS_OK);
  102.     }
  103.     else {
  104.         return (SYS_EBADIO);
  105.     }
  106. }