17332Sjkh/*-
27332Sjkh * Copyright (c) 1995 Mikael Hybsch
37332Sjkh * All rights reserved.
47332Sjkh *
57332Sjkh * Redistribution and use in source and binary forms, with or without
67332Sjkh * modification, are permitted provided that the following conditions
77332Sjkh * are met:
87332Sjkh * 1. Redistributions of source code must retain the above copyright
97332Sjkh *    notice, this list of conditions and the following disclaimer
107332Sjkh *    in this position and unchanged.
117332Sjkh * 2. Redistributions in binary form must reproduce the above copyright
127332Sjkh *    notice, this list of conditions and the following disclaimer in the
137332Sjkh *    documentation and/or other materials provided with the distribution.
147332Sjkh * 3. The name of the author may not be used to endorse or promote products
1513765Smpp *    derived from this software without specific prior written permission
167332Sjkh *
177332Sjkh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
187332Sjkh * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
197332Sjkh * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
207332Sjkh * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
217332Sjkh * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
227332Sjkh * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237332Sjkh * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247332Sjkh * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257332Sjkh * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
267332Sjkh * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277332Sjkh *
2850477Speter * $FreeBSD$
297332Sjkh *
307332Sjkh */
317332Sjkh
327332Sjkh#ifndef SCD_H
337332Sjkh#define	SCD_H
347332Sjkh
357332Sjkhtypedef unsigned char	bcd_t;
367332Sjkh#define	M_msf(msf)	msf[0]
377332Sjkh#define	S_msf(msf)	msf[1]
387332Sjkh#define	F_msf(msf)	msf[2]
397332Sjkh
407332Sjkh#define OREG_COMMAND	0
417332Sjkh#define OREG_WPARAMS	1
427332Sjkh#define OREG_CONTROL	3
437332Sjkh#define CBIT_ATTENTION_CLEAR		0x01
447332Sjkh#define CBIT_RESULT_READY_CLEAR		0x02
457332Sjkh#define CBIT_DATA_READY_CLEAR		0x04
467332Sjkh#define CBIT_RPARAM_CLEAR		0x40
477332Sjkh#define CBIT_RESET_DRIVE		0x80
487332Sjkh
497332Sjkh#define IREG_STATUS  0
507332Sjkh#define SBIT_ATTENTION		0x01
517332Sjkh#define SBIT_RESULT_READY	0x02
527332Sjkh#define SBIT_DATA_READY		0x04
537332Sjkh#define SBIT_BUSY		0x80
547332Sjkh
557332Sjkh#define IREG_RESULT		1
567332Sjkh#define IREG_DATA		2
577332Sjkh#define IREG_FSTATUS		3
587332Sjkh#define FBIT_WPARAM_READY	0x01
597332Sjkh
607332Sjkh#define CMD_GET_DRIVE_CONFIG	0x00
617332Sjkh#define CMD_SET_DRIVE_PARAM	0x10
627332Sjkh#define CMD_GET_SUBCHANNEL_DATA	0x21
637332Sjkh#define CMD_GET_TOC		0x24
647332Sjkh#define CMD_READ_TOC		0x30
657332Sjkh#define CMD_READ		0x34
667332Sjkh#define CMD_PLAY_AUDIO		0x40
677332Sjkh#define CMD_STOP_AUDIO		0x41
687332Sjkh#define CMD_EJECT		0x50
697332Sjkh#define CMD_SPIN_UP		0x51
707332Sjkh#define CMD_SPIN_DOWN		0x52
717332Sjkh
727332Sjkh#define ERR_CD_NOT_LOADED	0x20
737332Sjkh#define ERR_NO_CD_INSIDE	0x21
747332Sjkh#define ERR_NOT_SPINNING	0x22
757332Sjkh#define ERR_FATAL_READ_ERROR1	0x53
767332Sjkh#define ERR_FATAL_READ_ERROR2	0x57
777332Sjkh
787332Sjkh#define ATTEN_DRIVE_LOADED	0x80
797332Sjkh#define ATTEN_EJECT_PUSHED	0x81
807332Sjkh#define ATTEN_AUDIO_DONE	0x90
817332Sjkh#define ATTEN_SPIN_UP_DONE	0x24
827332Sjkh#define ATTEN_SPIN_DOWN		0x27
837332Sjkh#define ATTEN_EJECT_DONE	0x28
847332Sjkh
857332Sjkh
867332Sjkhstruct sony_drive_configuration {
877332Sjkh	char vendor[8];
887332Sjkh	char product[16];
897332Sjkh	char revision[8];
907332Sjkh	u_short config;
91143063Sjoerg} __packed;
927332Sjkh
937332Sjkh/* Almost same as cd_sub_channel_position_data */
947332Sjkhstruct sony_subchannel_position_data {
957332Sjkh	u_char	control:4;
967332Sjkh	u_char	addr_type:4;
977332Sjkh	u_char	track_number;
987332Sjkh	u_char	index_number;
997332Sjkh	u_char	rel_msf[3];
1007332Sjkh	u_char	dummy;
1017332Sjkh	u_char	abs_msf[3];
102143063Sjoerg} __packed;
1037332Sjkh
1047332Sjkhstruct sony_tracklist {
1057332Sjkh	u_char adr :4; /* xcdplayer needs these two values */
1067332Sjkh	u_char ctl :4;
1077332Sjkh	u_char track;
1087332Sjkh	u_char start_msf[3];
109143063Sjoerg} __packed;
1107332Sjkh
1117332Sjkh#define MAX_TRACKS 100
1127332Sjkh
1137332Sjkhstruct sony_toc {
1147332Sjkh	u_char session_number;
1157332Sjkh
1167332Sjkh	u_char :8;
1177332Sjkh	u_char :8;
1187332Sjkh	u_char first_track;
1197332Sjkh	u_char :8;
1207332Sjkh	u_char :8;
1217332Sjkh
1227332Sjkh	u_char :8;
1237332Sjkh	u_char :8;
1247332Sjkh	u_char last_track;
1257332Sjkh	u_char :8;
1267332Sjkh	u_char :8;
1277332Sjkh
1287332Sjkh	u_char :8;
1297332Sjkh	u_char :8;
1307332Sjkh	u_char lead_out_start_msf[3];
1317332Sjkh
1327332Sjkh	struct sony_tracklist tracks[MAX_TRACKS];
1337332Sjkh
1347332Sjkh	/* The rest is just to take space in case all data is returned */
1357332Sjkh
1367332Sjkh	u_char dummy[6*9];
137143063Sjoerg} __packed;
1387332Sjkh
1397332Sjkh#endif /* SCD_H */
140