diff options
Diffstat (limited to 'drivers/char/ip2/i2pack.h')
-rw-r--r-- | drivers/char/ip2/i2pack.h | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/drivers/char/ip2/i2pack.h b/drivers/char/ip2/i2pack.h new file mode 100644 index 000000000000..e9b87a78622c --- /dev/null +++ b/drivers/char/ip2/i2pack.h | |||
@@ -0,0 +1,364 @@ | |||
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: Definitions of the packets used to transfer data and commands | ||
12 | * Host <--> Board. Information provided here is only applicable | ||
13 | * when the standard loadware is active. | ||
14 | * | ||
15 | *******************************************************************************/ | ||
16 | #ifndef I2PACK_H | ||
17 | #define I2PACK_H 1 | ||
18 | |||
19 | //----------------------------------------------- | ||
20 | // Revision History: | ||
21 | // | ||
22 | // 10 October 1991 MAG First draft | ||
23 | // 24 February 1992 MAG Additions for 1.4.x loadware | ||
24 | // 11 March 1992 MAG New status packets | ||
25 | // | ||
26 | //----------------------------------------------- | ||
27 | |||
28 | //------------------------------------------------------------------------------ | ||
29 | // Packet Formats: | ||
30 | // | ||
31 | // Information passes between the host and board through the FIFO in packets. | ||
32 | // These have headers which indicate the type of packet. Because the fifo data | ||
33 | // path may be 16-bits wide, the protocol is constrained such that each packet | ||
34 | // is always padded to an even byte count. (The lower-level interface routines | ||
35 | // -- i2ellis.c -- are designed to do this). | ||
36 | // | ||
37 | // The sender (be it host or board) must place some number of complete packets | ||
38 | // in the fifo, then place a message in the mailbox that packets are available. | ||
39 | // Placing such a message interrupts the "receiver" (be it board or host), who | ||
40 | // reads the mailbox message and determines that there are incoming packets | ||
41 | // ready. Since there are no partial packets, and the length of a packet is | ||
42 | // given in the header, the remainder of the packet can be read without checking | ||
43 | // for FIFO empty condition. The process is repeated, packet by packet, until | ||
44 | // the incoming FIFO is empty. Then the receiver uses the outbound mailbox to | ||
45 | // signal the board that it has read the data. Only then can the sender place | ||
46 | // additional data in the fifo. | ||
47 | //------------------------------------------------------------------------------ | ||
48 | // | ||
49 | //------------------------------------------------ | ||
50 | // Definition of Packet Header Area | ||
51 | //------------------------------------------------ | ||
52 | // | ||
53 | // Caution: these only define header areas. In actual use the data runs off | ||
54 | // beyond the end of these structures. | ||
55 | // | ||
56 | // Since these structures are based on sequences of bytes which go to the board, | ||
57 | // there cannot be ANY padding between the elements. | ||
58 | #pragma pack(1) | ||
59 | |||
60 | //---------------------------- | ||
61 | // DATA PACKETS | ||
62 | //---------------------------- | ||
63 | |||
64 | typedef struct _i2DataHeader | ||
65 | { | ||
66 | unsigned char i2sChannel; /* The channel number: 0-255 */ | ||
67 | |||
68 | // -- Bitfields are allocated LSB first -- | ||
69 | |||
70 | // For incoming data, indicates whether this is an ordinary packet or a | ||
71 | // special one (e.g., hot key hit). | ||
72 | unsigned i2sId : 2 __attribute__ ((__packed__)); | ||
73 | |||
74 | // For tagging data packets. There are flush commands which flush only data | ||
75 | // packets bearing a particular tag. (used in implementing IntelliView and | ||
76 | // IntelliPrint). THE TAG VALUE 0xf is RESERVED and must not be used (it has | ||
77 | // meaning internally to the loadware). | ||
78 | unsigned i2sTag : 4; | ||
79 | |||
80 | // These two bits determine the type of packet sent/received. | ||
81 | unsigned i2sType : 2; | ||
82 | |||
83 | // The count of data to follow: does not include the possible additional | ||
84 | // padding byte. MAXIMUM COUNT: 4094. The top four bits must be 0. | ||
85 | unsigned short i2sCount; | ||
86 | |||
87 | } i2DataHeader, *i2DataHeaderPtr; | ||
88 | |||
89 | // Structure is immediately followed by the data, proper. | ||
90 | |||
91 | //---------------------------- | ||
92 | // NON-DATA PACKETS | ||
93 | //---------------------------- | ||
94 | |||
95 | typedef struct _i2CmdHeader | ||
96 | { | ||
97 | unsigned char i2sChannel; // The channel number: 0-255 (Except where noted | ||
98 | // - see below | ||
99 | |||
100 | // Number of bytes of commands, status or whatever to follow | ||
101 | unsigned i2sCount : 6; | ||
102 | |||
103 | // These two bits determine the type of packet sent/received. | ||
104 | unsigned i2sType : 2; | ||
105 | |||
106 | } i2CmdHeader, *i2CmdHeaderPtr; | ||
107 | |||
108 | // Structure is immediately followed by the applicable data. | ||
109 | |||
110 | //--------------------------------------- | ||
111 | // Flow Control Packets (Outbound) | ||
112 | //--------------------------------------- | ||
113 | |||
114 | // One type of outbound command packet is so important that the entire structure | ||
115 | // is explicitly defined here. That is the flow-control packet. This is never | ||
116 | // sent by user-level code (as would be the commands to raise/lower DTR, for | ||
117 | // example). These are only sent by the library routines in response to reading | ||
118 | // incoming data into the buffers. | ||
119 | // | ||
120 | // The parameters inside the command block are maintained in place, then the | ||
121 | // block is sent at the appropriate time. | ||
122 | |||
123 | typedef struct _flowIn | ||
124 | { | ||
125 | i2CmdHeader hd; // Channel #, count, type (see above) | ||
126 | unsigned char fcmd; // The flow control command (37) | ||
127 | unsigned short asof; // As of byte number "asof" (LSB first!) I have room | ||
128 | // for "room" bytes | ||
129 | unsigned short room; | ||
130 | } flowIn, *flowInPtr; | ||
131 | |||
132 | //---------------------------------------- | ||
133 | // (Incoming) Status Packets | ||
134 | //---------------------------------------- | ||
135 | |||
136 | // Incoming packets which are non-data packets are status packets. In this case, | ||
137 | // the channel number in the header is unimportant. What follows are one or more | ||
138 | // sub-packets, the first word of which consists of the channel (first or low | ||
139 | // byte) and the status indicator (second or high byte), followed by possibly | ||
140 | // more data. | ||
141 | |||
142 | #define STAT_CTS_UP 0 /* CTS raised (no other bytes) */ | ||
143 | #define STAT_CTS_DN 1 /* CTS dropped (no other bytes) */ | ||
144 | #define STAT_DCD_UP 2 /* DCD raised (no other bytes) */ | ||
145 | #define STAT_DCD_DN 3 /* DCD dropped (no other bytes) */ | ||
146 | #define STAT_DSR_UP 4 /* DSR raised (no other bytes) */ | ||
147 | #define STAT_DSR_DN 5 /* DSR dropped (no other bytes) */ | ||
148 | #define STAT_RI_UP 6 /* RI raised (no other bytes) */ | ||
149 | #define STAT_RI_DN 7 /* RI dropped (no other bytes) */ | ||
150 | #define STAT_BRK_DET 8 /* BRK detect (no other bytes) */ | ||
151 | #define STAT_FLOW 9 /* Flow control(-- more: see below */ | ||
152 | #define STAT_BMARK 10 /* Bookmark (no other bytes) | ||
153 | * Bookmark is sent as a response to | ||
154 | * a command 60: request for bookmark | ||
155 | */ | ||
156 | #define STAT_STATUS 11 /* Special packet: see below */ | ||
157 | #define STAT_TXCNT 12 /* Special packet: see below */ | ||
158 | #define STAT_RXCNT 13 /* Special packet: see below */ | ||
159 | #define STAT_BOXIDS 14 /* Special packet: see below */ | ||
160 | #define STAT_HWFAIL 15 /* Special packet: see below */ | ||
161 | |||
162 | #define STAT_MOD_ERROR 0xc0 | ||
163 | #define STAT_MODEM 0xc0/* If status & STAT_MOD_ERROR: | ||
164 | * == STAT_MODEM, then this is a modem | ||
165 | * status packet, given in response to a | ||
166 | * CMD_DSS_NOW command. | ||
167 | * The low nibble has each data signal: | ||
168 | */ | ||
169 | #define STAT_MOD_DCD 0x8 | ||
170 | #define STAT_MOD_RI 0x4 | ||
171 | #define STAT_MOD_DSR 0x2 | ||
172 | #define STAT_MOD_CTS 0x1 | ||
173 | |||
174 | #define STAT_ERROR 0x80/* If status & STAT_MOD_ERROR | ||
175 | * == STAT_ERROR, then | ||
176 | * sort of error on the channel. | ||
177 | * The remaining seven bits indicate | ||
178 | * what sort of error it is. | ||
179 | */ | ||
180 | /* The low three bits indicate parity, framing, or overrun errors */ | ||
181 | |||
182 | #define STAT_E_PARITY 4 /* Parity error */ | ||
183 | #define STAT_E_FRAMING 2 /* Framing error */ | ||
184 | #define STAT_E_OVERRUN 1 /* (uxart) overrun error */ | ||
185 | |||
186 | //--------------------------------------- | ||
187 | // STAT_FLOW packets | ||
188 | //--------------------------------------- | ||
189 | |||
190 | typedef struct _flowStat | ||
191 | { | ||
192 | unsigned short asof; | ||
193 | unsigned short room; | ||
194 | }flowStat, *flowStatPtr; | ||
195 | |||
196 | // flowStat packets are received from the board to regulate the flow of outgoing | ||
197 | // data. A local copy of this structure is also kept to track the amount of | ||
198 | // credits used and credits remaining. "room" is the amount of space in the | ||
199 | // board's buffers, "as of" having received a certain byte number. When sending | ||
200 | // data to the fifo, you must calculate how much buffer space your packet will | ||
201 | // use. Add this to the current "asof" and subtract it from the current "room". | ||
202 | // | ||
203 | // The calculation for the board's buffer is given by CREDIT_USAGE, where size | ||
204 | // is the un-rounded count of either data characters or command characters. | ||
205 | // (Which is to say, the count rounded up, plus two). | ||
206 | |||
207 | #define CREDIT_USAGE(size) (((size) + 3) & ~1) | ||
208 | |||
209 | //--------------------------------------- | ||
210 | // STAT_STATUS packets | ||
211 | //--------------------------------------- | ||
212 | |||
213 | typedef struct _debugStat | ||
214 | { | ||
215 | unsigned char d_ccsr; | ||
216 | unsigned char d_txinh; | ||
217 | unsigned char d_stat1; | ||
218 | unsigned char d_stat2; | ||
219 | } debugStat, *debugStatPtr; | ||
220 | |||
221 | // debugStat packets are sent to the host in response to a CMD_GET_STATUS | ||
222 | // command. Each byte is bit-mapped as described below: | ||
223 | |||
224 | #define D_CCSR_XON 2 /* Has received XON, ready to transmit */ | ||
225 | #define D_CCSR_XOFF 4 /* Has received XOFF, not transmitting */ | ||
226 | #define D_CCSR_TXENAB 8 /* Transmitter is enabled */ | ||
227 | #define D_CCSR_RXENAB 0x80 /* Receiver is enabled */ | ||
228 | |||
229 | #define D_TXINH_BREAK 1 /* We are sending a break */ | ||
230 | #define D_TXINH_EMPTY 2 /* No data to send */ | ||
231 | #define D_TXINH_SUSP 4 /* Output suspended via command 57 */ | ||
232 | #define D_TXINH_CMD 8 /* We are processing an in-line command */ | ||
233 | #define D_TXINH_LCD 0x10 /* LCD diagnostics are running */ | ||
234 | #define D_TXINH_PAUSE 0x20 /* We are processing a PAUSE command */ | ||
235 | #define D_TXINH_DCD 0x40 /* DCD is low, preventing transmission */ | ||
236 | #define D_TXINH_DSR 0x80 /* DSR is low, preventing transmission */ | ||
237 | |||
238 | #define D_STAT1_TXEN 1 /* Transmit INTERRUPTS enabled */ | ||
239 | #define D_STAT1_RXEN 2 /* Receiver INTERRUPTS enabled */ | ||
240 | #define D_STAT1_MDEN 4 /* Modem (data set sigs) interrupts enabled */ | ||
241 | #define D_STAT1_RLM 8 /* Remote loopback mode selected */ | ||
242 | #define D_STAT1_LLM 0x10 /* Local internal loopback mode selected */ | ||
243 | #define D_STAT1_CTS 0x20 /* CTS is low, preventing transmission */ | ||
244 | #define D_STAT1_DTR 0x40 /* DTR is low, to stop remote transmission */ | ||
245 | #define D_STAT1_RTS 0x80 /* RTS is low, to stop remote transmission */ | ||
246 | |||
247 | #define D_STAT2_TXMT 1 /* Transmit buffers are all empty */ | ||
248 | #define D_STAT2_RXMT 2 /* Receive buffers are all empty */ | ||
249 | #define D_STAT2_RXINH 4 /* Loadware has tried to inhibit remote | ||
250 | * transmission: dropped DTR, sent XOFF, | ||
251 | * whatever... | ||
252 | */ | ||
253 | #define D_STAT2_RXFLO 8 /* Loadware can send no more data to host | ||
254 | * until it receives a flow-control packet | ||
255 | */ | ||
256 | //----------------------------------------- | ||
257 | // STAT_TXCNT and STAT_RXCNT packets | ||
258 | //---------------------------------------- | ||
259 | |||
260 | typedef struct _cntStat | ||
261 | { | ||
262 | unsigned short cs_time; // (Assumes host is little-endian!) | ||
263 | unsigned short cs_count; | ||
264 | } cntStat, *cntStatPtr; | ||
265 | |||
266 | // These packets are sent in response to a CMD_GET_RXCNT or a CMD_GET_TXCNT | ||
267 | // bypass command. cs_time is a running 1 Millisecond counter which acts as a | ||
268 | // time stamp. cs_count is a running counter of data sent or received from the | ||
269 | // uxarts. (Not including data added by the chip itself, as with CRLF | ||
270 | // processing). | ||
271 | //------------------------------------------ | ||
272 | // STAT_HWFAIL packets | ||
273 | //------------------------------------------ | ||
274 | |||
275 | typedef struct _failStat | ||
276 | { | ||
277 | unsigned char fs_written; | ||
278 | unsigned char fs_read; | ||
279 | unsigned short fs_address; | ||
280 | } failStat, *failStatPtr; | ||
281 | |||
282 | // This packet is sent whenever the on-board diagnostic process detects an | ||
283 | // error. At startup, this process is dormant. The host can wake it up by | ||
284 | // issuing the bypass command CMD_HW_TEST. The process runs at low priority and | ||
285 | // performs continuous hardware verification; writing data to certain on-board | ||
286 | // registers, reading it back, and comparing. If it detects an error, this | ||
287 | // packet is sent to the host, and the process goes dormant again until the host | ||
288 | // sends another CMD_HW_TEST. It then continues with the next register to be | ||
289 | // tested. | ||
290 | |||
291 | //------------------------------------------------------------------------------ | ||
292 | // Macros to deal with the headers more easily! Note that these are defined so | ||
293 | // they may be used as "left" as well as "right" expressions. | ||
294 | //------------------------------------------------------------------------------ | ||
295 | |||
296 | // Given a pointer to the packet, reference the channel number | ||
297 | // | ||
298 | #define CHANNEL_OF(pP) ((i2DataHeaderPtr)(pP))->i2sChannel | ||
299 | |||
300 | // Given a pointer to the packet, reference the Packet type | ||
301 | // | ||
302 | #define PTYPE_OF(pP) ((i2DataHeaderPtr)(pP))->i2sType | ||
303 | |||
304 | // The possible types of packets | ||
305 | // | ||
306 | #define PTYPE_DATA 0 /* Host <--> Board */ | ||
307 | #define PTYPE_BYPASS 1 /* Host ---> Board */ | ||
308 | #define PTYPE_INLINE 2 /* Host ---> Board */ | ||
309 | #define PTYPE_STATUS 2 /* Host <--- Board */ | ||
310 | |||
311 | // Given a pointer to a Data packet, reference the Tag | ||
312 | // | ||
313 | #define TAG_OF(pP) ((i2DataHeaderPtr)(pP))->i2sTag | ||
314 | |||
315 | // Given a pointer to a Data packet, reference the data i.d. | ||
316 | // | ||
317 | #define ID_OF(pP) ((i2DataHeaderPtr)(pP))->i2sId | ||
318 | |||
319 | // The possible types of ID's | ||
320 | // | ||
321 | #define ID_ORDINARY_DATA 0 | ||
322 | #define ID_HOT_KEY 1 | ||
323 | |||
324 | // Given a pointer to a Data packet, reference the count | ||
325 | // | ||
326 | #define DATA_COUNT_OF(pP) ((i2DataHeaderPtr)(pP))->i2sCount | ||
327 | |||
328 | // Given a pointer to a Data packet, reference the beginning of data | ||
329 | // | ||
330 | #define DATA_OF(pP) &((unsigned char *)(pP))[4] // 4 = size of header | ||
331 | |||
332 | // Given a pointer to a Non-Data packet, reference the count | ||
333 | // | ||
334 | #define CMD_COUNT_OF(pP) ((i2CmdHeaderPtr)(pP))->i2sCount | ||
335 | |||
336 | #define MAX_CMD_PACK_SIZE 62 // Maximum size of such a count | ||
337 | |||
338 | // Given a pointer to a Non-Data packet, reference the beginning of data | ||
339 | // | ||
340 | #define CMD_OF(pP) &((unsigned char *)(pP))[2] // 2 = size of header | ||
341 | |||
342 | //-------------------------------- | ||
343 | // MailBox Bits: | ||
344 | //-------------------------------- | ||
345 | |||
346 | //-------------------------- | ||
347 | // Outgoing (host to board) | ||
348 | //-------------------------- | ||
349 | // | ||
350 | #define MB_OUT_STUFFED 0x80 // Host has placed output in fifo | ||
351 | #define MB_IN_STRIPPED 0x40 // Host has read in all input from fifo | ||
352 | |||
353 | //-------------------------- | ||
354 | // Incoming (board to host) | ||
355 | //-------------------------- | ||
356 | // | ||
357 | #define MB_IN_STUFFED 0x80 // Board has placed input in fifo | ||
358 | #define MB_OUT_STRIPPED 0x40 // Board has read all output from fifo | ||
359 | #define MB_FATAL_ERROR 0x20 // Board has encountered a fatal error | ||
360 | |||
361 | #pragma pack(4) // Reset padding to command-line default | ||
362 | |||
363 | #endif // I2PACK_H | ||
364 | |||