CDU31A/CDU33A Driver Info ------------------------- Information on the Sony CDU31A/CDU33A CDROM driver for the Linux kernel. Corey Minyard (minyard@metronet.com) Colossians 3:17 Crude Table of Contents ----------------------- Setting Up the Hardware Configuring the Kernel Configuring as a Module Driver Special Features This device driver handles Sony CDU31A/CDU33A CDROM drives and provides a complete block-level interface as well as an ioctl() interface as specified in include/linux/cdrom.h). With this interface, CDROMs can be accessed, standard audio CDs can be played back normally, and CD audio information can be read off the drive. Note that this will only work for CDU31A/CDU33A drives. Some vendors market their drives as CDU31A compatible. They lie. Their drives are really CDU31A hardware interface compatible (they can plug into the same card). They are not software compatible. Setting Up the Hardware ----------------------- The CDU31A driver is unable to safely tell if an interface card is present that it can use because the interface card does not announce its presence in any way besides placing 4 I/O locations in memory. It used to just probe memory and attempt commands, but Linus wisely asked me to remove that because it could really screw up other hardware in the system. Because of this, you must tell the kernel where the drive interface is, what interrupts are used, and possibly if you are on a PAS-16 soundcard. If you have the Sony CDU31A/CDU33A drive interface card, the following diagram will help you set it up. If you have another card, you are on your own. You need to make sure that the I/O address and interrupt is not used by another card in the system. You will need to know the I/O address and interrupt you have set. Note that use of interrupts is highly recommended, if possible, it really cuts down on CPU used. Unfortunately, most soundcards do not support interrupts for their CDROM interfaces. By default, the Sony interface card comes with interrupts disabled. +----------+-----------------+----------------------+ | JP1 | 34 Pin Conn | | | JP2 +-----------------+ | | JP3 | | JP4 | | +--+ | | +-+ | | | | External | | | | Connector | | | | | | +-+ | +--+ | | | +--------+ | | +------------------------------------------+ JP1 sets the Base Address, using the following settings: Address Pin 1 Pin 2 ------- ----- ----- 0x320 Short Short 0x330 Short Open 0x340 Open Short 0x360 Open Open JP2 and JP3 configure the DMA channel; they must be set the same. DMA Pin 1 Pin 2 Pin 3 --- ----- ----- ----- 1 On Off On 2 Off On Off 3 Off Off On JP4 Configures the IRQ: IRQ Pin 1 Pin 2 Pin 3 Pin 4 --- ----- ----- ----- ----- 3 Off Off On Off 4 Off Off* Off On 5 On Off Off Off 6 Off On Off Off The documentation states to set this for interrupt 4, but I think that is a mistake. Note that if you have another interface card, you will need to look at the documentation to find the I/O base address. This is specified to the SLCD.SYS driver for DOS with the /B: parameter, so you can look at you DOS driver setup to find the address, if necessary. Configuring the Kernel ---------------------- You must tell the kernel where the drive is at boot time. This can be done at the Linux boot prompt, by using LILO, or by using Bootlin. Note that this is no substitute for HOWTOs and LILO documentation, if you are confused please read those for info on bootline configuration and LILO. At the linux boot prompt, press the ALT key and add the following line after the boot name (you can let the kernel boot, it will tell you the default boot name while booting): cdu31a=<base address>,<interrupt>[,PAS] The base address needs to have "0x" in front of it, since it is in hex. For instance, to configure a drive at address 320 on interrupt 5, use the following: cdu31a=0x320,5 I use the following boot line: cdu31a=0x1f88,0,PAS because I have a PAS-16 which does not support interrupt for the CDU31A interface. Adding this as an append line at the beginning of the /etc/lilo.conf file will set it for lilo configurations. I have the following as the first line in my lilo.conf file: append="cdu31a=0x1f88,0" I'm not sure how to set up Bootlin (I have never used it), if someone would like to fill in this section please do. Configuring as a Module ----------------------- The driver supports loading as a module. However, you must specify the boot address and interrupt on the boot line to insmod. You can't use modprobe to load it, since modprobe doesn't support setting variables. Anyway, I use the following line to load my driver as a module /sbin/insmod /lib/modules/`uname -r`/misc/cdu31a.o cdu31a_port=0x1f88 You can set the following variables in the driver: cdu31a_port=<I/O address> - sets the base I/O. If hex, put 0x in front of it. This must be specified. cdu31a_irq=<interrupt> - Sets the interrupt number. Leaving this off will turn interrupts off. Driver Special Features ----------------------- This section describes features beyond the normal audio and CD-ROM functions of the drive. 2048 byte buffer mode If a disk is mounted with -o block=2048, data is copied straight from the drive data port to the buffer. Otherwise, the readahead buffer must be involved to hold the other 1K of data when a 1K block operation is done. Note that with 2048 byte blocks you cannot execute files from the CD. XA compatibility The driver should support XA disks for both the CDU31A and CDU33A. It does this transparently, the using program doesn't need to set it. Multi-Session A multi-session disk looks just like a normal disk to the user. Just mount one normally, and all the data should be there. A special thanks to Koen for help with this! Raw sector I/O Using the CDROMREADAUDIO it is possible to read raw audio and data tracks. Both operations return 2352 bytes per sector. On the data tracks, the first 12 bytes is not returned by the drive and the value of that data is indeterminate.