summaryrefslogtreecommitdiff
path: root/bsp/allwinner/libraries/sunxi-hal/hal/source/usb/storage/include/Scsi2.h
blob: 0731cf1acbe652404953fb29b8319950e169932f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
/*
********************************************************************************************************************
*                                              usb host driver
*
*                              (c) Copyright 2007-2010, javen.China
*                                       All Rights Reserved
*
* File Name     : Scsi2.h
*
* Author        : javen
*
* Version       : 2.0
*
* Date          : 2010.03.02
*
* Description   :
*
* History       :
*
********************************************************************************************************************
*/
#ifndef  __SCSI2_H__
#define  __SCSI2_H__

//----------------------------------------------------------------------------
// scsi-2
//----------------------------------------------------------------------------

// timeout values (milliseconds)
#define  SCSI_MEDIA_POLL_INTERVAL    1250   /* 1.25s, 查询media change间隔时间  */
#define  SCSI_MEDIA_OP_TIMEOUT       40000  /* 10s, 读/写等介质操作超时时间     */
#define  SCSI_COMMAND_TIMEOUT        20000   /* 2s, 普通命令超时时间             */

#define  SCSI_CMD_RETRY              3

/* CDB size */
#define SCSI_CDB_6                  6
#define SCSI_CDB_10                 10
#define SCSI_CDB_16                 16
#define UFI_CDB                     12
#define ATAPI_CDB                   12
#define MAX_CDB                     SCSI_CDB_16

// SCSI-2 device types
#define SCSI_DEVICE_DIRECT_ACCESS     0x00
#define SCSI_DEVICE_SEQUENTIAL_ACCESS 0x01
#define SCSI_DEVICE_PRINTER           0x02
#define SCSI_DEVICE_PROCESSOR         0x03
#define SCSI_DEVICE_WRITE_ONCE        0x04
#define SCSI_DEVICE_CDROM             0x05
#define SCSI_DEVICE_SCANNER           0x06
#define SCSI_DEVICE_OPTICAL           0x07
#define SCSI_DEVICE_MEDIUM_CHANGER    0x08
#define SCSI_DEVICE_COMM              0x09
#define SCSI_DEVICE_UNKNOWN           0x1F

// SCSI-2 medium types
#define SCSI_MEDIUM_UNKNOWN           0xFF

// CD-ROM medium types
#define MEDIUM_CD_ROM_UNKNOWN                       0x00
#define MEDIUM_CD_ROM_DATA_ONLY_120                 0x01
#define MEDIUM_CD_DA_AUDIO_ONLY_120                 0x02
#define MEDIUM_CD_ROM_DATA_AUDIO_COMBINED_120       0x03
#define MEDIUM_CD_PHOTO_CD_120                      0x04
#define MEDIUM_CD_ROM_DATA_ONLY_80                  0x05
#define MEDIUM_CD_DA_AUDIO_ONLY_80                  0x06
#define MEDIUM_CD_ROM_DATA_AUDIO_COMBINED_80        0x07
#define MEDIUM_CD_PHOTO_CD_80                       0x08

#define MEDIUM_CDR_ROM_UNKNOWN                      0x10
#define MEDIUM_CDR_ROM_DATA_ONLY_120                0x11
#define MEDIUM_CDR_DA_AUDIO_ONLY_120                0x12
#define MEDIUM_CDR_ROM_DATA_AUDIO_COMBINED_120      0x13
#define MEDIUM_CDR_PHOTO_CD_120                     0x14
#define MEDIUM_CDR_ROM_DATA_ONLY_80                 0x15
#define MEDIUM_CDR_DA_AUDIO_ONLY_80                 0x16
#define MEDIUM_CDR_ROM_DATA_AUDIO_COMBINED_80       0x17
#define MEDIUM_CDR_PHOTO_CD_80                      0x18

#define MEDIUM_CDE_ROM_UNKNOWN                      0x20
#define MEDIUM_CDE_ROM_DATA_ONLY_120                0x21
#define MEDIUM_CDE_DA_AUDIO_ONLY_120                0x22
#define MEDIUM_CDE_ROM_DATA_AUDIO_COMBINED_120      0x23
#define MEDIUM_CDE_PHOTO_CD_120                     0x24
#define MEDIUM_CDE_ROM_DATA_ONLY_80                 0x25
#define MEDIUM_CDE_DA_AUDIO_ONLY_80                 0x26
#define MEDIUM_CDE_ROM_DATA_AUDIO_COMBINED_80       0x27
#define MEDIUM_CDE_PHOTO_CD_80                      0x28


// mandatory SCSI-2 commands
#define SCSI_TEST_UNIT_READY      0x00
#define SCSI_REQUEST_SENSE        0x03
#define SCSI_INQUIRY              0x12
#define SCSI_SEND_DIAGNOSTIC      0x1D

