Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
CD(4)		       FreeBSD Kernel Interfaces Manual			 CD(4)

     cd	-- ATAPI and SCSI CD-ROM driver

     cd* at scsibus?
     #cd0 at scsibus0 target 6 lun 0 (fixed-configuration example)

     The cd driver provides support for	ATAPI and SCSI CD-ROM (Compact Disc
     Read-Only Memory) drives, via scsibus(4).	In an attempt to look like a
     regular disk, the cd driver synthesizes a partition table,	with one par-
     tition covering the entire	CD-ROM.	 It is possible	to modify this parti-
     tion table	using disklabel(8), but	it will	only last until	the CD-ROM is
     unmounted.	 In general the	interfaces are similar to those	described by
     wd(4) and sd(4).

     As	the SCSI adapter is probed during boot,	the SCSI bus is	scanned	for
     devices.  Any devices found which answer as "Read-only" and "removable"
     CD-ROM or WORM devices will be "attached" to the cd driver.

     The system	utility	disklabel(8) may be used to read the synthesized disk
     label structure, which will contain correct figures for the size of the
     CD-ROM should that	information be required.

     The following ioctl(2) calls which	apply to CD-ROM	drives are defined in
     the header	files <sys/cdio.h> and <sys/dkio.h>.

     DIOCGDINFO, DIOCSDINFO struct disklabel *
	     Read or write the in-core copy of the disklabel for the drive.
	     The disklabel is initialized with information read	from the SCSI
	     inquiry commands, and should be the same as the information
	     printed at	boot.  This structure is defined in disklabel(5).

     CDIOCPLAYTRACKS struct ioc_play_track *
	     Start audio playback given	a track	address	and length.  The
	     structure is defined as follows:

		   struct ioc_play_track {
			   u_char  start_track;
			   u_char  start_index;
			   u_char  end_track;
			   u_char  end_index;

     CDIOCPLAYBLOCKS struct ioc_play_blocks *
	     Start audio playback given	a block	address	and length.  The
	     structure is defined as follows:

		   struct ioc_play_blocks {
			   int	   blk;
			   int	   len;

     CDIOCPLAYMSF struct ioc_play_msf *
	     Start audio playback given	a "minutes-seconds-frames" address and
	     length.  The structure is defined as follows:

		   struct ioc_play_msf {
			   u_char  start_m;
			   u_char  start_s;
			   u_char  start_f;
			   u_char  end_m;
			   u_char  end_s;
			   u_char  end_f;

     CDIOCREADSUBCHANNEL struct	ioc_read_subchannel *
	     Read information from the subchannel at the location specified by
	     this structure:

		   struct ioc_read_subchannel {
			   u_char address_format;
		   #define CD_LBA_FORMAT   1
		   #define CD_MSF_FORMAT   2
			   u_char data_format;
		   #define CD_SUBQ_DATA		   0
		   #define CD_CURRENT_POSITION	   1
		   #define CD_MEDIA_CATALOG	   2
		   #define CD_TRACK_INFO	   3
			   u_char track;
			   int	   data_len;
			   struct  cd_sub_channel_info *data;

     CDIOREADTOCHEADER struct ioc_toc_header *
	     Return summary information	about the table	of contents for	the
	     mounted CD-ROM.  The information is returned into the following

		   struct ioc_toc_header {
			   u_short len;
			   u_char  starting_track;
			   u_char  ending_track;

     CDIOREADTOCENTRIES	struct ioc_read_toc_entry *
	     Return information	from the table of contents entries mentioned.
	     The argument structure is defined as follows:

		   struct ioc_read_toc_entry {
			   u_char  address_format;
			   u_char  starting_track;
			   u_short data_len;
			   struct  cd_toc_entry	*data;

	     The requested data	is written into	an area	of size	data_len and
	     pointed to	by data.

     CDIOCSETPATCH struct ioc_patch *
	     Attach various audio channels to various output channels.	The
	     argument structure	is defined thusly:

		   struct ioc_patch {
			   u_char  patch[4];
			   /* one for each channel */

     CDIOCGETVOL, CDIOCSETVOL struct ioc_vol *
	     Get (set) information about the volume settings of	the output
	     channels.	The argument structure is as follows:

		   struct  ioc_vol {
			   u_char  vol[4];
			   /* one for each channel */

	     Patch all output channels to all source channels.

	     Patch left	source channel to the left output channel and the
	     right source channel to the right output channel.

	     Mute output without changing the volume settings.

	     Attach both output	channels to the	left (right) source channel.

	     Turn on (off) debugging for the appropriate device.

	     Pause (resume) audio play,	without	resetting the location of the

	     Reset the drive.

	     Tell the drive to spin-up (-down) the CD-ROM.

	     Tell the drive to allow (prevent) manual ejection of the CD-ROM
	     disc.  Not	all drives support this	feature.

	     Eject the CD-ROM.

     In	addition the general scsi(4) ioctls may	be used	with the cd driver, if
     used against the `whole disk' partition (i.e., /dev/rcd0c).

     When a CD-ROM is changed in a drive controlled by the cd driver, then the
     act of changing the media will invalidate the disklabel and information
     held within the kernel.  To stop corruption, all accesses to the device
     will be discarded until there are no more open file descriptors referenc-
     ing the device.  During this period, all new open attempts	will be	re-
     jected.  When no more open	file descriptors reference the device, the
     first next	open will load a new set of parameters (including disklabel)
     for the drive.

     The audio code in the cd driver only supports SCSI-2 standard audio com-
     mands.  Because many CD-ROM manufacturers have not	followed the standard,
     there are many CD-ROM drives for which audio will not work.  Some work is
     planned to	support	some of	the more common	"broken" CD-ROM	drives;	how-
     ever, this	is not yet under way.

     /dev/cd[0-9][a-p]	 block mode CD-ROM devices
     /dev/rcd[0-9][a-p]	 raw mode CD-ROM devices


     cdio(1), eject(1),	ioctl(2), intro(4), scsi(4), scsibus(4), sd(4),	wd(4),
     disklabel(5), disklabel(8)

     The cd driver appeared in 386BSD 0.1.

     The names of the structures used for the third argument to	ioctl()	were
     poorly chosen, and	a number of spelling errors have survived in the names
     of	the ioctl() commands.

FreeBSD	13.0			August 27, 2015			  FreeBSD 13.0


Want to link to this manual page? Use this URL:

home | help