1 #ifndef UAE_BLKDEV_H 2 #define UAE_BLKDEV_H 3 4 #include "uae/types.h" 5 #ifdef FSUAE // NL 6 #include "uae/limits.h" 7 #endif 8 9 #define DEVICE_SCSI_BUFSIZE (65536 - 1024) 10 11 #define SCSI_UNIT_DISABLED -1 12 #define SCSI_UNIT_DEFAULT 0 13 #define SCSI_UNIT_IMAGE 1 14 #define SCSI_UNIT_IOCTL 2 15 #define SCSI_UNIT_SPTI 3 16 17 //#define device_debug write_log 18 #define device_debug 19 20 #define INQ_DASD 0x00 /* Direct-access device (disk) */ 21 #define INQ_SEQD 0x01 /* Sequential-access device (tape) */ 22 #define INQ_PRTD 0x02 /* Printer device */ 23 #define INQ_PROCD 0x03 /* Processor device */ 24 #define INQ_OPTD 0x04 /* Write once device (optical disk) */ 25 #define INQ_WORM 0x04 /* Write once device (optical disk) */ 26 #define INQ_ROMD 0x05 /* CD-ROM device */ 27 #define INQ_SCAN 0x06 /* Scanner device */ 28 #define INQ_OMEM 0x07 /* Optical Memory device */ 29 #define INQ_JUKE 0x08 /* Medium Changer device (jukebox) */ 30 #define INQ_COMM 0x09 /* Communications device */ 31 #define INQ_IT8_1 0x0A /* IT8 */ 32 #define INQ_IT8_2 0x0B /* IT8 */ 33 #define INQ_STARR 0x0C /* Storage array device */ 34 #define INQ_ENCL 0x0D /* Enclosure services device */ 35 #define INQ_NODEV 0x1F /* Unknown or no device */ 36 #define INQ_NOTPR 0x1F /* Logical unit not present (SCSI-1) */ 37 38 #define MAX_TOC_ENTRIES 103 39 struct cd_toc 40 { 41 uae_u8 adr, control; 42 uae_u8 tno; 43 uae_u8 point; 44 uae_u8 track; 45 int address; // LSN 46 int paddress; // LSN 47 uae_u8 zero; 48 uae_u8 crc[2]; 49 }; 50 struct cd_toc_head 51 { 52 int first_track, first_track_offset; 53 int last_track, last_track_offset; 54 int firstaddress; // LSN 55 int lastaddress; // LSN 56 int tracks; 57 int points; 58 struct cd_toc toc[MAX_TOC_ENTRIES]; 59 }; 60 61 #define SUB_ENTRY_SIZE 12 62 #define SUB_CHANNEL_SIZE 96 63 #define SUBQ_SIZE (4 + 12) 64 65 #define AUDIO_STATUS_NOT_SUPPORTED 0x00 66 #define AUDIO_STATUS_IN_PROGRESS 0x11 67 #define AUDIO_STATUS_PAUSED 0x12 68 #define AUDIO_STATUS_PLAY_COMPLETE 0x13 69 #define AUDIO_STATUS_PLAY_ERROR 0x14 70 #define AUDIO_STATUS_NO_STATUS 0x15 71 72 struct device_info { 73 bool open; 74 int type; 75 int media_inserted; 76 int removable; 77 int write_protected; 78 int cylinders; 79 int trackspercylinder; 80 int sectorspertrack; 81 int bytespersector; 82 int bus, target, lun; 83 int unitnum; 84 TCHAR label[MAX_DPATH]; 85 TCHAR mediapath[MAX_DPATH]; 86 TCHAR vendorid[10]; 87 TCHAR productid[18]; 88 TCHAR revision[6]; 89 const TCHAR *backend; 90 struct cd_toc_head toc; 91 TCHAR system_id[33]; 92 TCHAR volume_id[33]; 93 }; 94 95 struct amigascsi 96 { 97 uae_u8 *data; 98 uae_s32 len; 99 uae_u8 cmd[16]; 100 uae_s32 cmd_len; 101 uae_u8 flags; 102 uae_u8 sensedata[256]; 103 uae_u16 sense_len; 104 uae_u16 cmdactual; 105 uae_u8 status; 106 uae_u16 actual; 107 uae_u16 sactual; 108 }; 109 110 typedef int (*check_bus_func)(int flags); 111 typedef int (*open_bus_func)(int flags); 112 typedef void (*close_bus_func)(void); 113 typedef int (*open_device_func)(int, const TCHAR*, int); 114 typedef void (*close_device_func)(int); 115 typedef struct device_info* (*info_device_func)(int, struct device_info*, int, int); 116 typedef uae_u8* (*execscsicmd_out_func)(int, uae_u8*, int); 117 typedef uae_u8* (*execscsicmd_in_func)(int, uae_u8*, int, int*); 118 typedef int (*execscsicmd_direct_func)(int, struct amigascsi*); 119 120 typedef void (*play_subchannel_callback)(uae_u8*, int); 121 typedef int (*play_status_callback)(int); 122 123 typedef int (*pause_func)(int, int); 124 typedef int (*stop_func)(int); 125 typedef int (*play_func)(int, int, int, int, play_status_callback, play_subchannel_callback); 126 typedef uae_u32 (*volume_func)(int, uae_u16, uae_u16); 127 typedef int (*qcode_func)(int, uae_u8*, int); 128 typedef int (*toc_func)(int, struct cd_toc_head*); 129 typedef int (*read_func)(int, uae_u8*, int, int); 130 typedef int (*rawread_func)(int, uae_u8*, int, int, int, uae_u32); 131 typedef int (*write_func)(int, uae_u8*, int, int); 132 typedef int (*isatapi_func)(int); 133 typedef int (*ismedia_func)(int, int); 134 typedef int (*scsiemu_func)(int, uae_u8*); 135 136 struct device_functions { 137 const TCHAR *name; 138 open_bus_func openbus; 139 close_bus_func closebus; 140 open_device_func opendev; 141 close_device_func closedev; 142 info_device_func info; 143 execscsicmd_out_func exec_out; 144 execscsicmd_in_func exec_in; 145 execscsicmd_direct_func exec_direct; 146 147 pause_func pause; 148 stop_func stop; 149 play_func play; 150 volume_func volume; 151 qcode_func qcode; 152 toc_func toc; 153 read_func read; 154 rawread_func rawread; 155 write_func write; 156 157 isatapi_func isatapi; 158 ismedia_func ismedia; 159 160 scsiemu_func scsiemu; 161 162 }; 163 164 extern int device_func_init(int flags); 165 extern void device_func_reset(void); 166 extern int sys_command_open (int unitnum); 167 extern int sys_command_open_tape (int unitnum, const TCHAR *tape_directory, bool readonly); 168 extern void sys_command_close (int unitnum); 169 extern int sys_command_isopen (int unitnum); 170 extern struct device_info *sys_command_info (int unitnum, struct device_info *di, int); 171 extern int sys_command_cd_pause (int unitnum, int paused); 172 extern void sys_command_cd_stop (int unitnum); 173 extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int); 174 extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int scan, play_status_callback statusfunc, play_subchannel_callback subfunc); 175 extern uae_u32 sys_command_cd_volume (int unitnum, uae_u16 volume_left, uae_u16 volume_right); 176 extern int sys_command_cd_qcode (int unitnum, uae_u8*); 177 extern int sys_command_cd_toc (int unitnum, struct cd_toc_head*); 178 extern int sys_command_cd_read (int unitnum, uae_u8 *data, int block, int size); 179 extern int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize); 180 int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize, uae_u8 sectortype, uae_u8 scsicmd9, uae_u8 subs); 181 extern int sys_command_read (int unitnum, uae_u8 *data, int block, int size); 182 extern int sys_command_write (int unitnum, uae_u8 *data, int block, int size); 183 extern int sys_command_scsi_direct_native (int unitnum, int type, struct amigascsi *as); 184 extern int sys_command_scsi_direct (int unitnum, int type, uaecptr request); 185 extern int sys_command_ismedia (int unitnum, int quick); 186 extern struct device_info *sys_command_info_session (int unitnum, struct device_info *di, int, int); 187 extern bool blkdev_get_info (struct uae_prefs *p, int unitnum, struct device_info *di); 188 189 extern void scsi_atapi_fixup_pre (uae_u8 *scsi_cmd, int *len, uae_u8 **data, int *datalen, int *parm); 190 extern void scsi_atapi_fixup_post (uae_u8 *scsi_cmd, int len, uae_u8 *olddata, uae_u8 *data, int *datalen, int parm); 191 192 extern void scsi_log_before (uae_u8 *cdb, int cdblen, uae_u8 *data, int datalen); 193 extern void scsi_log_after (uae_u8 *data, int datalen, uae_u8 *sense, int senselen); 194 195 extern int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, 196 uae_u8 *scsi_data, int *data_len, uae_u8 *r, int *reply_len, uae_u8 *s, int *sense_len, bool atapi); 197 198 extern void blkdev_vsync (void); 199 extern void restore_blkdev_start(void); 200 201 extern int msf2lsn (int msf); 202 extern int lsn2msf (int lsn); 203 extern uae_u8 frombcd (uae_u8 v); 204 extern uae_u8 tobcd (uae_u8 v); 205 extern int fromlongbcd (uae_u8 *p); 206 extern void tolongbcd (uae_u8 *p, int v); 207 208 extern void blkdev_default_prefs (struct uae_prefs *p); 209 extern void blkdev_fix_prefs (struct uae_prefs *p); 210 extern int isaudiotrack (struct cd_toc_head*, int block); 211 extern int isdatatrack (struct cd_toc_head*, int block); 212 void sub_to_interleaved (const uae_u8 *s, uae_u8 *d); 213 void sub_to_deinterleaved (const uae_u8 *s, uae_u8 *d); 214 215 enum cd_standard_unit { CD_STANDARD_UNIT_DEFAULT, CD_STANDARD_UNIT_AUDIO, CD_STANDARD_UNIT_CDTV, CD_STANDARD_UNIT_CD32 }; 216 217 extern int get_standard_cd_unit (enum cd_standard_unit csu); 218 extern void close_standard_cd_unit (int); 219 extern void blkdev_cd_change (int unitnum, const TCHAR *name); 220 221 extern void blkdev_entergui (void); 222 extern void blkdev_exitgui (void); 223 224 bool filesys_do_disk_change (int, bool); 225 226 extern struct device_functions devicefunc_scsi_ioctl; 227 extern struct device_functions devicefunc_scsi_spti; 228 extern struct device_functions devicefunc_cdimage; 229 230 #endif /* UAE_BLKDEV_H */ 231