ttyDrv.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ttyDrv.c - provide terminal device access to serial channels */
  2. /* Copyright 1984-1995 Wind River systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,19mar99,cn  added check on pSioChan in ttyDevCreate () (SPR# 25839).
  7. 01g,06may97,db  added ttyClose and modified ttyOpen to keep track of count of
  8. open paths to device and provide HUPCL modem control. Added
  9. arg flags to ttyOpen for compatibility with iosOpen(SPR #7637).
  10. 01f,19nov96,ms  FIOBAUDRATE ioctl now returns OK or ERROR (SPR 5487).
  11. 01e,29oct96,dgp doc: correct spelling per SPR 5904
  12. 01d,20jun95,ms fixed comments for mangen
  13. 01c,15jun95,ms updated for new serial driver
  14. 01b,21feb95,ms revised to be generic.
  15. 01a,29dec94,ms written.
  16. */
  17. /*
  18. DESCRIPTION
  19. This library provides the OS-dependent functionality of a serial device,
  20. including canonical processing and the interface to the VxWorks I/O system.
  21. The BSP provides "raw" serial channels which are accessed
  22. via an SIO_CHAN data structure. These raw devices provide only low
  23. level access to the devices to send and receive characters.
  24. This library builds on that functionality by allowing the
  25. serial channels to be accessed via the VxWorks I/O system using
  26. the standard read/write interface. It also provides the canonical
  27. processing support of tyLib.
  28. The routines in this library are typically called by usrRoot()
  29. in usrConfig.c to create VxWorks serial devices at system startup time.
  30. INCLUDE FILES: ttyLib.h
  31. SEE ALSO: tyLib, sioLib.h
  32. */
  33. #include "vxWorks.h"
  34. #include "iv.h"
  35. #include "ioLib.h"
  36. #include "iosLib.h"
  37. #include "tyLib.h"
  38. #include "intLib.h"
  39. #include "errnoLib.h"
  40. #include "sioLib.h"
  41. #include "stdlib.h"
  42. /* data types */
  43. typedef struct  /* TYCO_DEV */
  44.     {
  45.     TY_DEV tyDev;
  46.     SIO_CHAN * pSioChan;
  47.     } TYCO_DEV;
  48. /* local variables */
  49. static int ttyDrvNum;           /* driver number assigned to this driver */
  50. /* forward declarations */
  51. LOCAL int    ttyOpen ();
  52. LOCAL int    ttyClose (TYCO_DEV *  pTyCoDev); 
  53. LOCAL STATUS ttyIoctl ();
  54. LOCAL void   ttyStartup ();
  55. /*******************************************************************************
  56. *
  57. * ttyDrv - initialize the tty driver
  58. *
  59. * This routine initializes the tty driver, which is the OS interface
  60. * to core serial channel(s). Normally, it is called by usrRoot()
  61. * in usrConfig.c.
  62. *
  63. * After this routine is called, ttyDevCreate() is typically called
  64. * to bind serial channels to VxWorks devices.
  65. *
  66. * RETURNS: OK, or ERROR if the driver cannot be installed.
  67. */
  68. STATUS ttyDrv (void)
  69.     {
  70.     /* check if driver already installed */
  71.     if (ttyDrvNum > 0)
  72.         return (OK);
  73.     ttyDrvNum = iosDrvInstall (ttyOpen, (FUNCPTR) NULL, ttyOpen,
  74.                                 ttyClose, tyRead, tyWrite, ttyIoctl);
  75.     return (ttyDrvNum == ERROR ? ERROR : OK);
  76.     }
  77. /*******************************************************************************
  78. *
  79. * ttyDevCreate - create a VxWorks device for a serial channel
  80. *
  81. * This routine creates a device on a specified serial channel.  Each channel
  82. * to be used should have exactly one device associated with it by calling
  83. * this routine.
  84. *
  85. * For instance, to create the device "/tyCo/0", with buffer sizes of 512 bytes,
  86. * the proper call would be:
  87. * .CS
  88. *     ttyDevCreate ("/tyCo/0", pSioChan, 512, 512);
  89. * .CE
  90. * Where pSioChan is the address of the underlying SIO_CHAN serial channel
  91. * descriptor (defined in sioLib.h).
  92. * This routine is typically called by usrRoot() in usrConfig.c
  93. *
  94. * RETURNS: OK, or ERROR if the driver is not installed, or the
  95. * device already exists.
  96. */
  97. STATUS ttyDevCreate
  98.     (
  99.     char *      name,           /* name to use for this device      */
  100.     SIO_CHAN * pSioChan, /* pointer to core driver structure */
  101.     int         rdBufSize,      /* read buffer size, in bytes       */
  102.     int         wrtBufSize      /* write buffer size, in bytes      */
  103.     )
  104.     {
  105.     TYCO_DEV *pTyCoDev;
  106.     if (ttyDrvNum <= 0)
  107.         {
  108.         errnoSet (S_ioLib_NO_DRIVER);
  109.         return (ERROR);
  110.         }
  111.     if (pSioChan == (SIO_CHAN *) ERROR)
  112. {
  113.         return (ERROR);
  114. }
  115.     /* allocate memory for the device */
  116.     if ((pTyCoDev = (TYCO_DEV *) malloc (sizeof (TYCO_DEV))) == NULL)
  117.         return (ERROR);
  118.     /* initialize the ty descriptor */
  119.     if (tyDevInit (&pTyCoDev->tyDev, rdBufSize, wrtBufSize,
  120.                    (FUNCPTR) ttyStartup) != OK)
  121.         {
  122. free (pTyCoDev);
  123.         return (ERROR);
  124.         }
  125.     /* initialize the SIO_CHAN structure */
  126.     pTyCoDev->pSioChan = pSioChan;
  127.     sioCallbackInstall (pSioChan, SIO_CALLBACK_GET_TX_CHAR,
  128. tyITx, (void *)pTyCoDev);
  129.     sioCallbackInstall (pSioChan, SIO_CALLBACK_PUT_RCV_CHAR,
  130. tyIRd, (void *)pTyCoDev);
  131.     /* start the device cranking */
  132.     sioIoctl (pSioChan, SIO_MODE_SET, (void *)SIO_MODE_INT);
  133.     /* add the device to the I/O system */
  134.     return (iosDevAdd (&pTyCoDev->tyDev.devHdr, name, ttyDrvNum));
  135.     }
  136. /*******************************************************************************
  137. *
  138. * ttyOpen - open a ttyDrv serial device.
  139. *
  140. * Increments a counter that holds the number of open paths to device. 
  141. */
  142. LOCAL int ttyOpen
  143.     (
  144.     TYCO_DEV * pTyCoDev, /* device to control */
  145.     char     * name, /* device name */
  146.     int flags, /* flags */
  147.     int         mode /* mode selected */
  148.     )
  149.     {
  150.     pTyCoDev->tyDev.numOpen++;  /* increment number of open paths */
  151.     sioIoctl (pTyCoDev->pSioChan, SIO_OPEN, NULL);
  152.     return ((int) pTyCoDev);
  153.     }
  154. /*******************************************************************************
  155. *
  156. * ttyClose - close a ttyDrv serial device.
  157. *
  158. * Decrements the counter of open paths to device and alerts the driver 
  159. * with an ioctl call when the count reaches zero. This scheme is used to
  160. * implement the HUPCL(hang up on last close).      
  161. */
  162. LOCAL int ttyClose
  163.     (
  164.     TYCO_DEV * pTyCoDev /* device to control */
  165.     )
  166.     {
  167.     if (!(--pTyCoDev->tyDev.numOpen))
  168. sioIoctl (pTyCoDev->pSioChan, SIO_HUP, NULL);
  169.     return ((int) pTyCoDev);
  170.     }
  171. /*******************************************************************************
  172. *
  173. * ttyIoctl - special device control
  174. *
  175. * RETURNS: depends on the function invoked.
  176. */
  177. LOCAL int ttyIoctl
  178.     (
  179.     TYCO_DEV * pTyCoDev, /* device to control */
  180.     int request, /* request code */
  181.     void * arg /* some argument */
  182.     )
  183.     {
  184.     int status;
  185.     if (request == FIOBAUDRATE)
  186. return (sioIoctl (pTyCoDev->pSioChan, SIO_BAUD_SET, arg) == OK ?
  187. OK : ERROR);
  188.     status = sioIoctl (pTyCoDev->pSioChan, request, arg);
  189.     if (status == ENOSYS)
  190. return (tyIoctl (&pTyCoDev->tyDev, request, (int)arg));
  191.     return (status);
  192.     }
  193. /*******************************************************************************
  194. *
  195. * ttyStartup - transmitter startup routine
  196. *
  197. * Call interrupt level character output routine.
  198. */
  199. LOCAL void ttyStartup
  200.     (
  201.     TYCO_DEV *pTyCoDev          /* ty device to start up */
  202.     )
  203.     {
  204.     sioTxStartup (pTyCoDev->pSioChan);
  205.     }