From owner-FreeBSD-users-jp@jp.freebsd.org  Thu Jul 11 12:38:03 1996
Received: by mail.jp.freebsd.org (8.7.3+2.6Wbeta5/8.7.3) id MAA10732
	Thu, 11 Jul 1996 12:38:03 +0900 (JST)
Received: by mail.jp.freebsd.org (8.7.3+2.6Wbeta5/8.7.3) with ESMTP id MAA10727
	for <FreeBSD-users-jp@jp.freebsd.org>; Thu, 11 Jul 1996 12:38:00 +0900 (JST)
From: sumida@akb.nefs.nec.co.jp
Received: from mailsv.nec.co.jp ([133.200.254.203]) by TYO2.gate.nec.co.jp (8.7.5+2.6Wbeta6/3.3Wb-NEC-TYO2) with ESMTP id MAA18949 for <FreeBSD-users-jp@jp.freebsd.org>; Thu, 11 Jul 1996 12:37:58 +0900 (JST)
Received: from rie.akb.nefs.nec.co.jp (rie.akb.nefs.nec.co.jp [133.208.122.130]) by mailsv.nec.co.jp (8.7.5+2.6Wbeta6/3.4W-96062709) with SMTP
	id MAA09561 for <FreeBSD-users-jp@jp.freebsd.org>; Thu, 11 Jul 1996 12:37:55 +0900 (JST)
Received: from lemon.akb.nefs.nec.co.jp by rie.akb.nefs.nec.co.jp (5.67+1.6W/6.4J.6)
	id AA03674; Thu, 11 Jul 96 12:35:11 JST
Date: Thu, 11 Jul 96 12:35:11 JST
Message-Id: <9607110335.AA03674@rie.akb.nefs.nec.co.jp>
To: FreeBSD-users-jp@jp.freebsd.org
Cc: sumida@akb.nefs.nec.co.jp
In-Reply-To: Your message of "Wed, 10 Jul 1996 10:20:28 +0900"
             <199607100120.KAA27949@s64.saskg.semicon.sony.co.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
X-Mailer: WeMail[1.22(PS)] ID:sumida
Reply-To: FreeBSD-users-jp@jp.freebsd.org
X-Distribute: distribute [version 2.1 (Alpha) patchlevel=19]
X-Sequence: FreeBSD-users-jp 2933
Subject: [FreeBSD-users-jp 2933] Re: 3-MODE FDD patch with auto RPM selection
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org


