COHERENT manpages
This page displays the COHERENT manpage for fd [Floppy disk driver].
List of available manpages
Index
fd -- Device Driver
Floppy disk driver
The files /dev/f* and /dev/rf* are entries for the floppy-disk driver fd.
Each entry is assigned major device number 4, is accessed as a block-
special device, and has a corresponding character-special device entry. fd
handles up to four 5.25-inch floppy-disk drives, each in one of several
formats.
The least-significant four bits of an entry's minor device number identify
the type of drive. The next least-significant two bits identify the drive.
The following table summarizes the name, minor device number, sectors per
track, partition sector size, characteristics, and addressing method for
each device entry of floppy-disk drive 0.
9 sectors/track
fqa0 13 9 1440 DSQD cylinder (3.25 inch -- 720K)
f9a0 12 9 720 DSDD cylinder (5.25 inch -- 360K)
15 sectors/track
fha0 14 15 2400 DSHD cylinder (5.25 inch -- 1.2MB)
18 sectors/track
fva0 15 18 2880 DSHD cylinder (3.5 inch -- 1.44MB
Prefixing an r to a device name given above gives the name of the
corresponding character-device entry. Corresponding device entries for
drives 1, 2, and 3 have minor numbers with offsets of 16, 32, and 48 from
the minor numbers given above, and have 1, 2, or 3 in place of 0 in the
names given above.
For device entries whose minor number's fourth least-significant bit is
zero (minor numbers 0 through 7 for drive 0), the driver uses surface
addressing rather than cylinder addressing. This means that it increments
tracks before heads when computing sector addresses and the first surface
is used completely before the second surface is accessed. For devices
whose minor number's fourth least significant bit is 1 (minor numbers 8
through 15 for drive 0), the driver uses cylinder addressing.
For a floppy disk to be accessible from the COHERENT system, a device file
must be present in directory /dev with the appropriate type, major and
minor device numbers, and permissions. The command mknod creates a special
file for a device.
The following table gives the all floppy-disk devices that COHERENT
recognizes, by minor number. Note that some specialized devices skip the
first cylinder on the disk, to support some third-party program that
requires this feature:
Minor
Number Drive Diameter Density Cylinders
0 0 Both Any 1-39/79
1 0 Both Any 0-39/79
4 0 5.25'' 360KB 1-39
5 0 3.5'' 720KB 1-79
6 0 5.25'' 1.2MB 1-79
7 0 3.5'' 1.44MB 1-79
12 0 5.25'' 360KB 0-39
13 0 3.5'' 720KB 0-79
14 0 5.25'' 1.2MB 0-79
15 0 3.5'' 1.44MB 0-79
16 1 Both Any 1-39/79
17 1 Both Any 0-39/79
20 1 5.25'' 360KB 1-39
21 1 3.5'' 720KB 1-79
22 1 5.25'' 1.2MB 1-79
23 1 3.5'' 1.44MB 1-79
28 1 5.25'' 360KB 0-39
29 1 3.5'' 720KB 0-79
30 1 5.25'' 1.2MB 0-79
31 1 3.5'' 1.44MB 0-79
Example
The following program examines a COHERENT floppy-disk device and prints its
size in bytes. It was written by Sanjay Lal (sanjayl@tor.comm.mot.com):
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#define BLOCK 512
struct FDATA {
int fd_size; /* Blocks per diskette */
int fd_nhds; /* Heads per drive */
int fd_trks; /* Tracks per side */
int fd_offs; /* Sector base */
int fd_nspt; /* Sectors per track */
char fd_GPL[4]; /* Controller gap param (indexed by rate) */
char fd_N; /* Controller size param */
char fd_FGPL; /* Format gap length */
};
/* Parameters for each kind of format */
struct FDATA fdata [] = {
/* 8 sectors per track, surface by surface seek. */
{ 320, 1, 40, 0, 8, { 0x00, 0x20, 0x20 }, 2, 0x58 }, /* Single sided */
{ 640, 2, 40, 0, 8, { 0x00, 0x20, 0x20 }, 2, 0x58 }, /* Double sided */
{ 1280, 2, 80, 0, 8, { 0x00, 0x20, 0x20 }, 2, 0x58 }, /* Quad density */
/* 9 sectors per track, surface by surface seek. */
{ 360, 1, 40, 0, 9, { 0x00, 0x20, 0x20 }, 2, 0x50 }, /* Single sided */
{ 720, 2, 40, 0, 9, { 0x00, 0x20, 0x20 }, 2, 0x50 }, /* Double sided */
{ 1440, 2, 80, 0, 9, { 0x00, 0x20, 0x20 }, 2, 0x50 }, /* Quad density */
/* 15 sectors per track, surface by surface seek. */
{ 2400, 2, 80, 0, 15, { 0x1B, 0x00, 0x00 }, 2, 0x54 }, /* High capacity */
/* 18 sectors per track, surface by surface seek. */
{ 2880, 2, 80, 0, 18, { 0x1B, 0x00, 0x00 }, 2, 0x6C }/* 1.44 3.5" */
};
#define funit(x) (minor(x) >> 4) /* Unit/drive number */
#define fkind(x) (minor(x) & 0x7) /* Kind of format */
static int ctrl;
int main(argc, argv)
int argc; char **argv;
{
int size;
struct stat sbuf;
struct FDATA *fdp;
if (argc!=2) {
fprintf(stderr, "usage : %s /dev/fd...\n",argv[0]);
exit(EXIT_FAILURE);
}
if (strcmp(argv[1], "conv")==0) {
/*special case*/
size = getchar() + getchar() * 256;
printf("%ld\n", (long)((long)size * (long)512) );
return (EXIT_SUCCESS);
}
if (ctrl = stat(argv[1], &sbuf)) {
fprintf (stderr,"%s : error stating %s.\n", argv[0], argv[1]);
exit(EXIT_FAILURE);
}
fdp = & fdata [fkind (sbuf.st_rdev)];
printf("%ld\n", (long)((long)fdp->fd_size * (long)512) );
return (EXIT_SUCCESS);
}
Files
<fdioctl.h> -- Driver command header file
/dev/fd* -- Block-special files
/dev/rfd* -- Character special files
See Also
device drivers,
fdformat,
floppy disk,
ft,
mkfs,
mknod
Diagnostics
The driver reports any error status received from the controller and
retries the operation several times before it reports an error to the
program that initiated an operation.
Notes
The floppy-tape driver ft also works through major-device number 4.
fd assumes that the disk is formatted with eight, nine, 15, or 18 sectors
of 512 bytes each per track, depending upon the /dev entry. Cylinder
addressing is the norm for COHERENT.
Programs that use the raw device interface must read whole sectors into
buffers that do not straddle DMA boundaries.






