亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? floppy.c

?? minix3的源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* This file contains the device dependent part of the driver for the Floppy * Disk Controller (FDC) using the NEC PD765 chip. * * The file contains two entry points: * *   floppy_task:   main entry when system is brought up * * Changes: *   Sep 11, 2005   code cleanup (Andy Tanenbaum) *   Dec 01, 2004   floppy driver moved to user-space (Jorrit N. Herder) *   Sep 15, 2004   sync alarms/ local timer management  (Jorrit N. Herder) *   Aug 12, 2003   null seek no interrupt fix  (Mike Haertel) *   May 14, 2000   d-d/i rewrite  (Kees J. Bot) *   Apr 04, 1992   device dependent/independent split  (Kees J. Bot) *   Mar 27, 1992   last details on density checking  (Kees J. Bot) *   Feb 14, 1992   check drive density on opens only  (Andy Tanenbaum) *	     1991   len[] / motors / reset / step rate / ...  (Bruce Evans) *   May 13, 1991   renovated the errors loop  (Don Chapman) *           1989   I/O vector to keep up with 1-1 interleave  (Bruce Evans) *   Jan 06, 1988   allow 1.44 MB diskettes  (Al Crew) *   Nov 28, 1986   better resetting for 386  (Peter Kay) *   Oct 27, 1986   fdc_results fixed for 8 MHz  (Jakob Schripsema) */#include "floppy.h"#include <timers.h>#include <ibm/diskparm.h>#include <minix/sysutil.h>#include <minix/syslib.h>/* I/O Ports used by floppy disk task. */#define DOR            0x3F2	/* motor drive control bits */#define FDC_STATUS     0x3F4	/* floppy disk controller status register */#define FDC_DATA       0x3F5	/* floppy disk controller data register */#define FDC_RATE       0x3F7	/* transfer rate register */#define DMA_ADDR       0x004	/* port for low 16 bits of DMA address */#define DMA_TOP        0x081	/* port for top 8 bits of 24-bit DMA addr */#define DMA_COUNT      0x005	/* port for DMA count (count =  bytes - 1) */#define DMA_FLIPFLOP   0x00C	/* DMA byte pointer flip-flop */#define DMA_MODE       0x00B	/* DMA mode port */#define DMA_INIT       0x00A	/* DMA init port */#define DMA_RESET_VAL  0x006#define DMA_ADDR_MASK  0xFFFFFF	/* mask to verify DMA address is 24-bit *//* Status registers returned as result of operation. */#define ST0             0x00	/* status register 0 */#define ST1             0x01	/* status register 1 */#define ST2             0x02	/* status register 2 */#define ST3             0x00	/* status register 3 (return by DRIVE_SENSE) */#define ST_CYL          0x03	/* slot where controller reports cylinder */#define ST_HEAD         0x04	/* slot where controller reports head */#define ST_SEC          0x05	/* slot where controller reports sector */#define ST_PCN          0x01	/* slot where controller reports present cyl *//* Fields within the I/O ports. *//* Main status register. */#define CTL_BUSY        0x10	/* bit is set when read or write in progress */#define DIRECTION       0x40	/* bit is set when reading data reg is valid */#define MASTER          0x80	/* bit is set when data reg can be accessed *//* Digital output port (DOR). */#define MOTOR_SHIFT        4	/* high 4 bits control the motors in DOR */#define ENABLE_INT      0x0C	/* used for setting DOR port *//* ST0. */#define ST0_BITS_TRANS  0xD8	/* check 4 bits of status */#define TRANS_ST0       0x00	/* 4 bits of ST0 for READ/WRITE */#define ST0_BITS_SEEK   0xF8	/* check top 5 bits of seek status */#define SEEK_ST0        0x20	/* top 5 bits of ST0 for SEEK *//* ST1. */#define BAD_SECTOR      0x05	/* if these bits are set in ST1, recalibrate */#define WRITE_PROTECT   0x02	/* bit is set if diskette is write protected *//* ST2. */#define BAD_CYL         0x1F	/* if any of these bits are set, recalibrate *//* ST3 (not used). */#define ST3_FAULT       0x80	/* if this bit is set, drive is sick */#define ST3_WR_PROTECT  0x40	/* set when diskette is write protected */#define ST3_READY       0x20	/* set when drive is ready *//* Floppy disk controller command bytes. */#define FDC_SEEK        0x0F	/* command the drive to seek */#define FDC_READ        0xE6	/* command the drive to read */#define FDC_WRITE       0xC5	/* command the drive to write */#define FDC_SENSE       0x08	/* command the controller to tell its status */#define FDC_RECALIBRATE 0x07	/* command the drive to go to cyl 0 */#define FDC_SPECIFY     0x03	/* command the drive to accept params */#define FDC_READ_ID     0x4A	/* command the drive to read sector identity */#define FDC_FORMAT      0x4D	/* command the drive to format a track *//* DMA channel commands. */#define DMA_READ        0x46	/* DMA read opcode */#define DMA_WRITE       0x4A	/* DMA write opcode *//* Parameters for the disk drive. */#define HC_SIZE         2880	/* # sectors on largest legal disk (1.44MB) */#define NR_HEADS        0x02	/* two heads (i.e., two tracks/cylinder) */#define MAX_SECTORS	  18	/* largest # sectors per track */#define DTL             0xFF	/* determines data length (sector size) */#define SPEC2           0x02	/* second parameter to SPECIFY */#define MOTOR_OFF      (3*HZ)	/* how long to wait before stopping motor */#define WAKEUP	       (2*HZ)	/* timeout on I/O, FDC won't quit. *//* Error codes */#define ERR_SEEK         (-1)	/* bad seek */#define ERR_TRANSFER     (-2)	/* bad transfer */#define ERR_STATUS       (-3)	/* something wrong when getting status */#define ERR_READ_ID      (-4)	/* bad read id */#define ERR_RECALIBRATE  (-5)	/* recalibrate didn't work properly */#define ERR_DRIVE        (-6)	/* something wrong with a drive */#define ERR_WR_PROTECT   (-7)	/* diskette is write protected */#define ERR_TIMEOUT      (-8)	/* interrupt timeout *//* No retries on some errors. */#define err_no_retry(err)	((err) <= ERR_WR_PROTECT)/* Encoding of drive type in minor device number. */#define DEV_TYPE_BITS   0x7C	/* drive type + 1, if nonzero */#define DEV_TYPE_SHIFT     2	/* right shift to normalize type bits */#define FORMAT_DEV_BIT  0x80	/* bit in minor to turn write into format *//* Miscellaneous. */#define MAX_ERRORS         6	/* how often to try rd/wt before quitting */#define MAX_RESULTS        7	/* max number of bytes controller returns */#define NR_DRIVES          2	/* maximum number of drives */#define DIVISOR          128	/* used for sector size encoding */#define SECTOR_SIZE_CODE   2	/* code to say "512" to the controller */#define TIMEOUT_MICROS   500000L	/* microseconds waiting for FDC */#define TIMEOUT_TICKS     30	/* ticks waiting for FDC */#define NT                 7	/* number of diskette/drive combinations */#define UNCALIBRATED       0	/* drive needs to be calibrated at next use */#define CALIBRATED         1	/* no calibration needed */#define BASE_SECTOR        1	/* sectors are numbered starting at 1 */#define NO_SECTOR        (-1)	/* current sector unknown */#define NO_CYL		 (-1)	/* current cylinder unknown, must seek */#define NO_DENS		 100	/* current media unknown */#define BSY_IDLE	   0	/* busy doing nothing */#define BSY_IO		   1	/* busy doing I/O */#define BSY_WAKEN	   2	/* got a wakeup call *//* Seven combinations of diskette/drive are supported. * * # Diskette Drive  Sectors  Tracks   Rotation Data-rate  Comment * 0   360K    360K     9       40     300 RPM  250 kbps   Standard PC DSDD * 1   1.2M    1.2M    15       80     360 RPM  500 kbps   AT disk in AT drive * 2   360K    720K     9       40     300 RPM  250 kbps   Quad density PC * 3   720K    720K     9       80     300 RPM  250 kbps   Toshiba, et al. * 4   360K    1.2M     9       40     360 RPM  300 kbps   PC disk in AT drive * 5   720K    1.2M     9       80     360 RPM  300 kbps   Toshiba in AT drive * 6   1.44M   1.44M   18	80     300 RPM  500 kbps   PS/2, et al. * * In addition, 720K diskettes can be read in 1.44MB drives, but that does * not need a different set of parameters.  This combination uses * * 3   720K    1.44M    9       80     300 RPM  250 kbps   PS/2, et al. */PRIVATE struct density {	u8_t	secpt;		/* sectors per track */	u8_t	cyls;		/* tracks per side */	u8_t	steps;		/* steps per cylinder (2 = double step) */	u8_t	test;		/* sector to try for density test */	u8_t	rate;		/* data rate (2=250, 1=300, 0=500 kbps) */	u8_t	start;		/* motor start (clock ticks) */	u8_t	gap;		/* gap size */	u8_t	spec1;		/* first specify byte (SRT/HUT) */} fdensity[NT] = {	{  9, 40, 1, 4*9, 2, 4*HZ/8, 0x2A, 0xDF },	/*  360K / 360K  */	{ 15, 80, 1,  14, 0, 4*HZ/8, 0x1B, 0xDF },	/*  1.2M / 1.2M  */	{  9, 40, 2, 2*9, 2, 4*HZ/8, 0x2A, 0xDF },	/*  360K / 720K  */	{  9, 80, 1, 4*9, 2, 6*HZ/8, 0x2A, 0xDF },	/*  720K / 720K  */	{  9, 40, 2, 2*9, 1, 4*HZ/8, 0x23, 0xDF },	/*  360K / 1.2M  */	{  9, 80, 1, 4*9, 1, 4*HZ/8, 0x23, 0xDF },	/*  720K / 1.2M  */	{ 18, 80, 1,  17, 0, 6*HZ/8, 0x1B, 0xCF },	/* 1.44M / 1.44M */};/* The following table is used with the test_sector array to recognize a * drive/floppy combination.  The sector to test has been determined by * looking at the differences in gap size, sectors/track, and double stepping. * This means that types 0 and 3 can't be told apart, only the motor start * time differs.  If a read test succeeds then the drive is limited to the * set of densities it can support to avoid unnecessary tests in the future. */#define b(d)	(1 << (d))	/* bit for density d. */PRIVATE struct test_order {	u8_t	t_density;	/* floppy/drive type */	u8_t	t_class;	/* limit drive to this class of densities */} test_order[NT-1] = {	{ 6,  b(3) | b(6) },		/* 1.44M  {720K, 1.44M} */	{ 1,  b(1) | b(4) | b(5) },	/* 1.2M   {1.2M, 360K, 720K} */	{ 3,  b(2) | b(3) | b(6) },	/* 720K   {360K, 720K, 1.44M} */	{ 4,  b(1) | b(4) | b(5) },	/* 360K   {1.2M, 360K, 720K} */	{ 5,  b(1) | b(4) | b(5) },	/* 720K   {1.2M, 360K, 720K} */	{ 2,  b(2) | b(3) },		/* 360K   {360K, 720K} */	/* Note that type 0 is missing, type 3 can read/write it too, which is	 * why the type 3 parameters have been pessimized to be like type 0.	 */};/* Variables. */PRIVATE struct floppy {		/* main drive struct, one entry per drive */  unsigned fl_curcyl;		/* current cylinder */  unsigned fl_hardcyl;		/* hardware cylinder, as opposed to: */  unsigned fl_cylinder;		/* cylinder number addressed */  unsigned fl_sector;		/* sector addressed */  unsigned fl_head;		/* head number addressed */  char fl_calibration;		/* CALIBRATED or UNCALIBRATED */  u8_t fl_density;		/* NO_DENS = ?, 0 = 360K; 1 = 360K/1.2M; etc.*/  u8_t fl_class;		/* bitmap for possible densities */  timer_t fl_tmr_stop;		/* timer to stop motor */  struct device fl_geom;	/* Geometry of the drive */  struct device fl_part[NR_PARTITIONS];  /* partition's base & size */} floppy[NR_DRIVES];PRIVATE int irq_hook_id;	/* id of irq hook at the kernel */PRIVATE int motor_status;	/* bitmap of current motor status */PRIVATE int need_reset;		/* set to 1 when controller must be reset */PRIVATE unsigned f_drive;	/* selected drive */PRIVATE unsigned f_device;	/* selected minor device */PRIVATE struct floppy *f_fp;	/* current drive */PRIVATE struct density *f_dp;	/* current density parameters */PRIVATE struct density *prev_dp;/* previous density parameters */PRIVATE unsigned f_sectors;	/* equal to f_dp->secpt (needed a lot) */PRIVATE u16_t f_busy;		/* BSY_IDLE, BSY_IO, BSY_WAKEN */PRIVATE struct device *f_dv;	/* device's base and size */PRIVATE struct disk_parameter_s fmt_param; /* parameters for format */PRIVATE u8_t f_results[MAX_RESULTS];/* the controller can give lots of output *//* The floppy uses various timers. These are managed by the floppy driver * itself, because only a single synchronous alarm is available per process. * Besides the 'f_tmr_timeout' timer below, the floppy structure for each * floppy disk drive contains a 'fl_tmr_stop' timer.  */PRIVATE timer_t f_tmr_timeout;		/* timer for various timeouts */PRIVATE timer_t *f_timers;		/* queue of floppy timers */PRIVATE clock_t f_next_timeout; 	/* the next timeout time */FORWARD _PROTOTYPE( void f_expire_tmrs, (struct driver *dp, message *m_ptr) );FORWARD _PROTOTYPE( void f_set_timer, (timer_t *tp, clock_t delta,						 tmr_func_t watchdog) 	);FORWARD _PROTOTYPE( void stop_motor, (timer_t *tp) 			);FORWARD _PROTOTYPE( void f_timeout, (timer_t *tp) 			);FORWARD _PROTOTYPE( struct device *f_prepare, (int device) 		);FORWARD _PROTOTYPE( char *f_name, (void) 				);FORWARD _PROTOTYPE( void f_cleanup, (void) 				);FORWARD _PROTOTYPE( int f_transfer, (int proc_nr, int opcode, off_t position,					iovec_t *iov, unsigned nr_req) 	);FORWARD _PROTOTYPE( int dma_setup, (int opcode) 			);FORWARD _PROTOTYPE( void start_motor, (void) 				);FORWARD _PROTOTYPE( int seek, (void) 					);FORWARD _PROTOTYPE( int fdc_transfer, (int opcode) 			);FORWARD _PROTOTYPE( int fdc_results, (void) 				);FORWARD _PROTOTYPE( int fdc_command, (u8_t *cmd, int len) 		);FORWARD _PROTOTYPE( void fdc_out, (int val) 				);FORWARD _PROTOTYPE( int recalibrate, (void) 				);FORWARD _PROTOTYPE( void f_reset, (void) 				);FORWARD _PROTOTYPE( int f_intr_wait, (void) 				);FORWARD _PROTOTYPE( int read_id, (void) 				);FORWARD _PROTOTYPE( int f_do_open, (struct driver *dp, message *m_ptr) 	);FORWARD _PROTOTYPE( void floppy_stop, (struct driver *dp, message *m_ptr));FORWARD _PROTOTYPE( int test_read, (int density)	 		);FORWARD _PROTOTYPE( void f_geometry, (struct partition *entry)		);/* Entry points to this driver. */PRIVATE struct driver f_dtab = {  f_name,	/* current device's name */  f_do_open,	/* open or mount request, sense type of diskette */  do_nop,	/* nothing on a close */  do_diocntl,	/* get or set a partitions geometry */  f_prepare,	/* prepare for I/O on a given minor device */  f_transfer,	/* do the I/O */  f_cleanup,	/* cleanup before sending reply to user process */  f_geometry,	/* tell the geometry of the diskette */  floppy_stop,	/* floppy cleanup on shutdown */  f_expire_tmrs,/* expire all alarm timers */  nop_cancel,  nop_select,  NULL,  NULL};/*===========================================================================* *				floppy_task				     * *===========================================================================*/PUBLIC void main(){/* Initialize the floppy structure and the timers. */  struct floppy *fp;  int s;  struct sigaction sa;  sa.sa_handler = SIG_MESS;  sigemptyset(&sa.sa_mask);  sa.sa_flags = 0;  if (sigaction(SIGTERM,&sa,NULL)<0) panic("floppy","sigaction failed", errno);  signal(SIGTERM, SIG_IGN);  f_next_timeout = TMR_NEVER;  tmr_inittimer(&f_tmr_timeout);  for (fp = &floppy[0]; fp < &floppy[NR_DRIVES]; fp++) {	fp->fl_curcyl = NO_CYL;	fp->fl_density = NO_DENS;	fp->fl_class = ~0;	tmr_inittimer(&fp->fl_tmr_stop);  }  /* Set IRQ policy, only request notifications, do not automatically    * reenable interrupts. ID return on interrupt is the IRQ line number.    */  irq_hook_id = FLOPPY_IRQ;  if ((s=sys_irqsetpolicy(FLOPPY_IRQ, 0, &irq_hook_id )) != OK)  	panic("FLOPPY", "Couldn't set IRQ policy", s);  if ((s=sys_irqenable(&irq_hook_id)) != OK)  	panic("FLOPPY", "Couldn't enable IRQs", s);  driver_task(&f_dtab);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产乱码久久久久久蜜臀| 在线中文字幕不卡| 欧美大度的电影原声| 玖玖九九国产精品| 精品成人a区在线观看| 国产xxx精品视频大全| 国产精品美女久久久久高潮| 91网页版在线| 天堂va蜜桃一区二区三区| 日韩一级片在线播放| 国产风韵犹存在线视精品| √…a在线天堂一区| 在线播放中文一区| 国产一区二区精品久久99| 亚洲欧美综合色| 3d动漫精品啪啪一区二区竹菊| 久久69国产一区二区蜜臀| 国产精品女人毛片| 欧美日韩欧美一区二区| 精彩视频一区二区| 亚洲免费观看高清在线观看| 欧美一区二区三区电影| 成人在线视频一区二区| 亚洲五码中文字幕| 国产日产欧美一区| 欧美久久久久久久久久| 国产成人高清视频| 亚洲一二三四区不卡| 久久天天做天天爱综合色| 色婷婷av久久久久久久| 国产在线播放一区| 亚洲电影一级黄| 国产欧美综合色| 欧美视频三区在线播放| 丁香五精品蜜臀久久久久99网站 | 91在线国产福利| 国产成人综合网站| 五月激情丁香一区二区三区| 国产免费久久精品| 51午夜精品国产| 91色婷婷久久久久合中文| 蜜桃视频一区二区| 亚洲在线中文字幕| 国产精品视频一二| 欧美videofree性高清杂交| 日本道精品一区二区三区| 91丨九色丨黑人外教| 精品综合免费视频观看| 亚洲成人av一区二区| 国产精品第13页| 日韩欧美一区二区免费| 日本精品一区二区三区高清| 国产v综合v亚洲欧| 免费精品视频最新在线| 亚洲成人一二三| 亚洲一线二线三线久久久| 国产精品丝袜91| 精品国产亚洲一区二区三区在线观看| 欧洲精品一区二区三区在线观看| 国产91精品精华液一区二区三区| 国产综合久久久久影院| 蜜桃视频一区二区三区在线观看| 偷拍一区二区三区四区| 亚洲国产成人av网| 亚洲一区二区视频| 一区二区久久久| 伊人色综合久久天天| 亚洲视频在线一区| 亚洲视频一区二区在线| 中文字幕一区二区三区不卡在线| 中文字幕精品在线不卡| 欧美激情在线看| 久久精品夜色噜噜亚洲aⅴ| 精品剧情v国产在线观看在线| 在线播放视频一区| 7777精品伊人久久久大香线蕉完整版| 欧美亚洲国产一区二区三区va| 91原创在线视频| 色一情一乱一乱一91av| 色综合久久久久综合体| 欧美在线短视频| 欧美高清精品3d| 日韩欧美国产高清| 久久综合av免费| 中文字幕精品—区二区四季| 亚洲素人一区二区| 亚洲日本电影在线| 亚洲一区二区三区在线播放| 午夜国产精品一区| 免费观看一级欧美片| 国产一区二区三区不卡在线观看| 国产一区二区免费视频| 成人性色生活片| 91成人国产精品| 亚洲视频在线一区观看| 激情偷乱视频一区二区三区| www.亚洲人| 亚洲va国产va欧美va观看| 日韩av不卡在线观看| 国产毛片精品视频| 99久久婷婷国产综合精品电影 | 国产不卡高清在线观看视频| 99re这里只有精品视频首页| 欧美日韩激情一区二区| ww久久中文字幕| 亚洲精品视频在线观看网站| 视频一区国产视频| 国产一区二区视频在线播放| 一本色道a无线码一区v| 日韩一区和二区| 成人欧美一区二区三区| 亚洲一区二区欧美| 国内精品国产成人国产三级粉色 | 久久精品在线免费观看| 亚洲国产精品久久人人爱| 亚洲一区二区三区精品在线| 午夜精品久久久久久久久久久| 日韩不卡一区二区| 成人免费看片app下载| 51精品国自产在线| 国产一区二区三区久久久 | 国产精品进线69影院| 午夜精品久久久久| 成人午夜又粗又硬又大| 欧美日韩国产高清一区| 日本一区二区久久| 视频一区视频二区在线观看| 不卡在线观看av| 精品福利一区二区三区免费视频| 亚洲免费观看高清完整版在线观看熊| 91国偷自产一区二区使用方法| 欧美电视剧在线观看完整版| 一区二区三区国产精华| 国产麻豆精品一区二区| 欧美日韩夫妻久久| 日韩一区中文字幕| 国产成人免费网站| 精品欧美一区二区久久| 亚洲午夜免费电影| 97se亚洲国产综合在线| ww亚洲ww在线观看国产| 日本aⅴ精品一区二区三区 | 欧美中文字幕一区| 国产精品护士白丝一区av| 国模套图日韩精品一区二区| 欧美日韩第一区日日骚| 玉足女爽爽91| 99久久精品免费| 国产拍揄自揄精品视频麻豆| 精品在线免费视频| 欧美一区二区三区在| 亚洲电影一级片| 欧洲精品在线观看| 亚洲精选免费视频| 成av人片一区二区| 欧美国产精品久久| 国产一区二区成人久久免费影院| 91精品一区二区三区久久久久久 | 亚洲成年人网站在线观看| 91浏览器在线视频| 亚洲丝袜精品丝袜在线| www.视频一区| 中文字幕在线不卡视频| 波多野结衣精品在线| 国产亚洲精品免费| 国产精品一区二区在线观看网站 | 一区二区久久久久| 欧美午夜精品免费| 午夜视频在线观看一区二区| 欧美在线观看视频在线| 一区二区三区四区国产精品| 色偷偷一区二区三区| 亚洲最快最全在线视频| 欧美手机在线视频| 日日摸夜夜添夜夜添国产精品| 91精品国产综合久久精品app| 日韩精品国产欧美| 欧美成人r级一区二区三区| 精品一区二区三区免费毛片爱 | 国产精品视频在线看| 91视视频在线观看入口直接观看www| 亚洲欧洲精品天堂一级| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 久久综合色综合88| 不卡一二三区首页| 亚洲免费观看高清完整版在线观看| 欧美性猛片aaaaaaa做受| 美国毛片一区二区| 久久久久高清精品| 色综合色综合色综合| 亚洲成a人片在线不卡一二三区| 日韩一区二区三| 国产成人aaa| 亚洲一区二区三区在线| 日韩欧美精品三级| 成人性视频免费网站| 亚洲成人久久影院| 久久久久久久综合色一本| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 色哦色哦哦色天天综合|