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 | |