// mandatory device-specific SCSI-2 commands
#define SCSI_READ6                0x08
#define SCSI_READ10               0x28
#define SCSI_READ16               0x88
#define SCSI_READ_CAPACITY        0x25

// optional device-specific SCSI-2 commands
#define SCSI_MODE_SELECT6         0x15
#define SCSI_MODE_SENSE6          0x1A
#define SCSI_START_STOP           0x1B
#define SCSI_WRITE6               0x0A
#define SCSI_WRITE10              0x2A
#define SCSI_WRITE16              0x8A
#define SCSI_SYNCHRONIZE_CACHE    0x35
#define SCSI_MODE_SELECT10        0x55
#define SCSI_MODE_SENSE10         0x5A

// ATAPI (CD-ROM) commands
#define SCSI_CD_PAUSE_RESUME                    0x4B
#define SCSI_CD_PLAY_AUDIO10                    0x45
#define SCSI_CD_PLAY_AUDIO_MSF                  0x47
#define SCSI_CD_PLAY_CD                         0xBC
#define SCSI_CD_READ_TOC                        0x43
#define SCSI_CD_STOP_PLAY_SCAN                  0x4E
#define SCSI_CD_SET_SPEED                       0xBB

// ATAPI (DVD) commands
#define SCSI_DVD_GET_EVENT_STATUS_NOTIFICATION  0x4A
#define SCSI_DVD_LOAD_UNLOAD                    0xA6
#define SCSI_DVD_PREVENT_ALLOW_MEDIUM_REMOVAL   0x1E
#define SCSI_DVD_READ_DISC_INFORMATION          0x51
#define SCSI_DVD_READ_TRACK_INFORMATION         0x52

// mode pages
#define MODE_PAGE_FLEXIBLE_DISK     0x05
#define MODE_PAGE_WCACHING_PAGE     0x08
#define MODE_PAGE_CDROM             0x0D
#define MODE_PAGE_CDROM_AUDIO       0x0E
#define MODE_PAGE_POWER_CONDITION   0x1A
#define MODE_PAGE_CDROM_CAPS        0x2A
#define MODE_PAGE_ALL_PAGES         0x3F

// SCSI-2 sense keys
#define SENSE_NONE                0x00
#define SENSE_RECOVERED_ERROR     0x01
#define SENSE_NOT_READY           0x02
#define SENSE_MEDIUM_ERROR        0x03
#define SENSE_HARDWARE_ERROR      0x04
#define SENSE_ILLEGAL_REQUEST     0x05
#define SENSE_UNIT_ATTENTION      0x06
#define SENSE_DATA_PROTECT        0x07
#define SENSE_BLANK_CHECK         0x08

// SCSI-2 ASC
#define ASC_LUN                   0x04
#define ASC_INVALID_COMMAND_FIELD 0x24
#define ASC_MEDIA_CHANGED         0x28
#define ASC_RESET                 0x29
#define ASC_COMMANDS_CLEARED      0x2F
#define ASC_MEDIUM_NOT_PRESENT    0x3A



//----------------------------------------------------------------------------
// 命令执行的结果
//----------------------------------------------------------------------------
#define  USB_STATUS_SUCCESS                                 0   /* 命令执行成功                 */

/* 输入参数 */
#define  USB_STATUS_BAD_ARGUMENTS                           1   /* 参数错误                     */
#define  USB_STATUS_BUFFER_TOO_SMALL                        2   /* 输入buffer太小               */

/* 设备相关 */
#define  USB_STATUS_DEVICE_DISCONNECTED                     30  /* 设备已经断开连接             */
#define  USB_STATUS_IO_TIMEOUT                              31  /* IO操作超时                   */
#define  USB_STATUS_IO_DEVICE_ERROR                         32  /* 设备错误                     */
#define  USB_STATUS_DEVICE_BUSY                             33  /* 设备忙                       */

/* 命令相关 */
#define  USB_STATUS_INVALID_COMMAND                         60  /* 不支持的命令                 */
#define  USB_STATUS_INVALID_FIELD_IN_COMMAND                61  /* 命令中有不支持的字段         */
#define  USB_STATUS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE      62  /* 超过最大逻辑块               */
#define  USB_STATUS_COMMAND_FAILED                          63  /* 命令执行失败                 */

/* 命令结果相关 */
#define  USB_STATUS_UNIT_NOT_READY                          91  /* 介质单元没有就绪             */
#define  USB_STATUS_MEDIA_NOT_PRESENT                       92  /* 媒体介质不存在               */
#define  USB_STATUS_NOT_READY_TO_READY_TRANSITION           93  /* Media从没有准备就绪到就绪    */
#define  USB_STATUS_UNRECOGNIZED_MEDIA                      94  /* 不支持的Media                */
#define  USB_STATUS_MEDIA_CHANGE                            95  /* Media发生变化                */
#define  USB_STATUS_UNKOWN_SENSE                            96  /* 未知sense                    */

