1This README belongs to release 4.2 or newer of the SoundBlaster Pro
2(Matsushita, Kotobuki, Panasonic, CreativeLabs, Longshine and Teac)
3CD-ROM driver for Linux.
4
5sbpcd really, really is NOT for ANY IDE/ATAPI drive!
6Not even if you have an "original" SoundBlaster card with an IDE interface!
7So, you'd better have a look into README.ide if your port address is 0x1F0,
80x170, 0x1E8, 0x168 or similar.
9I get tons of mails from IDE/ATAPI drive users - I really can't continue
10any more to answer them all. So, if your drive/interface information sheets
11mention "IDE" (primary, secondary, tertiary, quaternary) and the DOS driver
12invoking line within your CONFIG.SYS is using an address below 0x230:
13DON'T ROB MY LAST NERVE - jumper your interface to address 0x170 and IRQ 15
14(that is the "secondary IDE" configuration), set your drive to "master" and
15use ide-cd as your driver. If you do not have a second IDE hard disk, use the
16LILO commands
17   hdb=noprobe hdc=cdrom
18and get lucky.
19To make it fully clear to you: if you mail me about IDE/ATAPI drive problems,
20my answer is above, and I simply will discard your mail, hoping to stop the
21flood and to find time to lead my 12-year old son towards happy computing.
22
23The driver is able to drive the whole family of "traditional" AT-style (that
24is NOT the new "Enhanced IDE" or "ATAPI" drive standard) Matsushita,
25Kotobuki, Panasonic drives, sometimes labelled as "CreativeLabs". The
26well-known drives are CR-521, CR-522, CR-523, CR-562, CR-563.
27CR-574 is an IDE/ATAPI drive.
28
29The Longshine LCS-7260 is a double-speed drive which uses the "old"
30Matsushita command set. It is supported - with help by Serge Robyns.
31Vertos ("Elitegroup Computer Systems", ECS) has a similar drive - support
32has started; get in contact if you have such a "Vertos 100" or "ECS-AT"
33drive.
34
35There exists an "IBM External ISA CD-ROM Drive" which in fact is a CR-563
36with a special controller board. This drive is supported (the interface is
37of the "LaserMate" type), and it is possibly the best buy today (cheaper than
38an internal drive, and you can use it as an internal, too - e.g. plug it into
39a soundcard).
40
41CreativeLabs has a new drive "CD200" and a similar drive "CD200F". The latter
42is made by Funai and sometimes named "E2550UA", newer models may be named
43"MK4015". The CD200F drives should fully work.
44CD200 drives without "F" are still giving problems: drive detection and
45playing audio should work, data access will result in errors. I need qualified
46feedback about the bugs within the data functions or a drive (I never saw a
47CD200).
48
49The quad-speed Teac CD-55A drive is supported, but still does not reach "full
50speed". The data rate already reaches 500 kB/sec if you set SBP_BUFFER_FRAMES
51to 64 (it is not recommended to do that for normal "file access" usage, but it
52can speed up things a lot if you use something like "dd" to read from the
53drive; I use it for verifying self-written CDs this way).
54The drive itself is able to deliver 600 kB/sec, so this needs
55work; with the normal setup, the performance currently is not even as good as
56double-speed.
57
58This driver is NOT for Mitsumi or Sony or Aztech or Philips or XXX drives,
59and again: this driver is in no way usable for any IDE/ATAPI drive. If you 
60think your drive should work and it doesn't: send me the DOS driver for your
61beast (gzipped + uuencoded) and your CONFIG.SYS if you want to ask me for help,
62and include an original log message excerpt, and try to give all information
63a complete idiot needs to understand your hassle already with your first
64mail. And if you want to say "as I have mailed you before", be sure that I
65don't remember your "case" by such remarks; at the moment, I have some 
66hundreds of open correspondences about Linux CDROM questions (hope to reduce if
67the IDE/ATAPI user questions disappear). 
68
69
70This driver will work with the soundcard interfaces (SB Pro, SB 16, Galaxy,
71SoundFX, Mozart, MAD16 ...) and with the "no-sound" cards (Panasonic CI-101P,
72LaserMate, WDH-7001C, Longshine LCS-6853, Teac ...).
73
74It works with the "configurable" interface "Sequoia S-1000", too, which is 
75used on the Spea Media FX and Ensonic Soundscape sound cards. You have to
76specify the type "SBPRO 2" and the true CDROM port address with it, not the
77"configuration port" address.
78
79If you have a sound card which needs a "configuration driver" instead of
80jumpers for interface types and addresses (like Mozart cards) - those
81drivers get invoked before the DOS CDROM driver in your CONFIG.SYS, typical
82names are "cdsetup.sys" and "mztinit.sys" - let the sound driver do the
83CDROM port configuration (the leading comments in linux/drivers/sound/mad16.c
84are just for you!). Hannu Savolainen's mad16.c code is able to set up my
85Mozart card - I simply had to add
86   #define MAD16_CONF 0x06
87   #define MAD16_CDSEL 0x03
88to configure the CDROM interface for type "Panasonic" (LaserMate) and address
890x340.
90
91The interface type has to get configured in linux/drivers/cdrom/sbpcd.h, 
92because the register layout is different between the "SoundBlaster" and the
93"LaserMate" type.
94
95I got a report that the Teac interface card "I/F E117098" is of type
96"SoundBlaster" (i.e. you have to set SBPRO to 1) even with the addresses
970x300 and above. This is unusual, and it can't get covered by the auto
98probing scheme.
99The Teac 16-bit interface cards (like P/N E950228-00A, default address 0x2C0)
100need the SBPRO 3 setup.
101
102If auto-probing found the drive, the address is correct. The reported type
103may be wrong. A "mount" will give success only if the interface type is set
104right. Playing audio should work with a wrong set interface type, too.
105
106With some Teac and some CD200 drives I have seen interface cards which seem
107to lack the "drive select" lines; always drive 0 gets addressed. To avoid
108"mirror drives" (four drives detected where you only have one) with such
109interface cards, set MAX_DRIVES to 1 and jumper your drive to ID 0 (if
110possible).
111
112
113Up to 4 drives per interface card, and up to 4 interface cards are supported.
114All supported drive families can be mixed, but the CR-521 drives are 
115hard-wired to drive ID 0. The drives have to use different drive IDs, and each
116drive has to get a unique minor number (0...3), corresponding indirectly to 
117its drive ID.
118The drive IDs may be selected freely from 0 to 3 - they do not have to be in
119consecutive order.
120
121As Don Carroll, don@ds9.us.dell.com or FIDO 1:382/14, told me, it is possible
122to change old drives to any ID, too. He writes in this sense:
123   "In order to be able to use more than one single speed drive
124   (they do not have the ID jumpers) you must add a DIP switch
125   and two resistors. The pads are already on the board next to
126   the power connector. You will see the silkscreen for the
127   switch if you remove the top cover.
128                    1 2 3 4
129             ID 0 = x F F x             O = "on"
130             ID 1 = x O F x             F = "off"
131             ID 2 = x F O x             x = "don't care"
132             ID 3 = x O O x
133   Next to the switch are the positions for R76 (7k) and R78
134   (12k). I had to play around with the resistor values - ID 3
135   did not work with other values. If the values are not good,
136   ID 3 behaves like ID 0."
137
138To use more than 4 drives, you simply need a second controller card at a 
139different address and a second cable.
140
141The driver supports reading of data from the CD and playing of audio tracks.
142The audio part should run with WorkMan, xcdplayer, with the "non-X11" products
143CDplayer and WorkBone - tell me if it is not compatible with other software.
144The only accepted measure for correctness with the audio functions is the
145"cdtester" utility (appended) - most audio player programmers seem to be
146better musicians than programmers. ;-)
147
148With the CR-56x and the CD200 drives, the reading of audio frames is possible.
149This is implemented by an IOCTL function which reads READ_AUDIO frames of
1502352 bytes at once (configurable with the "READ_AUDIO" define, default is 0).
151Reading the same frame a second time gives different data; the frame data 
152start at a different position, but all read bytes are valid, and we always
153read 98 consecutive chunks (of 24 Bytes) as a frame. Reading more than 1 frame
154at once possibly misses some chunks at each frame boundary. This lack has to
155get corrected by external, "higher level" software which reads the same frame 
156again and tries to find and eliminate overlapping chunks (24-byte-pieces).
157
158The transfer rate with reading audio (1-frame-pieces) currently is very slow.
159This can be better reading bigger chunks, but the "missing" chunks possibly
160occur at the beginning of each single frame.
161The software interface possibly may change a bit the day the SCSI driver
162supports it too.
163
164With all but the CR-52x drives, MultiSession is supported.
165Photo CDs work (the "old" drives like CR-521 can access only the first
166session of a photoCD).
167At ftp.gwdg.de:/pub/linux/hpcdtoppm/ you will find Hadmut Danisch's package to
168convert photo CD image files and Gerd Knorr's viewing utility.
169
170The transfer rate will reach 150 kB/sec with CR-52x drives, 300 kB/sec with
171CR-56x drives, and currently not more than 500 kB/sec (usually less than
172250 kB/sec) with the Teac quad speed drives.
173XA (PhotoCD) disks with "old" drives give only 50 kB/sec.
174
175This release consists of
176- this README file
177- the driver file linux/drivers/cdrom/sbpcd.c
178- the stub files linux/drivers/cdrom/sbpcd[234].c
179- the header file linux/drivers/cdrom/sbpcd.h.
180
181
182To install:
183-----------
184
1851. Setup your hardware parameters. Though the driver does "auto-probing" at a
186   lot of (not all possible!) addresses, this step is recommended for
187   everyday use. You should let sbpcd auto-probe once and use the reported
188   address if a drive got found. The reported type may be incorrect; it is
189   correct if you can mount a data CD. There is no choice for you with the
190   type; only one is right, the others are deadly wrong.
191
192   a. Go into /usr/src/linux/drivers/cdrom/sbpcd.h and configure it for your
193      hardware (near the beginning):
194      a1. Set it up for the appropriate type of interface board.
195          "Original" CreativeLabs sound cards need "SBPRO 1".
196          Most "compatible" sound cards (almost all "non-CreativeLabs" cards)
197          need "SBPRO 0".
198          The "no-sound" board from OmniCd needs the "SBPRO 1" setup.
199          The Teac 8-bit "no-sound" boards need the "SBPRO 1" setup.
200          The Teac 16-bit "no-sound" boards need the "SBPRO 3" setup.
201          All other "no-sound" boards need the "SBPRO 0" setup.
202          The Spea Media FX and Ensoniq SoundScape cards need "SBPRO 2".
203          sbpcd.c holds some examples in its auto-probe list.
204          If you configure "SBPRO" wrong, the playing of audio CDs will work,
205          but you will not be able to mount a data CD.
206      a2. Tell the address of your CDROM_PORT (not of the sound port).
207      a3. If 4 drives get found, but you have only one, set MAX_DRIVES to 1.
208      a4. Set DISTRIBUTION to 0.
209   b. Additionally for 2.a1 and 2.a2, the setup may be done during
210      boot time (via the "kernel command line" or "LILO option"):
211          sbpcd=0x320,LaserMate
212      or
213          sbpcd=0x230,SoundBlaster
214      or
215          sbpcd=0x338,SoundScape
216      or
217          sbpcd=0x2C0,Teac16bit
218      This is especially useful if you install a fresh distribution.
219      If the second parameter is a number, it gets taken as the type
220      setting; 0 is "LaserMate", 1 is "SoundBlaster", 2 is "SoundScape",
221      3 is "Teac16bit".
222      So, for example
223          sbpcd=0x230,1
224      is equivalent to
225          sbpcd=0x230,SoundBlaster
226
2272. "cd /usr/src/linux" and do a "make config" and select "y" for Matsushita
228   CD-ROM support and for ISO9660 FileSystem support. If you do not have a
229   second, third, or fourth controller installed, do not say "y" to the 
230   secondary Matsushita CD-ROM questions.
231
2323. Then make the kernel image ("make zlilo" or similar).
233
2344. Make the device file(s). This step usually already has been done by the
235   MAKEDEV script.
236   The driver uses MAJOR 25, so, if necessary, do
237        mknod /dev/sbpcd  b 25 0       (if you have only one drive)
238   and/or
239        mknod /dev/sbpcd0 b 25 0
240        mknod /dev/sbpcd1 b 25 1
241        mknod /dev/sbpcd2 b 25 2
242        mknod /dev/sbpcd3 b 25 3
243   to make the node(s).
244
245   The "first found" drive gets MINOR 0 (regardless of its jumpered ID), the
246   "next found" (at the same cable) gets MINOR 1, ...
247   
248   For a second interface board, you have to make nodes like
249        mknod /dev/sbpcd4 b 26 0
250        mknod /dev/sbpcd5 b 26 1
251   and so on. Use the MAJORs 26, 27, 28.
252
253   If you further make a link like
254        ln -s sbpcd /dev/cdrom
255   you can use the name /dev/cdrom, too.
256
2575. Reboot with the new kernel.
258
259You should now be able to do
260              mkdir /CD
261and 
262              mount -rt iso9660 /dev/sbpcd /CD
263or
264              mount -rt iso9660 -o block=2048 /dev/sbpcd /CD
265and see the contents of your CD in the /CD directory.
266To use audio CDs, a mounting is not recommended (and it would fail if the
267first track is not a data track).
268
269
270Using sbpcd as a "loadable module":
271-----------------------------------
272
273If you do NOT select "Matsushita/Panasonic CDROM driver support" during the
274"make config" of your kernel, you can build the "loadable module" sbpcd.o.
275
276If sbpcd gets used as a module, the support of more than one interface
277card (i.e. drives 4...15) is disabled.
278
279You can specify interface address and type with the "insmod" command like:
280 # insmod /usr/src/linux/modules/sbpcd.o sbpcd=0x340,0
281or
282 # insmod /usr/src/linux/modules/sbpcd.o sbpcd=0x230,1
283or
284 # insmod /usr/src/linux/modules/sbpcd.o sbpcd=0x338,2
285where the last number represents the SBPRO setting (no strings allowed here).
286
287
288Things of interest:
289-------------------
290
291The driver is configured to try the LaserMate type of interface at I/O port
2920x0340 first. If this is not appropriate, sbpcd.h should get changed
293(you will find the right place - just at the beginning).
294
295No DMA and no IRQ is used.
296
297To reduce or increase the amount of kernel messages, edit sbpcd.c and play
298with the "DBG_xxx" switches (initialization of the variable "sbpcd_debug").
299Don't forget to reflect on what you do; enabling all DBG_xxx switches at once
300may crash your system, and each message line is accompanied by a delay.
301
302The driver uses the "variable BLOCK_SIZE" feature. To use it, you have to
303specify "block=2048" as a mount option. Doing this will disable the direct
304execution of a binary from the CD; you have to copy it to a device with the
305standard BLOCK_SIZE (1024) first. So, do not use this if your system is
306directly "running from the CDROM" (like some of Yggdrasil's installation
307variants). There are CDs on the market (like the German "unifix" Linux
308distribution) which MUST get handled with a block_size of 1024. Generally,
309one can say all the CDs which hold files of the name YMTRANS.TBL are defective;
310do not use block=2048 with those.
311
312Within sbpcd.h, you will find some "#define"s (e.g. EJECT and JUKEBOX). With
313these, you can configure the driver for some special things.
314You can use the appended program "cdtester" to set the auto-eject feature
315during runtime. Jeff Tranter's "eject" utility can do this, too (and more)
316for you.
317
318There is an ioctl CDROMMULTISESSION to obtain with a user program if
319the CD is an XA disk and - if it is - where the last session starts. The
320"cdtester" program illustrates how to call it.
321
322
323Auto-probing at boot time:
324--------------------------
325
326The driver does auto-probing at many well-known interface card addresses,
327but not all:
328Some probings can cause a hang if an NE2000 ethernet card gets touched, because
329SBPCD's auto-probing happens before the initialization of the net drivers.
330Those "hazardous" addresses are excluded from auto-probing; the "kernel 
331command line" feature has to be used during installation if you have your 
332drive at those addresses. The "module" version is allowed to probe at those
333addresses, too.
334
335The auto-probing looks first at the configured address resp. the address
336submitted by the kernel command line. With this, it is possible to use this
337driver within installation boot floppies, and for any non-standard address,
338too.
339
340Auto-probing will make an assumption about the interface type ("SBPRO" or not),
341based upon the address. That assumption may be wrong (initialization will be
342o.k., but you will get I/O errors during mount). In that case, use the "kernel
343command line" feature and specify address & type at boot time to find out the
344right setup.
345
346For everyday use, address and type should get configured within sbpcd.h. That
347will stop the auto-probing due to success with the first try.
348
349The kernel command "sbpcd=0" suppresses each auto-probing and causes
350the driver not to find any drive; it is meant for people who love sbpcd
351so much that they do not want to miss it, even if they miss the drives. ;-)  
352
353If you configure "#define CDROM_PORT 0" in sbpcd.h, the auto-probing is
354initially disabled and needs an explicit kernel command to get activated.
355Once activated, it does not stop before success or end-of-list. This may be
356useful within "universal" CDROM installation boot floppies (but using the 
357loadable module would be better because it allows an "extended" auto-probing
358without fearing NE2000 cards).
359
360To shorten the auto-probing list to a single entry, set DISTRIBUTION 0 within
361sbpcd.h.
362
363
364Setting up address and interface type:
365--------------------------------------
366
367If your I/O port address is not 0x340, you have to look for the #defines near
368the beginning of sbpcd.h and configure them: set SBPRO to 0 or 1 or 2, and
369change CDROM_PORT to the address of your CDROM I/O port.
370
371Almost all of the "SoundBlaster compatible" cards behave like the no-sound
372interfaces, i.e. need SBPRO 0! 
373
374With "original" SB Pro cards, an initial setting of CD_volume through the
375sound card's MIXER register gets done.
376If you are using a "compatible" sound card of types "LaserMate" or "SPEA",
377you can set SOUND_BASE (in sbpcd.h) to get it done with your card, too...
378
379
380Using audio CDs:
381----------------
382
383Workman, WorkBone, xcdplayer, cdplayer and the nice little tool "cdplay" (see
384README.aztcd from the Aztech driver package) should work.
385
386The program CDplayer likes to talk to "/dev/mcd" only, xcdplayer wants
387"/dev/rsr0", workman loves "/dev/sr0" or "/dev/cdrom" - so, make the 
388appropriate links to use them without the need to supply parameters.
389
390
391Copying audio tracks:
392---------------------
393
394The following program will copy track 1 (or a piece of it) from an audio CD
395into the file "track01":
396
397/*=================== begin program ========================================*/
398/*
399 * read an audio track from a CD
400 *
401 * (c) 1994 Eberhard Moenkeberg <emoenke@gwdg.de>
402 *          may be used & enhanced freely
403 *
404 * Due to non-existent sync bytes at the beginning of each audio frame (or due
405 * to a firmware bug within all known drives?), it is currently a kind of
406 * fortune if two consecutive frames fit together.
407 * Usually, they overlap, or a little piece is missing. This happens in units
408 * of 24-byte chunks. It has to get fixed by higher-level software (reading
409 * until an overlap occurs, and then eliminate the overlapping chunks). 
410 * ftp.gwdg.de:/pub/linux/misc/cdda2wav-sbpcd.*.tar.gz holds an example of
411 * such an algorithm.
412 * This example program further is missing to obtain the SubChannel data
413 * which belong to each frame.
414 *
415 * This is only an example of the low-level access routine. The read data are
416 * pure 16-bit CDDA values; they have to get converted to make sound out of
417 * them.
418 * It is no fun to listen to it without prior overlap/underlap correction!
419 */
420#include <stdio.h>
421#include <sys/ioctl.h>
422#include <sys/types.h>
423#include <linux/cdrom.h>
424
425static struct cdrom_tochdr hdr;
426static struct cdrom_tocentry entry[101];
427static struct cdrom_read_audio arg;
428static u_char buffer[CD_FRAMESIZE_RAW];
429static int datafile, drive;
430static int i, j, limit, track, err;
431static char filename[32];
432
433int main(int argc, char *argv[])
434{
435/*
436 * open /dev/cdrom
437 */
438  drive=open("/dev/cdrom", 0);
439  if (drive<0)
440    {
441      fprintf(stderr, "can't open drive.\n");
442      exit (-1);
443    }
444/*
445 * get TocHeader
446 */
447  fprintf(stdout, "getting TocHeader...\n");
448  err=ioctl(drive, CDROMREADTOCHDR, &hdr);
449  if (err!=0)
450    {
451      fprintf(stderr, "can't get TocHeader (error %d).\n", err);
452      exit (-1);
453    }
454  else
455    fprintf(stdout, "TocHeader: %d %d\n", hdr.cdth_trk0, hdr.cdth_trk1);
456/*
457 * get and display all TocEntries
458 */
459  fprintf(stdout, "getting TocEntries...\n");
460  for (i=1;i<=hdr.cdth_trk1+1;i++)
461    {
462      if (i!=hdr.cdth_trk1+1) entry[i].cdte_track = i;
463      else entry[i].cdte_track = CDROM_LEADOUT;
464      entry[i].cdte_format = CDROM_LBA;
465      err=ioctl(drive, CDROMREADTOCENTRY, &entry[i]);
466      if (err!=0)
467	{
468	  fprintf(stderr, "can't get TocEntry #%d (error %d).\n", i, err);
469	  exit (-1);
470	}
471      else
472	{
473	  fprintf(stdout, "TocEntry #%d: %1X %1X %06X %02X\n",
474		 entry[i].cdte_track,
475		 entry[i].cdte_adr,
476		 entry[i].cdte_ctrl,
477		 entry[i].cdte_addr.lba,
478		 entry[i].cdte_datamode);
479	}
480    }
481  fprintf(stdout, "got all TocEntries.\n");
482/*
483 * ask for track number (not implemented here)
484 */
485track=1;
486/*
487 * read track into file
488 */
489  sprintf(filename, "track%02d\0", track);
490  datafile=creat(filename, 0755);
491  if (datafile<0)
492    {
493      fprintf(stderr, "can't open datafile %s.\n", filename);
494      exit (-1);
495    }
496  arg.addr.lba=entry[track].cdte_addr.lba;
497  arg.addr_format=CDROM_LBA; /* CDROM_MSF would be possible here, too. */
498  arg.nframes=1;
499  arg.buf=&buffer[0];
500  limit=entry[track+1].cdte_addr.lba;
501  for (;arg.addr.lba<limit;arg.addr.lba++)
502    {
503      err=ioctl(drive, CDROMREADAUDIO, &arg);
504      if (err!=0)
505	{
506	  fprintf(stderr, "can't read abs. frame #%d (error %d).\n", 
507		 arg.addr.lba, err);
508	}
509      j=write(datafile, &buffer[0], CD_FRAMESIZE_RAW);
510      if (j!=CD_FRAMESIZE_RAW)
511	{
512	  fprintf(stderr,"I/O error (datafile) at rel. frame %d\n",
513			 arg.addr.lba-entry[track].cdte_addr.lba);
514	}
515      arg.addr.lba++;
516    }
517    return 0;
518}
519/*===================== end program ========================================*/
520
521At ftp.gwdg.de:/pub/linux/misc/cdda2wav-sbpcd.*.tar.gz is an adapted version of
522Heiko Eissfeldt's digital-audio to .WAV converter (the original is there, too).
523This is preliminary, as Heiko himself will care about it.
524
525
526Known problems:
527---------------
528
529Currently, the detection of disk change or removal is actively disabled.
530
531Most attempts to read the UPC/EAN code result in a stream of zeroes. All my
532drives are mostly telling there is no UPC/EAN code on disk or there is, but it
533is an all-zero number. I guess now almost no CD holds such a number.
534
535Bug reports, comments, wishes, donations (technical information is a donation,
536too :-) etc. to emoenke@gwdg.de.
537
538SnailMail address, preferable for CD editors if they want to submit a free
539"cooperation" copy:
540                         Eberhard Moenkeberg
541                         Reinholdstr. 14
542                         D-37083 Goettingen
543                         Germany
544---
545
546
547Appendix -- the "cdtester" utility:
548
549/*
550 * cdtester.c -- test the audio functions of a CD driver
551 *
552 * (c) 1995 Eberhard Moenkeberg <emoenke@gwdg.de>
553 *          published under the GPL
554 *
555 *          made under heavy use of the "Tiny Audio CD Player"
556 *          from Werner Zimmermann <zimmerma@rz.fht-esslingen.de>
557 *          (see linux/drivers/block/README.aztcd)
558 */
559#undef AZT_PRIVATE_IOCTLS /* not supported by every CDROM driver */
560#define SBP_PRIVATE_IOCTLS /* not supported by every CDROM driver */
561
562#include <stdio.h>
563#include <stdio.h>
564#include <malloc.h>
565#include <sys/ioctl.h>
566#include <sys/types.h>
567#include <linux/cdrom.h>
568
569#ifdef AZT_PRIVATE_IOCTLS
570#include <linux/../../drivers/cdrom/aztcd.h>
571#endif /* AZT_PRIVATE_IOCTLS */
572#ifdef SBP_PRIVATE_IOCTLS
573#include <linux/../../drivers/cdrom/sbpcd.h>
574#include <linux/fs.h>
575#endif /* SBP_PRIVATE_IOCTLS */
576
577struct cdrom_tochdr hdr;
578struct cdrom_tochdr tocHdr;
579struct cdrom_tocentry TocEntry[101];
580struct cdrom_tocentry entry;
581struct cdrom_multisession ms_info;
582struct cdrom_read_audio read_audio;
583struct cdrom_ti ti;
584struct cdrom_subchnl subchnl;
585struct cdrom_msf msf;
586struct cdrom_volctrl volctrl;
587#ifdef AZT_PRIVATE_IOCTLS
588union
589{
590	struct cdrom_msf msf;
591	unsigned char buf[CD_FRAMESIZE_RAW];
592} azt;
593#endif /* AZT_PRIVATE_IOCTLS */
594int i, i1, i2, i3, j, k;
595unsigned char sequence=0;
596unsigned char command[80];
597unsigned char first=1, last=1;
598char *default_device="/dev/cdrom";
599char dev[20];
600char filename[20];
601int drive;
602int datafile;
603int rc;
604
605void help(void)
606{
607	printf("Available Commands:\n");
608	printf("STOP          s      EJECT        e       QUIT         q\n");
609	printf("PLAY TRACK    t      PAUSE        p       RESUME       r\n");
610	printf("NEXT TRACK    n      REPEAT LAST  l       HELP         h\n");
611	printf("SUBCHANNEL_Q  c      TRACK INFO   i       PLAY AT      a\n");
612	printf("READ          d      READ RAW     w       READ AUDIO   A\n");
613	printf("MS-INFO       M      TOC          T       START        S\n");
614	printf("SET EJECTSW   X      DEVICE       D       DEBUG        Y\n");
615	printf("AUDIO_BUFSIZ  Z      RESET        R       SET VOLUME   v\n");
616	printf("GET VOLUME    V\n");
617}
618
619/*
620 *  convert MSF number (3 bytes only) to Logical_Block_Address 
621 */
622int msf2lba(u_char *msf)
623{
624	int i;
625	
626	i=(msf[0] * CD_SECS + msf[1]) * CD_FRAMES + msf[2] - CD_BLOCK_OFFSET;
627	if (i<0) return (0);
628	return (i);
629}
630/*
631 *  convert logical_block_address to m-s-f_number (3 bytes only)
632 */
633void lba2msf(int lba, unsigned char *msf)
634{
635	lba += CD_BLOCK_OFFSET;
636	msf[0] = lba / (CD_SECS*CD_FRAMES);
637	lba %= CD_SECS*CD_FRAMES;
638	msf[1] = lba / CD_FRAMES;
639	msf[2] = lba % CD_FRAMES;
640}
641
642int init_drive(char *dev)
643{
644	unsigned char msf_ent[3];
645
646	/*
647	 * open the device
648	 */
649	drive=open(dev,0);
650	if (drive<0) return (-1);
651	/*
652	 * get TocHeader
653	 */
654	printf("getting TocHeader...\n");
655	rc=ioctl(drive,CDROMREADTOCHDR,&hdr);
656	if (rc!=0)
657	{
658		printf("can't get TocHeader (error %d).\n",rc);
659		return (-2);
660	}
661	else
662		first=hdr.cdth_trk0;
663		last=hdr.cdth_trk1;
664		printf("TocHeader: %d %d\n",hdr.cdth_trk0,hdr.cdth_trk1);
665	/*
666	 * get and display all TocEntries
667	 */
668	printf("getting TocEntries...\n");
669	for (i=1;i<=hdr.cdth_trk1+1;i++)
670	{
671		if (i!=hdr.cdth_trk1+1) TocEntry[i].cdte_track = i;
672		else TocEntry[i].cdte_track = CDROM_LEADOUT;
673		TocEntry[i].cdte_format = CDROM_LBA;
674		rc=ioctl(drive,CDROMREADTOCENTRY,&TocEntry[i]);
675		if (rc!=0)
676		{
677			printf("can't get TocEntry #%d (error %d).\n",i,rc);
678		}
679		else
680		{
681			lba2msf(TocEntry[i].cdte_addr.lba,&msf_ent[0]);
682			if (TocEntry[i].cdte_track==CDROM_LEADOUT)
683			{
684				printf("TocEntry #%02X: %1X %1X %02d:%02d:%02d (lba: 0x%06X) %02X\n",
685				       TocEntry[i].cdte_track,
686				       TocEntry[i].cdte_adr,
687				       TocEntry[i].cdte_ctrl,
688				       msf_ent[0],
689				       msf_ent[1],
690				       msf_ent[2],
691				       TocEntry[i].cdte_addr.lba,
692				       TocEntry[i].cdte_datamode);
693			}
694			else
695			{
696				printf("TocEntry #%02d: %1X %1X %02d:%02d:%02d (lba: 0x%06X) %02X\n",
697				       TocEntry[i].cdte_track,
698				       TocEntry[i].cdte_adr,
699				       TocEntry[i].cdte_ctrl,
700				       msf_ent[0],
701				       msf_ent[1],
702				       msf_ent[2],
703				       TocEntry[i].cdte_addr.lba,
704				       TocEntry[i].cdte_datamode);
705			}
706		}
707	}
708	return (hdr.cdth_trk1); /* number of tracks */
709}
710
711void display(int size,unsigned char *buffer)
712{
713	k=0;
714	getchar();
715	for (i=0;i<(size+1)/16;i++)
716	{
717		printf("%4d:",i*16);
718		for (j=0;j<16;j++)
719		{
720			printf(" %02X",buffer[i*16+j]);
721		}
722		printf("  ");
723		for (j=0;j<16;j++)
724		{
725			if (isalnum(buffer[i*16+j])) 
726				printf("%c",buffer[i*16+j]);
727			else
728				printf(".");
729		}
730		printf("\n"); 
731		k++;
732		if (k>=20)
733		{
734			printf("press ENTER to continue\n");
735			getchar();
736			k=0;
737		}
738	} 
739} 
740
741int main(int argc, char *argv[])
742{
743	printf("\nTesting tool for a CDROM driver's audio functions V0.1\n");
744	printf("(C) 1995 Eberhard Moenkeberg <emoenke@gwdg.de>\n");
745	printf("initializing...\n");
746	
747	rc=init_drive(default_device);
748	if (rc<0) printf("could not open %s (rc=%d).\n",default_device,rc);
749	help();
750	while (1)
751	{
752		printf("Give a one-letter command (h = help): ");
753		scanf("%s",command);
754		command[1]=0;
755		switch (command[0])
756		{
757		case 'D':
758			printf("device name (f.e. /dev/sbpcd3): ? ");
759			scanf("%s",&dev);
760			close(drive);
761			rc=init_drive(dev);
762			if (rc<0) printf("could not open %s (rc %d).\n",dev,rc);
763			break;
764		case 'e':
765			rc=ioctl(drive,CDROMEJECT);
766			if (rc<0) printf("CDROMEJECT: rc=%d.\n",rc);
767			break;
768		case 'p':
769			rc=ioctl(drive,CDROMPAUSE);
770			if (rc<0) printf("CDROMPAUSE: rc=%d.\n",rc);
771			break;
772		case 'r':
773			rc=ioctl(drive,CDROMRESUME);
774			if (rc<0) printf("CDROMRESUME: rc=%d.\n",rc);
775			break;
776		case 's':
777			rc=ioctl(drive,CDROMSTOP);
778			if (rc<0) printf("CDROMSTOP: rc=%d.\n",rc);
779			break;
780		case 'S':
781			rc=ioctl(drive,CDROMSTART);
782			if (rc<0) printf("CDROMSTART: rc=%d.\n",rc);
783			break;
784		case 't':
785			rc=ioctl(drive,CDROMREADTOCHDR,&tocHdr);
786			if (rc<0)
787			{
788				printf("CDROMREADTOCHDR: rc=%d.\n",rc);
789				break;
790			}
791			first=tocHdr.cdth_trk0;
792			last= tocHdr.cdth_trk1;
793			if ((first==0)||(first>last))
794			{
795				printf ("--got invalid TOC data.\n");
796			}
797			else
798			{
799				printf("--enter track number(first=%d, last=%d): ",first,last);
800				scanf("%d",&i1);
801				ti.cdti_trk0=i1;
802				if (ti.cdti_trk0<first) ti.cdti_trk0=first;
803				if (ti.cdti_trk0>last) ti.cdti_trk0=last;
804				ti.cdti_ind0=0;
805				ti.cdti_trk1=last;
806				ti.cdti_ind1=0;
807				rc=ioctl(drive,CDROMSTOP);
808				rc=ioctl(drive,CDROMPLAYTRKIND,&ti);
809				if (rc<0) printf("CDROMPLAYTRKIND: rc=%d.\n",rc);
810			}
811			break;
812		case 'n':
813			rc=ioctl(drive,CDROMSTOP);
814			if (++ti.cdti_trk0>last) ti.cdti_trk0=last;
815			ti.cdti_ind0=0;
816			ti.cdti_trk1=last;
817			ti.cdti_ind1=0;
818			rc=ioctl(drive,CDROMPLAYTRKIND,&ti);
819			if (rc<0) printf("CDROMPLAYTRKIND: rc=%d.\n",rc);
820			break;
821		case 'l':
822			rc=ioctl(drive,CDROMSTOP);
823			if (--ti.cdti_trk0<first) ti.cdti_trk0=first;
824			ti.cdti_ind0=0;
825			ti.cdti_trk1=last;
826			ti.cdti_ind1=0;
827			rc=ioctl(drive,CDROMPLAYTRKIND,&ti);
828			if (rc<0) printf("CDROMPLAYTRKIND: rc=%d.\n",rc);
829			break;
830		case 'c':
831			subchnl.cdsc_format=CDROM_MSF;
832			rc=ioctl(drive,CDROMSUBCHNL,&subchnl);
833			if (rc<0) printf("CDROMSUBCHNL: rc=%d.\n",rc);
834			else
835			{
836				printf("AudioStatus:%s  Track:%d  Mode:%d  MSF=%02d:%02d:%02d\n",
837				       subchnl.cdsc_audiostatus==CDROM_AUDIO_PLAY ? "PLAYING":"NOT PLAYING",
838				       subchnl.cdsc_trk,subchnl.cdsc_adr, 
839				       subchnl.cdsc_absaddr.msf.minute,
840				       subchnl.cdsc_absaddr.msf.second,
841				       subchnl.cdsc_absaddr.msf.frame);
842			}
843			break;              
844		case 'i':
845			printf("Track No.: ");
846			scanf("%d",&i1);
847			entry.cdte_track=i1;
848			if (entry.cdte_track<first) entry.cdte_track=first;
849			if (entry.cdte_track>last)  entry.cdte_track=last;
850			entry.cdte_format=CDROM_MSF;
851			rc=ioctl(drive,CDROMREADTOCENTRY,&entry);
852			if (rc<0) printf("CDROMREADTOCENTRY: rc=%d.\n",rc);
853			else
854			{
855				printf("Mode %d Track, starts at %02d:%02d:%02d\n",
856				       entry.cdte_adr,
857				       entry.cdte_addr.msf.minute,
858				       entry.cdte_addr.msf.second,
859				       entry.cdte_addr.msf.frame);
860			}
861			break;
862		case 'a':
863			printf("Address (min:sec:frm)  ");
864			scanf("%d:%d:%d",&i1,&i2,&i3);
865			msf.cdmsf_min0=i1;
866			msf.cdmsf_sec0=i2;
867			msf.cdmsf_frame0=i3;
868			if (msf.cdmsf_sec0>59) msf.cdmsf_sec0=59;
869			if (msf.cdmsf_frame0>74) msf.cdmsf_frame0=74;
870			lba2msf(TocEntry[last+1].cdte_addr.lba-1,&msf.cdmsf_min1);
871			rc=ioctl(drive,CDROMSTOP);
872			rc=ioctl(drive,CDROMPLAYMSF,&msf);
873			if (rc<0) printf("CDROMPLAYMSF: rc=%d.\n",rc);
874			break;
875		case 'V':
876			rc=ioctl(drive,CDROMVOLREAD,&volctrl);
877			if (rc<0) printf("CDROMVOLCTRL: rc=%d.\n",rc);
878			printf("Volume: channel 0 (left) %d, channel 1 (right) %d\n",volctrl.channel0,volctrl.channel1);
879			break;  
880		case 'R':
881			rc=ioctl(drive,CDROMRESET);
882			if (rc<0) printf("CDROMRESET: rc=%d.\n",rc);
883			break;
884#ifdef AZT_PRIVATE_IOCTLS     /*not supported by every CDROM driver*/
885		case 'd':
886			printf("Address (min:sec:frm)  ");
887			scanf("%d:%d:%d",&i1,&i2,&i3);
888			azt.msf.cdmsf_min0=i1;
889			azt.msf.cdmsf_sec0=i2;
890			azt.msf.cdmsf_frame0=i3;
891			if (azt.msf.cdmsf_sec0>59) azt.msf.cdmsf_sec0=59;
892			if (azt.msf.cdmsf_frame0>74) azt.msf.cdmsf_frame0=74;
893			rc=ioctl(drive,CDROMREADMODE1,&azt.msf);
894			if (rc<0) printf("CDROMREADMODE1: rc=%d.\n",rc);
895			else display(CD_FRAMESIZE,azt.buf);
896			break;
897		case 'w':
898			printf("Address (min:sec:frame)  ");
899			scanf("%d:%d:%d",&i1,&i2,&i3);
900			azt.msf.cdmsf_min0=i1;
901			azt.msf.cdmsf_sec0=i2;
902			azt.msf.cdmsf_frame0=i3;
903			if (azt.msf.cdmsf_sec0>59) azt.msf.cdmsf_sec0=59;
904			if (azt.msf.cdmsf_frame0>74) azt.msf.cdmsf_frame0=74;
905			rc=ioctl(drive,CDROMREADMODE2,&azt.msf);
906			if (rc<0) printf("CDROMREADMODE2: rc=%d.\n",rc);
907			else display(CD_FRAMESIZE_RAW,azt.buf); /* currently only 2336 */
908			break;  
909#endif
910		case 'v':
911			printf("--Channel 0 (Left)  (0-255): ");
912			scanf("%d",&i1);
913			volctrl.channel0=i1;
914			printf("--Channel 1 (Right) (0-255): ");
915			scanf("%d",&i1);
916			volctrl.channel1=i1;
917			volctrl.channel2=0;
918			volctrl.channel3=0;
919			rc=ioctl(drive,CDROMVOLCTRL,&volctrl);
920			if (rc<0) printf("CDROMVOLCTRL: rc=%d.\n",rc);
921			break;  
922		case 'q':
923			close(drive);
924			exit(0);
925		case 'h':
926			help();
927			break;
928		case 'T': /* display TOC entry - without involving the driver */
929			scanf("%d",&i);
930			if ((i<hdr.cdth_trk0)||(i>hdr.cdth_trk1))
931				printf("invalid track number.\n");
932			else
933				printf("TocEntry %02d: adr=%01X ctrl=%01X msf=%02d:%02d:%02d mode=%02X\n",
934				       TocEntry[i].cdte_track,
935				       TocEntry[i].cdte_adr,
936				       TocEntry[i].cdte_ctrl,
937				       TocEntry[i].cdte_addr.msf.minute,
938				       TocEntry[i].cdte_addr.msf.second,
939				       TocEntry[i].cdte_addr.msf.frame,
940				       TocEntry[i].cdte_datamode);
941			break;
942		case 'A': /* read audio data into file */
943			printf("Address (min:sec:frm) ? ");
944			scanf("%d:%d:%d",&i1,&i2,&i3);
945			read_audio.addr.msf.minute=i1;
946			read_audio.addr.msf.second=i2;
947			read_audio.addr.msf.frame=i3;
948			read_audio.addr_format=CDROM_MSF;
949			printf("# of frames ? ");
950			scanf("%d",&i1);
951			read_audio.nframes=i1;
952			k=read_audio.nframes*CD_FRAMESIZE_RAW;
953			read_audio.buf=malloc(k);
954			if (read_audio.buf==NULL)
955			{
956				printf("can't malloc %d bytes.\n",k);
957				break;
958			}
959			sprintf(filename,"audio_%02d%02d%02d_%02d.%02d\0",
960				read_audio.addr.msf.minute,
961				read_audio.addr.msf.second,
962				read_audio.addr.msf.frame,
963				read_audio.nframes,
964				++sequence);
965			datafile=creat(filename, 0755);
966			if (datafile<0)
967			{
968				printf("can't open datafile %s.\n",filename);
969				break;
970			}
971			rc=ioctl(drive,CDROMREADAUDIO,&read_audio);
972			if (rc!=0)
973			{
974				printf("CDROMREADAUDIO: rc=%d.\n",rc);
975			}
976			else
977			{
978				rc=write(datafile,&read_audio.buf,k);
979				if (rc!=k) printf("datafile I/O error (%d).\n",rc);
980			}
981			close(datafile);
982			break;
983		case 'X': /* set EJECT_SW (0: disable, 1: enable auto-ejecting) */
984			scanf("%d",&i);
985			rc=ioctl(drive,CDROMEJECT_SW,i);
986			if (rc!=0)
987				printf("CDROMEJECT_SW: rc=%d.\n",rc);
988			else
989				printf("EJECT_SW set to %d\n",i);
990			break;
991		case 'M': /* get the multisession redirection info */
992			ms_info.addr_format=CDROM_LBA;
993			rc=ioctl(drive,CDROMMULTISESSION,&ms_info);
994			if (rc!=0)
995			{
996				printf("CDROMMULTISESSION(lba): rc=%d.\n",rc);
997			}
998			else
999			{
1000				if (ms_info.xa_flag) printf("MultiSession offset (lba): %d (0x%06X)\n",ms_info.addr.lba,ms_info.addr.lba);
1001				else
1002				{
1003					printf("this CD is not an XA disk.\n");
1004					break;
1005				}
1006			}
1007			ms_info.addr_format=CDROM_MSF;
1008			rc=ioctl(drive,CDROMMULTISESSION,&ms_info);
1009			if (rc!=0)
1010			{
1011				printf("CDROMMULTISESSION(msf): rc=%d.\n",rc);
1012			}
1013			else
1014			{
1015				if (ms_info.xa_flag)
1016					printf("MultiSession offset (msf): %02d:%02d:%02d (0x%02X%02X%02X)\n",
1017					       ms_info.addr.msf.minute,
1018					       ms_info.addr.msf.second,
1019					       ms_info.addr.msf.frame,
1020					       ms_info.addr.msf.minute,
1021					       ms_info.addr.msf.second,
1022					       ms_info.addr.msf.frame);
1023				else printf("this CD is not an XA disk.\n");
1024			}
1025			break;
1026#ifdef SBP_PRIVATE_IOCTLS
1027		case 'Y': /* set the driver's message level */
1028			printf("enter DDIOCSDBG switch number: ");
1029			scanf("%d",&j);
1030			printf("enter 0 for \"off\", 1 for \"on\": ");
1031			scanf("%d",&i);
1032			if (i==0) j|=0x80;
1033			printf("calling \"ioctl(drive,DDIOCSDBG,%d)\"\n",j);
1034			rc=ioctl(drive,DDIOCSDBG,j);
1035			printf("DDIOCSDBG: rc=%d.\n",rc);
1036			break;
1037		case 'Z': /* set the audio buffer size */
1038			printf("# frames wanted: ? ");
1039			scanf("%d",&j);
1040			rc=ioctl(drive,CDROMAUDIOBUFSIZ,j);
1041			printf("%d frames granted.\n",rc);
1042			break;
1043#endif /* SBP_PRIVATE_IOCTLS */
1044		default:
1045			printf("unknown command: \"%s\".\n",command);
1046			break;
1047		}
1048	}
1049	return 0;
1050}
1051/*==========================================================================*/
1052