1 /*****************************************************************************/ 2 3 /* 4 * cdk.h -- CDK interface definitions. 5 * 6 * Copyright (C) 1996-1998 Stallion Technologies 7 * Copyright (C) 1994-1996 Greg Ungerer. 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 */ 23 24 /*****************************************************************************/ 25 #ifndef _CDK_H 26 #define _CDK_H 27 /*****************************************************************************/ 28 29 #pragma pack(2) 30 31 /* 32 * The following set of definitions is used to communicate with the 33 * shared memory interface of the Stallion intelligent multiport serial 34 * boards. The definitions in this file are taken directly from the 35 * document titled "Generic Stackable Interface, Downloader and 36 * Communications Development Kit". 37 */ 38 39 /* 40 * Define the set of important shared memory addresses. These are 41 * required to initialize the board and get things started. All of these 42 * addresses are relative to the start of the shared memory. 43 */ 44 #define CDK_SIGADDR 0x200 45 #define CDK_FEATADDR 0x280 46 #define CDK_CDKADDR 0x300 47 #define CDK_RDYADDR 0x262 48 49 #define CDK_ALIVEMARKER 13 50 51 /* 52 * On hardware power up the ROMs located on the EasyConnection 8/64 will 53 * fill out the following signature information into shared memory. This 54 * way the host system can quickly determine that the board is present 55 * and is operational. 56 */ 57 typedef struct cdkecpsig { 58 unsigned long magic; 59 unsigned short romver; 60 unsigned short cputype; 61 unsigned char panelid[8]; 62 } cdkecpsig_t; 63 64 #define ECP_MAGIC 0x21504345 65 66 /* 67 * On hardware power up the ROMs located on the ONboard, Stallion and 68 * Brumbys will fill out the following signature information into shared 69 * memory. This way the host system can quickly determine that the board 70 * is present and is operational. 71 */ 72 typedef struct cdkonbsig { 73 unsigned short magic0; 74 unsigned short magic1; 75 unsigned short magic2; 76 unsigned short magic3; 77 unsigned short romver; 78 unsigned short memoff; 79 unsigned short memseg; 80 unsigned short amask0; 81 unsigned short pic; 82 unsigned short status; 83 unsigned short btype; 84 unsigned short clkticks; 85 unsigned short clkspeed; 86 unsigned short amask1; 87 unsigned short amask2; 88 } cdkonbsig_t; 89 90 #define ONB_MAGIC0 0xf2a7 91 #define ONB_MAGIC1 0xa149 92 #define ONB_MAGIC2 0x6352 93 #define ONB_MAGIC3 0xf121 94 95 /* 96 * Define the feature area structure. The feature area is the set of 97 * startup parameters used by the slave image when it starts executing. 98 * They allow for the specification of buffer sizes, debug trace, etc. 99 */ 100 typedef struct cdkfeature { 101 unsigned long debug; 102 unsigned long banner; 103 unsigned long etype; 104 unsigned long nrdevs; 105 unsigned long brdspec; 106 unsigned long txrqsize; 107 unsigned long rxrqsize; 108 unsigned long flags; 109 } cdkfeature_t; 110 111 #define ETYP_DDK 0 112 #define ETYP_CDK 1 113 114 /* 115 * Define the CDK header structure. This is the info that the slave 116 * environment sets up after it has been downloaded and started. It 117 * essentially provides a memory map for the shared memory interface. 118 */ 119 typedef struct cdkhdr { 120 unsigned short command; 121 unsigned short status; 122 unsigned short port; 123 unsigned short mode; 124 unsigned long cmd_buf[14]; 125 unsigned short alive_cnt; 126 unsigned short intrpt_mode; 127 unsigned char intrpt_id[8]; 128 unsigned char ver_release; 129 unsigned char ver_modification; 130 unsigned char ver_fix; 131 unsigned char deadman_restart; 132 unsigned short deadman; 133 unsigned short nrdevs; 134 unsigned long memp; 135 unsigned long hostp; 136 unsigned long slavep; 137 unsigned char hostreq; 138 unsigned char slavereq; 139 unsigned char cmd_reserved[30]; 140 } cdkhdr_t; 141 142 #define MODE_DDK 0 143 #define MODE_CDK 1 144 145 #define IMD_INTR 0x0 146 #define IMD_PPINTR 0x1 147 #define IMD_POLL 0xff 148 149 /* 150 * Define the memory mapping structure. This structure is pointed to by 151 * the memp field in the stlcdkhdr struct. As many as these structures 152 * as required are layed out in shared memory to define how the rest of 153 * shared memory is divided up. There will be one for each port. 154 */ 155 typedef struct cdkmem { 156 unsigned short dtype; 157 unsigned long offset; 158 } cdkmem_t; 159 160 #define TYP_UNDEFINED 0x0 161 #define TYP_ASYNCTRL 0x1 162 #define TYP_ASYNC 0x20 163 #define TYP_PARALLEL 0x40 164 #define TYP_SYNCX21 0x60 165 166 /*****************************************************************************/ 167 168 /* 169 * Following is a set of defines and structures used to actually deal 170 * with the serial ports on the board. Firstly is the set of commands 171 * that can be applied to ports. 172 */ 173 #define ASYCMD (((unsigned long) 'a') << 8) 174 175 #define A_NULL (ASYCMD | 0) 176 #define A_FLUSH (ASYCMD | 1) 177 #define A_BREAK (ASYCMD | 2) 178 #define A_GETPORT (ASYCMD | 3) 179 #define A_SETPORT (ASYCMD | 4) 180 #define A_SETPORTF (ASYCMD | 5) 181 #define A_SETPORTFTX (ASYCMD | 6) 182 #define A_SETPORTFRX (ASYCMD | 7) 183 #define A_GETSIGNALS (ASYCMD | 8) 184 #define A_SETSIGNALS (ASYCMD | 9) 185 #define A_SETSIGNALSF (ASYCMD | 10) 186 #define A_SETSIGNALSFTX (ASYCMD | 11) 187 #define A_SETSIGNALSFRX (ASYCMD | 12) 188 #define A_GETNOTIFY (ASYCMD | 13) 189 #define A_SETNOTIFY (ASYCMD | 14) 190 #define A_NOTIFY (ASYCMD | 15) 191 #define A_PORTCTRL (ASYCMD | 16) 192 #define A_GETSTATS (ASYCMD | 17) 193 #define A_RQSTATE (ASYCMD | 18) 194 #define A_FLOWSTATE (ASYCMD | 19) 195 #define A_CLEARSTATS (ASYCMD | 20) 196 197 /* 198 * Define those arguments used for simple commands. 199 */ 200 #define FLUSHRX 0x1 201 #define FLUSHTX 0x2 202 203 #define BREAKON -1 204 #define BREAKOFF -2 205 206 /* 207 * Define the port setting structure, and all those defines that go along 208 * with it. Basically this structure defines the characteristics of this 209 * port: baud rate, chars, parity, input/output char cooking etc. 210 */ 211 typedef struct asyport { 212 unsigned long baudout; 213 unsigned long baudin; 214 unsigned long iflag; 215 unsigned long oflag; 216 unsigned long lflag; 217 unsigned long pflag; 218 unsigned long flow; 219 unsigned long spare1; 220 unsigned short vtime; 221 unsigned short vmin; 222 unsigned short txlo; 223 unsigned short txhi; 224 unsigned short rxlo; 225 unsigned short rxhi; 226 unsigned short rxhog; 227 unsigned short spare2; 228 unsigned char csize; 229 unsigned char stopbs; 230 unsigned char parity; 231 unsigned char stopin; 232 unsigned char startin; 233 unsigned char stopout; 234 unsigned char startout; 235 unsigned char parmark; 236 unsigned char brkmark; 237 unsigned char cc[11]; 238 } asyport_t; 239 240 #define PT_STOP1 0x0 241 #define PT_STOP15 0x1 242 #define PT_STOP2 0x2 243 244 #define PT_NOPARITY 0x0 245 #define PT_ODDPARITY 0x1 246 #define PT_EVENPARITY 0x2 247 #define PT_MARKPARITY 0x3 248 #define PT_SPACEPARITY 0x4 249 250 #define F_NONE 0x0 251 #define F_IXON 0x1 252 #define F_IXOFF 0x2 253 #define F_IXANY 0x4 254 #define F_IOXANY 0x8 255 #define F_RTSFLOW 0x10 256 #define F_CTSFLOW 0x20 257 #define F_DTRFLOW 0x40 258 #define F_DCDFLOW 0x80 259 #define F_DSROFLOW 0x100 260 #define F_DSRIFLOW 0x200 261 262 #define FI_NORX 0x1 263 #define FI_RAW 0x2 264 #define FI_ISTRIP 0x4 265 #define FI_UCLC 0x8 266 #define FI_INLCR 0x10 267 #define FI_ICRNL 0x20 268 #define FI_IGNCR 0x40 269 #define FI_IGNBREAK 0x80 270 #define FI_DSCRDBREAK 0x100 271 #define FI_1MARKBREAK 0x200 272 #define FI_2MARKBREAK 0x400 273 #define FI_XCHNGBREAK 0x800 274 #define FI_IGNRXERRS 0x1000 275 #define FI_DSCDRXERRS 0x2000 276 #define FI_1MARKRXERRS 0x4000 277 #define FI_2MARKRXERRS 0x8000 278 #define FI_XCHNGRXERRS 0x10000 279 #define FI_DSCRDNULL 0x20000 280 281 #define FO_OLCUC 0x1 282 #define FO_ONLCR 0x2 283 #define FO_OOCRNL 0x4 284 #define FO_ONOCR 0x8 285 #define FO_ONLRET 0x10 286 #define FO_ONL 0x20 287 #define FO_OBS 0x40 288 #define FO_OVT 0x80 289 #define FO_OFF 0x100 290 #define FO_OTAB1 0x200 291 #define FO_OTAB2 0x400 292 #define FO_OTAB3 0x800 293 #define FO_OCR1 0x1000 294 #define FO_OCR2 0x2000 295 #define FO_OCR3 0x4000 296 #define FO_OFILL 0x8000 297 #define FO_ODELL 0x10000 298 299 #define P_RTSLOCK 0x1 300 #define P_CTSLOCK 0x2 301 #define P_MAPRTS 0x4 302 #define P_MAPCTS 0x8 303 #define P_LOOPBACK 0x10 304 #define P_DTRFOLLOW 0x20 305 #define P_FAKEDCD 0x40 306 307 #define P_RXIMIN 0x10000 308 #define P_RXITIME 0x20000 309 #define P_RXTHOLD 0x40000 310 311 /* 312 * Define a structure to communicate serial port signal and data state 313 * information. 314 */ 315 typedef struct asysigs { 316 unsigned long data; 317 unsigned long signal; 318 unsigned long sigvalue; 319 } asysigs_t; 320 321 #define DT_TXBUSY 0x1 322 #define DT_TXEMPTY 0x2 323 #define DT_TXLOW 0x4 324 #define DT_TXHIGH 0x8 325 #define DT_TXFULL 0x10 326 #define DT_TXHOG 0x20 327 #define DT_TXFLOWED 0x40 328 #define DT_TXBREAK 0x80 329 330 #define DT_RXBUSY 0x100 331 #define DT_RXEMPTY 0x200 332 #define DT_RXLOW 0x400 333 #define DT_RXHIGH 0x800 334 #define DT_RXFULL 0x1000 335 #define DT_RXHOG 0x2000 336 #define DT_RXFLOWED 0x4000 337 #define DT_RXBREAK 0x8000 338 339 #define SG_DTR 0x1 340 #define SG_DCD 0x2 341 #define SG_RTS 0x4 342 #define SG_CTS 0x8 343 #define SG_DSR 0x10 344 #define SG_RI 0x20 345 346 /* 347 * Define the notification setting structure. This is used to tell the 348 * port what events we want to be informed about. Fields here use the 349 * same defines as for the asysigs structure above. 350 */ 351 typedef struct asynotify { 352 unsigned long ctrl; 353 unsigned long data; 354 unsigned long signal; 355 unsigned long sigvalue; 356 } asynotify_t; 357 358 /* 359 * Define the port control structure. It is used to do fine grain 360 * control operations on the port. 361 */ 362 typedef struct { 363 unsigned long rxctrl; 364 unsigned long txctrl; 365 char rximdch; 366 char tximdch; 367 char spare1; 368 char spare2; 369 } asyctrl_t; 370 371 #define CT_ENABLE 0x1 372 #define CT_DISABLE 0x2 373 #define CT_STOP 0x4 374 #define CT_START 0x8 375 #define CT_STARTFLOW 0x10 376 #define CT_STOPFLOW 0x20 377 #define CT_SENDCHR 0x40 378 379 /* 380 * Define the stats structure kept for each port. This is a useful set 381 * of data collected for each port on the slave. The A_GETSTATS command 382 * is used to retrieve this data from the slave. 383 */ 384 typedef struct asystats { 385 unsigned long opens; 386 unsigned long txchars; 387 unsigned long rxchars; 388 unsigned long txringq; 389 unsigned long rxringq; 390 unsigned long txmsgs; 391 unsigned long rxmsgs; 392 unsigned long txflushes; 393 unsigned long rxflushes; 394 unsigned long overruns; 395 unsigned long framing; 396 unsigned long parity; 397 unsigned long ringover; 398 unsigned long lost; 399 unsigned long rxstart; 400 unsigned long rxstop; 401 unsigned long txstart; 402 unsigned long txstop; 403 unsigned long dcdcnt; 404 unsigned long dtrcnt; 405 unsigned long ctscnt; 406 unsigned long rtscnt; 407 unsigned long dsrcnt; 408 unsigned long ricnt; 409 unsigned long txbreaks; 410 unsigned long rxbreaks; 411 unsigned long signals; 412 unsigned long state; 413 unsigned long hwid; 414 } asystats_t; 415 416 /*****************************************************************************/ 417 418 /* 419 * All command and control communication with a device on the slave is 420 * via a control block in shared memory. Each device has its own control 421 * block, defined by the following structure. The control block allows 422 * the host to open, close and control the device on the slave. 423 */ 424 typedef struct cdkctrl { 425 unsigned char open; 426 unsigned char close; 427 unsigned long openarg; 428 unsigned long closearg; 429 unsigned long cmd; 430 unsigned long status; 431 unsigned long args[32]; 432 } cdkctrl_t; 433 434 /* 435 * Each device on the slave passes data to and from the host via a ring 436 * queue in shared memory. Define a ring queue structure to hold the 437 * vital information about each ring queue. Two ring queues will be 438 * allocated for each port, one for receive data and one for transmit 439 * data. 440 */ 441 typedef struct cdkasyrq { 442 unsigned long offset; 443 unsigned short size; 444 unsigned short head; 445 unsigned short tail; 446 } cdkasyrq_t; 447 448 /* 449 * Each asynchronous port is defined in shared memory by the following 450 * structure. It contains a control block to command a device, and also 451 * the necessary data channel information as well. 452 */ 453 typedef struct cdkasy { 454 cdkctrl_t ctrl; 455 unsigned short notify; 456 asynotify_t changed; 457 unsigned short receive; 458 cdkasyrq_t rxq; 459 unsigned short transmit; 460 cdkasyrq_t txq; 461 } cdkasy_t; 462 463 #pragma pack() 464 465 /*****************************************************************************/ 466 467 /* 468 * Define the set of ioctls used by the driver to do special things 469 * to the board. These include interrupting it, and initializing 470 * the driver after board startup and shutdown. 471 */ 472 #include <linux/ioctl.h> 473 474 #define STL_BINTR _IO('s',20) 475 #define STL_BSTART _IO('s',21) 476 #define STL_BSTOP _IO('s',22) 477 #define STL_BRESET _IO('s',23) 478 479 /* 480 * Define a set of ioctl extensions, used to get at special stuff. 481 */ 482 #define STL_GETPFLAG _IO('s',80) 483 #define STL_SETPFLAG _IO('s',81) 484 485 /*****************************************************************************/ 486 #endif 487