#define  USB_STATUS_UNKOWN_ERROR                            255 /* 未知错误                     */



//----------------------------------------------------------------------------
// Inquiry返回的数据
//----------------------------------------------------------------------------
typedef struct __InquiryData
{
    unsigned char Device_Type : 5;           /* 设备类型                     */
    unsigned char Qualifier   : 3;           /* 外围标识符                   */

    unsigned char scsi_1             : 7;    /* 命令集版本                   */
    unsigned char Removable_Media    : 1;    /* 可移动位                     */

    unsigned char ANSI_Version   : 4;        /* 设备支持的命令集版本         */
    unsigned char ECMA_Version   : 2;        /* 设备支持的ECMA-111版本       */
    unsigned char ISO_Version    : 2;        /* 设备支持的ISO IS-9316版本    */

    unsigned char Data_Format;               /* 标准INQUIRY数据的响应格式    */
    unsigned char Additional_Length;         /* 附加长度                     */
    unsigned char res[3];

    unsigned char Vendor_Info[8];            /* 设备制造商                   */
    unsigned char Product_Info[16];          /* 产品信息                     */
    unsigned char Product_Revision[4];       /* 产品修订版                   */
} __attribute__((packed)) __InquiryData_t;


//----------------------------------------------------------------------------
// request sense 返回的数据
//----------------------------------------------------------------------------
typedef struct __SenseData
{
    unsigned char ErrorCode: 7;
    unsigned char Valid: 1;
    unsigned char SegmentNumber;
    unsigned char SenseKey: 4;
    unsigned char Reserved: 1;
    unsigned char IncorrectLength: 1;
    unsigned char EndOfMedia: 1;
    unsigned char FileMark: 1;
    unsigned char Information[4];
    unsigned char AdditionalSenseLength;
    unsigned char CommandSpecificInformation[4];
    unsigned char AdditionalSenseCode;
    unsigned char AdditionalSenseCodeQualifier;
    unsigned char FieldReplaceableUnitCode;
    unsigned char SenseKeySpecific[3];
} __attribute__((packed))  __SenseData_t;

//----------------------------------------------------------------------------
// mode sense 返回的数据
//----------------------------------------------------------------------------
#define  SCSI_MODE_SENSE_MAX_DATA_LEN       192

typedef struct __BlockDevSpecPara
{
    unsigned char res_1 : 4;
    unsigned char DpoFua : 1;    /* 是否支持禁止页输出和强迫单元存取 */
    unsigned char res_2 : 2;
    unsigned char WP: 1;         /* write protect */
} __attribute__((packed))  __BlockDevSpecPara_t;

typedef struct __ModeSense6Header
{
    unsigned char ModeDataLength;
    unsigned char MediumType;
    unsigned char DevSpecPara;
    unsigned char BlockDescLength;
} __attribute__((packed)) __ModeSense6Header_t;

typedef struct __ModeSense10Header
{
    unsigned short ModeDataLength;
    unsigned char  MediumType;
    unsigned char  DeviceSpecPara;
    unsigned char  res[2];
    unsigned short BlockDescLength;
} __attribute__((packed)) __ModeSense10Header_t;

//----------------------------------------------------------------------------
// CD_Rom
//----------------------------------------------------------------------------

/* Play audio starting at MSF and ending at MSF */
typedef struct _CDROM_PlayAudioMsf
{
    unsigned char StartingM;
    unsigned char StartingS;
    unsigned char StartingF;
    unsigned char EndingM;
    unsigned char EndingS;
    unsigned char EndingF;
} CDROM_PlayAudioMsf_t;

/*
 *
 * C/DVD Read TOC
 *
 */

/* Format code definitions for readtoc command */
#define  CDROM_READTOC_FORMAT_CODE_TOC          0x00
#define  CDROM_READTOC_FORMAT_CODE_Session      0x01
#define  CDROM_READTOC_FORMAT_CODE_FULL_TOC     0x02
#define  CDROM_READTOC_FORMAT_CODE_PMA          0x03
#define  CDROM_READTOC_FORMAT_CODE_ATIP         0x04
#define  CDROM_READTOC_FORMAT_CODE_CD_TEXT      0x05

/* Maximum CD Rom size */
#define  MAXIMUM_NUMBER_TRACKS          100
#define  MAXIMUM_CDROM_SIZE             804

#define MAXIMUM_NUMBER_TRACKS_LARGE     0xAA

/* toc header */
typedef struct _CDROM_TocHeader
{
    unsigned short TocDataLength;
    unsigned char  FirstTrack;
    unsigned char  LastTrack;
} __attribute__((packed)) CDROM_TocHeader_t;

