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
|
/*
* Definitions for a Sanyo CD-ROM interface.
*
* Copyright (C) 1995 Vadim V. Model
* model@cecmow.enet.dec.com
* vadim@rbrf.msk.su
* vadim@ipsun.ras.ru
* Eric van der Maarel
* H.T.M.v.d.Maarel@marin.nl
*
* This information is based on mcd.c from M. Harriss and sjcd102.lst from
* E. Moenkeberg.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __SJCD_H__
#define __SJCD_H__
/*
* Change this to set the I/O port address as default. More flexibility
* come with setup implementation.
*/
#define SJCD_BASE_ADDR 0x340
/*
* Change this to set the irq as default. Really SANYO do not use interrupts
* at all.
*/
#define SJCD_INTR_NR 0
/*
* Change this to set the dma as default value. really SANYO does not use
* direct memory access at all.
*/
#define SJCD_DMA_NR 0
/*
* Macros which allow us to find out the status of the drive.
*/
#define SJCD_STATUS_AVAILABLE( x ) (((x)&0x02)==0)
#define SJCD_DATA_AVAILABLE( x ) (((x)&0x01)==0)
/*
* Port access macro. Three ports are available: S-data port (command port),
* status port (read only) and D-data port (read only).
*/
#define SJCDPORT( x ) ( sjcd_base + ( x ) )
#define SJCD_STATUS_PORT SJCDPORT( 1 )
#define SJCD_S_DATA_PORT SJCDPORT( 0 )
#define SJCD_COMMAND_PORT SJCDPORT( 0 )
#define SJCD_D_DATA_PORT SJCDPORT( 2 )
/*
* Drive info bits. Drive info available as first (mandatory) byte of
* command completion status.
*/
#define SST_NOT_READY 0x10 /* no disk in the drive (???) */
#define SST_MEDIA_CHANGED 0x20 /* disk is changed */
#define SST_DOOR_OPENED 0x40 /* door is open */
/* commands */
#define SCMD_EJECT_TRAY 0xD0 /* eject tray if not locked */
#define SCMD_LOCK_TRAY 0xD2 /* lock tray when in */
#define SCMD_UNLOCK_TRAY 0xD4 /* unlock tray when in */
#define SCMD_CLOSE_TRAY 0xD6 /* load tray in */
#define SCMD_RESET 0xFA /* soft reset */
#define SCMD_GET_STATUS 0x80
#define SCMD_GET_VERSION 0xCC
#define SCMD_DATA_READ 0xA0 /* are the same, depend on mode&args */
#define SCMD_SEEK 0xA0
#define SCMD_PLAY 0xA0
#define SCMD_GET_QINFO 0xA8
#define SCMD_SET_MODE 0xC4
#define SCMD_MODE_PLAY 0xE0
#define SCMD_MODE_COOKED (0xF8 & ~0x20)
#define SCMD_MODE_RAW 0xF9
#define SCMD_MODE_x20_BIT 0x20 /* What is it for ? */
#define SCMD_SET_VOLUME 0xAE
#define SCMD_PAUSE 0xE0
#define SCMD_STOP 0xE0
#define SCMD_GET_DISK_INFO 0xAA
/*
* Some standard arguments for SCMD_GET_DISK_INFO.
*/
#define SCMD_GET_1_TRACK 0xA0 /* get the first track information */
#define SCMD_GET_L_TRACK 0xA1 /* get the last track information */
#define SCMD_GET_D_SIZE 0xA2 /* get the whole disk information */
/*
* Borrowed from hd.c. Allows to optimize multiple port read commands.
*/
#define S_READ_DATA( port, buf, nr ) insb( port, buf, nr )
/*
* We assume that there are no audio disks with TOC length more than this
* number (I personally have never seen disks with more than 20 fragments).
*/
#define SJCD_MAX_TRACKS 100
struct msf {
unsigned char min;
unsigned char sec;
unsigned char frame;
};
struct sjcd_hw_disk_info {
unsigned char track_control;
unsigned char track_no;
unsigned char x, y, z;
union {
unsigned char track_no;
struct msf track_msf;
} un;
};
struct sjcd_hw_qinfo {
unsigned char track_control;
unsigned char track_no;
unsigned char x;
struct msf rel;
struct msf abs;
};
struct sjcd_play_msf {
struct msf start;
struct msf end;
};
struct sjcd_disk_info {
unsigned char first;
unsigned char last;
struct msf disk_length;
struct msf first_track;
};
struct sjcd_toc {
unsigned char ctrl_addr;
unsigned char track;
unsigned char point_index;
struct msf track_time;
struct msf disk_time;
};
#if defined( SJCD_GATHER_STAT )
struct sjcd_stat {
int ticks;
int tticks[ 8 ];
int idle_ticks;
int start_ticks;
int mode_ticks;
int read_ticks;
int data_ticks;
int stop_ticks;
int stopping_ticks;
};
#endif
#endif
|