summaryrefslogtreecommitdiffstats
path: root/drivers/char/ip2/i2pack.h
blob: 00342a677c90c473bb670c5e026d8c1aaa6f187c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
/*******************************************************************************
*
*   (c) 1998 by Computone Corporation
*
********************************************************************************
*
*
*   PACKAGE:     Linux tty Device Driver for IntelliPort II family of multiport
*                serial I/O controllers.
*
*   DESCRIPTION: Definitions of the packets used to transfer data and commands
*                Host <--> Board. Information provided here is only applicable
*                when the standard loadware is active.
*
*******************************************************************************/
#ifndef I2PACK_H
#define I2PACK_H  1

//-----------------------------------------------
// Revision History:
//
// 10 October 1991   MAG First draft
// 24 February 1992  MAG Additions for 1.4.x loadware
// 11 March 1992     MAG New status packets
//
//-----------------------------------------------

//------------------------------------------------------------------------------
// Packet Formats:
//
// Information passes between the host and board through the FIFO in packets.
// These have headers which indicate the type of packet. Because the fifo data
// path may be 16-bits wide, the protocol is constrained such that each packet
// is always padded to an even byte count. (The lower-level interface routines
// -- i2ellis.c -- are designed to do this).
//
// The sender (be it host or board) must place some number of complete packets
// in the fifo, then place a message in the mailbox that packets are available.
// Placing such a message interrupts the "receiver" (be it board or host), who
// reads the mailbox message and determines that there are incoming packets
// ready. Since there are no partial packets, and the length of a packet is
// given in the header, the remainder of the packet can be read without checking
// for FIFO empty condition. The process is repeated, packet by packet, until
// the incoming FIFO is empty. Then the receiver uses the outbound mailbox to
// signal the board that it has read the data. Only then can the sender place
// additional data in the fifo.
//------------------------------------------------------------------------------
//
//------------------------------------------------
// Definition of Packet Header Area
//------------------------------------------------
//
// Caution: these only define header areas. In actual use the data runs off
// beyond the end of these structures.
//
// Since these structures are based on sequences of bytes which go to the board,
// there cannot be ANY padding between the elements.
#pragma pack(1)

//----------------------------
// DATA PACKETS
//----------------------------

typedef struct _i2DataHeader
{
	unsigned char i2sChannel;  /* The channel number: 0-255 */

	// -- Bitfields are allocated LSB first --

	// For incoming data, indicates whether this is an ordinary packet or a
	// special one (e.g., hot key hit).
	unsigned i2sId : 2 __attribute__ ((__packed__));

	// For tagging data packets. There are flush commands which flush only data
	// packets bearing a particular tag. (used in implementing IntelliView and
	// IntelliPrint). THE TAG VALUE 0xf is RESERVED and must not be used (it has
	// meaning internally to the loadware).
	unsigned i2sTag : 4;

	// These two bits determine the type of packet sent/received.
	unsigned i2sType : 2;

	// The count of data to follow: does not include the possible additional
	// padding byte. MAXIMUM COUNT: 4094. The top four bits must be 0.
	unsigned short i2sCount;

} i2DataHeader, *i2DataHeaderPtr;

// Structure is immediately followed by the data, proper.

//----------------------------
// NON-DATA PACKETS
//----------------------------

typedef struct _i2CmdHeader
{
	unsigned char i2sChannel;	// The channel number: 0-255 (Except where noted
								// - see below

	// Number of bytes of commands, status or whatever to follow
	unsigned i2sCount : 6;

	// These two bits determine the type of packet sent/received.
	unsigned i2sType : 2;

} i2CmdHeader, *i2CmdHeaderPtr;

// Structure is immediately followed by the applicable data.

//---------------------------------------
// Flow Control Packets (Outbound)
//---------------------------------------

// One type of outbound command packet is so important that the entire structure
// is explicitly defined here. That is the flow-control packet. This is never
// sent by user-level code (as would be the commands to raise/lower DTR, for
// example). These are only sent by the library routines in response to reading
// incoming data into the buffers.
//
// The parameters inside the command block are maintained in place, then the
// block is sent at the appropriate time.

typedef struct _flowIn
{
	i2CmdHeader    hd;      // Channel #, count, type (see above)
	unsigned char  fcmd;    // The flow control command (37)
	unsigned short asof;    // As of byte number "asof" (LSB first!) I have room
							// for "room" bytes
	unsigned short room;
} flowIn, *flowInPtr;

//----------------------------------------
// (Incoming) Status Packets
//----------------------------------------

// Incoming packets which are non-data packets are status packets. In this case,
// the channel number in the header is unimportant. What follows are one or more
// sub-packets, the first word of which consists of the channel (first or low
// byte) and the status indicator (second or high byte), followed by possibly
// more data.