/* data track */
typedef struct _CDROM_TrackData
{
    unsigned char Reserved1;
    unsigned char Control : 4;
    unsigned char Adr     : 4;
    unsigned char TrackNumber;
    unsigned char Reserved2;

    unsigned int Address;
} __attribute__((packed)) CDROM_TrackData_t;

/* MSF address Format. see SFF-8020i page78 Table27 */
typedef struct _CDROM_MSF_ADDR
{
    unsigned char Reserved1;
    unsigned char Minute;
    unsigned char Second;
    unsigned char Frame;
} __attribute__((packed)) CDROM_MSF_ADDR_t;

/* MSF track */
typedef struct _CDROM_TrackMSF
{
    unsigned char Reserved1;
    unsigned char Control : 4;
    unsigned char Adr     : 4;
    unsigned char TrackNumber;
    unsigned char Reserved2;

    CDROM_MSF_ADDR_t MSF;
} __attribute__((packed)) CDROM_TrackMSF_t;

/*
 *
 * C/DVD mode sense
 *
 */
/* PageCode 1Ah. c/dvd power condition mode page format */
typedef struct _CDROM_PowerConditionPage
{
    unsigned char PageCode  : 6;
    unsigned char reserved1 : 1;
    unsigned char PS        : 1;

    unsigned char PageLength;

    unsigned char Standby   : 1;
    unsigned char Idle      : 1;
    unsigned char reserved2 : 6;

    unsigned int IdleTimer;
    unsigned int StandbyTimer;
} __attribute__((packed)) CDROM_PowerConditionPage_t;

/* PageCode 0Eh. cd audio control mode page format */
typedef struct _CDROM_ParameterPage
{
    unsigned char PageCode  : 6;
    unsigned char reserved1 : 1;
    unsigned char PS        : 1;

    unsigned char PageLength;

    unsigned char reserved2;
    unsigned char InactivityTimeMultiplier   : 4;
    unsigned char reserved3                  : 4;
    unsigned short NumberOfMSF_SUnitPerMUnit;
    unsigned short NumberOfMSF_FUnitPerSUnit;
} __attribute__((packed)) CDROM_ParameterPage_t;

/* PageCode 0Eh. cd audio control mode page format */
typedef  struct _CDROM_AudioControlPage
{
    unsigned char PageCode  : 6;
    unsigned char reserved1 : 1;
    unsigned char PS        : 1;

    unsigned char PageLength;

    unsigned char reserved2 : 1;
    unsigned char SOTC      : 1;
    unsigned char Immed     : 1;
    unsigned char reserved3 : 5;

    unsigned char reserved4[3];
    unsigned char Obsolete;

    unsigned char Port0Selection : 4;
    unsigned char reserved5      : 4;
    unsigned char Port0Volume;

    unsigned char Port1Selection : 4;
    unsigned char reserved6      : 4;
    unsigned char Port1Volume;

    unsigned char Port2Selection : 4;
    unsigned char reserved7      : 4;
    unsigned char Port2Volume;

    unsigned char Port3Selection : 4;
    unsigned char reserved8      : 4;
    unsigned char Port3Volume;
} __attribute__((packed)) CDROM_AudioControlPage_t;

