474 lines
14 KiB
C
474 lines
14 KiB
C
|
/*
|
||
|
* sbpcd.h Specify interface address and interface type here.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* these definitions can get overridden by the kernel command line
|
||
|
* ("lilo boot option"). Examples:
|
||
|
* sbpcd=0x230,SoundBlaster
|
||
|
* or
|
||
|
* sbpcd=0x300,LaserMate
|
||
|
* these strings are case sensitive !!!
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* change this to select the type of your interface board:
|
||
|
*
|
||
|
* set SBPRO to 1 for "true" SoundBlaster card
|
||
|
* set SBPRO to 0 for "poor" (no sound) interface cards
|
||
|
* and for "compatible" soundcards.
|
||
|
*
|
||
|
* most "compatible" sound boards like Galaxy need to set SBPRO to 0 !!!
|
||
|
* if SBPRO gets set wrong, the drive will get found - but any
|
||
|
* data access will give errors (audio access will work).
|
||
|
* The OmniCD interface card from CreativeLabs needs SBPRO 1.
|
||
|
*
|
||
|
* mail to emoenke@gwdg.de if your "compatible" card needs SBPRO 1
|
||
|
* (currently I do not know any "compatible" with SBPRO 1)
|
||
|
* then I can include better information with the next release.
|
||
|
*/
|
||
|
#define SBPRO 1
|
||
|
|
||
|
/*
|
||
|
* put your CDROM port base address here:
|
||
|
* SBPRO addresses typically are 0x0230 (=0x220+0x10), 0x0250, ...
|
||
|
* LASERMATE (CI-101P) adresses typically are 0x0300, 0x0310, ...
|
||
|
* there are some soundcards on the market with 0x0630, 0x0650, ...
|
||
|
*
|
||
|
* obey! changed against v0.4 !!!
|
||
|
* for SBPRO cards, specify the CDROM address - no longer the audio address!
|
||
|
* example: if your SBPRO audio address is 0x220, specify 0x230.
|
||
|
*
|
||
|
* a fill-in is not always necessary - the driver does auto-probing now,
|
||
|
* with the here specified address first...
|
||
|
*/
|
||
|
#define CDROM_PORT 0x0230
|
||
|
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
/*==========================================================================*/
|
||
|
/*
|
||
|
* nothing to change below here if you are not experimenting
|
||
|
*/
|
||
|
/*==========================================================================*/
|
||
|
/*==========================================================================*/
|
||
|
/*
|
||
|
* Debug output levels
|
||
|
*/
|
||
|
#define DBG_INF 1 /* necessary information */
|
||
|
#define DBG_IRQ 2 /* interrupt trace */
|
||
|
#define DBG_REA 3 /* "read" status trace */
|
||
|
#define DBG_CHK 4 /* "media check" trace */
|
||
|
#define DBG_TIM 5 /* datarate timer test */
|
||
|
#define DBG_INI 6 /* initialization trace */
|
||
|
#define DBG_TOC 7 /* tell TocEntry values */
|
||
|
#define DBG_IOC 8 /* ioctl trace */
|
||
|
#define DBG_STA 9 /* "ResponseStatus" trace */
|
||
|
#define DBG_ERR 10 /* "xx_ReadError" trace */
|
||
|
#define DBG_CMD 11 /* "cmd_out" trace */
|
||
|
#define DBG_WRN 12 /* give explanation before auto-probing */
|
||
|
#define DBG_MUL 13 /* multi session code test */
|
||
|
#define DBG_ID 14 /* "drive_id !=0" test code */
|
||
|
#define DBG_IOX 15 /* some special information */
|
||
|
#define DBG_DID 16 /* drive ID test */
|
||
|
#define DBG_RES 17 /* drive reset info */
|
||
|
#define DBG_SPI 18 /* SpinUp test */
|
||
|
#define DBG_000 19 /* unnecessary information */
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
/*==========================================================================*/
|
||
|
|
||
|
/*
|
||
|
* bits of flags_cmd_out:
|
||
|
*/
|
||
|
#define f_respo3 0x100
|
||
|
#define f_putcmd 0x80
|
||
|
#define f_respo2 0x40
|
||
|
#define f_lopsta 0x20
|
||
|
#define f_getsta 0x10
|
||
|
#define f_ResponseStatus 0x08
|
||
|
#define f_obey_p_check 0x04
|
||
|
#define f_bit1 0x02
|
||
|
#define f_wait_if_busy 0x01
|
||
|
|
||
|
/*
|
||
|
* diskstate_flags:
|
||
|
*/
|
||
|
#define upc_bit 0x40
|
||
|
#define volume_bit 0x20
|
||
|
#define toc_bit 0x10
|
||
|
#define multisession_bit 0x08
|
||
|
#define cd_size_bit 0x04
|
||
|
#define subq_bit 0x02
|
||
|
#define frame_size_bit 0x01
|
||
|
|
||
|
/*
|
||
|
* disk states (bits of diskstate_flags):
|
||
|
*/
|
||
|
#define upc_valid (DS[d].diskstate_flags&upc_bit)
|
||
|
#define volume_valid (DS[d].diskstate_flags&volume_bit)
|
||
|
#define toc_valid (DS[d].diskstate_flags&toc_bit)
|
||
|
#define multisession_valid (DS[d].diskstate_flags&multisession_bit)
|
||
|
#define cd_size_valid (DS[d].diskstate_flags&cd_size_bit)
|
||
|
#define subq_valid (DS[d].diskstate_flags&subq_bit)
|
||
|
#define frame_size_valid (DS[d].diskstate_flags&frame_size_bit)
|
||
|
|
||
|
|
||
|
/*
|
||
|
* bits of the status_byte (result of xx_ReadStatus):
|
||
|
*/
|
||
|
#define p_door_closed 0x80
|
||
|
#define p_caddy_in 0x40
|
||
|
#define p_spinning 0x20
|
||
|
#define p_check 0x10
|
||
|
#define p_busy_new 0x08
|
||
|
#define p_door_locked 0x04
|
||
|
#define p_bit_1 0x02
|
||
|
#define p_disk_ok 0x01
|
||
|
/*
|
||
|
* "old" drives status result bits:
|
||
|
*/
|
||
|
#define p_caddin_old 0x40
|
||
|
#define p_success_old 0x08
|
||
|
#define p_busy_old 0x04
|
||
|
|
||
|
/*
|
||
|
* used drive states:
|
||
|
*/
|
||
|
#define st_door_closed (DS[d].status_byte&p_door_closed)
|
||
|
#define st_caddy_in (DS[d].status_byte&p_caddy_in)
|
||
|
#define st_spinning (DS[d].status_byte&p_spinning)
|
||
|
#define st_check (DS[d].status_byte&p_check)
|
||
|
#define st_busy (DS[d].status_byte&p_busy_new)
|
||
|
#define st_door_locked (DS[d].status_byte&p_door_locked)
|
||
|
#define st_diskok (DS[d].status_byte&p_disk_ok)
|
||
|
|
||
|
/*
|
||
|
* bits of the CDi_status register:
|
||
|
*/
|
||
|
#define s_not_result_ready 0x04 /* 0: "result ready" */
|
||
|
#define s_not_data_ready 0x02 /* 0: "data ready" */
|
||
|
#define s_attention 0x01 /* 1: "attention required" */
|
||
|
/*
|
||
|
* usable as:
|
||
|
*/
|
||
|
#define DRV_ATTN ((inb(CDi_status)&s_attention)!=0)
|
||
|
#define DATA_READY ((inb(CDi_status)&s_not_data_ready)==0)
|
||
|
#define RESULT_READY ((inb(CDi_status)&s_not_result_ready)==0)
|
||
|
|
||
|
/*
|
||
|
* drive types (firmware versions):
|
||
|
*/
|
||
|
#define drv_199 0 /* <200 */
|
||
|
#define drv_200 1 /* <201 */
|
||
|
#define drv_201 2 /* <210 */
|
||
|
#define drv_210 3 /* <211 */
|
||
|
#define drv_211 4 /* <300 */
|
||
|
#define drv_300 5 /* else */
|
||
|
#define drv_099 0x10 /* new, <100 */
|
||
|
#define drv_100 0x11 /* new, >=100 */
|
||
|
#define drv_new 0x10 /* all new drives have that bit set */
|
||
|
#define drv_old 0x00 /* */
|
||
|
|
||
|
/*
|
||
|
* drv_099 and drv_100 are the "new" drives
|
||
|
*/
|
||
|
#define new_drive (DS[d].drv_type&0x10)
|
||
|
|
||
|
/*
|
||
|
* audio states:
|
||
|
*/
|
||
|
#define audio_playing 2
|
||
|
#define audio_pausing 1
|
||
|
|
||
|
/*
|
||
|
* drv_pattern, drv_options:
|
||
|
*/
|
||
|
#define speed_auto 0x80
|
||
|
#define speed_300 0x40
|
||
|
#define speed_150 0x20
|
||
|
#define sax_a 0x04
|
||
|
#define sax_xn2 0x02
|
||
|
#define sax_xn1 0x01
|
||
|
|
||
|
/*
|
||
|
* values of cmd_type (0 else):
|
||
|
*/
|
||
|
#define cmd_type_READ_M1 0x01 /* "data mode 1": 2048 bytes per frame */
|
||
|
#define cmd_type_READ_M2 0x02 /* "data mode 2": 12+2048+280 bytes per frame */
|
||
|
#define cmd_type_READ_SC 0x04 /* "subchannel info": 96 bytes per frame */
|
||
|
|
||
|
/*
|
||
|
* sense byte: used only if new_drive
|
||
|
* only during cmd 09 00 xx ah al 00 00
|
||
|
*
|
||
|
* values: 00
|
||
|
* 82
|
||
|
* xx from infobuf[0] after 85 00 00 00 00 00 00
|
||
|
*/
|
||
|
|
||
|
|
||
|
#define CD_MINS 75 /* minutes per CD */
|
||
|
#define CD_SECS 60 /* seconds per minutes */
|
||
|
#define CD_FRAMES 75 /* frames per second */
|
||
|
#define CD_FRAMESIZE 2048 /* bytes per frame, data mode */
|
||
|
#define CD_FRAMESIZE_XA 2340 /* bytes per frame, "xa" mode */
|
||
|
#define CD_FRAMESIZE_RAW 2352 /* bytes per frame, "raw" mode */
|
||
|
#define CD_BLOCK_OFFSET 150 /* offset of first logical frame */
|
||
|
|
||
|
|
||
|
/* audio status (bin) */
|
||
|
#define aud_00 0x00 /* Audio status byte not supported or not valid */
|
||
|
#define audx11 0x0b /* Audio play operation in progress */
|
||
|
#define audx12 0x0c /* Audio play operation paused */
|
||
|
#define audx13 0x0d /* Audio play operation successfully completed */
|
||
|
#define audx14 0x0e /* Audio play operation stopped due to error */
|
||
|
#define audx15 0x0f /* No current audio status to return */
|
||
|
|
||
|
/* audio status (bcd) */
|
||
|
#define aud_11 0x11 /* Audio play operation in progress */
|
||
|
#define aud_12 0x12 /* Audio play operation paused */
|
||
|
#define aud_13 0x13 /* Audio play operation successfully completed */
|
||
|
#define aud_14 0x14 /* Audio play operation stopped due to error */
|
||
|
#define aud_15 0x15 /* No current audio status to return */
|
||
|
|
||
|
/*============================================================================
|
||
|
==============================================================================
|
||
|
|
||
|
COMMAND SET of "old" drives like CR-521, CR-522
|
||
|
(the CR-562 family is different):
|
||
|
|
||
|
No. Command Code
|
||
|
--------------------------------------------
|
||
|
|
||
|
Drive Commands:
|
||
|
1 Seek 01
|
||
|
2 Read Data 02
|
||
|
3 Read XA-Data 03
|
||
|
4 Read Header 04
|
||
|
5 Spin Up 05
|
||
|
6 Spin Down 06
|
||
|
7 Diagnostic 07
|
||
|
8 Read UPC 08
|
||
|
9 Read ISRC 09
|
||
|
10 Play Audio 0A
|
||
|
11 Play Audio MSF 0B
|
||
|
12 Play Audio Track/Index 0C
|
||
|
|
||
|
Status Commands:
|
||
|
13 Read Status 81
|
||
|
14 Read Error 82
|
||
|
15 Read Drive Version 83
|
||
|
16 Mode Select 84
|
||
|
17 Mode Sense 85
|
||
|
18 Set XA Parameter 86
|
||
|
19 Read XA Parameter 87
|
||
|
20 Read Capacity 88
|
||
|
21 Read SUB_Q 89
|
||
|
22 Read Disc Code 8A
|
||
|
23 Read Disc Information 8B
|
||
|
24 Read TOC 8C
|
||
|
25 Pause/Resume 8D
|
||
|
26 Read Packet 8E
|
||
|
27 Read Path Check 00
|
||
|
|
||
|
|
||
|
all numbers (lba, msf-bin, msf-bcd, counts) to transfer high byte first
|
||
|
|
||
|
mnemo 7-byte command #bytes response (r0...rn)
|
||
|
________ ____________________ ____
|
||
|
|
||
|
Read Status:
|
||
|
status: 81. (1) one-byte command, gives the main
|
||
|
status byte
|
||
|
Read Error:
|
||
|
check1: 82 00 00 00 00 00 00. (6) r1: audio status
|
||
|
|
||
|
Read Packet:
|
||
|
check2: 8e xx 00 00 00 00 00. (xx) gets xx bytes response, relating
|
||
|
to commands 01 04 05 07 08 09
|
||
|
|
||
|
Play Audio:
|
||
|
play: 0a ll-bb-aa nn-nn-nn. (0) play audio, ll-bb-aa: starting block (lba),
|
||
|
nn-nn-nn: #blocks
|
||
|
Play Audio MSF:
|
||
|
0b mm-ss-ff mm-ss-ff (0) play audio from/to
|
||
|
|
||
|
Play Audio Track/Index:
|
||
|
0c ...
|
||
|
|
||
|
Pause/Resume:
|
||
|
pause: 8d pr 00 00 00 00 00. (0) pause (pr=00)
|
||
|
resume (pr=80) audio playing
|
||
|
|
||
|
Mode Select:
|
||
|
84 00 nn-nn ??-?? 00 (0) nn-nn: 2048 or 2340
|
||
|
possibly defines transfer size
|
||
|
|
||
|
set_vol: 84 83 00 00 sw le 00. (0) sw(itch): lrxxxxxx (off=1)
|
||
|
le(vel): min=0, max=FF, else half
|
||
|
(firmware 2.11)
|
||
|
|
||
|
Mode Sense:
|
||
|
get_vol: 85 03 00 00 00 00 00. (2) tell current audio volume setting
|
||
|
|
||
|
Read Disc Information:
|
||
|
tocdesc: 8b 00 00 00 00 00 00. (6) read the toc descriptor ("msf-bin"-format)
|
||
|
|
||
|
Read TOC:
|
||
|
tocent: 8c fl nn 00 00 00 00. (8) read toc entry #nn
|
||
|
(fl=0:"lba"-, =2:"msf-bin"-format)
|
||
|
|
||
|
Read Capacity:
|
||
|
capacit: 88 00 00 00 00 00 00. (5) "read CD-ROM capacity"
|
||
|
|
||
|
|
||
|
Read Path Check:
|
||
|
ping: 00 00 00 00 00 00 00. (2) r0=AA, r1=55
|
||
|
("ping" if the drive is connected)
|
||
|
|
||
|
Read Drive Version:
|
||
|
ident: 83 00 00 00 00 00 00. (12) gives "MATSHITAn.nn"
|
||
|
(n.nn = 2.01, 2.11., 3.00, ...)
|
||
|
|
||
|
Seek:
|
||
|
seek: 01 00 ll-bb-aa 00 00. (0)
|
||
|
seek: 01 02 mm-ss-ff 00 00. (0)
|
||
|
|
||
|
Read Data:
|
||
|
read: 02 xx-xx-xx nn-nn fl. (??) read nn-nn blocks of 2048 bytes,
|
||
|
starting at block xx-xx-xx
|
||
|
fl=0: "lba"-, =2:"msf-bcd"-coded xx-xx-xx
|
||
|
|
||
|
Read XA-Data:
|
||
|
read: 03 xx-xx-xx nn-nn fl. (??) read nn-nn blocks of 2340 bytes,
|
||
|
starting at block xx-xx-xx
|
||
|
fl=0: "lba"-, =2:"msf-bcd"-coded xx-xx-xx
|
||
|
|
||
|
Read SUB_Q:
|
||
|
89 fl 00 00 00 00 00. (13) r0: audio status, r4-r7: lba/msf,
|
||
|
fl=0: "lba", fl=2: "msf"
|
||
|
|
||
|
Read Disc Code:
|
||
|
8a 00 00 00 00 00 00. (14) possibly extended "check condition"-info
|
||
|
|
||
|
Read Header:
|
||
|
04 00 ll-bb-aa 00 00. (0) 4 bytes response with "check2"
|
||
|
04 02 mm-ss-ff 00 00. (0) 4 bytes response with "check2"
|
||
|
|
||
|
Spin Up:
|
||
|
05 00 ll-bb-aa 00 00. (0) possibly implies a "seek"
|
||
|
|
||
|
Spin Down:
|
||
|
06 ...
|
||
|
|
||
|
Diagnostic:
|
||
|
07 00 ll-bb-aa 00 00. (2) 2 bytes response with "check2"
|
||
|
07 02 mm-ss-ff 00 00. (2) 2 bytes response with "check2"
|
||
|
|
||
|
Read UPC:
|
||
|
08 00 ll-bb-aa 00 00. (16)
|
||
|
08 02 mm-ss-ff 00 00. (16)
|
||
|
|
||
|
Read ISRC:
|
||
|
09 00 ll-bb-aa 00 00. (15) 15 bytes response with "check2"
|
||
|
09 02 mm-ss-ff 00 00. (15) 15 bytes response with "check2"
|
||
|
|
||
|
Set XA Parameter:
|
||
|
86 ...
|
||
|
|
||
|
Read XA Parameter:
|
||
|
87 ...
|
||
|
|
||
|
==============================================================================
|
||
|
============================================================================*/
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
/*==========================================================================*/
|
||
|
|
||
|
/*
|
||
|
* highest allowed drive number (MINOR+1)
|
||
|
* currently only one controller, maybe later up to 4
|
||
|
*/
|
||
|
#define NR_SBPCD 4
|
||
|
|
||
|
/*
|
||
|
* we try to never disable interrupts - seems to work
|
||
|
*/
|
||
|
#define SBPCD_DIS_IRQ 0
|
||
|
|
||
|
/*
|
||
|
* we don't use the IRQ line - leave it free for the sound driver
|
||
|
*/
|
||
|
#define SBPCD_USE_IRQ 0
|
||
|
|
||
|
/*
|
||
|
* you can set the interrupt number of your interface board here:
|
||
|
* It is not used at this time. No need to set it correctly.
|
||
|
*/
|
||
|
#define SBPCD_INTR_NR 7
|
||
|
|
||
|
/*
|
||
|
* "write byte to port"
|
||
|
*/
|
||
|
#define OUT(x,y) outb(y,x)
|
||
|
|
||
|
|
||
|
#define MIXER_CD_Volume 0x28
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
/*
|
||
|
* use "REP INSB" for strobing the data in:
|
||
|
*/
|
||
|
#if PATCHLEVEL<15
|
||
|
#define READ_DATA(port, buf, nr) \
|
||
|
__asm__("cld;rep;insb": :"d" (port),"D" (buf),"c" (nr):"cx","dx","di")
|
||
|
#else
|
||
|
#define READ_DATA(port, buf, nr) insb(port, buf, nr)
|
||
|
#endif
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
/*
|
||
|
* to fork and execute a function after some elapsed time:
|
||
|
* one "jifs" unit is 10 msec.
|
||
|
*/
|
||
|
#define SET_TIMER(func, jifs) \
|
||
|
((timer_table[SBPCD_TIMER].expires = jiffies + jifs), \
|
||
|
(timer_table[SBPCD_TIMER].fn = func), \
|
||
|
(timer_active |= 1<<SBPCD_TIMER))
|
||
|
|
||
|
#define CLEAR_TIMER timer_active &= ~(1<<SBPCD_TIMER)
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
/*
|
||
|
* Creative Labs Programmers did this:
|
||
|
*/
|
||
|
#define MAX_TRACKS 120 /* why more than 99? */
|
||
|
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
/*
|
||
|
* To make conversions easier (machine dependent!)
|
||
|
*/
|
||
|
typedef union _msf
|
||
|
{
|
||
|
u_int n;
|
||
|
u_char c[4];
|
||
|
}
|
||
|
MSF;
|
||
|
|
||
|
typedef union _blk
|
||
|
{
|
||
|
u_int n;
|
||
|
u_char c[4];
|
||
|
}
|
||
|
BLK;
|
||
|
|
||
|
/*==========================================================================*/
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|