$B$9$_$@(B $B$G$9!#(B
$BJV;v$,CY$/$J$C$F$4$a$s$J$5$$!#(B

>>> FDC $B$N<oN`$K$O$"$^$j4X78$J$$$N$G$9$,!"(BTOMCAT 3 mode FDD $B$H$+$f$&(B
>>> FDC $B$K0MB8$7$J$$%?%$%W$N(B FDD $B$r(B FreeBSD $B>e$G(B 2HD $B$r;H$&%Q%C%A$r(B
>>> $B:n@.$7$^$7$?!#$^$@!"(Bdd $B$H(B tar $B$G$7$+;n$7$F$^$;$s$,!#(B
>>> $B$3$N5!G=$bAH$_9~$s$GD:$1$l$P99$KJXMx$K!*(B
>>>
>>$B$3$l$O$I$&$$$&$b$N$J$s$G$7$g$&$+!)$9$_$^$;$s$,(B $B$h$/M}2r$G$-$F$^$;$s!#(B
>>$B%Q%C%A$rDs6!$7$F$$$?$@$1$l$P%^!<%8$O$5$;$F$$$?$@$-$^$9$,!D!D(B

$B;d$OIaDL$N#3%b!<%I$K$D$$$F$O$h$/CN$i$J$$$N$G$9$,!"B?J,(B 2 pin $B$N(B DENSEL 
$B$G(B 300rpm/360rpm $B$r@Z$jBX$($k%I%i%$%V$@$H;W$C$F$$$^$9!#$G(B AT $B8_495!(B
$B$O(B FDC $B$K$h$C$F$3$N?.9f$N@Z$jBX$(J}$,0c$&$N$,:.Mp$N85$G$9$+!)(B
$BK\Mh(B DENSEL $B$O(B 500Kbps/250Kbps $B$N$?$a$K$"$kJ*$N$h$&$G$9!#(B 37C665 $B$N(B
$B;EMM$+$i$O$=$N$h$&$K8+$($^$9!#(B

TOMCAT $B$N(B FDD $B$O(B DENSEL $B?.9f$r;H$o$:!"(BDS $B$G(B 300/360 $B$r@Z$jBX$($k$h$&$K(B
$B$J$C$F$$$^$9!#%Y!<%9$O%_%D%_@=#3%b!<%I#F#D$N$h$&$G$9!#(B
$B#F#D#D$H(B DOS$B!$(BWindows $B$N%I%i%$%P#F#D$N%;%C%H$GGd$C$F$$$^$7$?!#(B

>>$B5U%"%;%s%V%k$OBgDq6X;_$5$l$F$$$k$N$G$d$P$$$G$9$,!"(B
>>$B%I%i%$%V3+$1$k$N$O(B $B$?$V$sLdBjL5$$$H;W$$$^$9!#(B

$B$;$C$+$/$7$i$Y$?$N$G8x3+$7$F$*$-$^$9!#8E$$#M#B$H$+$G$b;H$($k$O$:$J$N$G!)(B
FreeBSD 2.2-snap0323 $B$KBP$9$k%Q%C%A$G$9!#(B

$B;d$O(B tar $B$G;H$&$N$,<gL\E*$G:n$C$F$$$^$9!#(B $B$3$N%a!<%k$r8+$F$$$k$H(B MS-DOS
$B$N(B FD $B$r;H$&>l9g$O(B mtools $B$r;H$&$N$,0lHLE*$G(B mount_msdos $B$O$"$^$j;H$o$J(B
$B$$$N$G$9$M!#(B mtools $B$NJ}$,(B PANIC $B$K$J$k$3$H$O>/$J$/$F0BA4$G$9$M!#(B
$B;d$b(B mtools $B$r;n$7$F$_$^$9!#(B


================== $B@bL@(B ==============================

$B#T#O#M#C#A#T(B $B#3%b!<%I#F#D#DBP1~%Q%C%A!J;CDjHG!K(B


TOMCAT $B@=(B 3 mode FDD $B$r;HMQ$7$F!"#9#8Ey$N(B 2HD FD $B$r;H$&(B
$B0Y$N%Q%C%A$G$9!#(B

$B#1(B.$BDI2C$7$?%G%P%$%9(B

  /dev/rfd?.1232$B!"(B/dev/fd?.1232

		1024 byte 8 sectors/track 77 cylinders


  /dev/rfd?.1202$B!"(B/dev/fd?.1202

		512 byte 15 sectors/track 80 cylinders


  /dev/rfd?.1025$B!"(B/dev/fd?.1025

		256 byte 26 sectors/track 77 cylinders


  /dev/rfd?.1000$B!"(B/dev/fd?.1000

		256 byte 26 sectors/track 77 cylinders
		0 track $B$O%9%-%C%W$7$^$9!#(B


  /dev/rfd?.988$B!"(B/dev/fd?.988

		256 byte 26 sectors/track 77 cylinders
		0, 1 track $B$O%9%-%C%W$7$^$9!#(B


 $B>e5-$N%G%P%$%9$r;XDj$9$k$H!"(BTOMCAT FDD $B$N%b!<%?$r(B 360rpm $B$K(B
 $B@_Dj$7$F%"%/%;%9$7$^$9!#(B
 5.25 inchi FDD $B$G$b;HMQ$G$-$^$9!#(B
 ( 5.25' FDD 360rpm $B8GDj(B + BIOS $B@_Dj$r(B 5.25' 1.2MB $B$K$7$?>l9g(B )


$B#2!%(B256 byte 26 sectors/track $B$N(B FD $B$K$D$$$F(B

 $BDL>o(B 256x26 $B$N(B FD $B$O(B 0 $B%H%i%C%/$O(B FM $B%U%)!<%^%C%H$G!"(B
 128 byte/sector $B$K$J$C$F$$$^$9!#(B IBM 8' 2D $B%U%)!<%^%C%H$G$9!#(B
 $B$7$+$7%*%j%8%J%k$N(B fd $B%I%i%$%P$O(B MFM $B$7$+%5%]!<%H$7$F$$$J$$$N$G(B
 $B0J2<$N@)8B$,$"$j$^$9!#(B

 $B%U%)!<%^%C%H;~$O!"(B rfd?.1025 $B$r;HMQ$7$^$9!#(B
 0 $B%H%i%C%/$b(B MFM $B$G%U%)!<%^%C%H$5$l$^$9!#(B

 $BB>%7%9%F%`$G(B tar $B%;!<%V$7$?(B FD $B$rFI$`>l9g$O(B

   tar xvf /dev/rfd0.1000    ( 0 track $B$r;H$o$J$$(B )

 $B$^$?$O(B

   tar xvf /dev/rfd0.988     ( 0 $B%7%j%s%@$r;H$o$J$$(B )

 $B$H$7$^$9!#(B


$B#3!%(B512 byte 15 sectors/track $B$N(B FD $B$K$D$$$F(B

 512x15 $B$O!"(B360rpm 500Kbps $B$N(B 5.25' 2HC $B$H8F$P$l$F$$$k(B
 $B%U%)!<%^%C%H$N;v$G$9!#$H$3$m$,!"$b$H$b$H$N(B /dev/[r]fd.1200 $B$O(B
 3.5' $B%b!<%I;~$K(B 300rpm $B$N$^$^$G$9!#(B 5.25' 2HC $B$r(B 3.5' FD $B>e$G(B
 $B;H$&0Y$K$"$k$N$@$H;W$C$F$$$^$9!#(B
  $B$=$3$G!"(B3.5' FD $B>e$G!"(B360rpm $B$GF0:n$9$k0Y$K(B /dev/[rfd].1202
 $B$r;H$$$^$9!#(B FreeBSD(98) $B>e$N(B /dev/rfd0 $B$O$3$l$K$J$j$^$9!#(B
 ( PC9801/DA $B$O$=$&$G$7$?!#(B MS-DOS $B$N(B format a: /5 )
 5.25' FDD $B>e$G$ON><T$OA4$/F1$8$G$9!#(B


$B#4!%=`Hw(B

 patch -p < fd360.diff
 cd /dev
 ./MAKEDEV fd0 fd1

 $B$"$H(B kernel $B$N:F9=C[$r9T$C$F40N;(B


$B0J2<%Q%C%A$G$9!#(B
fd360.diff $B$H$+$N%U%!%$%k$K$7$F2<$5$$!#(B

========== cut cut cut cut ============
*** /usr/src/sys/i386/isa/fd.c.org	Mon Feb 26 06:01:31 1996
--- /usr/src/sys/i386/isa/fd.c	Tue Jul  9 03:55:23 1996
***************
*** 177,183 ****
  #define FD_NOT_VALID -2
  #define FDC_ERRMAX	100	/* do not log more */
  
! #define NUMTYPES 14
  #define NUMDENS  (NUMTYPES - 6)
  
  /* These defines (-1) must match index for fd_types */
--- 177,183 ----
  #define FD_NOT_VALID -2
  #define FDC_ERRMAX	100	/* do not log more */
  
! #define NUMTYPES 19
  #define NUMDENS  (NUMTYPES - 6)
  
  /* These defines (-1) must match index for fd_types */
***************
*** 192,204 ****
  #define FD_720          7
  #define FD_360          8
  
! #define FD_1480in5_25   9
! #define FD_1440in5_25   10
! #define FD_820in5_25    11
! #define FD_800in5_25    12
! #define FD_720in5_25    13
! #define FD_360in5_25    14
! 
  
  static struct fd_type fd_types[NUMTYPES] =
  {
--- 192,209 ----
  #define FD_720          7
  #define FD_360          8
  
! #define FD_1232_360     9	/* 1024x8 MFM 154 */
! #define FD_1200_360     10	/* 512x15 MFM 160 */
! #define FD_1025_360     11	/* 256x26 MFM 154 */
! #define FD_1000_360     12	/* 256x26 MFM 153, can't use track 0 */
! #define FD_0988_360     13	/* 256x26 MFM 152, can't use track 0,1 */
! 
! #define FD_1480in5_25   14
! #define FD_1440in5_25   15
! #define FD_820in5_25    16
! #define FD_800in5_25    17
! #define FD_720in5_25    18
! #define FD_360in5_25    19
  
  static struct fd_type fd_types[NUMTYPES] =
  {
***************
*** 211,216 ****
--- 216,227 ----
  {  9,2,0xFF,0x20,80,1440,1,FDC_250KBPS,2,0x50,1 }, /*  720K in HD 3.5in */
  {  9,2,0xFF,0x2A,40, 720,1,FDC_250KBPS,2,0x50,1 }, /*  360K in DD 5.25in */
  
+ {  8,3,0xFF,0x35,77,1232,1,FDC_500KBPS,2,0x74,1 }, /* 1.25M in HD 360rpm */
+ { 15,2,0xFF,0x1B,80,2400,1,FDC_500KBPS,2,0x54,1 }, /*  1.2M in HD 360rpm */
+ { 26,1,0xFF,0x0E,77,4004,1,FDC_500KBPS,2,0x36,1 }, /*  1.0M in HD 360rpm */
+ { 26,1,0xFF,0x0E,77,3978,1,FDC_500KBPS,2,0x36,1 }, /*  1.0M in HD 360rpm */
+ { 26,1,0xFF,0x0E,77,3952,1,FDC_500KBPS,2,0x36,1 }, /*  1.0M in HD 360rpm */
+ 
  { 18,2,0xFF,0x02,82,2952,1,FDC_500KBPS,2,0x02,2 }, /* 1.48M in HD 5.25in */
  { 18,2,0xFF,0x02,80,2880,1,FDC_500KBPS,2,0x02,2 }, /* 1.44M in HD 5.25in */
  { 10,2,0xFF,0x10,82,1640,1,FDC_300KBPS,2,0x2E,1 }, /*  820K in HD 5.25in */
***************
*** 250,255 ****
--- 261,270 ----
  	void	*bdev;
  	void	*cdev;
  #endif
+ 	int	rpm;
+ #define	FD_RPM_300	6	/* FDD motor 300rpm */
+ #define	FD_RPM_360	5	/* FDD motor 360rpm */
+ 	int	ssec;
  } fd_data[NFD];
  
  /***********************************************************************\
***************
*** 281,287 ****
--- 296,304 ----
  int out_fdc(fdcu_t, int);
  
  /* internal functions */
+ static void set_motor_rpm(fdcu_t, int, int);
  static void set_motor(fdcu_t, int, int);
+ static timeout_t fd_dchg_check;
  #  define TURNON 1
  #  define TURNOFF 0
  static timeout_t fd_turnoff;
***************
*** 795,800 ****
--- 812,833 ----
  /*		remember to not deselect the drive we're working on         */
  /****************************************************************************/
  static void
+ set_motor_rpm(fdcu_t fdcu, int fdsu, int rpm)
+ {
+ 	int fdout = fdc_data[fdcu].fdout;
+ 	int m = (FDO_MOEN0 << fdsu);
+ 
+ 	for (; rpm > 0; rpm--) {
+ 		fdout &= ~m;
+ 		outb(fdc_data[fdcu].baseport+FDOUT, fdout);
+ 		TRACE1("[0x%x->FDOUT]", fdout);
+ 		fdout |= m;
+ 		outb(fdc_data[fdcu].baseport+FDOUT, fdout);
+ 		TRACE1("[0x%x->FDOUT]", fdout);
+ 	}
+ }
+ 
+ static void
  set_motor(fdcu_t fdcu, int fdsu, int turnon)
  {
  	int fdout = fdc_data[fdcu].fdout;
***************
*** 877,890 ****
  }
  
  static void
  fd_turnon(fdu_t fdu)
  {
  	fd_p fd = fd_data + fdu;
  	if(!(fd->flags & FD_MOTOR))
  	{
  		fd->flags |= (FD_MOTOR + FD_MOTOR_WAIT);
! 		set_motor(fd->fdc->fdcu, fd->fdsu, TURNON);
! 		timeout(fd_motor_on, (caddr_t)fdu, hz); /* in 1 sec its ok */
  	}
  }
  
--- 910,941 ----
  }
  
  static void
+ fd_dchg_check(void *arg1)
+ {
+ 	fdu_t fdu = (fdu_t)arg1;
+ 	fd_p fd = fd_data + fdu;
+ 
+ 	set_motor_rpm(fd->fdc->fdcu, fd->fdsu, fd->rpm);
+ 	timeout(fd_motor_on, (caddr_t)fdu, hz);
+ }
+ 
+ static void
  fd_turnon(fdu_t fdu)
  {
  	fd_p fd = fd_data + fdu;
+ 	fdcu_t fdcu;
+ 	int	i;
+ 
  	if(!(fd->flags & FD_MOTOR))
  	{
  		fd->flags |= (FD_MOTOR + FD_MOTOR_WAIT);
! 		fdcu = fd->fdc->fdcu;
! 		set_motor(fdcu, fd->fdsu, TURNON);
! 		i = inb(fdc_data[fdcu].baseport+FDCTL);
! 		TRACE1("[FDCTL->0x%x]", i);
! 		if (i & FDI_DCHG)
! 			fd_cmd(fdcu, 3, NE7CMD_SEEK, fd->fdsu, 1, 0);
! 		timeout(fd_dchg_check, (caddr_t)fdu, hz / 100);
  	}
  }
  
***************
*** 1006,1011 ****
--- 1057,1064 ----
  		return(ENXIO);
  	if (type > NUMDENS)
  		return(ENXIO);
+ 	fd_data[fdu].rpm = FD_RPM_300;
+ 	fd_data[fdu].ssec = 0;
  	if (type == 0)
  		type = fd_data[fdu].type;
  	else {
***************
*** 1039,1057 ****
  				case FD_360:
  					type = FD_360in5_25;
  					break;
  				default:
  					return(ENXIO);
  				}
  				break;
  			case FD_1440:
! 				if (   type != FD_1720
! 				    && type != FD_1480
! 				    && type != FD_1200
! 				    && type != FD_820
! 				    && type != FD_800
! 				    && type != FD_720
! 				    )
  					return(ENXIO);
  				break;
  			}
  		}
--- 1092,1136 ----
  				case FD_360:
  					type = FD_360in5_25;
  					break;
+ 				case FD_1232_360:
+ 				case FD_1200_360:
+ 				case FD_1025_360:
+ 					break;
+ 				case FD_1000_360:
+ 					fd_data[fdu].ssec = 26;
+ 					break;
+ 				case FD_0988_360:
+ 					fd_data[fdu].ssec = 52;
+ 					break;
  				default:
  					return(ENXIO);
  				}
  				break;
  			case FD_1440:
! 				switch (type) {
! 				case FD_1720:
! 				case FD_1480:
! 				case FD_1200:
! 				case FD_820:
! 				case FD_800:
! 				case FD_720:
! 					break;
! 				case FD_1232_360:
! 				case FD_1200_360:
! 				case FD_1025_360:
! 					fd_data[fdu].rpm = FD_RPM_360;
! 					break;
! 				case FD_1000_360:
! 					fd_data[fdu].rpm = FD_RPM_360;
! 					fd_data[fdu].ssec = 26;
! 					break;
! 				case FD_0988_360:
! 					fd_data[fdu].rpm = FD_RPM_360;
! 					fd_data[fdu].ssec = 52;
! 					break;
! 				default:
  					return(ENXIO);
+ 				}
  				break;
  			}
  		}
