1 /* 2 ******************************************************************************************************************** 3 * usb host driver 4 * 5 * (c) Copyright 2007-2010, javen.China 6 * All Rights Reserved 7 * 8 * File Name : Scsi2.h 9 * 10 * Author : javen 11 * 12 * Version : 2.0 13 * 14 * Date : 2010.03.02 15 * 16 * Description : 17 * 18 * History : 19 * 20 ******************************************************************************************************************** 21 */ 22 #ifndef __SCSI2_H__ 23 #define __SCSI2_H__ 24 25 //---------------------------------------------------------------------------- 26 // scsi-2 27 //---------------------------------------------------------------------------- 28 29 // timeout values (milliseconds) 30 #define SCSI_MEDIA_POLL_INTERVAL 1250 /* 1.25s, 查询media change间隔时间 */ 31 #define SCSI_MEDIA_OP_TIMEOUT 40000 /* 10s, 读/写等介质操作超时时间 */ 32 #define SCSI_COMMAND_TIMEOUT 20000 /* 2s, 普通命令超时时间 */ 33 34 #define SCSI_CMD_RETRY 3 35 36 /* CDB size */ 37 #define SCSI_CDB_6 6 38 #define SCSI_CDB_10 10 39 #define SCSI_CDB_16 16 40 #define UFI_CDB 12 41 #define ATAPI_CDB 12 42 #define MAX_CDB SCSI_CDB_16 43 44 // SCSI-2 device types 45 #define SCSI_DEVICE_DIRECT_ACCESS 0x00 46 #define SCSI_DEVICE_SEQUENTIAL_ACCESS 0x01 47 #define SCSI_DEVICE_PRINTER 0x02 48 #define SCSI_DEVICE_PROCESSOR 0x03 49 #define SCSI_DEVICE_WRITE_ONCE 0x04 50 #define SCSI_DEVICE_CDROM 0x05 51 #define SCSI_DEVICE_SCANNER 0x06 52 #define SCSI_DEVICE_OPTICAL 0x07 53 #define SCSI_DEVICE_MEDIUM_CHANGER 0x08 54 #define SCSI_DEVICE_COMM 0x09 55 #define SCSI_DEVICE_UNKNOWN 0x1F 56 57 // SCSI-2 medium types 58 #define SCSI_MEDIUM_UNKNOWN 0xFF 59 60 // CD-ROM medium types 61 #define MEDIUM_CD_ROM_UNKNOWN 0x00 62 #define MEDIUM_CD_ROM_DATA_ONLY_120 0x01 63 #define MEDIUM_CD_DA_AUDIO_ONLY_120 0x02 64 #define MEDIUM_CD_ROM_DATA_AUDIO_COMBINED_120 0x03 65 #define MEDIUM_CD_PHOTO_CD_120 0x04 66 #define MEDIUM_CD_ROM_DATA_ONLY_80 0x05 67 #define MEDIUM_CD_DA_AUDIO_ONLY_80 0x06 68 #define MEDIUM_CD_ROM_DATA_AUDIO_COMBINED_80 0x07 69 #define MEDIUM_CD_PHOTO_CD_80 0x08 70 71 #define MEDIUM_CDR_ROM_UNKNOWN 0x10 72 #define MEDIUM_CDR_ROM_DATA_ONLY_120 0x11 73 #define MEDIUM_CDR_DA_AUDIO_ONLY_120 0x12 74 #define MEDIUM_CDR_ROM_DATA_AUDIO_COMBINED_120 0x13 75 #define MEDIUM_CDR_PHOTO_CD_120 0x14 76 #define MEDIUM_CDR_ROM_DATA_ONLY_80 0x15 77 #define MEDIUM_CDR_DA_AUDIO_ONLY_80 0x16 78 #define MEDIUM_CDR_ROM_DATA_AUDIO_COMBINED_80 0x17 79 #define MEDIUM_CDR_PHOTO_CD_80 0x18 80 81 #define MEDIUM_CDE_ROM_UNKNOWN 0x20 82 #define MEDIUM_CDE_ROM_DATA_ONLY_120 0x21 83 #define MEDIUM_CDE_DA_AUDIO_ONLY_120 0x22 84 #define MEDIUM_CDE_ROM_DATA_AUDIO_COMBINED_120 0x23 85 #define MEDIUM_CDE_PHOTO_CD_120 0x24 86 #define MEDIUM_CDE_ROM_DATA_ONLY_80 0x25 87 #define MEDIUM_CDE_DA_AUDIO_ONLY_80 0x26 88 #define MEDIUM_CDE_ROM_DATA_AUDIO_COMBINED_80 0x27 89 #define MEDIUM_CDE_PHOTO_CD_80 0x28 90 91 92 // mandatory SCSI-2 commands 93 #define SCSI_TEST_UNIT_READY 0x00 94 #define SCSI_REQUEST_SENSE 0x03 95 #define SCSI_INQUIRY 0x12 96 #define SCSI_SEND_DIAGNOSTIC 0x1D 97 98 // mandatory device-specific SCSI-2 commands 99 #define SCSI_READ6 0x08 100 #define SCSI_READ10 0x28 101 #define SCSI_READ16 0x88 102 #define SCSI_READ_CAPACITY 0x25 103 104 // optional device-specific SCSI-2 commands 105 #define SCSI_MODE_SELECT6 0x15 106 #define SCSI_MODE_SENSE6 0x1A 107 #define SCSI_START_STOP 0x1B 108 #define SCSI_WRITE6 0x0A 109 #define SCSI_WRITE10 0x2A 110 #define SCSI_WRITE16 0x8A 111 #define SCSI_SYNCHRONIZE_CACHE 0x35 112 #define SCSI_MODE_SELECT10 0x55 113 #define SCSI_MODE_SENSE10 0x5A 114 115 // ATAPI (CD-ROM) commands 116 #define SCSI_CD_PAUSE_RESUME 0x4B 117 #define SCSI_CD_PLAY_AUDIO10 0x45 118 #define SCSI_CD_PLAY_AUDIO_MSF 0x47 119 #define SCSI_CD_PLAY_CD 0xBC 120 #define SCSI_CD_READ_TOC 0x43 121 #define SCSI_CD_STOP_PLAY_SCAN 0x4E 122 #define SCSI_CD_SET_SPEED 0xBB 123 124 // ATAPI (DVD) commands 125 #define SCSI_DVD_GET_EVENT_STATUS_NOTIFICATION 0x4A 126 #define SCSI_DVD_LOAD_UNLOAD 0xA6 127 #define SCSI_DVD_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E 128 #define SCSI_DVD_READ_DISC_INFORMATION 0x51 129 #define SCSI_DVD_READ_TRACK_INFORMATION 0x52 130 131 // mode pages 132 #define MODE_PAGE_FLEXIBLE_DISK 0x05 133 #define MODE_PAGE_WCACHING_PAGE 0x08 134 #define MODE_PAGE_CDROM 0x0D 135 #define MODE_PAGE_CDROM_AUDIO 0x0E 136 #define MODE_PAGE_POWER_CONDITION 0x1A 137 #define MODE_PAGE_CDROM_CAPS 0x2A 138 #define MODE_PAGE_ALL_PAGES 0x3F 139 140 // SCSI-2 sense keys 141 #define SENSE_NONE 0x00 142 #define SENSE_RECOVERED_ERROR 0x01 143 #define SENSE_NOT_READY 0x02 144 #define SENSE_MEDIUM_ERROR 0x03 145 #define SENSE_HARDWARE_ERROR 0x04 146 #define SENSE_ILLEGAL_REQUEST 0x05 147 #define SENSE_UNIT_ATTENTION 0x06 148 #define SENSE_DATA_PROTECT 0x07 149 #define SENSE_BLANK_CHECK 0x08 150 151 // SCSI-2 ASC 152 #define ASC_LUN 0x04 153 #define ASC_INVALID_COMMAND_FIELD 0x24 154 #define ASC_MEDIA_CHANGED 0x28 155 #define ASC_RESET 0x29 156 #define ASC_COMMANDS_CLEARED 0x2F 157 #define ASC_MEDIUM_NOT_PRESENT 0x3A 158 159 160 161 //---------------------------------------------------------------------------- 162 // 命令执行的结果 163 //---------------------------------------------------------------------------- 164 #define USB_STATUS_SUCCESS 0 /* 命令执行成功 */ 165 166 /* 输入参数 */ 167 #define USB_STATUS_BAD_ARGUMENTS 1 /* 参数错误 */ 168 #define USB_STATUS_BUFFER_TOO_SMALL 2 /* 输入buffer太小 */ 169 170 /* 设备相关 */ 171 #define USB_STATUS_DEVICE_DISCONNECTED 30 /* 设备已经断开连接 */ 172 #define USB_STATUS_IO_TIMEOUT 31 /* IO操作超时 */ 173 #define USB_STATUS_IO_DEVICE_ERROR 32 /* 设备错误 */ 174 #define USB_STATUS_DEVICE_BUSY 33 /* 设备忙 */ 175 176 /* 命令相关 */ 177 #define USB_STATUS_INVALID_COMMAND 60 /* 不支持的命令 */ 178 #define USB_STATUS_INVALID_FIELD_IN_COMMAND 61 /* 命令中有不支持的字段 */ 179 #define USB_STATUS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 62 /* 超过最大逻辑块 */ 180 #define USB_STATUS_COMMAND_FAILED 63 /* 命令执行失败 */ 181 182 /* 命令结果相关 */ 183 #define USB_STATUS_UNIT_NOT_READY 91 /* 介质单元没有就绪 */ 184 #define USB_STATUS_MEDIA_NOT_PRESENT 92 /* 媒体介质不存在 */ 185 #define USB_STATUS_NOT_READY_TO_READY_TRANSITION 93 /* Media从没有准备就绪到就绪 */ 186 #define USB_STATUS_UNRECOGNIZED_MEDIA 94 /* 不支持的Media */ 187 #define USB_STATUS_MEDIA_CHANGE 95 /* Media发生变化 */ 188 #define USB_STATUS_UNKOWN_SENSE 96 /* 未知sense */ 189 190 #define USB_STATUS_UNKOWN_ERROR 255 /* 未知错误 */ 191 192 193 194 //---------------------------------------------------------------------------- 195 // Inquiry返回的数据 196 //---------------------------------------------------------------------------- 197 typedef struct __InquiryData 198 { 199 unsigned char Device_Type : 5; /* 设备类型 */ 200 unsigned char Qualifier : 3; /* 外围标识符 */ 201 202 unsigned char scsi_1 : 7; /* 命令集版本 */ 203 unsigned char Removable_Media : 1; /* 可移动位 */ 204 205 unsigned char ANSI_Version : 4; /* 设备支持的命令集版本 */ 206 unsigned char ECMA_Version : 2; /* 设备支持的ECMA-111版本 */ 207 unsigned char ISO_Version : 2; /* 设备支持的ISO IS-9316版本 */ 208 209 unsigned char Data_Format; /* 标准INQUIRY数据的响应格式 */ 210 unsigned char Additional_Length; /* 附加长度 */ 211 unsigned char res[3]; 212 213 unsigned char Vendor_Info[8]; /* 设备制造商 */ 214 unsigned char Product_Info[16]; /* 产品信息 */ 215 unsigned char Product_Revision[4]; /* 产品修订版 */ 216 } __attribute__((packed)) __InquiryData_t; 217 218 219 //---------------------------------------------------------------------------- 220 // request sense 返回的数据 221 //---------------------------------------------------------------------------- 222 typedef struct __SenseData 223 { 224 unsigned char ErrorCode: 7; 225 unsigned char Valid: 1; 226 unsigned char SegmentNumber; 227 unsigned char SenseKey: 4; 228 unsigned char Reserved: 1; 229 unsigned char IncorrectLength: 1; 230 unsigned char EndOfMedia: 1; 231 unsigned char FileMark: 1; 232 unsigned char Information[4]; 233 unsigned char AdditionalSenseLength; 234 unsigned char CommandSpecificInformation[4]; 235 unsigned char AdditionalSenseCode; 236 unsigned char AdditionalSenseCodeQualifier; 237 unsigned char FieldReplaceableUnitCode; 238 unsigned char SenseKeySpecific[3]; 239 } __attribute__((packed)) __SenseData_t; 240 241 //---------------------------------------------------------------------------- 242 // mode sense 返回的数据 243 //---------------------------------------------------------------------------- 244 #define SCSI_MODE_SENSE_MAX_DATA_LEN 192 245 246 typedef struct __BlockDevSpecPara 247 { 248 unsigned char res_1 : 4; 249 unsigned char DpoFua : 1; /* 是否支持禁止页输出和强迫单元存取 */ 250 unsigned char res_2 : 2; 251 unsigned char WP: 1; /* write protect */ 252 } __attribute__((packed)) __BlockDevSpecPara_t; 253 254 typedef struct __ModeSense6Header 255 { 256 unsigned char ModeDataLength; 257 unsigned char MediumType; 258 unsigned char DevSpecPara; 259 unsigned char BlockDescLength; 260 } __attribute__((packed)) __ModeSense6Header_t; 261 262 typedef struct __ModeSense10Header 263 { 264 unsigned short ModeDataLength; 265 unsigned char MediumType; 266 unsigned char DeviceSpecPara; 267 unsigned char res[2]; 268 unsigned short BlockDescLength; 269 } __attribute__((packed)) __ModeSense10Header_t; 270 271 //---------------------------------------------------------------------------- 272 // CD_Rom 273 //---------------------------------------------------------------------------- 274 275 /* Play audio starting at MSF and ending at MSF */ 276 typedef struct _CDROM_PlayAudioMsf 277 { 278 unsigned char StartingM; 279 unsigned char StartingS; 280 unsigned char StartingF; 281 unsigned char EndingM; 282 unsigned char EndingS; 283 unsigned char EndingF; 284 } CDROM_PlayAudioMsf_t; 285 286 /* 287 * 288 * C/DVD Read TOC 289 * 290 */ 291 292 /* Format code definitions for readtoc command */ 293 #define CDROM_READTOC_FORMAT_CODE_TOC 0x00 294 #define CDROM_READTOC_FORMAT_CODE_Session 0x01 295 #define CDROM_READTOC_FORMAT_CODE_FULL_TOC 0x02 296 #define CDROM_READTOC_FORMAT_CODE_PMA 0x03 297 #define CDROM_READTOC_FORMAT_CODE_ATIP 0x04 298 #define CDROM_READTOC_FORMAT_CODE_CD_TEXT 0x05 299 300 /* Maximum CD Rom size */ 301 #define MAXIMUM_NUMBER_TRACKS 100 302 #define MAXIMUM_CDROM_SIZE 804 303 304 #define MAXIMUM_NUMBER_TRACKS_LARGE 0xAA 305 306 /* toc header */ 307 typedef struct _CDROM_TocHeader 308 { 309 unsigned short TocDataLength; 310 unsigned char FirstTrack; 311 unsigned char LastTrack; 312 } __attribute__((packed)) CDROM_TocHeader_t; 313 314 /* data track */ 315 typedef struct _CDROM_TrackData 316 { 317 unsigned char Reserved1; 318 unsigned char Control : 4; 319 unsigned char Adr : 4; 320 unsigned char TrackNumber; 321 unsigned char Reserved2; 322 323 unsigned int Address; 324 } __attribute__((packed)) CDROM_TrackData_t; 325 326 /* MSF address Format. see SFF-8020i page78 Table27 */ 327 typedef struct _CDROM_MSF_ADDR 328 { 329 unsigned char Reserved1; 330 unsigned char Minute; 331 unsigned char Second; 332 unsigned char Frame; 333 } __attribute__((packed)) CDROM_MSF_ADDR_t; 334 335 /* MSF track */ 336 typedef struct _CDROM_TrackMSF 337 { 338 unsigned char Reserved1; 339 unsigned char Control : 4; 340 unsigned char Adr : 4; 341 unsigned char TrackNumber; 342 unsigned char Reserved2; 343 344 CDROM_MSF_ADDR_t MSF; 345 } __attribute__((packed)) CDROM_TrackMSF_t; 346 347 /* 348 * 349 * C/DVD mode sense 350 * 351 */ 352 /* PageCode 1Ah. c/dvd power condition mode page format */ 353 typedef struct _CDROM_PowerConditionPage 354 { 355 unsigned char PageCode : 6; 356 unsigned char reserved1 : 1; 357 unsigned char PS : 1; 358 359 unsigned char PageLength; 360 361 unsigned char Standby : 1; 362 unsigned char Idle : 1; 363 unsigned char reserved2 : 6; 364 365 unsigned int IdleTimer; 366 unsigned int StandbyTimer; 367 } __attribute__((packed)) CDROM_PowerConditionPage_t; 368 369 /* PageCode 0Eh. cd audio control mode page format */ 370 typedef struct _CDROM_ParameterPage 371 { 372 unsigned char PageCode : 6; 373 unsigned char reserved1 : 1; 374 unsigned char PS : 1; 375 376 unsigned char PageLength; 377 378 unsigned char reserved2; 379 unsigned char InactivityTimeMultiplier : 4; 380 unsigned char reserved3 : 4; 381 unsigned short NumberOfMSF_SUnitPerMUnit; 382 unsigned short NumberOfMSF_FUnitPerSUnit; 383 } __attribute__((packed)) CDROM_ParameterPage_t; 384 385 /* PageCode 0Eh. cd audio control mode page format */ 386 typedef struct _CDROM_AudioControlPage 387 { 388 unsigned char PageCode : 6; 389 unsigned char reserved1 : 1; 390 unsigned char PS : 1; 391 392 unsigned char PageLength; 393 394 unsigned char reserved2 : 1; 395 unsigned char SOTC : 1; 396 unsigned char Immed : 1; 397 unsigned char reserved3 : 5; 398 399 unsigned char reserved4[3]; 400 unsigned char Obsolete; 401 402 unsigned char Port0Selection : 4; 403 unsigned char reserved5 : 4; 404 unsigned char Port0Volume; 405 406 unsigned char Port1Selection : 4; 407 unsigned char reserved6 : 4; 408 unsigned char Port1Volume; 409 410 unsigned char Port2Selection : 4; 411 unsigned char reserved7 : 4; 412 unsigned char Port2Volume; 413 414 unsigned char Port3Selection : 4; 415 unsigned char reserved8 : 4; 416 unsigned char Port3Volume; 417 } __attribute__((packed)) CDROM_AudioControlPage_t; 418 419 /* PageCode 2Ah. c/dvd capabilities and mechanical status page. see SFF-8020i & SFF-8090 */ 420 typedef struct _CDROM_Capitilities 421 { 422 unsigned char PageCode : 6; 423 unsigned char reserved1 : 1; 424 unsigned char PS : 1; 425 426 unsigned char PageLength; 427 428 /* Byte2. see SFF-8090 */ 429 unsigned char CD_R_Rd : 1; 430 unsigned char CD_E_Rd : 1; 431 unsigned char Method2 : 1; 432 unsigned char DVD_ROM_Read : 1; 433 unsigned char DVD_R_Read : 1; 434 unsigned char DVD_RAM_Read : 1; 435 unsigned char reserved2 : 2; 436 437 /* Byte3. see SFF-8090 */ 438 unsigned char CD_R_Wr : 1; 439 unsigned char CD_E_Wr : 1; 440 unsigned char TestWrite : 1; 441 unsigned char reserved3 : 1; 442 unsigned char DVD_R_Write : 1; 443 unsigned char DVD_RAM_Wr : 1; 444 unsigned char reserved4 : 2; 445 446 /* Byte4 */ 447 unsigned char AudioPlay : 1; 448 unsigned char Composite : 1; 449 unsigned char DigitalPort1 : 1; 450 unsigned char DigitalPort2 : 1; 451 unsigned char Mode2_Form1 : 1; 452 unsigned char Mode2_Form2 : 1; 453 unsigned char MultiSession : 1; 454 unsigned char reserved5 : 1; 455 456 /* Byte5 */ 457 unsigned char CD_DA : 1; 458 unsigned char DAAccu : 1; 459 unsigned char RW_supported : 1; 460 unsigned char RW_De_Interleaved : 1; 461 unsigned char C2_Pointers : 1; 462 unsigned char ISRC : 1; 463 unsigned char UPC : 1; 464 unsigned char ReadBarCodeCapable : 1; 465 466 /* Byte6 */ 467 unsigned char Lock : 1; 468 unsigned char LockState : 1; 469 unsigned char PreventJumper : 1; 470 unsigned char Eject : 1; 471 unsigned char reserved6 : 1; 472 unsigned char LoadingMechanismType : 3; 473 474 /* Byte7 */ 475 unsigned char SeparateVolume : 1; 476 unsigned char SeparateChannelMute : 1; 477 unsigned char SupportsDiscPresent : 1; 478 unsigned char SW_SlotSelection : 1; 479 unsigned char SideChangeCapable : 1; 480 unsigned char reserved7 : 3; 481 482 unsigned short MaximumSpeedSupport; /* Byte8-9. see SFF-8020i */ 483 unsigned short NumberOfVolumelevelsSupported; /* Byte10-11 */ 484 unsigned short BufferSizeSupportedByLogicUnit; /* Byte12-13 */ 485 unsigned short CurrentSpeedSelected; /* Byte14-15 see SFF-8020i */ 486 487 unsigned char ObsoleteReserved3; /* Byte16 */ 488 489 /* Byte17 */ 490 unsigned char reserved8 : 1; 491 unsigned char BCK : 1; 492 unsigned char RCK : 1; 493 unsigned char LSBF : 1; 494 unsigned char Length : 2; 495 unsigned char reserved9 : 2; 496 497 unsigned short ObsoleteReserved4; /* Byte18-19 */ 498 unsigned short CopyManagementRevisionsupport; /* Byte20-21 */ 499 unsigned char reserved10; 500 unsigned char reserved11; 501 } __attribute__((packed)) CDROM_Capitilities_t; 502 503 /* 504 * 505 * C/DVD envent status 506 * 507 */ 508 #define CDROM_GET_EVENT_CMD_MAX_RETURN_DATA_LEN 0xff /* 通常都是8个byte */ 509 510 /* Notification class request */ 511 #define CDROM_NOTIFICATION_CLASS_REQUEST_POWER_MANAGEMENT 0x04 512 #define CDROM_NOTIFICATION_CLASS_REQUEST_MEDIA_STATUS 0x10 513 #define CDROM_NOTIFICATION_CLASS_REQUEST_DEVICE_BUSY 0x40 514 515 /* Notification class field */ 516 #define CDROM_NOTIFICATION_CLASS_FIELD_POWER_MANAGEMENT 0x02 517 #define CDROM_NOTIFICATION_CLASS_FIELD_MEDIA_STATUS 0x04 518 #define CDROM_NOTIFICATION_CLASS_FIELD_DEVICE_BUSY 0x06 519 520 /* Event Status Header */ 521 typedef struct _CDROM_EventHeader 522 { 523 unsigned short EventDataLength; 524 525 unsigned char NotificationClass : 3; 526 unsigned char reserved1 : 4; 527 unsigned char NEA : 1; 528 529 unsigned char SupportEventClass; 530 } __attribute__((packed)) CDROM_EventHeader_t; 531 532 /* Power Management Status Class Returned Data */ 533 #define CDROM_POWER_EVENT_NOCHG 0x00 534 #define CDROM_POWER_EVENT_PWRCHG_SUCC 0x01 535 #define CDROM_POWER_EVENT_PWRCHG_FAIL 0x02 536 537 #define CDROM_POWER_STATUS_ACTIVE 0x01 538 #define CDROM_POWER_STATUS_IDLE 0x02 539 #define CDROM_POWER_STATUS_STANDBY 0x03 540 541 typedef struct _CDROM_PowerStatus 542 { 543 unsigned char PowerEvent : 4; 544 unsigned char reserved1 : 4; 545 546 unsigned char PowerStatus; 547 unsigned char reserved2; 548 unsigned char reserved3; 549 } __attribute__((packed)) CDROM_PowerStatus_t; 550 551 /* Media Status Class Returned Data */ 552 #define CDROM_MEDIA_STATUS_EJECT_REQUEST 0x01 553 #define CDROM_MEDIA_STATUS_NEW_MEDIA 0x02 554 #define CDROM_MEDIA_STATUS_MEDIA_REMOVAL 0x03 555 556 typedef struct _CDROM_MediaStatus 557 { 558 unsigned char MediaStatus : 4; 559 unsigned char reserved1 : 4; 560 561 unsigned char DoorOpen : 1; 562 unsigned char MediaPesent : 1; 563 unsigned char reserved : 6; 564 565 unsigned char StartSlot; 566 unsigned char EndSlot; 567 } __attribute__((packed)) CDROM_MediaStatus_t; 568 569 /* Device Busy Status Class Returned Data */ 570 #define CDROM_DEVICE_BUSY_EVENT_TIMEOUT_OCCURED 0x03 571 572 #define CDROM_DEVICE_BUSY_STATUS_NOEVENT 0x00 573 #define CDROM_DEVICE_BUSY_STATUS_POWER 0x01 574 #define CDROM_DEVICE_BUSY_STATUS_IMMEDIATE 0x02 575 #define CDROM_DEVICE_BUSY_STATUS_DEFERED 0x03 576 577 typedef struct _CDROM_DeviceBusyStatus 578 { 579 unsigned char DeviceBusyEvent : 4; 580 unsigned char reserved1 : 4; 581 582 unsigned char DeviceBusyStatus; 583 unsigned short Time; 584 } __attribute__((packed)) CDROM_DeviceBusyStatus_t; 585 586 /* 587 * 588 * C/DVD Get Configuration 589 * 590 */ 591 #define CDROM_FEATURE_LIST_PROFILE_LIST 0x00 592 #define CDROM_FEATURE_LIST_CORE 0x01 593 #define CDROM_FEATURE_LIST_MORPHING 0x02 594 #define CDROM_FEATURE_LIST_REMOVABLE_MEDIUM 0x03 595 #define CDROM_FEATURE_LIST_WRITE_PROTECT 0x04 596 #define CDROM_FEATURE_LIST_RANDOM_READABLE 0x10 597 #define CDROM_FEATURE_LIST_MULTIREAD 0x1D 598 #define CDROM_FEATURE_LIST_CD_READ 0x1E 599 #define CDROM_FEATURE_LIST_DVD_READ 0x1F 600 #define CDROM_FEATURE_LIST_RANDOM_WRITABLE 0x20 601 #define CDROM_FEATURE_LIST_INCREMENTAL_STREAMING_WRITABLE 0x21 602 #define CDROM_FEATURE_LIST_FORMATTABLE 0x23 603 #define CDROM_FEATURE_LIST_HARDWARE_DEFECT_MANAGEMENT 0x24 604 #define CDROM_FEATURE_LIST_WRITE_ONCE 0x25 605 #define CDROM_FEATURE_LIST_RESTRICTED_OVERWRITE 0x26 606 #define CDROM_FEATURE_LIST_CD_RW_CAV_WRITE 0x27 607 #define CDROM_FEATURE_LIST_MRW 0x28 608 #define CDROM_FEATURE_LIST_ENHABCED_DEFECT_REPORTING 0x29 609 #define CDROM_FEATURE_LIST_DVD_RW 0x2A 610 #define CDROM_FEATURE_LIST_DVD_R 0x2B 611 #define CDROM_FEATURE_LIST_RIGID_RESTRICTED_OVERWRITE 0x2C 612 #define CDROM_FEATURE_LIST_CD_TRACK_AT_ONCE 0x2D 613 #define CDROM_FEATURE_LIST_CD_MASTERING 0x2E 614 #define CDROM_FEATURE_LIST_DVD_R_RW_WRITE 0x2F 615 #define CDROM_FEATURE_LIST_LAYER_JUMP_RECORDING 0x33 616 #define CDROM_FEATURE_LIST_LJ_RIGID_RESTRICTED_OVERWRITE 0x34 617 #define CDROM_FEATURE_LIST_STOP_LONG_OPERATION 0x35 618 #define CDROM_FEATURE_LIST_CD_RW_MEDIA_WRITE_SUPPORT 0x37 619 #define CDROM_FEATURE_LIST_BD_R_PSEUDO_OVERWRITE_FEATURE 0x38 620 #define CDROM_FEATURE_LIST_DVD_RW_DUAL_LAYER 0x3A 621 #define CDROM_FEATURE_LIST_DVD_R_DUAL_LAYER 0x3B 622 #define CDROM_FEATURE_LIST_BD_READ 0x40 623 #define CDROM_FEATURE_LIST_BD_WRITE 0x41 624 #define CDROM_FEATURE_LIST_TSR 0x42 625 #define CDROM_FEATURE_LIST_HD_DVD_READ 0x50 626 #define CDROM_FEATURE_LIST_HD_DVD_WRITE 0x51 627 #define CDROM_FEATURE_LIST_HD_DVD_RW_FRAGMENT_RECORDING 0x52 628 #define CDROM_FEATURE_LIST_HYBRID_DISC 0x80 629 #define CDROM_FEATURE_LIST_POWER_MANAGEMENT 0x100 630 #define CDROM_FEATURE_LIST_SMART 0x101 631 #define CDROM_FEATURE_LIST_EMBEDDED_CHANGER 0x102 632 #define CDROM_FEATURE_LIST_CD_AUDIO_ANALOG_PLAY 0x103 633 #define CDROM_FEATURE_LIST_MICROCODE_UPGRADE 0x104 634 #define CDROM_FEATURE_LIST_TIMEOUT 0x105 635 #define CDROM_FEATURE_LIST_DVD_CSS 0x106 636 #define CDROM_FEATURE_LIST_REAL_TIME_STREAMING 0x107 637 #define CDROM_FEATURE_LIST_LOGICAL_UNIT_SERIAL_NUMBER 0x108 638 #define CDROM_FEATURE_LIST_MEDIA_SERIAL_NUMBER 0x109 639 #define CDROM_FEATURE_LIST_DISC_CONTROL_BLOCKS 0x10A 640 #define CDROM_FEATURE_LIST_DVD_CPRM 0x10B 641 #define CDROM_FEATURE_LIST_FIRMWARE_INFORMATION 0x10C 642 #define CDROM_FEATURE_LIST_AACS 0x10D 643 #define CDROM_FEATURE_LIST_DVD_CSS_MANAGED_RECORDING 0x10E 644 #define CDROM_FEATURE_LIST_VCPS 0x110 645 #define CDROM_FEATURE_LIST_SECUR_DISC 0x113 646 647 /* 648 * 649 * C/DVD Read Disc Information 650 * 651 */ 652 653 /* Data Type Field definition */ 654 #define CDROM_DISC_INFO_STANDARD 0x00 655 #define CDROM_DISC_INFO_TRACK_RESOURCES 0x00 656 #define CDROM_DISC_INFO_POW_RESOURCES 0x00 657 658 /* C/DVD Disc Information Block Data */ 659 typedef struct _CDROM_DiscInfo 660 { 661 unsigned short DataInformationLength; 662 663 unsigned char DiscStatus : 2; 664 unsigned char StatusOfLastSession : 2; 665 unsigned char Erasable : 1; 666 unsigned char DiscInformationDataType : 3; 667 668 unsigned char FirstTrackNumberOnDisc; 669 unsigned char NumberOfSessions_LSB; 670 unsigned char FirstTrackNumberInLastSession_LSB; 671 unsigned char LastTrackNumberInLastSession_LSB; 672 673 unsigned char BG_FormatStatus : 2; 674 unsigned char Dbit : 1; 675 unsigned char reserved1 : 1; 676 unsigned char DAC_V : 1; 677 unsigned char URU : 1; 678 unsigned char DBC_V : 1; 679 unsigned char DID_V : 1; 680 681 unsigned char DiscType; 682 unsigned char NumberOfSessions_MSB; 683 unsigned char FirstTrackNumberInLastSession_MSB; 684 unsigned char LastTrackNumberInLastSession_MSB; 685 686 unsigned int DiscIdentification; 687 unsigned int LeadInStartTimeOfLastSession_MSF; 688 unsigned int LastPossibleStartTimeForStartOfLeadOut_MSF; 689 unsigned char DiscBarCode[8]; 690 unsigned char DiscApplicationCode; 691 unsigned char NumberOfOPCTableEntries; 692 693 /* OPCTableEntries */ 694 } __attribute__((packed)) CDROM_DiscInfo_t; 695 696 /* Status of last session field definition */ 697 #define CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_EMPTY 0x00 698 #define CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_IMCOMPLETE 0x01 699 #define CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_DAMAGED_BOARDER 0x02 700 #define CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_COMPLETE 0x03 701 702 /* Disc status field definition */ 703 #define CDROM_DISC_INFO_DISC_STATUS_EMPTY 0x00 704 #define CDROM_DISC_INFO_DISC_STATUS_IMCOMPLETE 0x01 705 #define CDROM_DISC_INFO_DISC_STATUS_COMPLETE 0x02 706 #define CDROM_DISC_INFO_DISC_STATUS_FINALIZATION 0x03 707 708 /* BG foramt status field definition */ 709 #define CDROM_DISC_INFO_BG_FORMAT_STATUS_EMPTY 0x00 710 #define CDROM_DISC_INFO_BG_FORMAT_STATUS_NOT_RUNNING 0x01 711 #define CDROM_DISC_INFO_BG_FORMAT_STATUS_RUNNING 0x02 712 #define CDROM_DISC_INFO_BG_FORMAT_STATUS_COMPLETE 0x03 713 714 /* Disk type field definition */ 715 #define CDROM_DISC_INFO_DISC_TYPE_CDDA_CDROM 0x00 716 #define CDROM_DISC_INFO_DISC_TYPE_CDI 0x10 717 #define CDROM_DISC_INFO_DISC_TYPE_CD_XA 0x20 718 719 720 /* 721 * 722 * C/DVD Read Track Information 723 * 724 */ 725 #define CDROM_TRACK_INFO_ADDRESS_NUMBER_TYPE_LBA 0x00 726 #define CDROM_TRACK_INFO_ADDRESS_NUMBER_TYPE_TRACK_NUMBER 0x01 727 #define CDROM_TRACK_INFO_ADDRESS_NUMBER_TYPE_BORDER_NUMBER 0x02 728 729 typedef struct _CDROM_TrackInfo 730 { 731 unsigned short TrackInformationlength; 732 unsigned char TrackNumber_LSB; 733 unsigned char SessionNumber_LSB; 734 unsigned char reserved1; 735 736 unsigned char TrackMode : 4; 737 unsigned char Copy : 1; 738 unsigned char Damage : 1; 739 unsigned char LJRS : 2; 740 741 unsigned char DataMode : 4; 742 unsigned char FP : 1; 743 unsigned char Packet : 1; 744 unsigned char Blank : 1; 745 unsigned char RT : 1; 746 747 unsigned char NWA_V : 1; /* next write address valid */ 748 unsigned char LRA_V : 1; /* last recorded address valid */ 749 unsigned char reserved2 : 6; 750 751 unsigned int TrackStartAddress; 752 unsigned int NextWritableAddress; 753 unsigned int FreeBlocks; 754 unsigned int FixedPacketSize; 755 unsigned int TrackSizeEndAddress; 756 unsigned int LastRecordedAddress; 757 unsigned char TrackNumber_MSB; 758 unsigned char SessionNumber_MSB; 759 unsigned char reserved3; 760 unsigned int ReadCompatibilityLBA; 761 unsigned int NextLayerJumpAddress; 762 unsigned int LastLayerJumpAddress; 763 } __attribute__((packed)) CDROM_TrackInfo_t; 764 765 766 767 768 769 770 771 772 773 //---------------------------------------------------------------------------- 774 // 775 //---------------------------------------------------------------------------- 776 int ScsiInquery(__mscLun_t *mscLun, void *buffer, unsigned int buffer_len); 777 int ScsiReadCapacity(__mscLun_t *mscLun); 778 int ScsiModeSense6(__mscLun_t *mscLun, 779 unsigned int PageCode, 780 unsigned int DBD, 781 void *buffer, 782 unsigned int buffer_len, 783 unsigned int *ActLen); 784 int ScsiModeSense10(__mscLun_t *mscLun, 785 unsigned int PageCode, 786 unsigned int DBD, 787 void *buffer, 788 unsigned int buffer_len, 789 unsigned int *ActLen); 790 int ScsiTestUnitReady(__mscLun_t *mscLun); 791 int ScsiRequestSense(__mscLun_t *mscLun, void *buffer, unsigned int buffer_len); 792 static int ScsiGetSenseData(__mscLun_t *mscLun); 793 int ScsiStartStopUnit(__mscLun_t *mscLun, unsigned int LoEj, unsigned int Start); 794 int ScsiSynchronizeCache(__mscLun_t *mscLun); 795 int ScsiRead(__mscLun_t *mscLun, 796 unsigned int Version, 797 unsigned int StartSector, 798 unsigned int NumSectors, 799 void *buffer, 800 unsigned int buffer_len); 801 int ScsiWrite(__mscLun_t *mscLun, 802 unsigned int Version, 803 unsigned int StartSector, 804 unsigned int NumSectors, 805 void *buffer, 806 unsigned int buffer_len); 807 int ScsiPreventAllowMedium(__mscLun_t *mscLun, unsigned int Persistent, unsigned int Prevent); 808 809 /* C/DVD */ 810 int ScsiCDPauseResume(__mscLun_t *mscLun, unsigned int Resume); 811 int ScsiCDPlayAudio10(__mscLun_t *mscLun, unsigned int Lba, unsigned int Lenght); 812 int ScsiCDPlayAudioMSF(__mscLun_t *mscLun, CDROM_PlayAudioMsf_t *msf); 813 int ScsiCDReadToc(__mscLun_t *mscLun, 814 unsigned int MSF, 815 unsigned int Format, 816 unsigned int StartingNumber, 817 void *Buffer, 818 unsigned int BufferLen); 819 int ScsiCDStopPlayScan(__mscLun_t *mscLun); 820 int ScsiCDReadDiscInfo(__mscLun_t *mscLun, 821 unsigned int DataType, 822 void *Buffer, 823 unsigned int BufferLen, 824 unsigned int *ActLen); 825 int ScsiCDReadTrackInfo(__mscLun_t *mscLun, 826 unsigned int Open, 827 unsigned int Address_or_Number, 828 unsigned int LogicalBlockAddress, 829 void *Buffer, 830 unsigned int BufferLen, 831 unsigned int *ActLen); 832 int ScsiDvdGetEventStatus(__mscLun_t *mscLun, 833 unsigned int Immed, 834 unsigned int ClassRequest, 835 void *Buffer, 836 unsigned int BufferLen); 837 int ScsiDvdLoad(__mscLun_t *mscLun, 838 unsigned int Immed, 839 unsigned int Start, 840 unsigned int LoUnlo, 841 unsigned int Slot); 842 int ScsiCDSetSpeed(__mscLun_t *mscLun, unsigned int ReadSpeed, unsigned int WriteSpeed); 843 int ScsiDVDGetConfiguration(__mscLun_t *mscLun, 844 unsigned int RT, 845 unsigned int StartingFeatureNumber, 846 void *Buffer, 847 unsigned int BufferLen); 848 849 850 #endif //__SCSI2_H__ 851 852 853 854 855 856