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