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__
|