gio_crea.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.  *  ======== gio_crea.c ========
  11.  *
  12.  */
  13. #include <std.h>
  14. #include <dev.h>
  15. #include <mem.h>
  16. #include <que.h>
  17. #include <sys.h>
  18. #include <gio.h>
  19. #include <iom.h>
  20. #include <_gio.h>
  21. /*
  22.  *  ======== GIO_create ========
  23.  */
  24. GIO_Handle GIO_create(String name, Int mode, Int *status, Ptr optArgs, 
  25.         GIO_Attrs *attrs)
  26. {
  27.     GIO_Handle  gioChan;
  28.     IOM_Packet  *packet;
  29.     DEV_Device  *entry;
  30.     Int         i;
  31.     Int         tmpStat;
  32.     if (attrs == NULL) {
  33.         attrs = &GIO_ATTRS;
  34.     }
  35.     /*
  36.      * status param is used to pass additional device status back to caller.
  37.      */
  38.     if (status == NULL) {
  39.         status = &tmpStat;    /* no longer need to check if status valid ptr */
  40.     }
  41.     *status = IOM_COMPLETED;
  42.     
  43.     /*
  44.      *  Find device structure in device table for device with name 'name'.
  45.      *  DEV_match() returns the remaining name string for use by the
  46.      *  mini-driver's create() function.
  47.      */
  48.     name = DEV_match(name, &entry);
  49.     if (entry == NULL) {
  50.         SYS_error(name, SYS_ENODEV); /* sys error - no device found */
  51.         return (NULL);
  52.     }
  53.     
  54.     if (entry->type != DEV_IOMTYPE) {
  55.         SYS_error("IOM", SYS_EINVAL); /* sys error - invalid device parameter */
  56.         return (NULL);
  57.     }
  58.     /*  allocate and 0-fill IOM object */
  59.     gioChan = MEM_calloc(0, sizeof(GIO_Obj), 0);
  60.     if (gioChan == NULL) {
  61.         *status = IOM_EALLOC;  
  62.        
  63.         return (NULL);
  64.     }
  65.     /* initialize queue structures */
  66.     QUE_new(&gioChan->freeList);
  67.     /*
  68.      * Allocate packets for asynch I/O.
  69.      */
  70.     for (i=0; i < attrs->nPackets; i++) {
  71.         packet = _GIO_mkPacket();
  72.         if (packet == NULL) {
  73.            
  74.             *status = IOM_EALLOC;
  75.             GIO_delete(gioChan);
  76.             return (NULL);
  77.         }
  78.         QUE_put(&gioChan->freeList, packet);
  79.     }
  80.     /*
  81.      * Create semaphore or other synchronization object.  'gioChan->syncObj' is
  82.      * used to wait for I/O to complete when GIO_submit() is called with
  83.      * NULL *appCallback parameter. 
  84.      */
  85.     gioChan->syncObj = GIO->SEMCREATE(0, NULL);
  86.     if (gioChan->syncObj == NULL) {
  87.         *status = IOM_EALLOC;
  88.  
  89.         GIO_delete(gioChan);
  90.         return (NULL);
  91.     }
  92.     gioChan->fxns = (IOM_Fxns *)entry->fxns;
  93.     gioChan->mode = mode;
  94.     gioChan->timeout = attrs->timeout;
  95.     *status = gioChan->fxns->mdCreateChan(&gioChan->mdChan, entry->devp,
  96.             name, mode, optArgs, _GIO_iomCallback, gioChan);
  97.     if (gioChan->mdChan == NULL) {
  98.         
  99.         GIO_delete(gioChan);
  100.         return (NULL);
  101.     }
  102.     return (gioChan);
  103. }