fdcio.h revision 87992
1165138Syongari/* 2165138Syongari * Copyright (C) 1992-1994,2001 by Joerg Wunsch, Dresden 3165138Syongari * All rights reserved. 4165138Syongari * 5165138Syongari * Redistribution and use in source and binary forms, with or without 6165138Syongari * modification, are permitted provided that the following conditions 7165138Syongari * are met: 8165138Syongari * 1. Redistributions of source code must retain the above copyright 9165138Syongari * notice, this list of conditions and the following disclaimer. 10165138Syongari * 2. Redistributions in binary form must reproduce the above copyright 11165138Syongari * notice, this list of conditions and the following disclaimer in the 12165138Syongari * documentation and/or other materials provided with the distribution. 13165138Syongari * 14165138Syongari * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY 15165138Syongari * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16165138Syongari * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17165138Syongari * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE 18165138Syongari * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19165138Syongari * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 20165138Syongari * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 21165138Syongari * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 22165138Syongari * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23165138Syongari * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 24165138Syongari * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 25165138Syongari * DAMAGE. 26165138Syongari * 27165138Syongari * $FreeBSD: head/sys/sys/fdcio.h 87992 2001-12-15 19:09:04Z joerg $ 28165138Syongari */ 29165138Syongari 30165138Syongari#ifndef _MACHINE_IOCTL_FD_H_ 31165138Syongari#define _MACHINE_IOCTL_FD_H_ 32165138Syongari 33165138Syongari#ifndef _KERNEL 34165138Syongari#include <sys/types.h> 35165138Syongari#endif 36165138Syongari#include <sys/ioccom.h> 37165138Syongari 38165138Syongari#define FD_FORMAT_VERSION 110 /* used to validate before formatting */ 39165138Syongari#define FD_MAX_NSEC 36 /* highest known number of spt - allow for */ 40165138Syongari /* 2.88 MB drives */ 41165138Syongari 42165138Syongaristruct fd_formb { 43165138Syongari int format_version; /* == FD_FORMAT_VERSION */ 44165138Syongari int cyl, head; 45165138Syongari int transfer_rate; /* FDC_???KBPS */ 46165138Syongari 47165138Syongari union { 48165138Syongari struct fd_form_data { 49165138Syongari /* 50165138Syongari * DO NOT CHANGE THE LAYOUT OF THIS STRUCTS 51165138Syongari * it is hardware-dependent since it exactly 52165138Syongari * matches the byte sequence to write to FDC 53165138Syongari * during its `format track' operation 54165138Syongari */ 55165138Syongari u_char secshift; /* 0 -> 128, ...; usually 2 -> 512 */ 56165138Syongari u_char nsecs; /* must be <= FD_MAX_NSEC */ 57165138Syongari u_char gaplen; /* GAP 3 length; usually 84 */ 58165138Syongari u_char fillbyte; /* usually 0xf6 */ 59165138Syongari struct fd_idfield_data { 60165138Syongari /* 61165138Syongari * data to write into id fields; 62165138Syongari * for obscure formats, they mustn't match 63165138Syongari * the real values (but mostly do) 64165138Syongari */ 65165138Syongari u_char cylno; /* 0 thru 79 (or 39) */ 66165138Syongari u_char headno; /* 0, or 1 */ 67165138Syongari u_char secno; /* starting at 1! */ 68165138Syongari u_char secsize; /* usually 2 */ 69165138Syongari } idfields[FD_MAX_NSEC]; /* 0 <= idx < nsecs used */ 70165138Syongari } structured; 71165138Syongari u_char raw[1]; /* to have continuous indexed access */ 72165138Syongari } format_info; 73165138Syongari}; 74165138Syongari 75165138Syongari/* make life easier */ 76165138Syongari# define fd_formb_secshift format_info.structured.secshift 77165138Syongari# define fd_formb_nsecs format_info.structured.nsecs 78165138Syongari# define fd_formb_gaplen format_info.structured.gaplen 79165138Syongari# define fd_formb_fillbyte format_info.structured.fillbyte 80165138Syongari/* these data must be filled in for(i = 0; i < fd_formb_nsecs; i++) */ 81165138Syongari# define fd_formb_cylno(i) format_info.structured.idfields[i].cylno 82165138Syongari# define fd_formb_headno(i) format_info.structured.idfields[i].headno 83165138Syongari# define fd_formb_secno(i) format_info.structured.idfields[i].secno 84165138Syongari# define fd_formb_secsize(i) format_info.structured.idfields[i].secsize 85165138Syongari 86165138Syongaristruct fd_type { 87165138Syongari int sectrac; /* sectors per track */ 88165138Syongari int secsize; /* size code for sectors */ 89165138Syongari int datalen; /* data len when secsize = 0 */ 90165138Syongari int gap; /* gap len between sectors */ 91165138Syongari int tracks; /* total number of cylinders */ 92165138Syongari int size; /* size of disk in sectors */ 93165138Syongari int trans; /* transfer speed code */ 94165138Syongari int heads; /* number of heads */ 95165138Syongari int f_gap; /* format gap len */ 96165138Syongari int f_inter; /* format interleave factor */ 97165138Syongari int offset_side2; /* offset of sectors on side2 */ 98165138Syongari int flags; /* misc. features */ 99165138Syongari#define FL_MFM 0x0001 /* MFM recording */ 100165138Syongari#define FL_2STEP 0x0002 /* 2 steps between cylinders */ 101165138Syongari#define FL_PERPND 0x0004 /* perpendicular recording */ 102165138Syongari}; 103165138Syongari 104165138Syongaristruct fdc_status { 105165138Syongari u_int status[7]; 106165138Syongari}; 107165138Syongari 108165138Syongari/* 109165138Syongari * cyl and head are being passed into ioctl(FD_READID) 110165138Syongari * all four fields are being returned 111165138Syongari */ 112165138Syongaristruct fdc_readid { 113165138Syongari u_char cyl; /* C - 0...79 */ 114165138Syongari u_char head; /* H - 0...1 */ 115165138Syongari u_char sec; /* R - 1...n */ 116165138Syongari u_char secshift; /* N - log2(secsize / 128) */ 117165138Syongari}; 118165138Syongari 119165138Syongari/* 120165138Syongari * Diskette drive type, basically the same as stored in RTC on ISA 121165138Syongari * machines (see /sys/isa/rtc.h), but right-shifted by four bits. 122165138Syongari */ 123165138Syongarienum fd_drivetype { 124165138Syongari FDT_NONE, FDT_360K, FDT_12M, FDT_720K, FDT_144M, FDT_288M_1, 125165138Syongari FDT_288M 126165138Syongari}; 127165138Syongari 128165138Syongari 129165138Syongari#define FD_FORM _IOW('F', 61, struct fd_formb) /* format a track */ 130165138Syongari#define FD_GTYPE _IOR('F', 62, struct fd_type) /* get drive type */ 131165138Syongari#define FD_STYPE _IOW('F', 63, struct fd_type) /* set drive type */ 132165138Syongari 133192736Syongari#define FD_GOPTS _IOR('F', 64, int) /* drive options, see below */ 134192736Syongari#define FD_SOPTS _IOW('F', 65, int) 135192736Syongari 136198475Slulf#define FD_DEBUG _IOW('F', 66, int) 137192736Syongari 138165138Syongari#define FD_CLRERR _IO('F', 67) /* clear error counter */ 139165138Syongari 140165138Syongari#define FD_READID _IOWR('F', 68, struct fdc_readid) /* read ID field */ 141165138Syongari 142165138Syongari/* 143193299Syongari * Obtain NE765 status registers. Only successful if there is 144173775Syongari * a valid status stored in fdc->status[]. 145193299Syongari */ 146193299Syongari#define FD_GSTAT _IOR('F', 69, struct fdc_status) 147222230Syongari 148222230Syongari#define FD_GDTYPE _IOR('F', 70, enum fd_drivetype) /* obtain drive type */ 149199012Syongari 150207445Syongari/* Options for FD_GOPTS/FD_SOPTS, cleared on device close */ 151165138Syongari#define FDOPT_NORETRY 0x0001 /* no retries on failure */ 152165138Syongari#define FDOPT_NOERRLOG 0x002 /* no "hard error" kernel log messages */ 153165138Syongari#define FDOPT_NOERROR 0x0004 /* do not indicate errors, caller will use 154165138Syongari FD_GSTAT in order to obtain status */ 155165138Syongari#define FDOPT_AUTOSEL 0x8000 /* read/only option: device performs media 156197592Syongari * autoselection */ 157165138Syongari 158165138Syongari/* 159261455Seadler * Transfer rate definitions. Used in the structures above. They 160165138Syongari * represent the hardware encoding of bits 0 and 1 of the FDC control 161165138Syongari * register when writing to the register. 162165138Syongari * Transfer rates for FM encoding are half the values listed here 163165138Syongari * (but we currently don't support FM encoding). 164165138Syongari */ 165165138Syongari#define FDC_500KBPS 0x00 /* 500KBPS MFM drive transfer rate */ 166165138Syongari#define FDC_300KBPS 0x01 /* 300KBPS MFM drive transfer rate */ 167165138Syongari#define FDC_250KBPS 0x02 /* 250KBPS MFM drive transfer rate */ 168165138Syongari#define FDC_1MBPS 0x03 /* 1MPBS MFM drive transfer rate */ 169165138Syongari 170165138Syongari#endif /* !_MACHINE_IOCTL_FD_H_ */ 171165138Syongari