***************
*** 1127,1132 ****
--- 1206,1213 ----
  			goto bad;
  		}
  		if ((bp->b_bcount % fdblk) != 0) {
+ 			printf( "fd%d: fdstrat: bad request bcount = %ld\n",
+ 				fdu, bp->b_bcount);
  			bp->b_error = EINVAL;
  			bp->b_flags |= B_ERROR;
  			goto bad;
***************
*** 1147,1152 ****
--- 1228,1234 ----
  		}
  		goto bad;
  	}
+ 	blknum += fd->ssec;
   	bp->b_cylin = blknum / (fd->ft->sectrac * fd->ft->heads);
   	bp->b_pblkno = bp->b_blkno;
  	dp = &(fdc->head);
***************
*** 1449,1455 ****
  		isa_dmastart(bp->b_flags, bp->b_un.b_addr+fd->skip,
  			format ? bp->b_bcount : fdblk, fdc->dmachan);
  		blknum = (unsigned long)bp->b_blkno*DEV_BSIZE/fdblk
! 			+ fd->skip/fdblk;
  		sectrac = fd->ft->sectrac;
  		sec = blknum %  (sectrac * fd->ft->heads);
  		head = sec / sectrac;
--- 1531,1537 ----
  		isa_dmastart(bp->b_flags, bp->b_un.b_addr+fd->skip,
  			format ? bp->b_bcount : fdblk, fdc->dmachan);
  		blknum = (unsigned long)bp->b_blkno*DEV_BSIZE/fdblk
