dio_tskStatic.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_tskStatic.c ========
  11.  *  Static SEM 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_tskStaticClose(DEV_Handle device);
  20. static Int      DIO_tskStaticOpen(DEV_Handle device, String name);
  21. /*
  22.  *  Static SEM based version of function table.
  23.  */
  24. DEV_Fxns DIO_tskStaticFxns = {
  25.     DIO_tskStaticClose,         /* close */
  26.     DIO_ctrl,                   /* ctrl */
  27.     DIO_tskIdle,                /* idle */
  28.     DIO_tskIssue,               /* issue */
  29.     DIO_tskStaticOpen,          /* open */
  30.     DIO_tskReady,               /* ready */
  31.     DIO_tskReclaim              /* reclaim */
  32. };
  33. static DIO_Handle mkPort(DEV_Handle device, String name);
  34. extern far Int DIO_NUMTSKSTATIC;        /* Number of SEM based DIO */
  35. extern far DIO_Obj DIO_TSKTABLE[];      /* Table of SEM 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.     DIO_Handle dio;
  44.     DEV_Device  *entry;
  45.     Uns         mode;
  46.     Int         status;
  47.     static Int  numUsed = 0;
  48.     /* supports only the number of statically created SEM based DIO */
  49.     if (numUsed >= DIO_NUMTSKSTATIC) {
  50.         return (NULL);
  51.     }
  52.     /* params should contain name of mini-driver */
  53.     if (params == NULL) {
  54.         return (NULL);
  55.     }
  56.     
  57.     /*
  58.      * check to see that name of mini-driver matches one in the device table
  59.      * and its type is of DEV_IOMTYPE.
  60.      */
  61.     (void)DEV_match(params->name, &entry);
  62.     if (entry == NULL || entry->type != DEV_IOMTYPE) {
  63.         return (NULL);
  64.     }
  65.     /* allocate dio object */
  66.     dio = &DIO_TSKTABLE[numUsed++];
  67.     dio->fxns = (IOM_Fxns *)entry->fxns;
  68.     mode = (device->mode == DEV_INPUT) ? IOM_INPUT : IOM_OUTPUT;
  69.     /* create a channel from the mini-driver */
  70.     status = dio->fxns->mdCreateChan(&dio->chanp, entry->devp, name, mode,
  71.                 params->chanParams, DIO_tskCallback, device); 
  72.     if (status != IOM_COMPLETED) {
  73.         return (NULL);
  74.     }
  75.     return (dio);
  76. }
  77. /*
  78.  *  ======== DIO_tskStaticClose ========
  79.  *  DIO_tskStaticClose() should never be called.
  80.  */
  81. static Int DIO_tskStaticClose(DEV_Handle device)
  82. {
  83.     return (SYS_EBADIO);
  84. }
  85. /*
  86.  *  ======== DIO_tskStaticOpen ========
  87.  */
  88. static Int DIO_tskStaticOpen(DEV_Handle device, String name)
  89. {
  90.     /* allocates DIO_Obj and creates mini-driver channel */
  91.     if ((device->object = (Ptr)mkPort(device, name)) != NULL) {
  92.         return (SYS_OK);
  93.     }
  94.     else {
  95.         return (SYS_EBADIO);
  96.     }
  97. }