| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| David Howells | a020ff4 | 2006-01-04 18:01:03 +0000 | [diff] [blame] | 361 | #pragma pack()                  // Reset padding to command-line default | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 362 |  | 
|  | 363 | #endif      // I2PACK_H | 
|  | 364 |  |