Home | History | Annotate | Line # | Download | only in isa
      1 /*	$NetBSD: mcdreg.h,v 1.9 2000/06/08 18:22:16 cgd Exp $	*/
      2 
      3 /*
      4  * Copyright 1993 by Holger Veit (data part)
      5  * Copyright 1993 by Brian Moore (audio part)
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. All advertising materials mentioning features or use of this software
     17  *    must display the following acknowledgement:
     18  *	This software was developed by Holger Veit and Brian Moore
     19  *      for use with "386BSD" and similar operating systems.
     20  *    "Similar operating systems" includes mainly non-profit oriented
     21  *    systems for research and education, including but not restricted to
     22  *    "NetBSD", "FreeBSD", "Mach" (by CMU).
     23  * 4. Neither the name of the developer(s) nor the name "386BSD"
     24  *    may be used to endorse or promote products derived from this
     25  *    software without specific prior written permission.
     26  *
     27  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER(S) ``AS IS'' AND ANY
     28  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE DEVELOPER(S) BE
     31  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
     32  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
     33  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     34  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     35  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     36  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     37  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     38  *
     39  * This file contains definitions for some cdrom control commands
     40  * and status codes. This info was "inherited" from the DOS MTMCDE.SYS
     41  * driver, and is thus not complete (and may even be wrong). Some day
     42  * the manufacturer or anyone else might provide better documentation,
     43  * so this file (and the driver) will then have a better quality.
     44  */
     45 
     46 #if __GNUC__ >= 2
     47 #pragma pack(1)
     48 #endif
     49 
     50 typedef unsigned char	bcd_t;
     51 #define	M_msf(msf)	msf[0]
     52 #define	S_msf(msf)	msf[1]
     53 #define	F_msf(msf)	msf[2]
     54 
     55 #define	MCD_COMMAND	0
     56 #define	MCD_STATUS	0
     57 #define	MCD_RDATA	0
     58 #define	MCD_RESET	1
     59 #define	MCD_XFER	1
     60 #define	MCD_CTL2	2 /* XXX Is this right? */
     61 #define	MCD_CONFIG	3
     62 #define MCD_NPORT	4
     63 
     64 #define	MCD_MASK_DMA	0x07	/* bits 2-0 = DMA channel */
     65 #define	MCD_MASK_IRQ	0x70	/* bits 6-4 = INT number */
     66 				/* 001 = int 2,9 */
     67 				/* 010 = int 3 */
     68 				/* 011 = int 5 */
     69 				/* 100 = int 10 */
     70 				/* 101 = int 11 */
     71 
     72 /* Status bits */
     73 #define	MCD_ST_DOOROPEN		0x80
     74 #define	MCD_ST_DSKIN		0x40
     75 #define	MCD_ST_DSKCHNG		0x20
     76 #define	MCD_ST_SPINNING		0x10
     77 #define	MCD_ST_AUDIODISK	0x08	/* audio disk is in */
     78 #define	MCD_ST_READERR		0x04
     79 #define	MCD_ST_AUDIOBSY		0x02	/* audio disk is playing */
     80 #define	MCD_ST_CMDCHECK		0x01	/* command error */
     81 
     82 /* Xfer bits */
     83 #define	MCD_XF_STATUSUNAVAIL	0x04
     84 #define	MCD_XF_DATAUNAVAIL	0x02
     85 
     86 /* Modes */
     87 #define	MCD_MD_TESTMODE		0x80	/* 0 = DATALENGTH is valid */
     88 #define	MCD_MD_DATALENGTH	0x40	/* 1 = read ECC data also */
     89 #define	MCD_MD_ECCMODE		0x20	/* 1 = disable secondary ECC */
     90 #define	MCD_MD_SPINDOWN		0x08	/* 1 = spin down */
     91 #define	MCD_MD_READTOC		0x04	/* 1 = read TOC on GETQCHN */
     92 #define	MCD_MD_PLAYAUDIO	0x01	/* 1 = play audio through headphones */
     93 
     94 #define	MCD_MD_RAW		(MCD_MD_PLAYAUDIO|MCD_MD_ECCMODE|MCD_MD_DATALENGTH)
     95 #define	MCD_MD_COOKED		(MCD_MD_PLAYAUDIO)
     96 #define	MCD_MD_TOC		(MCD_MD_PLAYAUDIO|MCD_MD_READTOC)
     97 #define	MCD_MD_SLEEP		(MCD_MD_PLAYAUDIO|MCD_MD_SPINDOWN)
     98 
     99 #define	MCD_BLKSIZE_RAW		sizeof(struct mcd_rawsector)
    100 #define	MCD_BLKSIZE_COOKED	2048
    101 
    102 /* Lock states */
    103 #define	MCD_LK_UNLOCK		0x00
    104 #define	MCD_LK_LOCK		0x01
    105 #define	MCD_LK_TEST		0x02
    106 
    107 /* Config commands */
    108 #define	MCD_CF_IRQENABLE	0x10
    109 #define	MCD_CF_DMATIMEOUT	0x08
    110 #define	MCD_CF_READUPC		0x04
    111 #define	MCD_CF_DMAENABLE	0x02
    112 #define	MCD_CF_BLOCKSIZE	0x01
    113 
    114 /* UPC subcommands */
    115 #define	MCD_UPC_DISABLE		0x00
    116 #define	MCD_UPC_ENABLE		0x01
    117 
    118 /* commands known by the controller */
    119 #define	MCD_CMDRESET		0x00
    120 #define	MCD_CMDGETVOLINFO	0x10	/* gets mcd_volinfo */
    121 #define	MCD_CMDGETDISKINFO	0x11	/* gets mcd_disk */
    122 #define	MCD_CMDGETQCHN		0x20	/* gets mcd_qchninfo */
    123 #define	MCD_CMDGETSENSE		0x30	/* gets sense info */
    124 #define	MCD_CMDGETSTAT		0x40	/* gets a byte of status */
    125 #define	MCD_CMDSETMODE		0x50	/* set transmission mode, needs byte */
    126 #define	MCD_CMDSTOPAUDIO	0x70
    127 #define	MCD_CMDSTOPAUDIOTIME	0x80
    128 #define	MCD_CMDGETVOLUME	0x8E	/* gets mcd_volume */
    129 #define	MCD_CMDCONFIGDRIVE	0x90
    130 #define	MCD_CMDSETDRIVEMODE	0xa0	/* set drive mode */
    131 #define	MCD_CMDSETVOLUME	0xae	/* sets mcd_volume */
    132 #define	MCD_CMDREAD1		0xb0	/* read n sectors */
    133 #define	MCD_CMDREADSINGLESPEED	0xc0	/* read (single speed) */
    134 #define	MCD_CMDREADDOUBLESPEED	0xc1	/* read (double speed) */
    135 #define	MCD_CMDGETDRIVEMODE	0xc2	/* get drive mode */
    136 #define	MCD_CMDREAD3		0xc3	/* ? */
    137 #define	MCD_CMDSETINTERLEAVE	0xc8	/* set interleave for read */
    138 #define	MCD_CMDCONTINFO		0xdc	/* get controller info */
    139 #define	MCD_CMDSTOP		0xf0	/* stop everything */
    140 #define	MCD_CMDEJECTDISK	0xf6
    141 #define	MCD_CMDCLOSETRAY	0xf8
    142 #define	MCD_CMDSETLOCK		0xfe	/* needs byte */
    143 
    144 union mcd_qchninfo {
    145 	struct {
    146 		u_char	control:4;
    147 		u_char	addr_type:4;
    148 		u_char	trk_no;
    149 		u_char	idx_no;
    150 		bcd_t	track_size[3];
    151 		u_char	:8;
    152 		bcd_t	absolute_pos[3];
    153 	} toc;
    154 	struct {
    155 		u_char	control:4;
    156 		u_char	addr_type:4;
    157 		u_char	trk_no;
    158 		u_char	idx_no;
    159 		bcd_t	relative_pos[3];
    160 		u_char	:8;
    161 		bcd_t	absolute_pos[3];
    162 	} current;
    163 	struct {
    164 		u_char	control:4;
    165 		u_char	addr_type:4;
    166 		u_char	upccode[7];
    167 		u_char	junk[2];
    168 	} upc;
    169 };
    170 
    171 struct mcd_volinfo {
    172 	bcd_t	trk_low;
    173 	bcd_t	trk_high;
    174 	bcd_t	vol_msf[3];
    175 	bcd_t	trk1_msf[3];
    176 };
    177 
    178 struct mcd_result {
    179 	u_char	length;
    180 	union {
    181 		struct {
    182 			u_char	data[1];
    183 		} raw;
    184 		struct {
    185 			u_char	code;
    186 			u_char	version;
    187 		} continfo;
    188 		union mcd_qchninfo qchninfo;
    189 		struct mcd_volinfo volinfo;
    190 	} data;
    191 };
    192 
    193 struct mcd_command {
    194 	u_char	opcode;
    195 	u_char	length;
    196 	union {
    197 		struct {
    198 			u_char	data[1];
    199 		} raw;
    200 		struct {
    201 			bcd_t	start_msf[3];
    202 			bcd_t	reserved[3];
    203 		} seek;
    204 		struct {
    205 			bcd_t	start_msf[3];
    206 			bcd_t	length[3];
    207 		} read;
    208 		struct {
    209 			bcd_t	start_msf[3];
    210 			bcd_t	end_msf[3];
    211 		} play;
    212 		struct {
    213 			u_char	mode;
    214 		} datamode;
    215 		struct {
    216 			u_char	time;
    217 		} hold;
    218 		struct {
    219 			u_char	mode;
    220 		} drivemode;
    221 		struct {
    222 			u_char	mode;
    223 		} lockmode;
    224 		struct {
    225 			u_char	subcommand;
    226 			u_char	data1, data2;
    227 		} config;
    228 	} data;
    229 };
    230 
    231 struct mcd_mbox {
    232 	struct mcd_command cmd;
    233 	struct mcd_result res;
    234 };
    235 
    236 struct mcd_volume {
    237 	u_char	v0l;
    238 	u_char	v0rs;
    239 	u_char	v0r;
    240 	u_char	v0ls;
    241 };
    242 
    243 struct mcd_rawsector {
    244 	u_char	sync1[12];
    245 	u_char	header[4];
    246 	u_char	subheader1[4];
    247 	u_char	subheader2[4];
    248 	u_char	data[MCD_BLKSIZE_COOKED];
    249 	u_char	ecc_bits[280];
    250 };
    251 
    252 #if __GNUC__ >= 2
    253 #pragma pack()
    254 #endif
    255