The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/pc/floppy.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 typedef struct FController FController;
    2 typedef struct FDrive FDrive;
    3 typedef struct FType FType;
    4 
    5 static void floppyintr(Ureg*);
    6 static int floppyon(FDrive*);
    7 static void floppyoff(FDrive*);
    8 static void floppysetdef(FDrive*);
    9 
   10 /*
   11  *  a floppy drive
   12  */
   13 struct FDrive
   14 {
   15         FType   *t;             /* floppy type */
   16         int     dt;             /* drive type */
   17         int     dev;
   18 
   19         ulong   lasttouched;    /* time last touched */
   20         int     cyl;            /* current arm position */
   21         int     confused;       /* needs to be recalibrated */
   22         int     vers;
   23         int     maxtries;       /* max read attempts before Eio */
   24 
   25         int     tcyl;           /* target cylinder */
   26         int     thead;          /* target head */
   27         int     tsec;           /* target sector */
   28         long    len;            /* size of xfer */
   29 
   30         uchar   *cache;         /* track cache */
   31         int     ccyl;
   32         int     chead;
   33 };
   34 
   35 /*
   36  *  controller for 4 floppys
   37  */
   38 struct FController
   39 {
   40         QLock;                  /* exclusive access to the contoller */
   41 
   42         int     ndrive;
   43         FDrive  *d;             /* the floppy drives */
   44         FDrive  *selected;
   45         int     rate;           /* current rate selected */
   46         uchar   cmd[14];        /* command */
   47         int     ncmd;           /* # command bytes */
   48         uchar   stat[14];       /* command status */
   49         int     nstat;          /* # status bytes */
   50         int     confused;       /* controler needs to be reset */
   51         Rendez  r;              /* wait here for command termination */
   52         int     motor;          /* bit mask of spinning disks */
   53 };
   54 
   55 /*
   56  *  floppy types (all MFM encoding)
   57  */
   58 struct FType
   59 {
   60         char    *name;
   61         int     dt;             /* compatible drive type */
   62         int     bytes;          /* bytes/sector */
   63         int     sectors;        /* sectors/track */
   64         int     heads;          /* number of heads */
   65         int     steps;          /* steps per cylinder */
   66         int     tracks;         /* tracks/disk */
   67         int     gpl;            /* intersector gap length for read/write */     
   68         int     fgpl;           /* intersector gap length for format */
   69         int     rate;           /* rate code */
   70 
   71         /*
   72          *  these depend on previous entries and are set filled in
   73          *  by floppyinit
   74          */
   75         int     bcode;          /* coded version of bytes for the controller */
   76         long    cap;            /* drive capacity in bytes */
   77         long    tsize;          /* track size in bytes */
   78 };
   79 /* bits in the registers */
   80 enum
   81 {
   82         /* status registers a & b */
   83         Psra=           0x3f0,
   84         Psrb=           0x3f1,
   85 
   86         /* digital output register */
   87         Pdor=           0x3f2,
   88         Fintena=        0x8,    /* enable floppy interrupt */
   89         Fena=           0x4,    /* 0 == reset controller */
   90 
   91         /* main status register */
   92         Pmsr=           0x3f4,
   93         Fready=         0x80,   /* ready to be touched */
   94         Ffrom=          0x40,   /* data from controller */
   95         Ffloppybusy=    0x10,   /* operation not over */
   96 
   97         /* data register */
   98         Pfdata=         0x3f5,
   99         Frecal=         0x07,   /* recalibrate cmd */
  100         Fseek=          0x0f,   /* seek cmd */
  101         Fsense=         0x08,   /* sense cmd */
  102         Fread=          0x66,   /* read cmd */
  103         Freadid=        0x4a,   /* read track id */
  104         Fspec=          0x03,   /* set hold times */
  105         Fwrite=         0x45,   /* write cmd */
  106         Fformat=        0x4d,   /* format cmd */
  107         Fmulti=         0x80,   /* or'd with Fread or Fwrite for multi-head */
  108         Fdumpreg=       0x0e,   /* dump internal registers */
  109 
  110         /* digital input register */
  111         Pdir=           0x3F7,  /* disk changed port (read only) */
  112         Pdsr=           0x3F7,  /* data rate select port (write only) */
  113         Fchange=        0x80,   /* disk has changed */
  114 
  115         /* status 0 byte */
  116         Drivemask=      3<<0,
  117         Seekend=        1<<5,
  118         Codemask=       (3<<6)|(3<<3),
  119         Cmdexec=        1<<6,
  120 
  121         /* status 1 byte */
  122         Overrun=        0x10,
  123 };
  124 
  125 
  126 static void
  127 pcfloppyintr(Ureg *ur, void *a)
  128 {
  129         USED(a);
  130 
  131         floppyintr(ur);
  132 }
  133 
  134 void
  135 floppysetup0(FController *fl)
  136 {
  137         fl->ndrive = 0;
  138         if(ioalloc(Psra, 6, 0, "floppy") < 0)
  139                 return;
  140         if(ioalloc(Pdir, 1, 0, "floppy") < 0){
  141                 iofree(Psra);
  142                 return;
  143         }
  144         fl->ndrive = 2;
  145 }
  146 
  147 void
  148 floppysetup1(FController *fl)
  149 {
  150         uchar equip;
  151 
  152         /*
  153          *  read nvram for types of floppies 0 & 1
  154          */
  155         equip = nvramread(0x10);
  156         if(fl->ndrive > 0){
  157                 fl->d[0].dt = (equip >> 4) & 0xf;
  158                 floppysetdef(&fl->d[0]);
  159         }
  160         if(fl->ndrive > 1){
  161                 fl->d[1].dt = equip & 0xf;
  162                 floppysetdef(&fl->d[1]);
  163         }
  164         intrenable(IrqFLOPPY, pcfloppyintr, fl, BUSUNKNOWN, "floppy");
  165 }
  166 
  167 /*
  168  *  eject disk ( unknown on safari )
  169  */
  170 void
  171 floppyeject(FDrive *dp)
  172 {
  173         floppyon(dp);
  174         dp->vers++;
  175         floppyoff(dp);
  176 }
  177 
  178 int 
  179 floppyexec(char *a, long b, int c)
  180 {
  181         USED(a, b, c);
  182         return b;
  183 }

Cache object: dfbd564ae8d1083602d2d019ee23f0ce


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.