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

VxWorks

开发平台:

C/C++

  1. /* wdbSioTestLib.c - test the serial line connection to the agent */
  2. /* Copyright 1995-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,14sep01,jhw  Fixed warnings from compiling with gnu -pedantic flag
  7.  Added copyright.
  8. 01a,19jun95,ms   written.
  9. */
  10. /*
  11. DESCRIPTION
  12. This module is used to test the serial connection to the agent.
  13. If the macro INCLUDE_SIO_TEST is defined in configAll.h, then
  14. this library will be called to test the serial connection.
  15. It does the following:
  16.    prints "WDB READY" over the serial line when VxWorks comes up,
  17.    thus verifying that the serial transmitter works.
  18.    optionally echos characters until some designated character (e.g., EOF
  19.    for SLIP) arrives, thus verifying that both the transmitter and
  20.    receiver work.
  21. */
  22. #include "wdb/wdb.h"
  23. #include "wdb/wdbRtIfLib.h"
  24. #include "errno.h"
  25. #include "string.h"
  26. #include "sioLib.h"
  27. /* locals */
  28. static void * wdbSioTestSem;
  29. static char * msg = "WDB READYnr"; /* greeting message */
  30. static int msgSize; /* size of message */
  31. static int msgIx; /* index into the message */
  32. static char lastInChar; /* last input character recieved */
  33. static char lastInCharValid; /* lastInChar is valid */
  34. static char eofChar; /* end of test character */
  35. /* forward declarations */
  36. static STATUS wdbSioTestRcv (void *pDev, char thisChar);
  37. static STATUS wdbSioTestTx  (void *pDev, char * pThisChar);
  38. /******************************************************************************
  39. *
  40. * wdbSioTest - test a serial channel
  41. */
  42. void wdbSioTest
  43.     (
  44.     SIO_CHAN * pSioChan, /* serial channel to test */
  45.     int mode, /* mode in which to test the device */
  46.     char eof /* character to terminate test */
  47.     )
  48.     {
  49.     msgSize = strlen (msg);
  50.     eofChar = eof;
  51.     if (mode == SIO_MODE_POLL)
  52. {
  53. if (sioIoctl (pSioChan, SIO_MODE_SET, (void *)SIO_MODE_POLL) != OK)
  54.     return;
  55. /* send the greeting */
  56. for (msgIx = 0; msgIx < msgSize; msgIx++)
  57.     {
  58.     while (sioPollOutput (pSioChan, msg[msgIx]) == EAGAIN)
  59.                 ;
  60.     }
  61. /* echo characters until eofChar is recieved */
  62. if (eofChar == 0)
  63.     return;
  64. for (;;)
  65.     {
  66.     char thisChar;
  67.     while (sioPollInput (pSioChan, &thisChar) == EAGAIN)
  68.                 ;
  69.     if (thisChar == eofChar)
  70. return;
  71.     while (sioPollOutput (pSioChan, thisChar) == EAGAIN)
  72.                 ;
  73.     }
  74. }
  75.     else if (mode == SIO_MODE_INT)
  76. {
  77. /*
  78.  * The WDB agent will take control of the serial port once
  79.  * we return, so we must block until we finish the serial test.
  80.  * Here we create a semaphore to block on.
  81.  */
  82. if ((pWdbRtIf->semCreate == NULL) ||
  83.     (pWdbRtIf->semGive == NULL) ||
  84.     (pWdbRtIf->semTake == NULL))
  85.     return;
  86. wdbSioTestSem = pWdbRtIf->semCreate();
  87. /* install our interrupt handlers */
  88. sioCallbackInstall (pSioChan, SIO_CALLBACK_GET_TX_CHAR,
  89.     (FUNCPTR) wdbSioTestTx, (void *)pSioChan);
  90. sioCallbackInstall (pSioChan, SIO_CALLBACK_PUT_RCV_CHAR,
  91.     (FUNCPTR) wdbSioTestRcv, (void *)pSioChan);
  92. /* put the device in interupt mode and start transmitting */
  93. if (sioIoctl (pSioChan, SIO_MODE_SET, (void *)SIO_MODE_INT) != OK)
  94.     return;
  95. sioTxStartup (pSioChan);
  96. /* wait until the test is done */
  97. pWdbRtIf->semTake (wdbSioTestSem, NULL);
  98. }
  99.     }
  100. /******************************************************************************
  101. *
  102. * wdbSioTestRcv - recieve characters in interrupt mode.
  103. */ 
  104. static STATUS wdbSioTestRcv
  105.     (
  106.     void *      pDev,
  107.     char        thisChar
  108.     )
  109.     {
  110.     /* end the test when an EOF char arrives */
  111.     if (thisChar == eofChar)
  112. {
  113. pWdbRtIf->semGive (wdbSioTestSem);
  114. return (ERROR);
  115. }
  116.     /* don't start echoing until we finish printing the greeting msg */
  117.     if (msgIx < msgSize)
  118. return (ERROR);
  119.     /* else store away the character and start the transmitter */
  120.     lastInChar = thisChar;
  121.     lastInCharValid = TRUE;
  122.     sioTxStartup ((SIO_CHAN *)pDev);
  123.     return (OK);
  124.     }
  125. /******************************************************************************
  126. *
  127. * wdbSioTestTx - transmit characters in interrupt mode.
  128. */
  129. static STATUS wdbSioTestTx
  130.     (
  131.     void * pDev,
  132.     char * pThisChar
  133.     )
  134.     {
  135.     /* first transmit the greeting message */
  136.     if (msgIx < msgSize)
  137. {
  138. *pThisChar = msg[msgIx];
  139. msgIx++;
  140. return (OK);
  141. }
  142.     /* end the test after the greeting if no eofChar is specified */
  143.     if (eofChar == 0)
  144. {
  145. pWdbRtIf->semGive (wdbSioTestSem);
  146. return (ERROR);
  147. }
  148.     /* echo recieved characters */
  149.     if (lastInCharValid)
  150. {
  151. *pThisChar = lastInChar;
  152. lastInCharValid = FALSE;
  153. return (OK);
  154. }
  155.     return (ERROR);
  156.     }