#define STAT_CTS_UP     0  /* CTS raised  (no other bytes) */
#define STAT_CTS_DN     1  /* CTS dropped (no other bytes) */
#define STAT_DCD_UP     2  /* DCD raised  (no other bytes) */
#define STAT_DCD_DN     3  /* DCD dropped (no other bytes) */
#define STAT_DSR_UP     4  /* DSR raised  (no other bytes) */
#define STAT_DSR_DN     5  /* DSR dropped (no other bytes) */
#define STAT_RI_UP      6  /* RI  raised  (no other bytes) */
#define STAT_RI_DN      7  /* RI  dropped (no other bytes) */
#define STAT_BRK_DET    8  /* BRK detect  (no other bytes) */
#define STAT_FLOW       9  /* Flow control(-- more: see below */
#define STAT_BMARK      10 /* Bookmark    (no other bytes)
							* Bookmark is sent as a response to
							* a command 60: request for bookmark
							*/
#define STAT_STATUS     11 /* Special packet: see below */
#define STAT_TXCNT      12 /* Special packet: see below */
#define STAT_RXCNT      13 /* Special packet: see below */
#define STAT_BOXIDS     14 /* Special packet: see below */
#define STAT_HWFAIL     15 /* Special packet: see below */

#define STAT_MOD_ERROR  0xc0
#define STAT_MODEM      0xc0/* If status & STAT_MOD_ERROR:
							 * == STAT_MODEM, then this is a modem
							 * status packet, given in response to a
							 * CMD_DSS_NOW command.
							 * The low nibble has each data signal:
							 */
#define STAT_MOD_DCD    0x8
#define STAT_MOD_RI     0x4
#define STAT_MOD_DSR    0x2
#define STAT_MOD_CTS    0x1

#define STAT_ERROR      0x80/* If status & STAT_MOD_ERROR
							 * == STAT_ERROR, then
							 * sort of error on the channel.
							 * The remaining seven bits indicate
							 * what sort of error it is.
							 */
/* The low three bits indicate parity, framing, or overrun errors */

#define STAT_E_PARITY   4     /* Parity error */
#define STAT_E_FRAMING  2     /* Framing error */
#define STAT_E_OVERRUN  1     /* (uxart) overrun error */

//---------------------------------------
// STAT_FLOW packets
//---------------------------------------

typedef struct _flowStat
{
	unsigned short asof;
	unsigned short room;
}flowStat, *flowStatPtr;

// flowStat packets are received from the board to regulate the flow of outgoing
// data. A local copy of this structure is also kept to track the amount of
// credits used and credits remaining. "room" is the amount of space in the
// board's buffers, "as of" having received a certain byte number. When sending
// data to the fifo, you must calculate how much buffer space your packet will
// use.  Add this to the current "asof" and subtract it from the current "room".
//
// The calculation for the board's buffer is given by CREDIT_USAGE, where size
// is the un-rounded count of either data characters or command characters.
// (Which is to say, the count rounded up, plus two).

#define CREDIT_USAGE(size) (((size) + 3) & ~1)

//---------------------------------------
// STAT_STATUS packets
//---------------------------------------

typedef  struct   _debugStat
{
	unsigned char d_ccsr;
	unsigned char d_txinh;
	unsigned char d_stat1;
	unsigned char d_stat2;
} debugStat, *debugStatPtr;

// debugStat packets are sent to the host in response to a CMD_GET_STATUS
// command.  Each byte is bit-mapped as described below:

#define D_CCSR_XON      2     /* Has received XON, ready to transmit */
#define D_CCSR_XOFF     4     /* Has received XOFF, not transmitting */
#define D_CCSR_TXENAB   8     /* Transmitter is enabled */
#define D_CCSR_RXENAB   0x80  /* Receiver is enabled */

#define D_TXINH_BREAK   1     /* We are sending a break */
#define D_TXINH_EMPTY   2     /* No data to send */
#define D_TXINH_SUSP    4     /* Output suspended via command 57 */
#define D_TXINH_CMD     8     /* We are processing an in-line command */
#define D_TXINH_LCD     0x10  /* LCD diagnostics are running */
#define D_TXINH_PAUSE   0x20  /* We are processing a PAUSE command */
#define D_TXINH_DCD     0x40  /* DCD is low, preventing transmission */
#define D_TXINH_DSR     0x80  /* DSR is low, preventing transmission */

