wdbTyCoDrv.c
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:5k
开发平台:

MultiPlatform

  1. /* wdbTyCoDrv.c - WDB agent interface over a VxWorks TTY device */
  2. /* Copyright 1984-1996 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01c,23jan96,tpr  added casts to compile with Diab Data tools.
  7. 01b,15jun95,ms  updated for new serial driver structure.
  8. 01a,21dec94,ms   written.
  9. */
  10. /*
  11. DESCRIPTION
  12. This library uses a VxWorks tyCo device to emulate a raw SIO_CHAN.
  13. */
  14. #include "vxWorks.h"
  15. #include "ioLib.h"
  16. #include "sioLib.h"
  17. #include "wdb/wdbCommIfLib.h"
  18. #include "wdb/wdbTyCoDrv.h"
  19. #include "stdio.h"
  20. /* locals */
  21. static SIO_DRV_FUNCS wdbTyCoDrvFuncs;
  22. /******************************************************************************
  23. *
  24. * unimp - unimplemented function.
  25. */ 
  26. static int unimp (void)
  27.     {
  28.     return (ENOSYS);
  29.     }
  30. /******************************************************************************
  31. *
  32. * wdbTyCoIoctl - 
  33. *
  34. * RETURNS: OK on success, EIO on device error, ENOSYS on unsupported
  35. *          request.
  36. */ 
  37. static int wdbTyCoIoctl
  38.     (
  39.     SIO_CHAN * pSioChan,
  40.     int cmd,
  41.     void * arg
  42.     )
  43.     {
  44.     switch (cmd)
  45. {
  46. case SIO_MODE_GET:
  47. case SIO_AVAIL_MODES_GET:
  48.     *(int *)arg = SIO_MODE_INT;
  49.     return (OK);
  50. case SIO_MODE_SET: 
  51.     return (arg == (void *)SIO_MODE_INT ? OK : EIO);
  52. case SIO_BAUD_SET:
  53.     return (ioctl (((WDB_TYCO_SIO_CHAN *)pSioChan)->fd, FIOBAUDRATE,
  54. (int)arg) == OK ? OK : EIO);
  55. case SIO_BAUD_GET:
  56. case SIO_HW_OPTS_SET:
  57. case SIO_HW_OPTS_GET:
  58.     /* should be supported but can't be for tyCoDrv */
  59. default:
  60.     return (ENOSYS);
  61. }
  62.     }
  63. /******************************************************************************
  64. *
  65. * wdbTyCoStartup - start transmitting over the serial device.
  66. */
  67. static int wdbTyCoStartup
  68.     (
  69.     SIO_CHAN * pSioChan
  70.     )
  71.     {
  72.     char thisChar;
  73.     WDB_TYCO_SIO_CHAN * pChan = (WDB_TYCO_SIO_CHAN *)pSioChan;
  74.     while ((*pChan->getTxChar) (pChan->getTxArg, &thisChar) != ERROR)
  75. write (((WDB_TYCO_SIO_CHAN *)pSioChan)->fd, &thisChar, 1);
  76.     return (OK);
  77.     }
  78. /******************************************************************************
  79. *
  80. * wdbTyCoCallbackInstall - install callbacks.
  81. */ 
  82. static int wdbTyCoCallbackInstall
  83.     (
  84.     SIO_CHAN * pSioChan,
  85.     int callbackType,
  86.     STATUS (*callback)(),
  87.     void * callbackArg
  88.     )
  89.     {
  90.     WDB_TYCO_SIO_CHAN * pChan = (WDB_TYCO_SIO_CHAN *)pSioChan;
  91.     switch (callbackType)
  92. {
  93. case SIO_CALLBACK_GET_TX_CHAR:
  94.     pChan->getTxChar = callback;
  95.     pChan->getTxArg = callbackArg;
  96.     return (OK);
  97. case SIO_CALLBACK_PUT_RCV_CHAR:
  98.     pChan->putRcvChar = callback;
  99.     pChan->putRcvArg = callbackArg;
  100.     return (OK);
  101. default:
  102.     return (ENOSYS);
  103. }
  104.     }
  105. /******************************************************************************
  106. *
  107. * wdbTyCoRcv - receive a character over the serial channel.
  108. */
  109. static BOOL wdbTyCoRcv
  110.     (
  111.     SIO_CHAN * pSioChan,
  112.     int  inChar
  113.     )
  114.     {
  115.     char thisChar;
  116.     WDB_TYCO_SIO_CHAN * pChan = (WDB_TYCO_SIO_CHAN *)pSioChan;
  117.     thisChar = inChar & 0xff;
  118.     (*pChan->putRcvChar)(pChan->putRcvArg, thisChar);
  119.     return (TRUE); /* no more processing by the tyCo device */
  120.     }
  121. /******************************************************************************
  122. *
  123. * wdbTyCoDevInit - initialize a tyCo SIO_CHAN
  124. */
  125. STATUS wdbTyCoDevInit
  126.     (
  127.     WDB_TYCO_SIO_CHAN *pChan, /* channel structure to initialize */
  128.     char * device, /* name of underlying tyCo device to use */
  129.     int baudRate /* baud rate */
  130.     )
  131.     {
  132.     /* make sure driver functions are initialized */
  133.     if (wdbTyCoDrvFuncs.ioctl == NULL)
  134. {
  135. wdbTyCoDrvFuncs.ioctl = wdbTyCoIoctl;
  136. wdbTyCoDrvFuncs.txStartup = wdbTyCoStartup;
  137. wdbTyCoDrvFuncs.callbackInstall = wdbTyCoCallbackInstall;
  138. wdbTyCoDrvFuncs.pollInput = (int (*) (SIO_CHAN *, char *)) unimp;
  139. wdbTyCoDrvFuncs.pollOutput = (int (*) (SIO_CHAN *, char ))  unimp;
  140. }
  141.     /* open and initialize the tyCoDev device */
  142.     pChan->fd = open (device, O_RDWR, 0);
  143.     if (pChan->fd <= 0)
  144. {
  145. printErr ("wdbTyCoDrv: open of %s failedn", device);
  146. return (ERROR);
  147. }
  148.     if (ioctl (pChan->fd, FIOISATTY, 0) != TRUE)
  149. {
  150. printErr ("%s is not a TTY devicen");
  151. close (pChan->fd);
  152. return (ERROR);
  153. }
  154.     if (ioctl (pChan->fd, FIOBAUDRATE, baudRate) == ERROR)
  155. {
  156. printErr ("wdbTyCoDrv: seting baud rate to %d failedn", baudRate);
  157. close (pChan->fd);
  158. return (ERROR);
  159. }
  160.     if (ioctl (pChan->fd, FIOFLUSH, 0)  == ERROR ||
  161.         ioctl (pChan->fd, FIOOPTIONS, OPT_RAW)  == ERROR ||
  162.         ioctl (pChan->fd, FIOPROTOHOOK, (int)wdbTyCoRcv) == ERROR ||
  163.         ioctl (pChan->fd, FIOPROTOARG, (int)pChan) == ERROR)
  164. {
  165. printErr ("wdbTyCoDrv: ioctl failedn");
  166. close (pChan->fd);
  167. return (ERROR);
  168. }
  169.     /* initialize the SIO_CHAN structure */
  170.     pChan->pDrvFuncs = &wdbTyCoDrvFuncs;
  171.     return (OK);
  172.     }