6c5e9bbdf5
a bunch of system include files.
223 lines
8.5 KiB
C
223 lines
8.5 KiB
C
/*
|
|
* Copyright (c) 1993 Steve Gerakines
|
|
*
|
|
* This is freely redistributable software. You may do anything you
|
|
* wish with it, so long as the above notice stays intact.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS
|
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* ftape.h - QIC-40/80 floppy tape driver functions
|
|
* 10/30/93 v0.3
|
|
* Set up constant values. Added support to get hardware info.
|
|
*
|
|
* 08/07/93 v0.2
|
|
* Header file that sits in /sys/sys, first revision. Support for
|
|
* ioctl functions added.
|
|
*/
|
|
|
|
#ifndef _FTAPE_H_
|
|
#define _FTAPE_H_
|
|
|
|
#ifndef _IOCTL_H_
|
|
#include <sys/ioctl.h>
|
|
#endif
|
|
|
|
/* Miscellaneous constant values */
|
|
#define QCV_BLKSIZE 1024 /* Size of a block */
|
|
#define QCV_SEGSIZE 32768 /* Size of a segment */
|
|
#define QCV_BLKSEG 32 /* Blocks per segment */
|
|
#define QCV_ECCSIZE 3072 /* Bytes ecc eats */
|
|
#define QCV_ECCBLKS 3 /* Blocks ecc eats */
|
|
#define QCV_NFMT 3 /* Number of tape formats */
|
|
#define QCV_NLEN 5 /* Number of tape lengths */
|
|
#define QCV_HDRMAGIC 0xaa55aa55 /* Magic for header segment */
|
|
#define QCV_FSMAGIC 0x33cc33cc /* Magic for fileset */
|
|
|
|
#define UCHAR unsigned char
|
|
#define USHORT unsigned short
|
|
#define ULONG unsigned long
|
|
|
|
/* Segment request structure. */
|
|
typedef struct qic_segment {
|
|
ULONG sg_trk; /* Track number */
|
|
ULONG sg_seg; /* Segment number */
|
|
ULONG sg_crcmap; /* Returned bitmap of CRC errors */
|
|
ULONG sg_badmap; /* Map of known bad sectors */
|
|
UCHAR *sg_data; /* Segment w/bad blocks discarded */
|
|
} QIC_Segment;
|
|
|
|
/* Tape geometry structure. */
|
|
typedef struct qic_geom {
|
|
int g_fmtno; /* Format number */
|
|
int g_lenno; /* Length number */
|
|
char g_fmtdesc[16]; /* Format text description */
|
|
char g_lendesc[16]; /* Length text description */
|
|
int g_trktape; /* Number of tracks per tape */
|
|
int g_segtrk; /* Number of segments per track */
|
|
int g_blktrk; /* Number of blocks per track */
|
|
int g_fdtrk; /* Floppy disk tracks */
|
|
int g_fdside; /* Floppy disk sectors/side */
|
|
} QIC_Geom;
|
|
|
|
/* Tape hardware info */
|
|
typedef struct qic_hwinfo {
|
|
int hw_make; /* 10-bit drive make */
|
|
int hw_model; /* 6-bit model */
|
|
int hw_rombeta; /* TRUE if beta rom */
|
|
int hw_romid; /* 8-bit rom ID */
|
|
} QIC_HWInfo;
|
|
|
|
/* Various ioctl() routines. */
|
|
#define QIOREAD _IOWR('q', 1, QIC_Segment) /* Read segment */
|
|
#define QIOWRITE _IOW('q', 2, QIC_Segment) /* Write segment */
|
|
#define QIOREWIND _IO('q', 3) /* Rewind tape */
|
|
#define QIOBOT _IO('q', 4) /* Seek beg of trk */
|
|
#define QIOEOT _IO('q', 5) /* Seek end of trk */
|
|
#define QIOTRACK _IOW('q', 6, int) /* Seek to track */
|
|
#define QIOSEEKLP _IO('q', 7) /* Seek load point */
|
|
#define QIOFORWARD _IO('q', 8) /* Move tape fwd */
|
|
#define QIOSTOP _IO('q', 9) /* Stop tape */
|
|
#define QIOPRIMARY _IO('q', 10) /* Primary mode */
|
|
#define QIOFORMAT _IO('q', 11) /* Format mode */
|
|
#define QIOVERIFY _IO('q', 12) /* Verify mode */
|
|
#define QIOWRREF _IO('q', 13) /* Write ref burst */
|
|
#define QIOSTATUS _IOR('q', 14, int) /* Get drive status */
|
|
#define QIOCONFIG _IOR('q', 15, int) /* Get tape config */
|
|
#define QIOGEOM _IOR('q', 16, QIC_Geom) /* Get geometry */
|
|
#define QIOHWINFO _IOR('q', 17, QIC_HWInfo) /* Get hardware inf */
|
|
#define QIOSENDHDR _IOW('q', 18, QIC_Segment) /* Send header */
|
|
#define QIORECVHDR _IOWR('q', 19, QIC_Segment) /* Receive header */
|
|
|
|
/* QIC drive status bits. */
|
|
#define QS_READY 0x01 /* Drive ready */
|
|
#define QS_ERROR 0x02 /* Error detected */
|
|
#define QS_CART 0x04 /* Tape in drive */
|
|
#define QS_RDONLY 0x08 /* Write protect */
|
|
#define QS_NEWCART 0x10 /* New tape inserted */
|
|
#define QS_FMTOK 0x20 /* Tape is formatted */
|
|
#define QS_BOT 0x40 /* Tape at beginning */
|
|
#define QS_EOT 0x80 /* Tape at end */
|
|
|
|
/* QIC configuration bits. */
|
|
#define QCF_RTMASK 0x18 /* Rate mask */
|
|
#define QCF_RT250 0x00 /* 250K bps */
|
|
#define QCF_RT2 0x01 /* 2M bps */
|
|
#define QCF_RT500 0x02 /* 500K bps */
|
|
#define QCF_RT1 0x03 /* 1M bps */
|
|
#define QCF_EXTRA 0x40 /* Extra length tape */
|
|
#define QCF_QIC80 0x80 /* QIC-80 detected */
|
|
|
|
/* QIC tape status bits. */
|
|
#define QTS_FMMASK 0x0f /* Tape format mask */
|
|
#define QTS_LNMASK 0xf0 /* Tape length mask */
|
|
#define QTS_QIC40 0x01 /* QIC-40 tape */
|
|
#define QTS_QIC80 0x02 /* QIC-80 tape */
|
|
#define QTS_QIC500 0x03 /* QIC-500 tape */
|
|
#define QTS_LEN1 0x10 /* 205 ft/550 Oe */
|
|
#define QTS_LEN2 0x20 /* 307.5 ft/550 Oe */
|
|
#define QTS_LEN3 0x30 /* 295 ft/900 Oe */
|
|
#define QTS_LEN4 0x40 /* 1100 ft/550 Oe */
|
|
#define QTS_LEN5 0x50 /* 1100 ft/900 Oe */
|
|
|
|
/* Tape header segment structure */
|
|
typedef struct qic_header {
|
|
ULONG qh_sig; /* Header signature 0x55aa55aa */
|
|
UCHAR qh_fmtc; /* Format code */
|
|
UCHAR qh_unused1;
|
|
USHORT qh_hseg; /* Header segment number */
|
|
USHORT qh_dhseg; /* Duplicate header segment number */
|
|
USHORT qh_first; /* First logical area data segment */
|
|
USHORT qh_last; /* Last logical area data segment */
|
|
UCHAR qh_fmtdate[4]; /* Most recent format date */
|
|
UCHAR qh_chgdate[4]; /* Most recent tape change date */
|
|
UCHAR qh_unused2[2];
|
|
USHORT qh_tstrk; /* Tape segments per track */
|
|
UCHAR qh_ttcart; /* Tape tracks per cartridge */
|
|
UCHAR qh_mfside; /* Max floppy sides */
|
|
UCHAR qh_mftrk; /* Max floppy tracks */
|
|
UCHAR qh_mfsect; /* Max floppy sector */
|
|
char qh_tname[44]; /* Tape name (ASCII, space filled) */
|
|
UCHAR qh_namdate[4]; /* Date tape was given a name */
|
|
USHORT qh_cprseg; /* Compression map start segment */
|
|
UCHAR qh_unused3[48];
|
|
UCHAR qh_refmt; /* Re-format flag */
|
|
UCHAR qh_unused4;
|
|
UCHAR qh_iocount[4]; /* I/O count for life of tape */
|
|
UCHAR qh_unused5[4];
|
|
UCHAR qh_ffmtdate[4]; /* Date first formatted */
|
|
USHORT qh_fmtcount; /* Number of times formatted */
|
|
USHORT qh_badsect; /* Failed sector count */
|
|
char qh_mfname[44]; /* Manufacturer name if pre-formatted */
|
|
char qh_mflot[44]; /* Manufacturer lot code */
|
|
UCHAR qh_unused6[22];
|
|
ULONG qh_fail[448]; /* Failed sector log */
|
|
ULONG qh_badmap[6912]; /* Bad sector map */
|
|
} QIC_Header;
|
|
|
|
/* Volume table of contents entry structure. */
|
|
typedef struct qic_vtbl {
|
|
UCHAR vt_sig[4]; /* Signature "VTBL" if entry used */
|
|
USHORT vt_first; /* Starting segment */
|
|
USHORT vt_last; /* Ending segment */
|
|
char vt_vname[44]; /* Set name */
|
|
UCHAR vt_savdate[4]; /* Date saved */
|
|
UCHAR vt_flags; /* Volume flags */
|
|
UCHAR vt_multi; /* Multi cartridge sequence no. */
|
|
UCHAR vt_vext[26]; /* Extension data */
|
|
char vt_passwd[8]; /* Password for volume */
|
|
UCHAR vt_dirsize[4]; /* Directory section size */
|
|
UCHAR vt_dtasize[4]; /* Data section size */
|
|
USHORT vt_osver; /* Operating System version */
|
|
char vt_label[16]; /* Source drive label */
|
|
UCHAR vt_ldev; /* Logical device origin */
|
|
UCHAR vt_pdev; /* Physical device origin */
|
|
UCHAR vt_cprtype; /* Compression type */
|
|
UCHAR vt_ostype; /* Operating System type */
|
|
UCHAR vt_ostype2; /* Always zero ?? */
|
|
UCHAR vt_isocpr; /* ISO compression type */
|
|
UCHAR vt_unused1[4];
|
|
} QIC_VTbl;
|
|
|
|
/* Data compression map structure. */
|
|
typedef struct qic_dcmap {
|
|
UCHAR dc_sig[4]; /* Signature "DCMS" */
|
|
USHORT dc_mlen; /* Total map length */
|
|
UCHAR dc_unused1[6];
|
|
ULONG dc_offset[7421]; /* Byte offsets to segments */
|
|
} QIC_DCMap;
|
|
|
|
/* System specific file set structures - Unix */
|
|
typedef struct qic_unix_set {
|
|
UCHAR fsu_perm; /* Permissions */
|
|
UCHAR fsu_attr2; /* More attributes */
|
|
UCHAR fsu_ctime[4]; /* Creation time */
|
|
UCHAR fsu_atime[4]; /* Last access time */
|
|
UCHAR fsu_inode[4]; /* i-node number */
|
|
UCHAR fsu_user[4]; /* User number */
|
|
UCHAR fsu_group[4]; /* Group number */
|
|
UCHAR fsu_major; /* Major device number */
|
|
UCHAR fsu_minor; /* Minor device number */
|
|
UCHAR fsu_nsize; /* Name size */
|
|
UCHAR fsu_name; /* Entry name starts here */
|
|
} QIC_Unix_Set;
|
|
|
|
/* File set structure */
|
|
typedef struct qic_fileset {
|
|
UCHAR fs_size; /* Size of fixed + system size - 1 */
|
|
UCHAR fs_attr; /* Attributes */
|
|
UCHAR fs_mtime; /* Modification time */
|
|
UCHAR fs_dsize[4]; /* Data size */
|
|
} QIC_FileSet;
|
|
|
|
#endif /* _FTAPE_H_ */
|