1 /* 2 * libdi - CD Audio Device Interface Library 3 * 4 * Copyright (C) 1993-2004 Ti Kan 5 * E-mail: xmcd@amb.org 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 #ifndef __SCSIPT_H__ 22 #define __SCSIPT_H__ 23 24 #if defined(DI_SCSIPT) || defined(CDDA_RD_SCSIPT) 25 26 #ifndef lint 27 static char *_scsipt_h_ident_ = "@(#)scsipt.h 6.78 04/01/14"; 28 #endif 29 30 31 #define MAX_VENDORS 8 /* Max number of vendors */ 32 33 /* 34 * Vendor-unique modules 35 * 36 * Undefine any of these (except VENDOR_SCSI2) to remove 37 * vendor-unique support for a particular vendor. Removing 38 * unused vendor-unique modules can reduce the executable 39 * binary size and run-time memory usage. 40 */ 41 #define VENDOR_SCSI2 0 /* SCSI-2 mode */ 42 #define VENDOR_CHINON 1 /* Chinon vendor-unique mode */ 43 #define VENDOR_HITACHI 2 /* Hitachi vendor-unique mode */ 44 #define VENDOR_NEC 3 /* NEC vendor-unique mode */ 45 #define VENDOR_PIONEER 4 /* Pioneer vendor-unique mode */ 46 #define VENDOR_SONY 5 /* Sony vendor-unique mode */ 47 #define VENDOR_TOSHIBA 6 /* Toshiba vendor-unique mode */ 48 #define VENDOR_PANASONIC 7 /* Panasonic vendor-unique mode */ 49 50 51 /* Data direction code */ 52 #define OP_NODATA 0 /* SCSI no data */ 53 #define OP_DATAIN 1 /* SCSI data-in */ 54 #define OP_DATAOUT 2 /* SCSI data-out */ 55 56 57 /* Default command timeout interval */ 58 #define DFLT_CMD_TIMEOUT 10 /* seconds */ 59 60 61 /* Read Sub-channel audio status */ 62 #define AUDIO_NOTVALID 0x00 /* audio status not valid */ 63 #define AUDIO_PLAYING 0x11 /* audio play in progress */ 64 #define AUDIO_PAUSED 0x12 /* audio play paused */ 65 #define AUDIO_COMPLETED 0x13 /* audio play successfully completed */ 66 #define AUDIO_FAILED 0x14 /* audio played stopped due to error */ 67 #define AUDIO_NOSTATUS 0x15 /* no audio status */ 68 69 70 /* SCSI command opcodes */ 71 72 /* 6-byte commands */ 73 #define OP_S_TEST 0x00 /* test unit ready */ 74 #define OP_S_REZERO 0x01 /* rezero */ 75 #define OP_S_RSENSE 0x03 /* request sense */ 76 #define OP_S_READ 0x08 /* read (8) */ 77 #define OP_S_SEEK 0x0b /* seek */ 78 #define OP_S_INQUIR 0x12 /* inquiry */ 79 #define OP_S_MSELECT 0x15 /* mode select (6) */ 80 #define OP_S_MSENSE 0x1a /* mode sense (6) */ 81 #define OP_S_START 0x1b /* start/stop unit */ 82 #define OP_S_PREVENT 0x1e /* prevent/allow medium removal */ 83 #define OP_S_INITELEMSTAT 0x07 /* initialize element status */ 84 85 /* 10-byte commands */ 86 #define OP_M_RDCAP 0x25 /* read capacity */ 87 #define OP_M_READ 0x28 /* read (10) */ 88 #define OP_M_RDSUBQ 0x42 /* read subchannel */ 89 #define OP_M_RDTOC 0x43 /* read TOC */ 90 #define OP_M_RDHDR 0x44 /* read header */ 91 #define OP_M_PLAY 0x45 /* play audio (10) */ 92 #define OP_M_PLAYMSF 0x47 /* play audio MSF */ 93 #define OP_M_PLAYTI 0x48 /* play audio track/index */ 94 #define OP_M_PLAYTR 0x49 /* play audio track relative (10) */ 95 #define OP_M_PAUSE 0x4b /* pause/resume */ 96 #define OP_M_MSELECT 0x55 /* mode select (10) */ 97 #define OP_M_MSENSE 0x5a /* mode sense (10) */ 98 99 /* 12-byte commands */ 100 #define OP_L_PLAY 0xa5 /* play audio (12) */ 101 #define OP_L_READ 0xa8 /* read (12) */ 102 #define OP_L_PLAYTR 0xa9 /* play audio track relative (12) */ 103 #define OP_L_MOVEMED 0xa5 /* move medium */ 104 #define OP_L_READELEMSTAT 0xb8 /* read element status */ 105 #define OP_L_READCD 0xbe /* MMC read CD */ 106 107 108 /* Data lengths */ 109 #define SZ_RDSUBQ 48 /* max read sub-channel Q data size */ 110 #define SZ_MCNDATA 13 /* media catalog number data size */ 111 #define SZ_ISRCDATA 12 /* intl std recording code data size */ 112 #define SZ_RDTOC 804 /* max read TOC (tracks) data size */ 113 #define SZ_RDCDTEXT 8192 /* max read TOC (CD-TEXT) data size */ 114 #define SZ_CDTEXTPKD 12 /* CDTEXT per-pack data size */ 115 #define SZ_CDTEXTINFO 512 /* CDTEXT scratch buffer size */ 116 #define SZ_TOCHDR 4 /* TOC header size */ 117 #define SZ_TOCENT 8 /* TOC per-track entry size */ 118 #define SZ_MSENSE 60 /* max mode sense/mode sel data size */ 119 #define SZ_AUDIOCTL 16 /* audio control page size */ 120 #define SZ_DEVCAPAB 16 /* device capab page size */ 121 #define SZ_ELEMADDR 20 /* element addr page size */ 122 #define SZ_RSENSE 18 /* max request sense data size */ 123 #define SZ_ELEMHDR 8 /* med chgr element status header */ 124 #define SZ_ELEMSTAT 8 /* med chgr element status */ 125 126 127 /* CD-ROM Mode sense/mode select page codes */ 128 #define PG_ERRECOV 0x01 /* error recovery parameters page */ 129 #define PG_DISCONN 0x02 /* disconn/conn parameters page */ 130 #define PG_CDROMCTL 0x0d /* cd-rom control parameters page */ 131 #define PG_AUDIOCTL 0x0e /* audio control parameters page */ 132 #define PG_ALL 0x3f /* 0x01, 0x02, 0x0d and 0x0e */ 133 134 /* Medium-changer Mode sense/mode select page codes */ 135 #define PG_DEVCAPAB 0x1f /* device capabilities page */ 136 #define PG_ELEMADDR 0x1d /* element address assignments page */ 137 138 139 /* Read sub-channel format codes */ 140 #define SUB_ALL 0x00 /* sub-Q channel data */ 141 #define SUB_CURPOS 0x01 /* current CD-ROM position */ 142 #define SUB_MCN 0x02 /* media catalog num (UPC/bar code) */ 143 #define SUB_ISRC 0x03 /* track ISRC code */ 144 145 146 /* Inquiry data misc definitions */ 147 #define DEV_WORM 0x04 /* WORM/CD-R peripheral device type */ 148 #define DEV_ROM 0x05 /* ROM peripheral device type */ 149 #define DEV_CHANGER 0x08 /* Medium changer device type */ 150 #define DEV_CONNECTED 0x00 /* peripheral qualifier */ 151 152 153 /* SCSI CDB handling */ 154 #define MAX_CMDLEN 12 /* Max SCSI CDB length */ 155 #define SCSICDB_RESET(p) (void) memset(p, 0, MAX_CMDLEN); 156 157 158 /* CDDA-over-SCSI read method code */ 159 #define CDDA_MMC 0 /* Use MMC read command */ 160 #define CDDA_STD 1 /* Use SCSI read command */ 161 #define CDDA_NEC 2 /* Use NEC vendor-unique */ 162 #define CDDA_SONY 3 /* Use Sony vendor-unique */ 163 164 165 /* 166 * SCSI inquiry data 167 */ 168 typedef struct inqry_data { 169 #if _BYTE_ORDER_ == _L_ENDIAN_ 170 unsigned int type:5; /* peripheral device type */ 171 unsigned int pqual:3; /* peripheral qualifier */ 172 unsigned int qualif:7; /* device type qualifier */ 173 unsigned int rmb:1; /* removable media */ 174 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 175 unsigned int pqual:3; /* peripheral qualifier */ 176 unsigned int type:5; /* peripheral device type */ 177 unsigned int rmb:1; /* removable media */ 178 unsigned int qualif:7; /* device type qualifier */ 179 #endif /* _BYTE_ORDER_ */ 180 181 unsigned int ver:8; /* SCSI version */ 182 unsigned int res1:8; /* reserved */ 183 184 byte_t len; /* length of additional data */ 185 byte_t res2[3]; /* reserved */ 186 byte_t vendor[8]; /* vendor ID */ 187 byte_t prod[16]; /* product ID */ 188 byte_t revnum[4]; /* revision number */ 189 } inquiry_data_t; 190 191 192 /* 193 * Mode Sense/Mode Select data 194 */ 195 196 /* Mode Sense/Mode Select (6 byte) data */ 197 typedef struct mode_sense_6_data { 198 /* mode header */ 199 unsigned int data_len:8; /* data length */ 200 unsigned int medium:8; /* medium */ 201 #if _BYTE_ORDER_ == _L_ENDIAN_ 202 unsigned int speed:4; /* speed */ 203 unsigned int buffered:3; /* buffered */ 204 unsigned int wprot:1; /* write protected */ 205 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 206 unsigned int wprot:1; /* write protected */ 207 unsigned int buffered:3; /* buffered */ 208 unsigned int speed:4; /* speed */ 209 #endif /* _BYTE_ORDER_ */ 210 unsigned int bdescr_len:8; /* block descriptor length */ 211 212 byte_t data[48]; /* block desc/page desc data */ 213 } mode_sense_6_data_t; 214 215 216 /* Mode Sense/Mode Select (10 byte) data */ 217 typedef struct mode_sense_10_data { 218 /* mode header */ 219 unsigned int data_len:16; /* data length */ 220 unsigned int medium:8; /* medium */ 221 #if _BYTE_ORDER_ == _L_ENDIAN_ 222 unsigned int speed:4; /* speed */ 223 unsigned int buffered:3; /* buffered */ 224 unsigned int wprot:1; /* write protected */ 225 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 226 unsigned int wprot:1; /* write protected */ 227 unsigned int buffered:3; /* buffered */ 228 unsigned int speed:4; /* speed */ 229 #endif /* _BYTE_ORDER_ */ 230 231 unsigned int res:16; /* reserved */ 232 unsigned int bdescr_len:16; /* block descriptor length */ 233 234 byte_t data[48]; /* block desc/page desc data */ 235 } mode_sense_10_data_t; 236 237 238 /* Block descriptor data */ 239 typedef struct blk_desc { 240 unsigned int dens_code:8; /* density code */ 241 unsigned int num_blks:24; /* number of blocks */ 242 243 unsigned int res:8; /* reserved */ 244 unsigned int blk_len:24; /* block length */ 245 } blk_desc_t; 246 247 248 /* CD-ROM Audio-parameters page (0x0e) data */ 249 typedef struct audio_pg { 250 #if _BYTE_ORDER_ == _L_ENDIAN_ 251 unsigned int pg_code:6; /* page code */ 252 unsigned int res:2; /* reserved */ 253 unsigned int pg_len:8; /* page length */ 254 unsigned int res1:1; /* reserved */ 255 unsigned int sotc:1; /* SOTC */ 256 unsigned int immed:1; /* immediate */ 257 unsigned int res2:5; /* reserved */ 258 unsigned int res3:8; /* reserved */ 259 260 unsigned int res4:16; /* reserved */ 261 unsigned int audio_bps:16; /* logical blocks per second */ 262 263 unsigned int p0_ch_ctrl:4; /* port 0 channel control */ 264 unsigned int res5:4; /* reserved */ 265 unsigned int p0_vol:8; /* port 0 volume */ 266 unsigned int p1_ch_ctrl:4; /* port 1 channel control */ 267 unsigned int res6:4; /* reserved */ 268 unsigned int p1_vol:8; /* port 1 volume */ 269 270 unsigned int p2_ch_ctrl:4; /* port 2 channel control */ 271 unsigned int res7:4; /* reserved */ 272 unsigned int p2_vol:8; /* port 2 volume */ 273 unsigned int p3_ch_ctrl:4; /* port 3 channel control */ 274 unsigned int res8:4; /* reserved */ 275 unsigned int p3_vol:8; /* port 3 volume */ 276 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 277 unsigned int res:2; /* reserved */ 278 unsigned int pg_code:6; /* page code */ 279 unsigned int pg_len:8; /* page length */ 280 unsigned int res2:5; /* reserved */ 281 unsigned int immed:1; /* immediate */ 282 unsigned int sotc:1; /* SOTC */ 283 unsigned int res1:1; /* reserved */ 284 unsigned int res3:8; /* reserved */ 285 286 unsigned int res4:16; /* reserved */ 287 unsigned int audio_bps:16; /* logical blocks per second */ 288 289 unsigned int res5:4; /* reserved */ 290 unsigned int p0_ch_ctrl:4; /* port 0 channel control */ 291 unsigned int p0_vol:8; /* port 0 volume */ 292 unsigned int res6:4; /* reserved */ 293 unsigned int p1_ch_ctrl:4; /* port 1 channel control */ 294 unsigned int p1_vol:8; /* port 1 volume */ 295 296 unsigned int res7:4; /* reserved */ 297 unsigned int p2_ch_ctrl:4; /* port 2 channel control */ 298 unsigned int p2_vol:8; /* port 2 volume */ 299 unsigned int res8:4; /* reserved */ 300 unsigned int p3_ch_ctrl:4; /* port 3 channel control */ 301 unsigned int p3_vol:8; /* port 3 volume */ 302 #endif /* _BYTE_ORDER_ */ 303 } audio_pg_t; 304 305 306 /* Medium-changer Device capabilities page (0x1f) data */ 307 typedef struct dev_capab { 308 #if _BYTE_ORDER_ == _L_ENDIAN_ 309 unsigned int pg_code:6; /* page code */ 310 unsigned int res:2; /* reserved */ 311 unsigned int pg_len:8; /* page length */ 312 unsigned int stor_mt:1; /* medium transport element */ 313 unsigned int stor_st:1; /* storage element */ 314 unsigned int stor_ie:1; /* import/export element */ 315 unsigned int stor_dt:1; /* data transfer element */ 316 unsigned int res1:4; /* reserved */ 317 unsigned int res2:8; /* reserved */ 318 319 unsigned int move_mt_mt:1; /* move medium: MT->MT */ 320 unsigned int move_mt_st:1; /* move medium: MT->ST */ 321 unsigned int move_mt_ie:1; /* move medium: MT->IE */ 322 unsigned int move_mt_dt:1; /* move medium: MT->DT */ 323 unsigned int res3:4; /* reserved */ 324 unsigned int move_st_mt:1; /* move medium: ST->MT */ 325 unsigned int move_st_st:1; /* move medium: ST->ST */ 326 unsigned int move_st_ie:1; /* move medium: ST->IE */ 327 unsigned int move_st_dt:1; /* move medium: ST->DT */ 328 unsigned int res4:4; /* reserved */ 329 unsigned int move_ie_mt:1; /* move medium: IE->MT */ 330 unsigned int move_ie_st:1; /* move medium: IE->ST */ 331 unsigned int move_ie_ie:1; /* move medium: IE->IE */ 332 unsigned int move_ie_dt:1; /* move medium: IE->DT */ 333 unsigned int res5:4; /* reserved */ 334 unsigned int move_dt_mt:1; /* move medium: DT->MT */ 335 unsigned int move_dt_st:1; /* move medium: DT->ST */ 336 unsigned int move_dt_ie:1; /* move medium: DT->IE */ 337 unsigned int move_dt_dt:1; /* move medium: DT->DT */ 338 unsigned int res6:4; /* reserved */ 339 340 unsigned int res7:32; /* reserved */ 341 342 unsigned int xchg_mt_mt:1; /* exchange medium: MT<->MT */ 343 unsigned int xchg_mt_st:1; /* exchange medium: MT<->ST */ 344 unsigned int xchg_mt_ie:1; /* exchange medium: MT<->IE */ 345 unsigned int xchg_mt_dt:1; /* exchange medium: MT<->DT */ 346 unsigned int res8:4; /* reserved */ 347 unsigned int xchg_st_mt:1; /* exchange medium: ST<->MT */ 348 unsigned int xchg_st_st:1; /* exchange medium: ST<->ST */ 349 unsigned int xchg_st_ie:1; /* exchange medium: ST<->IE */ 350 unsigned int xchg_st_dt:1; /* exchange medium: ST<->DT */ 351 unsigned int res9:4; /* reserved */ 352 unsigned int xchg_ie_mt:1; /* exchange medium: IE<->MT */ 353 unsigned int xchg_ie_st:1; /* exchange medium: IE<->ST */ 354 unsigned int xchg_ie_ie:1; /* exchange medium: IE<->IE */ 355 unsigned int xchg_ie_dt:1; /* exchange medium: IE<->DT */ 356 unsigned int res10:4; /* reserved */ 357 unsigned int xchg_dt_mt:1; /* exchange medium: DT<->MT */ 358 unsigned int xchg_dt_st:1; /* exchange medium: DT<->ST */ 359 unsigned int xchg_dt_ie:1; /* exchange medium: DT<->IE */ 360 unsigned int xchg_dt_dt:1; /* exchange medium: DT<->DT */ 361 unsigned int res11:4; /* reserved */ 362 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 363 unsigned int res:2; /* reserved */ 364 unsigned int pg_code:6; /* page code */ 365 unsigned int pg_len:8; /* page length */ 366 unsigned int res1:4; /* reserved */ 367 unsigned int stor_dt:1; /* data transfer element */ 368 unsigned int stor_ie:1; /* import/export element */ 369 unsigned int stor_st:1; /* storage element */ 370 unsigned int stor_mt:1; /* medium transport element */ 371 unsigned int res2:8; /* reserved */ 372 373 unsigned int res3:4; /* reserved */ 374 unsigned int move_mt_dt:1; /* move medium: MT->DT */ 375 unsigned int move_mt_ie:1; /* move medium: MT->IE */ 376 unsigned int move_mt_st:1; /* move medium: MT->ST */ 377 unsigned int move_mt_mt:1; /* move medium: MT->MT */ 378 unsigned int res4:4; /* reserved */ 379 unsigned int move_st_dt:1; /* move medium: ST->DT */ 380 unsigned int move_st_ie:1; /* move medium: ST->IE */ 381 unsigned int move_st_st:1; /* move medium: ST->ST */ 382 unsigned int move_st_mt:1; /* move medium: ST->MT */ 383 unsigned int res5:4; /* reserved */ 384 unsigned int move_ie_dt:1; /* move medium: IE->DT */ 385 unsigned int move_ie_ie:1; /* move medium: IE->IE */ 386 unsigned int move_ie_st:1; /* move medium: IE->ST */ 387 unsigned int move_ie_mt:1; /* move medium: IE->MT */ 388 unsigned int res6:4; /* reserved */ 389 unsigned int move_dt_dt:1; /* move medium: DT->DT */ 390 unsigned int move_dt_ie:1; /* move medium: DT->IE */ 391 unsigned int move_dt_st:1; /* move medium: DT->ST */ 392 unsigned int move_dt_mt:1; /* move medium: DT->MT */ 393 394 unsigned int res7:32; /* reserved */ 395 396 unsigned int res8:4; /* reserved */ 397 unsigned int xchg_mt_dt:1; /* exchange medium: MT<->DT */ 398 unsigned int xchg_mt_ie:1; /* exchange medium: MT<->IE */ 399 unsigned int xchg_mt_st:1; /* exchange medium: MT<->ST */ 400 unsigned int xchg_mt_mt:1; /* exchange medium: MT<->MT */ 401 unsigned int res9:4; /* reserved */ 402 unsigned int xchg_st_dt:1; /* exchange medium: ST<->DT */ 403 unsigned int xchg_st_ie:1; /* exchange medium: ST<->IE */ 404 unsigned int xchg_st_st:1; /* exchange medium: ST<->ST */ 405 unsigned int xchg_st_mt:1; /* exchange medium: ST<->MT */ 406 unsigned int res10:4; /* reserved */ 407 unsigned int xchg_ie_dt:1; /* exchange medium: IE<->DT */ 408 unsigned int xchg_ie_ie:1; /* exchange medium: IE<->IE */ 409 unsigned int xchg_ie_st:1; /* exchange medium: IE<->ST */ 410 unsigned int xchg_ie_mt:1; /* exchange medium: IE<->MT */ 411 unsigned int res11:4; /* reserved */ 412 unsigned int xchg_dt_dt:1; /* exchange medium: DT<->DT */ 413 unsigned int xchg_dt_ie:1; /* exchange medium: DT<->IE */ 414 unsigned int xchg_dt_st:1; /* exchange medium: DT<->ST */ 415 unsigned int xchg_dt_mt:1; /* exchange medium: DT<->MT */ 416 #endif /* _BYTE_ORDER_ */ 417 } dev_capab_t; 418 419 420 /* Medium-changer Element address assignments page (0x1d) data */ 421 typedef struct elem_addr { 422 #if _BYTE_ORDER_ == _L_ENDIAN_ 423 unsigned int pg_code:6; /* page code */ 424 unsigned int res:2; /* reserved */ 425 unsigned int pg_len:8; /* page length */ 426 unsigned int mt_addr:16; /* medium transport element address */ 427 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 428 unsigned int res:2; /* reserved */ 429 unsigned int pg_code:6; /* page code */ 430 unsigned int pg_len:8; /* page length */ 431 unsigned int mt_addr:16; /* medium transport element address */ 432 #endif /* _BYTE_ORDER_ */ 433 434 unsigned int mt_num:16; /* medium transport elements */ 435 unsigned int st_addr:16; /* storage element address */ 436 437 unsigned int st_num:16; /* storage elements */ 438 unsigned int ie_addr:16; /* import/export element address */ 439 440 unsigned int ie_num:16; /* import/export elements */ 441 unsigned int dt_addr:16; /* data transfer element address */ 442 443 unsigned int dt_num:16; /* data transfer elements */ 444 unsigned int res1:16; /* reserved */ 445 } elem_addr_t; 446 447 448 /* 449 * Request Sense data 450 */ 451 typedef struct req_sense_data { 452 #if _BYTE_ORDER_ == _L_ENDIAN_ 453 unsigned int errcode:7; /* error code */ 454 unsigned int valid:1; /* valid bit */ 455 unsigned int segno:8; /* segment number */ 456 unsigned int key:4; /* sense key */ 457 unsigned int res:1; /* reserved */ 458 unsigned int ili:1; /* ILI */ 459 unsigned int eom:1; /* end-of-medium */ 460 unsigned int fm:1; /* filemark */ 461 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 462 unsigned int valid:1; /* valid bit */ 463 unsigned int errcode:7; /* error code */ 464 unsigned int segno:8; /* segment number */ 465 unsigned int fm:1; /* filemark */ 466 unsigned int eom:1; /* end-of-medium */ 467 unsigned int ili:1; /* ILI */ 468 unsigned int res:1; /* reserved */ 469 unsigned int key:4; /* sense key */ 470 #endif /* _BYTE_ORDER_ */ 471 unsigned int info0:8; /* information */ 472 473 unsigned int info1:8; /* information */ 474 unsigned int info2:8; /* information */ 475 unsigned int info3:8; /* information */ 476 unsigned int addl_len:8; /* additional sense length */ 477 478 unsigned int cmd_spec0:8; /* command specific information */ 479 unsigned int cmd_spec1:8; /* command specific information */ 480 unsigned int cmd_spec2:8; /* command specific information */ 481 unsigned int cmd_spec3:8; /* command specific information */ 482 483 unsigned int code:8; /* additional sense code */ 484 unsigned int qual:8; /* additional sense code qualifier */ 485 unsigned int fruc:8; /* field replaceable unit code */ 486 unsigned int key_spec0:8; /* sense-key specific */ 487 488 unsigned int key_spec1:8; /* sense-key specific */ 489 unsigned int key_spec2:8; /* sense-key specific */ 490 unsigned int pad1:16; /* pad for alignment */ 491 } req_sense_data_t; 492 493 494 /* Structure to map request sense key code to a descriptive string */ 495 typedef struct req_sense_keymap { 496 int key; /* The sense key */ 497 char *text; /* The description text string */ 498 } req_sense_keymap_t; 499 500 501 /* 502 * Read subchannel Q data header 503 */ 504 typedef struct subq_hdr { 505 byte_t reserved; /* reserved */ 506 byte_t audio_status; /* audio status */ 507 word16_t subch_len; /* subchannel data length */ 508 } subq_hdr_t; 509 510 511 /* 512 * Subchannel Q data - format 00 (All information) 513 */ 514 typedef struct subq_00 { 515 unsigned int fmt_code:8; /* format code */ 516 #if _BYTE_ORDER_ == _L_ENDIAN_ 517 unsigned int preemph:1; /* preemphasis */ 518 unsigned int copyallow:1; /* digital copy allow */ 519 unsigned int trktype:1; /* 0=audio 1=data */ 520 unsigned int audioch:1; /* 0=2ch 1=4ch */ 521 unsigned int adr:4; /* ADR */ 522 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 523 unsigned int adr:4; /* ADR */ 524 unsigned int audioch:1; /* 0=2ch 1=4ch */ 525 unsigned int trktype:1; /* 0=audio 1=data */ 526 unsigned int copyallow:1; /* digital copy allow */ 527 unsigned int preemph:1; /* preemphasis */ 528 #endif /* _BYTE_ORDER_ */ 529 unsigned int trkno:8; /* track number */ 530 unsigned int idxno:8; /* index number */ 531 532 lmsf_t abs_addr; /* absolute address */ 533 lmsf_t rel_addr; /* track-relative address */ 534 535 #if _BYTE_ORDER_ == _L_ENDIAN_ 536 unsigned int reserved:7; /* reserved */ 537 unsigned int mcval:1; /* MCN is valid */ 538 #else 539 unsigned int mcval:1; /* MCN is valid */ 540 unsigned int reserved:7; /* reserved */ 541 #endif 542 byte_t mcn[15]; /* MCN data */ 543 544 #if _BYTE_ORDER_ == _L_ENDIAN_ 545 unsigned int reserved2:7; /* reserved */ 546 unsigned int tcval:1; /* ISRC is valid */ 547 #else 548 unsigned int tcval:1; /* ISRC is valid */ 549 unsigned int reserved2:7; /* reserved */ 550 #endif 551 byte_t isrc[15]; /* ISRC data */ 552 } subq_00_t; 553 554 555 /* 556 * Subchannel Q data - format 01 (CD-ROM Current Position) 557 */ 558 typedef struct subq_01 { 559 unsigned int fmt_code:8; /* format code */ 560 #if _BYTE_ORDER_ == _L_ENDIAN_ 561 unsigned int preemph:1; /* preemphasis */ 562 unsigned int copyallow:1; /* digital copy allow */ 563 unsigned int trktype:1; /* 0=audio 1=data */ 564 unsigned int audioch:1; /* 0=2ch 1=4ch */ 565 unsigned int adr:4; /* ADR */ 566 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 567 unsigned int adr:4; /* ADR */ 568 unsigned int audioch:1; /* 0=2ch 1=4ch */ 569 unsigned int trktype:1; /* 0=audio 1=data */ 570 unsigned int copyallow:1; /* digital copy allow */ 571 unsigned int preemph:1; /* preemphasis */ 572 #endif /* _BYTE_ORDER_ */ 573 unsigned int trkno:8; /* track number */ 574 unsigned int idxno:8; /* index number */ 575 576 lmsf_t abs_addr; /* absolute address */ 577 lmsf_t rel_addr; /* track-relative address */ 578 } subq_01_t; 579 580 581 /* 582 * Subchannel Q data - format 02 (Media Catalog Number) 583 */ 584 typedef struct subq_02 { 585 unsigned int fmt_code:8; /* format code */ 586 unsigned int reserved:24; /* reserved */ 587 588 #if _BYTE_ORDER_ == _L_ENDIAN_ 589 unsigned int reserved2:7; /* reserved */ 590 unsigned int mcval:1; /* MCN is valid */ 591 #else 592 unsigned int mcval:1; /* MCN is valid */ 593 unsigned int reserved2:7; /* reserved */ 594 #endif 595 byte_t mcn[15]; /* MCN data */ 596 } subq_02_t; 597 598 599 /* 600 * Subchannel Q data - format 03 (International Standard Recording Code) 601 */ 602 typedef struct subq_03 { 603 unsigned int fmt_code:8; /* format code */ 604 unsigned int reserved:24; /* reserved */ 605 606 #if _BYTE_ORDER_ == _L_ENDIAN_ 607 unsigned int reserved2:7; /* reserved */ 608 unsigned int tcval:1; /* ISRC is valid */ 609 #else 610 unsigned int tcval:1; /* ISRC is valid */ 611 unsigned int reserved2:7; /* reserved */ 612 #endif 613 byte_t isrc[15]; /* ISRC data */ 614 } subq_03_t; 615 616 617 /* 618 * Read TOC command data header 619 */ 620 typedef struct toc_hdr { 621 word16_t data_len; /* TOC data length */ 622 byte_t first_trk; /* first track number */ 623 byte_t last_trk; /* last track number */ 624 } toc_hdr_t; 625 626 627 /* 628 * Read TOC command track descriptor 629 */ 630 typedef struct toc_trk_descr { 631 unsigned int res1:8; /* reserved */ 632 #if _BYTE_ORDER_ == _L_ENDIAN_ 633 unsigned int preemph:1; /* preemphasis */ 634 unsigned int copyallow:1; /* digital copy allow */ 635 unsigned int trktype:1; /* 0=audio 1=data */ 636 unsigned int audioch:1; /* 0=2ch 1=4ch */ 637 unsigned int adr:4; /* ADR */ 638 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 639 unsigned int adr:4; /* ADR */ 640 unsigned int audioch:1; /* 0=2ch 1=4ch */ 641 unsigned int trktype:1; /* 0=audio 1=data */ 642 unsigned int copyallow:1; /* digital copy allow */ 643 unsigned int preemph:1; /* preemphasis */ 644 #endif /* _BYTE_ORDER_ */ 645 unsigned int trkno:8; /* track number */ 646 unsigned int res2:8; /* reserved */ 647 648 lmsf_t abs_addr; /* absolute address */ 649 } toc_trk_descr_t; 650 651 652 /* Values for the pack_type field of the toc_cdtext_pack_t structure */ 653 #define PACK_TITLE 0x80 /* Album or track title */ 654 #define PACK_PERFORMER 0x81 /* Name of performer(s) */ 655 #define PACK_SONGWRITER 0x82 /* Name of songwriter(s) */ 656 #define PACK_COMPOSER 0x83 /* Name of composer(s) */ 657 #define PACK_ARRANGER 0x84 /* Name of arranger(s) */ 658 #define PACK_MESSAGE 0x85 /* Message(s) to user */ 659 #define PACK_IDENT 0x86 /* Disc identification info */ 660 #define PACK_GENRE 0x87 /* Genre identification and info */ 661 #define PACK_TOC 0x88 /* TOC info */ 662 #define PACK_TOC2 0x89 /* Second TOC info */ 663 #define PACK_UPCEAN 0x8e /* UPC/EAN code, ISRC code (track) */ 664 #define PACK_SIZEINFO 0x8f /* Size info of the block */ 665 666 /* 667 * Read TOC command CD-TEXT pack descriptor 668 */ 669 typedef struct toc_cdtext_pack { 670 byte_t pack_type; /* Pack type */ 671 byte_t trk_no; /* Track Number */ 672 byte_t seq_no; /* Sequence number */ 673 byte_t blk_char; /* Block character */ 674 byte_t data[SZ_CDTEXTPKD]; 675 /* Text data */ 676 byte_t crc0; /* CRC info */ 677 byte_t crc1; /* CRC info */ 678 } toc_cdtext_pack_t; 679 680 681 /* 682 * Medium changer Read Element Status data structures 683 */ 684 685 /* Element status header */ 686 typedef struct { 687 unsigned int firstelem:16; /* first elem addr reported */ 688 unsigned int numelem:16; /* number of elems reported */ 689 690 unsigned int datalen:32; /* report byte cnt max=0xffffff */ 691 } elemhdr_t; 692 693 694 /* Element types */ 695 #define ELEMTYP_ALL 0 /* all types */ 696 #define ELEMTYP_MT 1 /* medium transport */ 697 #define ELEMTYP_ST 2 /* storage */ 698 #define ELEMTYP_IE 3 /* import export */ 699 #define ELEMTYP_DT 4 /* data transfer */ 700 701 702 /* Element status page */ 703 typedef struct { 704 unsigned int type:8; /* elem type code */ 705 #if _BYTE_ORDER_ == _L_ENDIAN_ 706 unsigned int res1:6; /* reserved */ 707 unsigned int avoltag:1; /* avoltag */ 708 unsigned int pvoltag:1; /* pvoltag */ 709 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 710 unsigned int pvoltag:1; /* pvoltag */ 711 unsigned int avoltag:1; /* avoltag */ 712 unsigned int res1:6; /* reserved */ 713 #endif /* _BYTE_ORDER_ */ 714 unsigned int desclen:16; /* elem descriptor length each */ 715 716 unsigned int pagelen:32; /* descriptors byte cnt max=0xffffff */ 717 } elemstat_t; 718 719 720 /* Medium transport element descriptor */ 721 typedef struct { 722 unsigned int elemaddr:16; /* element address */ 723 #if _BYTE_ORDER_ == _L_ENDIAN_ 724 unsigned int full:1; /* full */ 725 unsigned int res2:1; /* reserved */ 726 unsigned int excpt:1; /* except */ 727 unsigned int res1:5; /* reserved */ 728 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 729 unsigned int res1:5; /* reserved */ 730 unsigned int excpt:1; /* except */ 731 unsigned int res2:1; /* reserved */ 732 unsigned int full:1; /* full */ 733 #endif /* _BYTE_ORDER_ */ 734 unsigned int res3:8; /* reserved */ 735 736 unsigned int asc:8; /* additional sense code */ 737 unsigned int ascq:8; /* additional sense code qualifier */ 738 unsigned int res4:16; /* reserved */ 739 740 unsigned int res5:8; /* reserved */ 741 #if _BYTE_ORDER_ == _L_ENDIAN_ 742 unsigned int res6:6; /* reserved */ 743 unsigned int invert:1; /* invert */ 744 unsigned int svalid:1; /* svalid */ 745 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 746 unsigned int svalid:1; /* svalid */ 747 unsigned int invert:1; /* invert */ 748 unsigned int res6:6; /* reserved */ 749 #endif /* _BYTE_ORDER_ */ 750 unsigned int srcaddr:16; /* source storage elem address */ 751 752 byte_t pri_voltag[35]; /* primary volume tag info */ 753 byte_t alt_voltag[15]; /* alternate volume tag info */ 754 } elemdesc_mt_t; 755 756 757 /* Storage element descriptor */ 758 typedef struct { 759 unsigned int elemaddr:16; /* element address */ 760 #if _BYTE_ORDER_ == _L_ENDIAN_ 761 unsigned int full:1; /* full */ 762 unsigned int res2:1; /* reserved */ 763 unsigned int excpt:1; /* except */ 764 unsigned int access:1; /* access */ 765 unsigned int res1:4; /* reserved */ 766 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 767 unsigned int res1:4; /* reserved */ 768 unsigned int access:1; /* access */ 769 unsigned int excpt:1; /* except */ 770 unsigned int res2:1; /* reserved */ 771 unsigned int full:1; /* full */ 772 #endif /* _BYTE_ORDER_ */ 773 unsigned int res3:8; /* reserved */ 774 775 unsigned int asc:8; /* additional sense code */ 776 unsigned int ascq:8; /* additional sense code qualifier */ 777 unsigned int res4:16; /* reserved */ 778 779 unsigned int res5:8; /* reserved */ 780 #if _BYTE_ORDER_ == _L_ENDIAN_ 781 unsigned int res6:6; /* reserved */ 782 unsigned int invert:1; /* invert */ 783 unsigned int svalid:1; /* svalid */ 784 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 785 unsigned int svalid:1; /* svalid */ 786 unsigned int invert:1; /* invert */ 787 unsigned int res6:6; /* reserved */ 788 #endif /* _BYTE_ORDER_ */ 789 unsigned int srcaddr:16; /* source storage elem address */ 790 791 byte_t pri_voltag[35]; /* primary volume tag info */ 792 byte_t alt_voltag[15]; /* alternate volume tag info */ 793 } elemdesc_st_t; 794 795 796 /* Import/export element descriptor */ 797 typedef struct { 798 unsigned int elemaddr:16; /* element address */ 799 #if _BYTE_ORDER_ == _L_ENDIAN_ 800 unsigned int full:1; /* full */ 801 unsigned int impexp:1; /* impexp */ 802 unsigned int excpt:1; /* except */ 803 unsigned int access:1; /* access */ 804 unsigned int exenab:1; /* exenab */ 805 unsigned int inenab:1; /* inenab */ 806 unsigned int res1:2; /* reserved */ 807 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 808 unsigned int res1:2; /* reserved */ 809 unsigned int inenab:1; /* inenab */ 810 unsigned int exenab:1; /* exenab */ 811 unsigned int access:1; /* access */ 812 unsigned int excpt:1; /* except */ 813 unsigned int impexp:1; /* impexp */ 814 unsigned int full:1; /* full */ 815 #endif /* _BYTE_ORDER_ */ 816 unsigned int res3:8; /* reserved */ 817 818 unsigned int asc:8; /* additional sense code */ 819 unsigned int ascq:8; /* additional sense code qualifier */ 820 unsigned int res4:16; /* reserved */ 821 822 unsigned int res5:8; /* reserved */ 823 #if _BYTE_ORDER_ == _L_ENDIAN_ 824 unsigned int res6:6; /* reserved */ 825 unsigned int invert:1; /* invert */ 826 unsigned int svalid:1; /* svalid */ 827 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 828 unsigned int svalid:1; /* svalid */ 829 unsigned int invert:1; /* invert */ 830 unsigned int res6:6; /* reserved */ 831 #endif /* _BYTE_ORDER_ */ 832 unsigned int srcaddr:16; /* source storage elem address */ 833 834 byte_t pri_voltag[35]; /* primary volume tag info */ 835 byte_t alt_voltag[15]; /* alternate volume tag info */ 836 } elemdesc_ie_t; 837 838 839 /* Data transfer element descriptor */ 840 typedef struct { 841 unsigned int elemaddr:16; /* element address */ 842 #if _BYTE_ORDER_ == _L_ENDIAN_ 843 unsigned int full:1; /* full */ 844 unsigned int res2:1; /* reserved */ 845 unsigned int excpt:1; /* except */ 846 unsigned int access:1; /* access */ 847 unsigned int res1:4; /* reserved */ 848 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 849 unsigned int res1:4; /* reserved */ 850 unsigned int access:1; /* access */ 851 unsigned int excpt:1; /* except */ 852 unsigned int res2:1; /* reserved */ 853 unsigned int full:1; /* full */ 854 #endif /* _BYTE_ORDER_ */ 855 unsigned int res3:8; /* reserved */ 856 857 unsigned int asc:8; /* additional sense code */ 858 unsigned int ascq:8; /* additional sense code qualifier */ 859 #if _BYTE_ORDER_ == _L_ENDIAN_ 860 unsigned int lun:3; /* lun */ 861 unsigned int res5:1; /* reserved */ 862 unsigned int luvalid:1; /* luvalid */ 863 unsigned int idvalid:1; /* idvalid */ 864 unsigned int res6:1; /* reserved */ 865 unsigned int notbus:1; /* notbus */ 866 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 867 unsigned int notbus:1; /* notbus */ 868 unsigned int res6:1; /* reserved */ 869 unsigned int idvalid:1; /* idvalid */ 870 unsigned int luvalid:1; /* luvalid */ 871 unsigned int res5:1; /* reserved */ 872 unsigned int lun:3; /* lun */ 873 #endif /* _BYTE_ORDER_ */ 874 unsigned int busaddr:8; /* scsi bus addr */ 875 876 unsigned int res7:8; /* reserved */ 877 #if _BYTE_ORDER_ == _L_ENDIAN_ 878 unsigned int res8:6; /* reserved */ 879 unsigned int invert:1; /* invert */ 880 unsigned int svalid:1; /* svalid */ 881 #else /* _BYTE_ORDER_ == _B_ENDIAN_ */ 882 unsigned int svalid:1; /* svalid */ 883 unsigned int invert:1; /* invert */ 884 unsigned int res8:6; /* reserved */ 885 #endif /* _BYTE_ORDER_ */ 886 unsigned int srcaddr:16; /* source storage elem address */ 887 888 byte_t pri_voltag[35]; /* primary volume tag info */ 889 byte_t alt_voltag[15]; /* alternate volume tag info */ 890 } elemdesc_dt_t; 891 892 893 /* Union of all element descriptors */ 894 typedef union { 895 elemdesc_mt_t mt; /* medium transport elem descriptor */ 896 elemdesc_st_t st; /* storage elem descriptor */ 897 elemdesc_ie_t ie; /* import/export elem descriptor */ 898 elemdesc_dt_t dt; /* data transfer elem descriptor */ 899 } elemdesc_t; 900 901 902 /* 903 * Medium changer parameters structure 904 */ 905 typedef struct { 906 word16_t mtbase; /* Medium transport element base addr */ 907 word16_t stbase; /* Storage element base addr */ 908 word16_t iebase; /* Import/export element base addr */ 909 word16_t dtbase; /* Data transfer element base addr */ 910 } mcparm_t; 911 912 913 /* Defines for the addrfmt field of the cdda_req_t structure */ 914 #define READFMT_LBA 0x1 915 #define READFMT_MSF 0x2 916 917 /* 918 * Read CDDA request structure 919 */ 920 typedef struct cdda_req { 921 lmsf_t pos; /* Address location to read */ 922 int nframes; /* Number of frames to read */ 923 byte_t *buf; /* Data buffer pointer */ 924 byte_t addrfmt; /* Address format */ 925 } cdda_req_t; 926 927 928 929 /***** Additional include files *****/ 930 931 /* OS interface library headers */ 932 #include "libdi_d/os_aix.h" /* IBM AIX */ 933 #include "libdi_d/os_aux.h" /* Apple A/UX */ 934 #include "libdi_d/os_bsdi.h" /* BSDI BSD/OS */ 935 #include "libdi_d/os_dec.h" /* Digital OSF/1 & Ultrix */ 936 #include "libdi_d/os_dgux.h" /* Data General DG/UX */ 937 #include "libdi_d/os_fnbsd.h" /* FreeBSD/NetBSD */ 938 #include "libdi_d/os_hpux.h" /* HP-UX */ 939 #include "libdi_d/os_irix.h" /* SGI IRIX */ 940 #include "libdi_d/os_linux.h" /* Linux */ 941 #include "libdi_d/os_news.h" /* Sony NEWS-OS */ 942 #include "libdi_d/os_sco.h" /* SCO UNIX/Open Desktop/Open Server */ 943 #include "libdi_d/os_sinix.h" /* SNI SINIX */ 944 #include "libdi_d/os_sun.h" /* SunOS */ 945 #include "libdi_d/os_svr4.h" /* SVR4 */ 946 #include "libdi_d/os_vms.h" /* Digital OpenVMS */ 947 948 /* If compiling on a non-supported OS, force demo-only mode */ 949 #if !defined(OS_MODULE) && !defined(DEMO_ONLY) 950 #define DEMO_ONLY 951 #endif 952 953 /* If demo-only, no need to compile in the vendor-unique modules */ 954 #ifdef DEMO_ONLY 955 #ifdef VENDOR_CHINON 956 #undef VENDOR_CHINON 957 #endif 958 #ifdef VENDOR_HITACHI 959 #undef VENDOR_HITACHI 960 #endif 961 #ifdef VENDOR_NEC 962 #undef VENDOR_NEC 963 #endif 964 #ifdef VENDOR_PIONEER 965 #undef VENDOR_PIONEER 966 #endif 967 #ifdef VENDOR_SONY 968 #undef VENDOR_SONY 969 #endif 970 #ifdef VENDOR_TOSHIBA 971 #undef VENDOR_TOSHIBA 972 #endif 973 #ifdef VENDOR_PANASONIC 974 #undef VENDOR_PANASONIC 975 #endif 976 #endif /* DEMO_ONLY */ 977 978 /* Demo mode support header */ 979 #include "libdi_d/os_demo.h" 980 981 /* Vendor-unique library headers */ 982 #include "libdi_d/vu_chin.h" /* Chinon vendor-unique header */ 983 #include "libdi_d/vu_hita.h" /* Hitachi vendor-unique header */ 984 #include "libdi_d/vu_nec.h" /* NEC vendor-unique header */ 985 #include "libdi_d/vu_pana.h" /* Panasonic vendor-unique header */ 986 #include "libdi_d/vu_pion.h" /* Pioneer vendor-unique header */ 987 #include "libdi_d/vu_sony.h" /* Sony vendor-unique header */ 988 #include "libdi_d/vu_tosh.h" /* Toshiba vendor-unique header */ 989 990 /* 991 * Functions for vendor-unique module use only 992 */ 993 extern bool_t scsipt_rezero_unit(di_dev_t *, int); 994 extern bool_t scsipt_tst_unit_rdy(di_dev_t *, int, req_sense_data_t *, 995 bool_t); 996 extern bool_t scsipt_request_sense(di_dev_t *, int, byte_t *, size_t); 997 extern bool_t scsipt_rdsubq(di_dev_t *, int, byte_t, byte_t, cdstat_t *, 998 char *, char *, bool_t); 999 extern bool_t scsipt_modesense(di_dev_t *, int, byte_t *, byte_t, 1000 byte_t, size_t); 1001 extern bool_t scsipt_modesel(di_dev_t *, int, byte_t *, byte_t, size_t); 1002 extern bool_t scsipt_inquiry(di_dev_t *, int, byte_t *, size_t); 1003 extern bool_t scsipt_rdtoc(di_dev_t *, int, byte_t *, size_t, int, int, 1004 bool_t, bool_t); 1005 extern bool_t scsipt_playmsf(di_dev_t *, int, msf_t *, msf_t *); 1006 extern bool_t scsipt_play10(di_dev_t *, int, sword32_t, sword32_t); 1007 extern bool_t scsipt_play12(di_dev_t *, int, sword32_t, sword32_t); 1008 extern bool_t scsipt_play_trkidx(di_dev_t *, int, int, int, int, int); 1009 extern bool_t scsipt_read_cdda(di_dev_t *, int, cdda_req_t *, size_t, int, 1010 req_sense_data_t *); 1011 extern bool_t scsipt_prev_allow(di_dev_t *, int, bool_t); 1012 extern bool_t scsipt_start_stop(di_dev_t *, int, bool_t, bool_t, bool_t); 1013 extern bool_t scsipt_pause_resume(di_dev_t *, int, bool_t); 1014 extern bool_t scsipt_move_medium(di_dev_t *, int, 1015 word16_t, word16_t, word16_t); 1016 extern bool_t scsipt_init_elemstat(di_dev_t *, int); 1017 extern bool_t scsipt_read_elemstat(di_dev_t *, int, byte_t *, size_t, int); 1018 extern bool_t scsipt_disc_present(di_dev_t *, int, curstat_t *, 1019 req_sense_data_t *); 1020 1021 #endif /* DI_SCSIPT CDDA_RD_SCSIPT */ 1022 1023 #ifdef DI_SCSIPT 1024 1025 /* 1026 * Vendor-unique module initialization jump table 1027 */ 1028 typedef struct { 1029 void (*init)(void); /* VU init function */ 1030 } vuinit_tbl_t; 1031 1032 1033 /* 1034 * Vendor-unique module entry jump table 1035 */ 1036 typedef struct { 1037 /* Vendor name string */ 1038 char *vendor; 1039 1040 /* Play audio function */ 1041 bool_t (*playaudio)(byte_t, sword32_t, sword32_t, 1042 msf_t *, msf_t *, byte_t, byte_t); 1043 1044 /* Pause/resume function */ 1045 bool_t (*pause_resume)(bool_t); 1046 1047 /* Start/stop function */ 1048 bool_t (*start_stop)(bool_t, bool_t); 1049 1050 /* Playback status function */ 1051 bool_t (*get_playstatus)(cdstat_t *); 1052 1053 /* Playback volume function */ 1054 int (*volume)(int, curstat_t *, bool_t); 1055 1056 /* Channel routing function */ 1057 bool_t (*route)(curstat_t *); 1058 1059 /* Playback mute function */ 1060 bool_t (*mute)(bool_t); 1061 1062 /* Read TOC function */ 1063 bool_t (*get_toc)(curstat_t *); 1064 1065 /* Eject function */ 1066 bool_t (*eject)(void); 1067 1068 /* Module start function */ 1069 void (*start)(void); 1070 1071 /* Module halt function */ 1072 void (*halt)(void); 1073 } vu_tbl_t; 1074 1075 1076 /* 1077 * Public functions 1078 */ 1079 extern char *scsipt_reqsense_keystr(int); 1080 extern void scsipt_enable(di_dev_t *, int); 1081 extern void scsipt_disable(di_dev_t *, int); 1082 extern bool_t scsipt_is_enabled(di_dev_t *, int); 1083 extern void scsipt_init(curstat_t *, di_tbl_t *); 1084 extern void scsipt_load_cdtext(curstat_t *, di_cdtext_t *); 1085 extern bool_t scsipt_playmode(curstat_t *); 1086 extern bool_t scsipt_check_disc(curstat_t *); 1087 extern void scsipt_status_upd(curstat_t *); 1088 extern void scsipt_lock(curstat_t *, bool_t); 1089 extern void scsipt_repeat(curstat_t *, bool_t); 1090 extern void scsipt_shuffle(curstat_t *, bool_t); 1091 extern void scsipt_load_eject(curstat_t *); 1092 extern void scsipt_ab(curstat_t *); 1093 extern void scsipt_sample(curstat_t *); 1094 extern void scsipt_level(curstat_t *, byte_t, bool_t); 1095 extern void scsipt_play_pause(curstat_t *); 1096 extern void scsipt_stop(curstat_t *, bool_t); 1097 extern void scsipt_chgdisc(curstat_t *); 1098 extern void scsipt_prevtrk(curstat_t *); 1099 extern void scsipt_nexttrk(curstat_t *); 1100 extern void scsipt_previdx(curstat_t *); 1101 extern void scsipt_nextidx(curstat_t *); 1102 extern void scsipt_rew(curstat_t *, bool_t); 1103 extern void scsipt_ff(curstat_t *, bool_t); 1104 extern void scsipt_warp(curstat_t *); 1105 extern void scsipt_route(curstat_t *); 1106 extern void scsipt_mute_on(curstat_t *); 1107 extern void scsipt_mute_off(curstat_t *); 1108 extern void scsipt_cddajitter(curstat_t *); 1109 extern void scsipt_debug(void); 1110 extern void scsipt_start(curstat_t *); 1111 extern void scsipt_icon(curstat_t *, bool_t); 1112 extern void scsipt_halt(curstat_t *); 1113 extern char *scsipt_methodstr(void); 1114 1115 #else 1116 1117 #define scsipt_init NULL 1118 1119 #endif /* DI_SCSIPT */ 1120 1121 #endif /* __SCSIPT_H__ */ 1122 1123