summaryrefslogtreecommitdiff
path: root/bsp/allwinner/libraries/sunxi-hal/hal/source/usb/storage/Disk/CD.h
blob: 71cd6336a7a7ca408836731b76953a41454f45d1 (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
/*
********************************************************************************************************************
*                                              usb host driver
*
*                              (c) Copyright 2007-2010, javen.China
*                                       All Rights Reserved
*
* File Name     : CD.h
*
* Author        : javen
*
* Version       : 2.0
*
* Date          : 2010.03.02
*
* Description   :
*
* History       :
*
********************************************************************************************************************
*/
#ifndef  __CD_H__
#define  __CD_H__

/* CD-ROM address types */
#define CDROM_LBA 0x01  /* data-related.  "logical block": first frame is #0            */
#define CDROM_MSF 0x02  /* audio-related. "minute-second-frame": binary, not bcd here!  */

/* Some generally useful CD-ROM information -- mostly based on the above */
#define CD_MINS              74 /* max. minutes per CD, not really a limit  */
#define CD_SECS              60 /* seconds per minute                       */
#define CD_FRAMES            75 /* frames per second                        */
#define CD_SYNC_SIZE         12 /* 12 sync bytes per raw data frame         */
#define CD_MSF_OFFSET       150 /* MSF numbering offset of first frame      */
#define CD_CHUNK_SIZE        24 /* lowest-level "data bytes piece"          */
#define CD_NUM_OF_CHUNKS     98 /* chunks per frame                         */
#define CD_FRAMESIZE_SUB     96 /* subchannel data "frame" size             */
#define CD_HEAD_SIZE          4 /* header (address) bytes per raw data frame */
#define CD_SUBHEAD_SIZE       8 /* subheader bytes per raw XA data frame    */
#define CD_EDC_SIZE           4 /* bytes EDC per most raw data frame types  */
#define CD_ZERO_SIZE          8 /* bytes zero per yellow book mode 1 frame  */
#define CD_ECC_SIZE         276 /* bytes ECC per most raw data frame types  */
#define CD_FRAMESIZE       2048 /* bytes per frame, "cooked" mode           */
#define CD_FRAMESIZE_RAW   2352 /* bytes per frame, "raw" mode              */
#define CD_FRAMESIZE_RAWER 2646 /* The maximum possible returned bytes      */

/* most drives don't deliver everything: */
#define CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW - CD_SYNC_SIZE)                 /*2340*/
#define CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW - CD_SYNC_SIZE - CD_HEAD_SIZE)  /*2336*/

#define CD_XA_HEAD        (CD_HEAD_SIZE + CD_SUBHEAD_SIZE)  /* "before data" part of raw XA frame */
#define CD_XA_TAIL        (CD_EDC_SIZE + CD_ECC_SIZE)       /* "after data" part of raw XA frame */
#define CD_XA_SYNC_HEAD   (CD_SYNC_SIZE + CD_XA_HEAD)       /* sync bytes + header of XA frame */


/* capability flags used with the uniform CD-ROM driver */
#define CDROM_CLOSE_TRAY        0x1         /* caddy systems _can't_ close          */
#define CDROM_OPEN_TRAY         0x2         /* but _can_ eject.                     */
#define CDROM_LOCK              0x4         /* disable manual eject                 */
#define CDROM_SELECT_SPEED      0x8         /* programmable speed                   */
#define CDROM_SELECT_DISC       0x10        /* select disc from juke-box            */
#define CDROM_MULTI_SESSION     0x20        /* read sessions>1                      */
#define CDROM_MCN               0x40        /* Medium Catalog Number                */
#define CDROM_MEDIA_CHANGED     0x80        /* media changed                        */
#define CDROM_PLAY_AUDIO        0x100       /* audio functions                      */
#define CDROM_RESET             0x200       /* hard reset device                    */
#define CDROM_DRIVE_STATUS      0x800       /* drive implements drive status        */
#define CDROM_GENERIC_PACKET    0x1000      /* drive implements generic packets     */
#define CDROM_CD_R              0x2000      /* drive is a CD-R                      */
#define CDROM_CD_RW             0x4000      /* drive is a CD-RW                     */
#define CDROM_DVD               0x8000      /* drive is a DVD                       */
#define CDROM_DVD_R             0x10000     /* drive can write DVD-R                */
#define CDROM_DVD_RAM           0x20000     /* drive can write DVD-RAM              */
#define CDROM_MO_DRIVE          0x40000     /* drive is an MO device                */
#define CDROM_MRW               0x80000     /* drive can read MRW                   */
#define CDROM_MRW_W             0x100000    /* drive can write MRW                  */
#define CDROM_RAM               0x200000    /* ok to open for WRITE                 */

/* bit to tell whether track is data or audio (cdrom_tocentry.cdte_ctrl) */
#define  CDROM_DATA_TRACK       0x04

/* The leadout track is always 0xAA, regardless of # of tracks on disc */
#define  CDROM_LEADOUT          0xAA

/* frame address */
typedef struct _MSF_LBA
{
    CDROM_MSF_ADDR_t msf;
    unsigned int lba;
} __attribute__((packed)) MSF_LBA_t;

/* 某个 track 的 Toc entry */
typedef struct _CDROM_TocEntry
{
    unsigned int TrackNumber;      /* Toc 所属的 track     */
    unsigned int Format;           /* CD-ROM address types */
    unsigned int Adr   : 4;        /* The type of information encode in the Q sub-channel of this blocks */
    unsigned int Ctrl  : 4;        /* attributes of the track */

    MSF_LBA_t Address;      /* Toc entry address    */
    unsigned int DataMode;         /* is a data track?     */
} CDROM_TocEntry_t;

typedef struct _CD_Rom
{
    /* 光驱的信息 */
    unsigned int DriveType;                    /* 光驱的型号               */
    unsigned int MaxSpeed;                     /* 光驱最大的速度           */
    unsigned int CurrentSpeed;                 /* 光驱当前的速度           */
    unsigned int Readcd_cdda;                  /* reading audio data using READ_CD */
    unsigned int WriteAble;                    /* 光驱是否支持写操作       */
    CDROM_Capitilities_t Capitilities;  /* 光驱的驱动能力           */
    unsigned int Eject;                        /* 是否支持光驱退出         */
    unsigned int PowerStatus;                  /* 光驱电源状态. Active, Idle, Standby ? */

    /* 光碟信息 */
    unsigned int DiscType;                     /* 光碟的型号               */
    unsigned int DoubleDisc;                   /* 是否是双面光碟?          */
    unsigned int LastWriteSector;              /* 但前已经写的最后一个扇区 */
    unsigned int MultiSession;                 /* 多区段                   */
    unsigned int NumberOfSUinitPerMUnit;       /* MSF中每M保护的s个数      */
    unsigned int NumberOfFUinitPerSUnit;       /* MSF中每S保护的F个数      */
    unsigned int InactivityTimeMultiPlier;     /*                          */

    /* 光驱管理 */
    unsigned int DriveStatus;                  /* 光驱状态                 */
    unsigned int IsMeduimPrevent;              /* 是否设置禁止介质移动     */
} CD_Rom_t;

/*
*******************************************************************************
*                     lba_to_msf
*
* Description:
*    LBA转换为msf
*
* Parameters:
*    lba    :  input.
*    m      :  input.
*    s      :  input.
*    f      :  input.
*
* Return value:
*    无
*
* note:
*    无
*
*******************************************************************************
*/
static inline void lba_to_msf(int lba, u8 *m, u8 *s, u8 *f)
{
    lba += CD_MSF_OFFSET;
    lba &= 0xffffff;        /* negative lbas use only 24 bits */
    *m  = lba / (CD_SECS * CD_FRAMES);
    lba %= (CD_SECS * CD_FRAMES);
    *s  = lba / CD_FRAMES;
    *f  = lba % CD_FRAMES;
}

/*
*******************************************************************************
*                     msf_to_lba
*
* Description:
*    msf转换为LBA
*
* Parameters:
*    m      :  input.
*    s      :  input.
*    f      :  input.
*
* Return value:
*
* note:
*    无
*
*******************************************************************************
*/
static inline int msf_to_lba(u8 m, u8 s, u8 f)
{
    return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
}

int CDIOCtrl(__UsbBlkDev_t *BlkDev, unsigned int Cmd, int Aux, void *pBuffer);

#endif   //__CD_H__