/* PageCode 2Ah. c/dvd capabilities and mechanical status page. see SFF-8020i & SFF-8090 */
typedef struct _CDROM_Capitilities
{
    unsigned char PageCode  : 6;
    unsigned char reserved1 : 1;
    unsigned char PS        : 1;

    unsigned char PageLength;

    /* Byte2. see SFF-8090 */
    unsigned char CD_R_Rd      : 1;
    unsigned char CD_E_Rd      : 1;
    unsigned char Method2      : 1;
    unsigned char DVD_ROM_Read : 1;
    unsigned char DVD_R_Read   : 1;
    unsigned char DVD_RAM_Read : 1;
    unsigned char reserved2    : 2;

    /* Byte3. see SFF-8090 */
    unsigned char CD_R_Wr      : 1;
    unsigned char CD_E_Wr      : 1;
    unsigned char TestWrite    : 1;
    unsigned char reserved3    : 1;
    unsigned char DVD_R_Write  : 1;
    unsigned char DVD_RAM_Wr   : 1;
    unsigned char reserved4    : 2;

    /* Byte4 */
    unsigned char AudioPlay      : 1;
    unsigned char Composite      : 1;
    unsigned char DigitalPort1   : 1;
    unsigned char DigitalPort2   : 1;
    unsigned char Mode2_Form1    : 1;
    unsigned char Mode2_Form2    : 1;
    unsigned char MultiSession   : 1;
    unsigned char reserved5      : 1;

    /* Byte5 */
    unsigned char CD_DA              : 1;
    unsigned char DAAccu             : 1;
    unsigned char RW_supported       : 1;
    unsigned char RW_De_Interleaved  : 1;
    unsigned char C2_Pointers        : 1;
    unsigned char ISRC               : 1;
    unsigned char UPC                : 1;
    unsigned char ReadBarCodeCapable : 1;

    /* Byte6 */
    unsigned char Lock                   : 1;
    unsigned char LockState              : 1;
    unsigned char PreventJumper          : 1;
    unsigned char Eject                  : 1;
    unsigned char reserved6              : 1;
    unsigned char LoadingMechanismType   : 3;

    /* Byte7 */
    unsigned char SeparateVolume         : 1;
    unsigned char SeparateChannelMute    : 1;
    unsigned char SupportsDiscPresent    : 1;
    unsigned char SW_SlotSelection       : 1;
    unsigned char SideChangeCapable      : 1;
    unsigned char reserved7              : 3;

    unsigned short MaximumSpeedSupport;              /* Byte8-9. see SFF-8020i   */
    unsigned short NumberOfVolumelevelsSupported;    /* Byte10-11                */
    unsigned short BufferSizeSupportedByLogicUnit;   /* Byte12-13                */
    unsigned short CurrentSpeedSelected;             /* Byte14-15 see SFF-8020i  */

    unsigned char  ObsoleteReserved3;                /* Byte16                   */

    /* Byte17 */
    unsigned char reserved8  : 1;
    unsigned char BCK        : 1;
    unsigned char RCK        : 1;
    unsigned char LSBF       : 1;
    unsigned char Length     : 2;
    unsigned char reserved9  : 2;

    unsigned short ObsoleteReserved4;                /* Byte18-19    */
    unsigned short CopyManagementRevisionsupport;    /* Byte20-21    */
    unsigned char  reserved10;
    unsigned char  reserved11;
} __attribute__((packed)) CDROM_Capitilities_t;

/*
 *
 * C/DVD envent status
 *
 */
#define  CDROM_GET_EVENT_CMD_MAX_RETURN_DATA_LEN        0xff /* 通常都是8个byte */

/* Notification class request */
#define  CDROM_NOTIFICATION_CLASS_REQUEST_POWER_MANAGEMENT  0x04
#define  CDROM_NOTIFICATION_CLASS_REQUEST_MEDIA_STATUS      0x10
#define  CDROM_NOTIFICATION_CLASS_REQUEST_DEVICE_BUSY       0x40

/* Notification class field */
#define  CDROM_NOTIFICATION_CLASS_FIELD_POWER_MANAGEMENT    0x02
#define  CDROM_NOTIFICATION_CLASS_FIELD_MEDIA_STATUS        0x04
#define  CDROM_NOTIFICATION_CLASS_FIELD_DEVICE_BUSY         0x06

/* Event Status Header */
typedef struct _CDROM_EventHeader
{
    unsigned short EventDataLength;

    unsigned char NotificationClass  : 3;
    unsigned char reserved1          : 4;
    unsigned char NEA                : 1;

    unsigned char SupportEventClass;
} __attribute__((packed)) CDROM_EventHeader_t;

/* Power Management Status Class Returned Data */
#define  CDROM_POWER_EVENT_NOCHG            0x00
#define  CDROM_POWER_EVENT_PWRCHG_SUCC      0x01
#define  CDROM_POWER_EVENT_PWRCHG_FAIL      0x02

#define  CDROM_POWER_STATUS_ACTIVE          0x01
#define  CDROM_POWER_STATUS_IDLE            0x02
#define  CDROM_POWER_STATUS_STANDBY         0x03

typedef struct _CDROM_PowerStatus
{
    unsigned char PowerEvent : 4;
    unsigned char reserved1  : 4;

    unsigned char PowerStatus;
    unsigned char reserved2;
    unsigned char reserved3;
} __attribute__((packed)) CDROM_PowerStatus_t;

/* Media Status Class Returned Data */
#define  CDROM_MEDIA_STATUS_EJECT_REQUEST   0x01
#define  CDROM_MEDIA_STATUS_NEW_MEDIA       0x02
#define  CDROM_MEDIA_STATUS_MEDIA_REMOVAL   0x03

typedef struct _CDROM_MediaStatus
{
    unsigned char MediaStatus : 4;
    unsigned char reserved1   : 4;

    unsigned char DoorOpen    : 1;
    unsigned char MediaPesent : 1;
    unsigned char reserved    : 6;

    unsigned char StartSlot;
    unsigned char EndSlot;
} __attribute__((packed)) CDROM_MediaStatus_t;

/* Device Busy Status Class Returned Data */
#define  CDROM_DEVICE_BUSY_EVENT_TIMEOUT_OCCURED    0x03

