i2lib.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:12k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2. *
  3. *   (c) 1998 by Computone Corporation
  4. *
  5. ********************************************************************************
  6. *
  7. *
  8. *   PACKAGE:     Linux tty Device Driver for IntelliPort II family of multiport
  9. *                serial I/O controllers.
  10. *
  11. *   DESCRIPTION: Header file for high level library functions
  12. *
  13. *******************************************************************************/
  14. #ifndef I2LIB_H
  15. #define I2LIB_H   1
  16. //------------------------------------------------------------------------------
  17. // I2LIB.H
  18. //
  19. // IntelliPort-II and IntelliPort-IIEX
  20. //
  21. // Defines, structure definitions, and external declarations for i2lib.c
  22. //------------------------------------------------------------------------------
  23. //--------------------------------------
  24. // Mandatory Includes:
  25. //--------------------------------------
  26. #include "ip2types.h"
  27. #include "i2ellis.h"
  28. #include "i2pack.h"
  29. #include "i2cmd.h"
  30. //------------------------------------------------------------------------------
  31. // i2ChanStr -- Channel Structure:
  32. // Used to track per-channel information for the library routines using standard
  33. // loadware. Note also, a pointer to an array of these structures is patched
  34. // into the i2eBordStr (see i2ellis.h)
  35. //------------------------------------------------------------------------------
  36. //
  37. // If we make some limits on the maximum block sizes, we can avoid dealing with
  38. // buffer wrap. The wrapping of the buffer is based on where the start of the
  39. // packet is. Then there is always room for the packet contiguously.
  40. //
  41. // Maximum total length of an outgoing data or in-line command block. The limit
  42. // of 36 on data is quite arbitrary and based more on DOS memory limitations
  43. // than the board interface. However, for commands, the maximum packet length is
  44. // MAX_CMD_PACK_SIZE, because the field size for the count is only a few bits
  45. // (see I2PACK.H) in such packets. For data packets, the count field size is not
  46. // the limiting factor. As of this writing, MAX_OBUF_BLOCK < MAX_CMD_PACK_SIZE,
  47. // but be careful if wanting to modify either.
  48. //
  49. #define MAX_OBUF_BLOCK  36
  50. // Another note on maximum block sizes: we are buffering packets here. Data is
  51. // put into the buffer (if there is room) regardless of the credits from the
  52. // board. The board sends new credits whenever it has removed from his buffers a
  53. // number of characters equal to 80% of total buffer size. (Of course, the total
  54. // buffer size is what is reported when the very first set of flow control
  55. // status packets are received from the board. Therefore, to be robust, you must
  56. // always fill the board to at least 80% of the current credit limit, else you
  57. // might not give it enough to trigger a new report. These conditions are
  58. // obtained here so long as the maximum output block size is less than 20% the
  59. // size of the board's output buffers. This is true at present by "coincidence"
  60. // or "infernal knowledge": the board's output buffers are at least 700 bytes
  61. // long (20% = 140 bytes, at least). The 80% figure is "official", so the safest
  62. // strategy might be to trap the first flow control report and guarantee that
  63. // the effective maxObufBlock is the minimum of MAX_OBUF_BLOCK and 20% of first
  64. // reported buffer credit.
  65. //
  66. #define MAX_CBUF_BLOCK  6 // Maximum total length of a bypass command block
  67. #define IBUF_SIZE       512 // character capacity of input buffer per channel
  68. #define OBUF_SIZE       1024// character capacity of output buffer per channel
  69. #define CBUF_SIZE       10 // character capacity of output bypass buffer
  70. typedef struct _i2ChanStr
  71. {
  72. // First, back-pointers so that given a pointer to this structure, you can
  73. // determine the correct board and channel number to reference, (say, when
  74. // issuing commands, etc. (Note, channel number is in infl.hd.i2sChannel.)
  75. int      port_index;    // Index of port in channel structure array attached
  76. // to board structure.
  77. PTTY     pTTY;          // Pointer to tty structure for port (OS specific)
  78. USHORT   validity;      // Indicates whether the given channel has been
  79. // initialized, really exists (or is a missing
  80. // channel, e.g. channel 9 on an 8-port box.)
  81. i2eBordStrPtr  pMyBord; // Back-pointer to this channel's board structure 
  82. int      wopen; // waiting fer carrier
  83. int      throttled; // Set if upper layer can take no data
  84. int      flags;         // Defined in tty.h
  85. int      session;       // Defined in tty.h
  86. int      pgrp;          // Defined in tty.h
  87. PWAITQ   open_wait;     // Pointer for OS sleep function.
  88. PWAITQ   close_wait;    // Pointer for OS sleep function.
  89. PWAITQ   delta_msr_wait;// Pointer for OS sleep function.
  90. PWAITQ   dss_now_wait; // Pointer for OS sleep function.
  91. struct timer_list  BookmarkTimer;   // Used by i2DrainOutput
  92. wait_queue_head_t pBookmarkWait;   // Used by i2DrainOutput
  93. struct termios NormalTermios;
  94. struct termios CalloutTermios;
  95. int      BaudBase;
  96. int      BaudDivisor;
  97. USHORT   ClosingDelay;
  98. USHORT   ClosingWaitTime;
  99. volatile
  100. flowIn   infl; // This structure is initialized as a completely
  101. // formed flow-control command packet, and as such
  102. // has the channel number, also the capacity and
  103. // "as-of" data needed continuously.
  104. USHORT   sinceLastFlow; // Counts the number of characters read from input
  105. // buffers, since the last time flow control info
  106. // was sent.
  107. USHORT   whenSendFlow;  // Determines when new flow control is to be sent to
  108. // the board. Note unlike earlier manifestations of
  109. // the driver, these packets can be sent from
  110. // in-place.
  111. USHORT   channelNeeds;  // Bit map of important things which must be done
  112. // for this channel. (See bits below )
  113. volatile
  114. flowStat outfl;         // Same type of structure is used to hold current
  115. // flow control information used to control our
  116. // output. "asof" is kept updated as data is sent,
  117. // and "room" never goes to zero.
  118. // The incoming ring buffer
  119. // Unlike the outgoing buffers, this holds raw data, not packets. The two
  120. // extra bytes are used to hold the byte-padding when there is room for an
  121. // odd number of bytes before we must wrap.
  122. //
  123. UCHAR    Ibuf[IBUF_SIZE + 2];
  124. volatile
  125. USHORT   Ibuf_stuff;     // Stuffing index
  126. volatile
  127. USHORT   Ibuf_strip;     // Stripping index
  128. // The outgoing ring-buffer: Holds Data and command packets. N.B., even
  129. // though these are in the channel structure, the channel is also written
  130. // here, the easier to send it to the fifo when ready. HOWEVER, individual
  131. // packets here are NOT padded to even length: the routines for writing
  132. // blocks to the fifo will pad to even byte counts.
  133. //
  134. UCHAR Obuf[OBUF_SIZE+MAX_OBUF_BLOCK+4];
  135. volatile
  136. USHORT Obuf_stuff;     // Stuffing index
  137. volatile
  138. USHORT Obuf_strip;     // Stripping index
  139. int Obuf_char_count;
  140. // The outgoing bypass-command buffer. Unlike earlier manifestations, the
  141. // flow control packets are sent directly from the structures. As above, the
  142. // channel number is included in the packet, but they are NOT padded to even
  143. // size.
  144. //
  145. UCHAR    Cbuf[CBUF_SIZE+MAX_CBUF_BLOCK+2];
  146. volatile
  147. USHORT   Cbuf_stuff;     // Stuffing index
  148. volatile
  149. USHORT   Cbuf_strip;     // Stripping index
  150. // The temporary buffer for the Linux tty driver PutChar entry.
  151. //
  152. UCHAR    Pbuf[MAX_OBUF_BLOCK - sizeof (i2DataHeader)];
  153. volatile
  154. USHORT   Pbuf_stuff;     // Stuffing index
  155. // The state of incoming data-set signals
  156. //
  157. USHORT   dataSetIn;     // Bit-mapped according to below. Also indicates
  158. // whether a break has been detected since last
  159. // inquiry.
  160. // The state of outcoming data-set signals (as far as we can tell!)
  161. //
  162. USHORT   dataSetOut;     // Bit-mapped according to below. 
  163. // Most recent hot-key identifier detected
  164. //
  165. USHORT   hotKeyIn;      // Hot key as sent by the board, HOT_CLEAR indicates
  166. // no hot key detected since last examined.
  167. // Counter of outstanding requests for bookmarks
  168. //
  169. short   bookMarks; // Number of outstanding bookmark requests, (+ive
  170. // whenever a bookmark request if queued up, -ive
  171. // whenever a bookmark is received).
  172. // Misc options
  173. //
  174. USHORT   channelOptions;   // See below
  175. // To store various incoming special packets
  176. //
  177. debugStat   channelStatus;
  178. cntStat     channelRcount;
  179. cntStat     channelTcount;
  180. failStat    channelFail;
  181. // To store the last values for line characteristics we sent to the board.
  182. //
  183. int speed;
  184. int flush_flags;
  185. void (*trace)(unsigned short,unsigned char,unsigned char,unsigned long,...);
  186. /*
  187.  * Kernel counters for the 4 input interrupts 
  188.  */
  189. struct async_icount icount;
  190. /*
  191.  * Task queues for processing input packets from the board.
  192.  */
  193. struct tq_struct tqueue_input;
  194. struct tq_struct tqueue_status;
  195. struct tq_struct tqueue_hangup;
  196. rwlock_t Ibuf_spinlock;
  197. rwlock_t Obuf_spinlock;
  198. rwlock_t Cbuf_spinlock;
  199. rwlock_t Pbuf_spinlock;
  200. } i2ChanStr, *i2ChanStrPtr;
  201. //---------------------------------------------------
  202. // Manifests and bit-maps for elements in i2ChanStr
  203. //---------------------------------------------------
  204. //
  205. // flush flags
  206. //
  207. #define STARTFL_FLAG 1
  208. #define STOPFL_FLAG  2
  209. // validity
  210. //
  211. #define CHANNEL_MAGIC_BITS 0xff00
  212. #define CHANNEL_MAGIC      0x5300   // (validity & CHANNEL_MAGIC_BITS) ==
  213. // CHANNEL_MAGIC --> structure good
  214. #define CHANNEL_SUPPORT    0x0001   // Indicates channel is supported, exists,
  215. // and passed P.O.S.T.
  216. // channelNeeds
  217. //
  218. #define NEED_FLOW    1  // Indicates flow control has been queued
  219. #define NEED_INLINE  2  // Indicates inline commands or data queued
  220. #define NEED_BYPASS  4  // Indicates bypass commands queued
  221. #define NEED_CREDIT  8  // Indicates would be sending except has not sufficient
  222. // credit. The data is still in the channel structure,
  223. // but the channel is not enqueued in the board
  224. // structure again until there is a credit received from
  225. // the board.
  226. // dataSetIn (Also the bits for i2GetStatus return value)
  227. //
  228. #define I2_DCD 1
  229. #define I2_CTS 2
  230. #define I2_DSR 4
  231. #define I2_RI  8
  232. // dataSetOut (Also the bits for i2GetStatus return value)
  233. //
  234. #define I2_DTR 1
  235. #define I2_RTS 2
  236. // i2GetStatus() can optionally clear these bits
  237. //
  238. #define I2_BRK    0x10  // A break was detected
  239. #define I2_PAR    0x20  // A parity error was received 
  240. #define I2_FRA    0x40  // A framing error was received
  241. #define I2_OVR    0x80  // An overrun error was received 
  242. // i2GetStatus() automatically clears these bits */
  243. //
  244. #define I2_DDCD   0x100 // DCD changed from its  former value
  245. #define I2_DCTS   0x200 // CTS changed from its former value 
  246. #define I2_DDSR   0x400 // DSR changed from its former value 
  247. #define I2_DRI    0x800 // RI changed from its former value 
  248. // hotKeyIn
  249. //
  250. #define HOT_CLEAR 0x1322   // Indicates that no hot-key has been detected
  251. // channelOptions
  252. //
  253. #define CO_NBLOCK_WRITE 1   // Writes don't block waiting for buffer. (Default
  254. // is, they do wait.)
  255. // fcmodes
  256. //
  257. #define I2_OUTFLOW_CTS  0x0001
  258. #define I2_INFLOW_RTS   0x0002
  259. #define I2_INFLOW_DSR   0x0004
  260. #define I2_INFLOW_DTR   0x0008
  261. #define I2_OUTFLOW_DSR  0x0010
  262. #define I2_OUTFLOW_DTR  0x0020
  263. #define I2_OUTFLOW_XON  0x0040
  264. #define I2_OUTFLOW_XANY 0x0080
  265. #define I2_INFLOW_XON   0x0100
  266. #define I2_CRTSCTS      (I2_OUTFLOW_CTS|I2_INFLOW_RTS)
  267. #define I2_IXANY_MODE   (I2_OUTFLOW_XON|I2_OUTFLOW_XANY)
  268. //-------------------------------------------
  269. // Macros used from user level like functions
  270. //-------------------------------------------
  271. // Macros to set and clear channel options
  272. //
  273. #define i2SetOption(pCh, option) pCh->channelOptions |= option
  274. #define i2ClrOption(pCh, option) pCh->channelOptions &= ~option
  275. // Macro to set fatal-error trap
  276. //
  277. #define i2SetFatalTrap(pB, routine) pB->i2eFatalTrap = routine
  278. //--------------------------------------------
  279. // Declarations and prototypes for i2lib.c
  280. //--------------------------------------------
  281. //
  282. static int  i2InitChannels(i2eBordStrPtr, int, i2ChanStrPtr);
  283. static int  i2QueueCommands(int, i2ChanStrPtr, int, int, cmdSyntaxPtr,...);
  284. static int  i2GetStatus(i2ChanStrPtr, int);
  285. static int  i2Input(i2ChanStrPtr);
  286. static int  i2InputFlush(i2ChanStrPtr);
  287. static int  i2Output(i2ChanStrPtr, const char *, int, int);
  288. static int  i2OutputFree(i2ChanStrPtr);
  289. static int  i2ServiceBoard(i2eBordStrPtr);
  290. static void i2DrainOutput(i2ChanStrPtr, int);
  291. #ifdef IP2DEBUG_TRACE
  292. void ip2trace(unsigned short,unsigned char,unsigned char,unsigned long,...);
  293. #else
  294. #define ip2trace(a,b,c,d...) do {} while (0)
  295. #endif
  296. // Argument to i2QueueCommands
  297. //
  298. #define C_IN_LINE 1
  299. #define C_BYPASS  0
  300. #endif   // I2LIB_H