1 /*
2 ********************************************************************************************************************
3 * usb host driver
4 *
5 * (c) Copyright 2007-2010, javen.China
6 * All Rights Reserved
7 *
8 * File Name : CD.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 __CD_H__
23 #define __CD_H__
24
25 /* CD-ROM address types */
26 #define CDROM_LBA 0x01 /* data-related. "logical block": first frame is #0 */
27 #define CDROM_MSF 0x02 /* audio-related. "minute-second-frame": binary, not bcd here! */
28
29 /* Some generally useful CD-ROM information -- mostly based on the above */
30 #define CD_MINS 74 /* max. minutes per CD, not really a limit */
31 #define CD_SECS 60 /* seconds per minute */
32 #define CD_FRAMES 75 /* frames per second */
33 #define CD_SYNC_SIZE 12 /* 12 sync bytes per raw data frame */
34 #define CD_MSF_OFFSET 150 /* MSF numbering offset of first frame */
35 #define CD_CHUNK_SIZE 24 /* lowest-level "data bytes piece" */
36 #define CD_NUM_OF_CHUNKS 98 /* chunks per frame */
37 #define CD_FRAMESIZE_SUB 96 /* subchannel data "frame" size */
38 #define CD_HEAD_SIZE 4 /* header (address) bytes per raw data frame */
39 #define CD_SUBHEAD_SIZE 8 /* subheader bytes per raw XA data frame */
40 #define CD_EDC_SIZE 4 /* bytes EDC per most raw data frame types */
41 #define CD_ZERO_SIZE 8 /* bytes zero per yellow book mode 1 frame */
42 #define CD_ECC_SIZE 276 /* bytes ECC per most raw data frame types */
43 #define CD_FRAMESIZE 2048 /* bytes per frame, "cooked" mode */
44 #define CD_FRAMESIZE_RAW 2352 /* bytes per frame, "raw" mode */
45 #define CD_FRAMESIZE_RAWER 2646 /* The maximum possible returned bytes */
46
47 /* most drives don't deliver everything: */
48 #define CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW - CD_SYNC_SIZE) /*2340*/
49 #define CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW - CD_SYNC_SIZE - CD_HEAD_SIZE) /*2336*/
50
51 #define CD_XA_HEAD (CD_HEAD_SIZE + CD_SUBHEAD_SIZE) /* "before data" part of raw XA frame */
52 #define CD_XA_TAIL (CD_EDC_SIZE + CD_ECC_SIZE) /* "after data" part of raw XA frame */
53 #define CD_XA_SYNC_HEAD (CD_SYNC_SIZE + CD_XA_HEAD) /* sync bytes + header of XA frame */
54
55
56 /* capability flags used with the uniform CD-ROM driver */
57 #define CDROM_CLOSE_TRAY 0x1 /* caddy systems _can't_ close */
58 #define CDROM_OPEN_TRAY 0x2 /* but _can_ eject. */
59 #define CDROM_LOCK 0x4 /* disable manual eject */
60 #define CDROM_SELECT_SPEED 0x8 /* programmable speed */
61 #define CDROM_SELECT_DISC 0x10 /* select disc from juke-box */
62 #define CDROM_MULTI_SESSION 0x20 /* read sessions>1 */
63 #define CDROM_MCN 0x40 /* Medium Catalog Number */
64 #define CDROM_MEDIA_CHANGED 0x80 /* media changed */
65 #define CDROM_PLAY_AUDIO 0x100 /* audio functions */
66 #define CDROM_RESET 0x200 /* hard reset device */
67 #define CDROM_DRIVE_STATUS 0x800 /* drive implements drive status */
68 #define CDROM_GENERIC_PACKET 0x1000 /* drive implements generic packets */
69 #define CDROM_CD_R 0x2000 /* drive is a CD-R */
70 #define CDROM_CD_RW 0x4000 /* drive is a CD-RW */
71 #define CDROM_DVD 0x8000 /* drive is a DVD */
72 #define CDROM_DVD_R 0x10000 /* drive can write DVD-R */
73 #define CDROM_DVD_RAM 0x20000 /* drive can write DVD-RAM */
74 #define CDROM_MO_DRIVE 0x40000 /* drive is an MO device */
75 #define CDROM_MRW 0x80000 /* drive can read MRW */
76 #define CDROM_MRW_W 0x100000 /* drive can write MRW */
77 #define CDROM_RAM 0x200000 /* ok to open for WRITE */
78
79 /* bit to tell whether track is data or audio (cdrom_tocentry.cdte_ctrl) */
80 #define CDROM_DATA_TRACK 0x04
81
82 /* The leadout track is always 0xAA, regardless of # of tracks on disc */
83 #define CDROM_LEADOUT 0xAA
84
85 /* frame address */
86 typedef struct _MSF_LBA
87 {
88 CDROM_MSF_ADDR_t msf;
89 unsigned int lba;
90 } __attribute__((packed)) MSF_LBA_t;
91
92 /* 某个 track 的 Toc entry */
93 typedef struct _CDROM_TocEntry
94 {
95 unsigned int TrackNumber; /* Toc 所属的 track */
96 unsigned int Format; /* CD-ROM address types */
97 unsigned int Adr : 4; /* The type of information encode in the Q sub-channel of this blocks */
98 unsigned int Ctrl : 4; /* attributes of the track */
99
100 MSF_LBA_t Address; /* Toc entry address */
101 unsigned int DataMode; /* is a data track? */
102 } CDROM_TocEntry_t;
103
104 typedef struct _CD_Rom
105 {
106 /* 光驱的信息 */
107 unsigned int DriveType; /* 光驱的型号 */
108 unsigned int MaxSpeed; /* 光驱最大的速度 */
109 unsigned int CurrentSpeed; /* 光驱当前的速度 */
110 unsigned int Readcd_cdda; /* reading audio data using READ_CD */
111 unsigned int WriteAble; /* 光驱是否支持写操作 */
112 CDROM_Capitilities_t Capitilities; /* 光驱的驱动能力 */
113 unsigned int Eject; /* 是否支持光驱退出 */
114 unsigned int PowerStatus; /* 光驱电源状态. Active, Idle, Standby ? */
115
116 /* 光碟信息 */
117 unsigned int DiscType; /* 光碟的型号 */
118 unsigned int DoubleDisc; /* 是否是双面光碟? */
119 unsigned int LastWriteSector; /* 但前已经写的最后一个扇区 */
120 unsigned int MultiSession; /* 多区段 */
121 unsigned int NumberOfSUinitPerMUnit; /* MSF中每M保护的s个数 */
122 unsigned int NumberOfFUinitPerSUnit; /* MSF中每S保护的F个数 */
123 unsigned int InactivityTimeMultiPlier; /* */
124
125 /* 光驱管理 */
126 unsigned int DriveStatus; /* 光驱状态 */
127 unsigned int IsMeduimPrevent; /* 是否设置禁止介质移动 */
128 } CD_Rom_t;
129
130 /*
131 *******************************************************************************
132 * lba_to_msf
133 *
134 * Description:
135 * LBA转换为msf
136 *
137 * Parameters:
138 * lba : input.
139 * m : input.
140 * s : input.
141 * f : input.
142 *
143 * Return value:
144 * 无
145 *
146 * note:
147 * 无
148 *
149 *******************************************************************************
150 */
lba_to_msf(int lba,u8 * m,u8 * s,u8 * f)151 static inline void lba_to_msf(int lba, u8 *m, u8 *s, u8 *f)
152 {
153 lba += CD_MSF_OFFSET;
154 lba &= 0xffffff; /* negative lbas use only 24 bits */
155 *m = lba / (CD_SECS * CD_FRAMES);
156 lba %= (CD_SECS * CD_FRAMES);
157 *s = lba / CD_FRAMES;
158 *f = lba % CD_FRAMES;
159 }
160
161 /*
162 *******************************************************************************
163 * msf_to_lba
164 *
165 * Description:
166 * msf转换为LBA
167 *
168 * Parameters:
169 * m : input.
170 * s : input.
171 * f : input.
172 *
173 * Return value:
174 *
175 * note:
176 * 无
177 *
178 *******************************************************************************
179 */
msf_to_lba(u8 m,u8 s,u8 f)180 static inline int msf_to_lba(u8 m, u8 s, u8 f)
181 {
182 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
183 }
184
185 int CDIOCtrl(__UsbBlkDev_t *BlkDev, unsigned int Cmd, int Aux, void *pBuffer);
186
187 #endif //__CD_H__
188
189
190