#define  CDROM_DEVICE_BUSY_STATUS_NOEVENT           0x00
#define  CDROM_DEVICE_BUSY_STATUS_POWER             0x01
#define  CDROM_DEVICE_BUSY_STATUS_IMMEDIATE         0x02
#define  CDROM_DEVICE_BUSY_STATUS_DEFERED           0x03

typedef struct _CDROM_DeviceBusyStatus
{
    unsigned char  DeviceBusyEvent   : 4;
    unsigned char  reserved1         : 4;

    unsigned char  DeviceBusyStatus;
    unsigned short Time;
} __attribute__((packed)) CDROM_DeviceBusyStatus_t;

/*
 *
 * C/DVD Get Configuration
 *
 */
#define  CDROM_FEATURE_LIST_PROFILE_LIST                        0x00
#define  CDROM_FEATURE_LIST_CORE                                0x01
#define  CDROM_FEATURE_LIST_MORPHING                            0x02
#define  CDROM_FEATURE_LIST_REMOVABLE_MEDIUM                    0x03
#define  CDROM_FEATURE_LIST_WRITE_PROTECT                       0x04
#define  CDROM_FEATURE_LIST_RANDOM_READABLE                     0x10
#define  CDROM_FEATURE_LIST_MULTIREAD                           0x1D
#define  CDROM_FEATURE_LIST_CD_READ                             0x1E
#define  CDROM_FEATURE_LIST_DVD_READ                            0x1F
#define  CDROM_FEATURE_LIST_RANDOM_WRITABLE                     0x20
#define  CDROM_FEATURE_LIST_INCREMENTAL_STREAMING_WRITABLE      0x21
#define  CDROM_FEATURE_LIST_FORMATTABLE                         0x23
#define  CDROM_FEATURE_LIST_HARDWARE_DEFECT_MANAGEMENT          0x24
#define  CDROM_FEATURE_LIST_WRITE_ONCE                          0x25
#define  CDROM_FEATURE_LIST_RESTRICTED_OVERWRITE                0x26
#define  CDROM_FEATURE_LIST_CD_RW_CAV_WRITE                     0x27
#define  CDROM_FEATURE_LIST_MRW                                 0x28
#define  CDROM_FEATURE_LIST_ENHABCED_DEFECT_REPORTING           0x29
#define  CDROM_FEATURE_LIST_DVD_RW                              0x2A
#define  CDROM_FEATURE_LIST_DVD_R                               0x2B
#define  CDROM_FEATURE_LIST_RIGID_RESTRICTED_OVERWRITE          0x2C
#define  CDROM_FEATURE_LIST_CD_TRACK_AT_ONCE                    0x2D
#define  CDROM_FEATURE_LIST_CD_MASTERING                        0x2E
#define  CDROM_FEATURE_LIST_DVD_R_RW_WRITE                      0x2F
#define  CDROM_FEATURE_LIST_LAYER_JUMP_RECORDING                0x33
#define  CDROM_FEATURE_LIST_LJ_RIGID_RESTRICTED_OVERWRITE       0x34
#define  CDROM_FEATURE_LIST_STOP_LONG_OPERATION                 0x35
#define  CDROM_FEATURE_LIST_CD_RW_MEDIA_WRITE_SUPPORT           0x37
#define  CDROM_FEATURE_LIST_BD_R_PSEUDO_OVERWRITE_FEATURE       0x38
#define  CDROM_FEATURE_LIST_DVD_RW_DUAL_LAYER                   0x3A
#define  CDROM_FEATURE_LIST_DVD_R_DUAL_LAYER                    0x3B
#define  CDROM_FEATURE_LIST_BD_READ                             0x40
#define  CDROM_FEATURE_LIST_BD_WRITE                            0x41
#define  CDROM_FEATURE_LIST_TSR                                 0x42
#define  CDROM_FEATURE_LIST_HD_DVD_READ                         0x50
#define  CDROM_FEATURE_LIST_HD_DVD_WRITE                        0x51
#define  CDROM_FEATURE_LIST_HD_DVD_RW_FRAGMENT_RECORDING        0x52
#define  CDROM_FEATURE_LIST_HYBRID_DISC                         0x80
#define  CDROM_FEATURE_LIST_POWER_MANAGEMENT                    0x100
#define  CDROM_FEATURE_LIST_SMART                               0x101
#define  CDROM_FEATURE_LIST_EMBEDDED_CHANGER                    0x102
#define  CDROM_FEATURE_LIST_CD_AUDIO_ANALOG_PLAY                0x103
#define  CDROM_FEATURE_LIST_MICROCODE_UPGRADE                   0x104
#define  CDROM_FEATURE_LIST_TIMEOUT                             0x105
#define  CDROM_FEATURE_LIST_DVD_CSS                             0x106
#define  CDROM_FEATURE_LIST_REAL_TIME_STREAMING                 0x107
#define  CDROM_FEATURE_LIST_LOGICAL_UNIT_SERIAL_NUMBER          0x108
#define  CDROM_FEATURE_LIST_MEDIA_SERIAL_NUMBER                 0x109
#define  CDROM_FEATURE_LIST_DISC_CONTROL_BLOCKS                 0x10A
#define  CDROM_FEATURE_LIST_DVD_CPRM                            0x10B
#define  CDROM_FEATURE_LIST_FIRMWARE_INFORMATION                0x10C
#define  CDROM_FEATURE_LIST_AACS                                0x10D
#define  CDROM_FEATURE_LIST_DVD_CSS_MANAGED_RECORDING           0x10E
#define  CDROM_FEATURE_LIST_VCPS                                0x110
#define  CDROM_FEATURE_LIST_SECUR_DISC                          0x113