! 			+ fd->skip/fdblk + fd->ssec;
  		sectrac = fd->ft->sectrac;
  		sec = blknum %  (sectrac * fd->ft->heads);
  		head = sec / sectrac;
***************
*** 1571,1577 ****
  		{
  			/* set up next transfer */
  			blknum = (unsigned long)bp->b_blkno*DEV_BSIZE/fdblk
! 				+ fd->skip/fdblk;
  			bp->b_cylin =
  				(blknum / (fd->ft->sectrac * fd->ft->heads));
  			fdc->state = DOSEEK;
--- 1653,1659 ----
  		{
  			/* set up next transfer */
  			blknum = (unsigned long)bp->b_blkno*DEV_BSIZE/fdblk
! 				+ fd->skip/fdblk + fd->ssec;
  			bp->b_cylin =
  				(blknum / (fd->ft->sectrac * fd->ft->heads));
  			fdc->state = DOSEEK;
***************
*** 1848,1854 ****
  		dl = (struct disklabel *)buffer;
  		dl->d_secsize = fdblk;
  		fdt = fd_data[FDUNIT(minor(dev))].ft;
! 		dl->d_secpercyl = fdt->size / fdt->tracks;
  		dl->d_type = DTYPE_FLOPPY;
  
  		if (readdisklabel(dkmodpart(dev, RAW_PART), fdstrategy, dl)
--- 1930,1936 ----
  		dl = (struct disklabel *)buffer;
  		dl->d_secsize = fdblk;
  		fdt = fd_data[FDUNIT(minor(dev))].ft;
! 		dl->d_secpercyl = fdt->sectrac * fdt->heads;
  		dl->d_type = DTYPE_FLOPPY;
  
  		if (readdisklabel(dkmodpart(dev, RAW_PART), fdstrategy, dl)
*** /dev/MAKEDEV.org	Sat Mar 23 23:51:25 1996
--- /dev/MAKEDEV	Tue Jul  9 03:53:08 1996
***************
*** 374,379 ****
--- 374,398 ----
  		# ln ${name}${unit}.360 ${name}${unit}48ds9
  		# ln r${name}${unit}.360 r${name}${unit}48ds9
  
+ 		mknod ${name}${unit}.1232  b $blk `expr $unit '*' 64 + 9`
+ 		mknod r${name}${unit}.1232 c $chr `expr $unit '*' 64 + 9`
+ 		# ln ${name}${unit}.1232 ${name}${unit}135ds8
+ 		# ln r${name}${unit}.1232 r${name}${unit}135ds8
+ 
+ 		mknod ${name}${unit}.1202  b $blk `expr $unit '*' 64 + 10`
+ 		mknod r${name}${unit}.1202 c $chr `expr $unit '*' 64 + 10`
+ 
+ 		mknod ${name}${unit}.1025  b $blk `expr $unit '*' 64 + 11`
+ 		mknod r${name}${unit}.1025 c $chr `expr $unit '*' 64 + 11`
+ 
+ 		mknod ${name}${unit}.1000  b $blk `expr $unit '*' 64 + 12`
+ 		mknod r${name}${unit}.1000 c $chr `expr $unit '*' 64 + 12`
+ 		# ln ${name}${unit}.1000 ${name}${unit}135ds26
+ 		# ln r${name}${unit}.1000 r${name}${unit}135ds26
+ 
+ 		mknod ${name}${unit}.988  b $blk `expr $unit '*' 64 + 13`
+ 		mknod r${name}${unit}.988 c $chr `expr $unit '*' 64 + 13`
+ 
  		chgrp operator ${name}${unit}* r${name}${unit}*
  		;;
  	*)
========== cut cut cut cut ============

---------------------------------
$B=;ED(B $B>0N<(B
sumida@akb.nefs.nec.co.jp
---------------------------------