#define D_STAT1_TXEN    1     /* Transmit INTERRUPTS enabled */
#define D_STAT1_RXEN    2     /* Receiver INTERRUPTS enabled */
#define D_STAT1_MDEN    4     /* Modem (data set sigs) interrupts enabled */
#define D_STAT1_RLM     8     /* Remote loopback mode selected */
#define D_STAT1_LLM     0x10  /* Local internal loopback mode selected */
#define D_STAT1_CTS     0x20  /* CTS is low, preventing transmission */
#define D_STAT1_DTR     0x40  /* DTR is low, to stop remote transmission */
#define D_STAT1_RTS     0x80  /* RTS is low, to stop remote transmission */

#define D_STAT2_TXMT    1     /* Transmit buffers are all empty */
#define D_STAT2_RXMT    2     /* Receive buffers are all empty */
#define D_STAT2_RXINH   4     /* Loadware has tried to inhibit remote
							   * transmission:  dropped DTR, sent XOFF,
							   * whatever...
							   */
#define D_STAT2_RXFLO   8     /* Loadware can send no more data to host
							   * until it receives a flow-control packet
							   */
//-----------------------------------------
// STAT_TXCNT and STAT_RXCNT packets
//----------------------------------------

typedef  struct   _cntStat
{
	unsigned short cs_time;    // (Assumes host is little-endian!)
	unsigned short cs_count;
} cntStat, *cntStatPtr;

// These packets are sent in response to a CMD_GET_RXCNT or a CMD_GET_TXCNT
// bypass command. cs_time is a running 1 Millisecond counter which acts as a
// time stamp. cs_count is a running counter of data sent or received from the
// uxarts. (Not including data added by the chip itself, as with CRLF
// processing).
//------------------------------------------
// STAT_HWFAIL packets
//------------------------------------------

typedef struct _failStat
{
	unsigned char fs_written;
	unsigned char fs_read;
	unsigned short fs_address;
} failStat, *failStatPtr;

// This packet is sent whenever the on-board diagnostic process detects an
// error. At startup, this process is dormant. The host can wake it up by
// issuing the bypass command CMD_HW_TEST. The process runs at low priority and
// performs continuous hardware verification; writing data to certain on-board
// registers, reading it back, and comparing. If it detects an error, this
// packet is sent to the host, and the process goes dormant again until the host
// sends another CMD_HW_TEST. It then continues with the next register to be
// tested.

//------------------------------------------------------------------------------
// Macros to deal with the headers more easily! Note that these are defined so
// they may be used as "left" as well as "right" expressions.
//------------------------------------------------------------------------------

// Given a pointer to the packet, reference the channel number
//
#define CHANNEL_OF(pP)  ((i2DataHeaderPtr)(pP))->i2sChannel

// Given a pointer to the packet, reference the Packet type
//
#define PTYPE_OF(pP) ((i2DataHeaderPtr)(pP))->i2sType

// The possible types of packets
//
#define PTYPE_DATA   0  /* Host <--> Board */
#define PTYPE_BYPASS 1  /* Host ---> Board */
#define PTYPE_INLINE 2  /* Host ---> Board */
#define PTYPE_STATUS 2  /* Host <--- Board */

// Given a pointer to a Data packet, reference the Tag
//
#define TAG_OF(pP) ((i2DataHeaderPtr)(pP))->i2sTag

// Given a pointer to a Data packet, reference the data i.d.
//
#define ID_OF(pP)  ((i2DataHeaderPtr)(pP))->i2sId

// The possible types of ID's
//
#define ID_ORDINARY_DATA   0
#define ID_HOT_KEY         1

// Given a pointer to a Data packet, reference the count
//
#define DATA_COUNT_OF(pP) ((i2DataHeaderPtr)(pP))->i2sCount

// Given a pointer to a Data packet, reference the beginning of data
//
#define DATA_OF(pP) &((unsigned char *)(pP))[4] // 4 = size of header

// Given a pointer to a Non-Data packet, reference the count
//
#define CMD_COUNT_OF(pP) ((i2CmdHeaderPtr)(pP))->i2sCount

#define MAX_CMD_PACK_SIZE  62 // Maximum size of such a count

// Given a pointer to a Non-Data packet, reference the beginning of data
//
#define CMD_OF(pP) &((unsigned char *)(pP))[2]  // 2 = size of header

//--------------------------------
// MailBox Bits:
//--------------------------------

//--------------------------
// Outgoing (host to board)
//--------------------------
//
#define MB_OUT_STUFFED     0x80  // Host has placed output in fifo 
#define MB_IN_STRIPPED     0x40  // Host has read in all input from fifo 

//--------------------------
// Incoming (board to host)
//--------------------------
//
#define MB_IN_STUFFED      0x80  // Board has placed input in fifo 
#define MB_OUT_STRIPPED    0x40  // Board has read all output from fifo 
#define MB_FATAL_ERROR     0x20  // Board has encountered a fatal error

#pragma pack()                  // Reset padding to command-line default

#endif      // I2PACK_H