/*
 *
 * C/DVD Read Disc Information
 *
 */

/* Data Type Field definition */
#define  CDROM_DISC_INFO_STANDARD               0x00
#define  CDROM_DISC_INFO_TRACK_RESOURCES        0x00
#define  CDROM_DISC_INFO_POW_RESOURCES          0x00

/* C/DVD Disc Information Block Data */
typedef struct _CDROM_DiscInfo
{
    unsigned short DataInformationLength;

    unsigned char  DiscStatus                : 2;
    unsigned char  StatusOfLastSession       : 2;
    unsigned char  Erasable                  : 1;
    unsigned char  DiscInformationDataType   : 3;

    unsigned char  FirstTrackNumberOnDisc;
    unsigned char  NumberOfSessions_LSB;
    unsigned char  FirstTrackNumberInLastSession_LSB;
    unsigned char  LastTrackNumberInLastSession_LSB;

    unsigned char  BG_FormatStatus   : 2;
    unsigned char  Dbit              : 1;
    unsigned char  reserved1         : 1;
    unsigned char  DAC_V             : 1;
    unsigned char  URU               : 1;
    unsigned char  DBC_V             : 1;
    unsigned char  DID_V             : 1;

    unsigned char  DiscType;
    unsigned char  NumberOfSessions_MSB;
    unsigned char  FirstTrackNumberInLastSession_MSB;
    unsigned char  LastTrackNumberInLastSession_MSB;

    unsigned int DiscIdentification;
    unsigned int LeadInStartTimeOfLastSession_MSF;
    unsigned int LastPossibleStartTimeForStartOfLeadOut_MSF;
    unsigned char  DiscBarCode[8];
    unsigned char  DiscApplicationCode;
    unsigned char  NumberOfOPCTableEntries;

    /* OPCTableEntries */
} __attribute__((packed)) CDROM_DiscInfo_t;

/* Status of last session field definition */
#define  CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_EMPTY           0x00
#define  CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_IMCOMPLETE      0x01
#define  CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_DAMAGED_BOARDER 0x02
#define  CDROM_DISC_INFO_STATUS_OF_LAST_SESSION_COMPLETE        0x03

/* Disc status field definition */
#define  CDROM_DISC_INFO_DISC_STATUS_EMPTY                      0x00
#define  CDROM_DISC_INFO_DISC_STATUS_IMCOMPLETE                 0x01
#define  CDROM_DISC_INFO_DISC_STATUS_COMPLETE                   0x02
#define  CDROM_DISC_INFO_DISC_STATUS_FINALIZATION               0x03

/* BG foramt status field definition */
#define  CDROM_DISC_INFO_BG_FORMAT_STATUS_EMPTY                 0x00
#define  CDROM_DISC_INFO_BG_FORMAT_STATUS_NOT_RUNNING           0x01
#define  CDROM_DISC_INFO_BG_FORMAT_STATUS_RUNNING               0x02
#define  CDROM_DISC_INFO_BG_FORMAT_STATUS_COMPLETE              0x03

/* Disk type field definition */
#define  CDROM_DISC_INFO_DISC_TYPE_CDDA_CDROM                   0x00
#define  CDROM_DISC_INFO_DISC_TYPE_CDI                          0x10
#define  CDROM_DISC_INFO_DISC_TYPE_CD_XA                        0x20


/*
 *
 * C/DVD Read Track Information
 *
 */
#define  CDROM_TRACK_INFO_ADDRESS_NUMBER_TYPE_LBA               0x00
#define  CDROM_TRACK_INFO_ADDRESS_NUMBER_TYPE_TRACK_NUMBER      0x01
#define  CDROM_TRACK_INFO_ADDRESS_NUMBER_TYPE_BORDER_NUMBER     0x02

