Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Definitions for a Sanyo CD-ROM interface. |
| 3 | * |
| 4 | * Copyright (C) 1995 Vadim V. Model |
| 5 | * model@cecmow.enet.dec.com |
| 6 | * vadim@rbrf.msk.su |
| 7 | * vadim@ipsun.ras.ru |
| 8 | * Eric van der Maarel |
| 9 | * H.T.M.v.d.Maarel@marin.nl |
| 10 | * |
| 11 | * This information is based on mcd.c from M. Harriss and sjcd102.lst from |
| 12 | * E. Moenkeberg. |
| 13 | * |
| 14 | * This program is free software; you can redistribute it and/or modify |
| 15 | * it under the terms of the GNU General Public License as published by |
| 16 | * the Free Software Foundation; either version 2 of the License, or |
| 17 | * (at your option) any later version. |
| 18 | * |
| 19 | * This program is distributed in the hope that it will be useful, |
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 22 | * GNU General Public License for more details. |
| 23 | * |
| 24 | * You should have received a copy of the GNU General Public License |
| 25 | * along with this program; if not, write to the Free Software |
| 26 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 27 | */ |
| 28 | |
| 29 | #ifndef __SJCD_H__ |
| 30 | #define __SJCD_H__ |
| 31 | |
| 32 | /* |
| 33 | * Change this to set the I/O port address as default. More flexibility |
| 34 | * come with setup implementation. |
| 35 | */ |
| 36 | #define SJCD_BASE_ADDR 0x340 |
| 37 | |
| 38 | /* |
| 39 | * Change this to set the irq as default. Really SANYO do not use interrupts |
| 40 | * at all. |
| 41 | */ |
| 42 | #define SJCD_INTR_NR 0 |
| 43 | |
| 44 | /* |
| 45 | * Change this to set the dma as default value. really SANYO does not use |
| 46 | * direct memory access at all. |
| 47 | */ |
| 48 | #define SJCD_DMA_NR 0 |
| 49 | |
| 50 | /* |
| 51 | * Macros which allow us to find out the status of the drive. |
| 52 | */ |
| 53 | #define SJCD_STATUS_AVAILABLE( x ) (((x)&0x02)==0) |
| 54 | #define SJCD_DATA_AVAILABLE( x ) (((x)&0x01)==0) |
| 55 | |
| 56 | /* |
| 57 | * Port access macro. Three ports are available: S-data port (command port), |
| 58 | * status port (read only) and D-data port (read only). |
| 59 | */ |
| 60 | #define SJCDPORT( x ) ( sjcd_base + ( x ) ) |
| 61 | #define SJCD_STATUS_PORT SJCDPORT( 1 ) |
| 62 | #define SJCD_S_DATA_PORT SJCDPORT( 0 ) |
| 63 | #define SJCD_COMMAND_PORT SJCDPORT( 0 ) |
| 64 | #define SJCD_D_DATA_PORT SJCDPORT( 2 ) |
| 65 | |
| 66 | /* |
| 67 | * Drive info bits. Drive info available as first (mandatory) byte of |
| 68 | * command completion status. |
| 69 | */ |
| 70 | #define SST_NOT_READY 0x10 /* no disk in the drive (???) */ |
| 71 | #define SST_MEDIA_CHANGED 0x20 /* disk is changed */ |
| 72 | #define SST_DOOR_OPENED 0x40 /* door is open */ |
| 73 | |
| 74 | /* commands */ |
| 75 | |
| 76 | #define SCMD_EJECT_TRAY 0xD0 /* eject tray if not locked */ |
| 77 | #define SCMD_LOCK_TRAY 0xD2 /* lock tray when in */ |
| 78 | #define SCMD_UNLOCK_TRAY 0xD4 /* unlock tray when in */ |
| 79 | #define SCMD_CLOSE_TRAY 0xD6 /* load tray in */ |
| 80 | |
| 81 | #define SCMD_RESET 0xFA /* soft reset */ |
| 82 | #define SCMD_GET_STATUS 0x80 |
| 83 | #define SCMD_GET_VERSION 0xCC |
| 84 | |
| 85 | #define SCMD_DATA_READ 0xA0 /* are the same, depend on mode&args */ |
| 86 | #define SCMD_SEEK 0xA0 |
| 87 | #define SCMD_PLAY 0xA0 |
| 88 | |
| 89 | #define SCMD_GET_QINFO 0xA8 |
| 90 | |
| 91 | #define SCMD_SET_MODE 0xC4 |
| 92 | #define SCMD_MODE_PLAY 0xE0 |
| 93 | #define SCMD_MODE_COOKED (0xF8 & ~0x20) |
| 94 | #define SCMD_MODE_RAW 0xF9 |
| 95 | #define SCMD_MODE_x20_BIT 0x20 /* What is it for ? */ |
| 96 | |
| 97 | #define SCMD_SET_VOLUME 0xAE |
| 98 | #define SCMD_PAUSE 0xE0 |
| 99 | #define SCMD_STOP 0xE0 |
| 100 | |
| 101 | #define SCMD_GET_DISK_INFO 0xAA |
| 102 | |
| 103 | /* |
| 104 | * Some standard arguments for SCMD_GET_DISK_INFO. |
| 105 | */ |
| 106 | #define SCMD_GET_1_TRACK 0xA0 /* get the first track information */ |
| 107 | #define SCMD_GET_L_TRACK 0xA1 /* get the last track information */ |
| 108 | #define SCMD_GET_D_SIZE 0xA2 /* get the whole disk information */ |
| 109 | |
| 110 | /* |
| 111 | * Borrowed from hd.c. Allows to optimize multiple port read commands. |
| 112 | */ |
| 113 | #define S_READ_DATA( port, buf, nr ) insb( port, buf, nr ) |
| 114 | |
| 115 | /* |
| 116 | * We assume that there are no audio disks with TOC length more than this |
| 117 | * number (I personally have never seen disks with more than 20 fragments). |
| 118 | */ |
| 119 | #define SJCD_MAX_TRACKS 100 |
| 120 | |
| 121 | struct msf { |
| 122 | unsigned char min; |
| 123 | unsigned char sec; |
| 124 | unsigned char frame; |
| 125 | }; |
| 126 | |
| 127 | struct sjcd_hw_disk_info { |
| 128 | unsigned char track_control; |
| 129 | unsigned char track_no; |
| 130 | unsigned char x, y, z; |
| 131 | union { |
| 132 | unsigned char track_no; |
| 133 | struct msf track_msf; |
| 134 | } un; |
| 135 | }; |
| 136 | |
| 137 | struct sjcd_hw_qinfo { |
| 138 | unsigned char track_control; |
| 139 | unsigned char track_no; |
| 140 | unsigned char x; |
| 141 | struct msf rel; |
| 142 | struct msf abs; |
| 143 | }; |
| 144 | |
| 145 | struct sjcd_play_msf { |
| 146 | struct msf start; |
| 147 | struct msf end; |
| 148 | }; |
| 149 | |
| 150 | struct sjcd_disk_info { |
| 151 | unsigned char first; |
| 152 | unsigned char last; |
| 153 | struct msf disk_length; |
| 154 | struct msf first_track; |
| 155 | }; |
| 156 | |
| 157 | struct sjcd_toc { |
| 158 | unsigned char ctrl_addr; |
| 159 | unsigned char track; |
| 160 | unsigned char point_index; |
| 161 | struct msf track_time; |
| 162 | struct msf disk_time; |
| 163 | }; |
| 164 | |
| 165 | #if defined( SJCD_GATHER_STAT ) |
| 166 | |
| 167 | struct sjcd_stat { |
| 168 | int ticks; |
| 169 | int tticks[ 8 ]; |
| 170 | int idle_ticks; |
| 171 | int start_ticks; |
| 172 | int mode_ticks; |
| 173 | int read_ticks; |
| 174 | int data_ticks; |
| 175 | int stop_ticks; |
| 176 | int stopping_ticks; |
| 177 | }; |
| 178 | |
| 179 | #endif |
| 180 | |
| 181 | #endif |