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