typedef struct _CDROM_TrackInfo
{
    unsigned short TrackInformationlength;
    unsigned char  TrackNumber_LSB;
    unsigned char  SessionNumber_LSB;
    unsigned char  reserved1;

    unsigned char  TrackMode : 4;
    unsigned char  Copy      : 1;
    unsigned char  Damage    : 1;
    unsigned char  LJRS      : 2;

    unsigned char  DataMode  : 4;
    unsigned char  FP        : 1;
    unsigned char  Packet    : 1;
    unsigned char  Blank     : 1;
    unsigned char  RT        : 1;

    unsigned char  NWA_V     : 1;        /* next write address valid     */
    unsigned char  LRA_V     : 1;        /* last recorded address valid  */
    unsigned char  reserved2 : 6;

    unsigned int TrackStartAddress;
    unsigned int NextWritableAddress;
    unsigned int FreeBlocks;
    unsigned int FixedPacketSize;
    unsigned int TrackSizeEndAddress;
    unsigned int LastRecordedAddress;
    unsigned char  TrackNumber_MSB;
    unsigned char  SessionNumber_MSB;
    unsigned char  reserved3;
    unsigned int ReadCompatibilityLBA;
    unsigned int NextLayerJumpAddress;
    unsigned int LastLayerJumpAddress;
} __attribute__((packed)) CDROM_TrackInfo_t;









//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------
int ScsiInquery(__mscLun_t *mscLun, void *buffer, unsigned int buffer_len);
int ScsiReadCapacity(__mscLun_t *mscLun);
int ScsiModeSense6(__mscLun_t *mscLun,
                     unsigned int PageCode,
                     unsigned int DBD,
                     void *buffer,
                     unsigned int buffer_len,
                     unsigned int *ActLen);
int ScsiModeSense10(__mscLun_t *mscLun,
                      unsigned int PageCode,
                      unsigned int DBD,
                      void *buffer,
                      unsigned int buffer_len,
                      unsigned int *ActLen);
int ScsiTestUnitReady(__mscLun_t *mscLun);
int ScsiRequestSense(__mscLun_t *mscLun, void *buffer, unsigned int buffer_len);
static int ScsiGetSenseData(__mscLun_t *mscLun);
int ScsiStartStopUnit(__mscLun_t *mscLun, unsigned int LoEj, unsigned int Start);
int ScsiSynchronizeCache(__mscLun_t *mscLun);
int ScsiRead(__mscLun_t *mscLun,
               unsigned int Version,
               unsigned int StartSector,
               unsigned int NumSectors,
               void *buffer,
               unsigned int buffer_len);
int ScsiWrite(__mscLun_t *mscLun,
                unsigned int Version,
                unsigned int StartSector,
                unsigned int NumSectors,
                void *buffer,
                unsigned int buffer_len);
int ScsiPreventAllowMedium(__mscLun_t *mscLun, unsigned int Persistent, unsigned int Prevent);

/* C/DVD */
int ScsiCDPauseResume(__mscLun_t *mscLun, unsigned int Resume);
int ScsiCDPlayAudio10(__mscLun_t *mscLun, unsigned int Lba, unsigned int Lenght);
int ScsiCDPlayAudioMSF(__mscLun_t *mscLun, CDROM_PlayAudioMsf_t *msf);
int ScsiCDReadToc(__mscLun_t *mscLun,
                    unsigned int MSF,
                    unsigned int Format,
                    unsigned int StartingNumber,
                    void *Buffer,
                    unsigned int BufferLen);
int ScsiCDStopPlayScan(__mscLun_t *mscLun);
int ScsiCDReadDiscInfo(__mscLun_t *mscLun,
                         unsigned int DataType,
                         void *Buffer,
                         unsigned int BufferLen,
                         unsigned int *ActLen);
int ScsiCDReadTrackInfo(__mscLun_t *mscLun,
                          unsigned int Open,
                          unsigned int Address_or_Number,
                          unsigned int LogicalBlockAddress,
                          void *Buffer,
                          unsigned int BufferLen,
                          unsigned int *ActLen);
int ScsiDvdGetEventStatus(__mscLun_t *mscLun,
                            unsigned int Immed,
                            unsigned int ClassRequest,
                            void *Buffer,
                            unsigned int BufferLen);
int ScsiDvdLoad(__mscLun_t *mscLun,
                  unsigned int Immed,
                  unsigned int Start,
                  unsigned int LoUnlo,
                  unsigned int Slot);
int ScsiCDSetSpeed(__mscLun_t *mscLun, unsigned int ReadSpeed, unsigned int WriteSpeed);
int ScsiDVDGetConfiguration(__mscLun_t *mscLun,
                              unsigned int RT,
                              unsigned int StartingFeatureNumber,
                              void *Buffer,
                              unsigned int BufferLen);


#endif   //__SCSI2_H__