程序14-19 linux/include/linux/fdreg.h
1 /*
2 * This file contains some defines for the floppy disk controller.
3 * Various sources. Mostly "IBM Microcomputers: A Programmers
4 * Handbook", Sanches and Canton.
5 */
/*
* 该文件中含有一些软盘控制器的一些定义。这些信息有多处来源,大多数取自Sanches和Canton
* 编著的"IBM微型计算机:程序员手册"一书。
*/
6 #ifndef _FDREG_H // 该定义用来排除代码中重复包含此头文件。
7 #define _FDREG_H
8
// 一些软盘类型函数的原型说明。
9 extern int ticks_to_floppy_on(unsigned int nr);
10 extern void floppy_on(unsigned int nr);
11 extern void floppy_off(unsigned int nr);
12 extern void floppy_select(unsigned int nr);
13 extern void floppy_deselect(unsigned int nr);
14
// 下面是有关软盘控制器一些端口和符号的定义。
15 /* Fd controller regs. S&C, about page 340 */
/* 软盘控制器(FDC)寄存器端口。摘自S&C书中约340页 */
16 #define FD_STATUS 0x3f4 // 主状态寄存器端口。
17 #define FD_DATA 0x3f5 // 数据端口。
18 #define FD_DOR 0x3f2 /* Digital Output Register */
// 数字输出寄存器(也称为数字控制寄存器)。
19 #define FD_DIR 0x3f7 /* Digital Input Register (read) */
// 数字输入寄存器。
20 #define FD_DCR 0x3f7 /* Diskette Control Register (write)*/
// 数据传输率控制寄存器。
21
22 /* Bits of main status register */
/* 主状态寄存器各比特位的含义 */
23 #define STATUS_BUSYMASK 0x0F /* drive busy mask */
// 驱动器忙位(每位对应一个驱动器)。
24 #define STATUS_BUSY 0x10 /* FDC busy */
// 软盘控制器忙。
25 #define STATUS_DMA 0x20 /* 0- DMA mode */
// 0 - 为DMA数据传输模式,1 - 为非DMA模式。
26 #define STATUS_DIR 0x40 /* 0- cpu->fdc */
// 传输方向:0 - CPU à fdc,1 - 相反。
27 #define STATUS_READY 0x80 /* Data reg ready */
// 数据寄存器就绪位。
28
29 /* Bits of FD_ST0 */
/*状态字节0(ST0)各比特位的含义 */
30 #define ST0_DS 0x03 /* drive select mask */
// 驱动器选择号(发生中断时驱动器号)。
31 #define ST0_HA 0x04 /* Head (Address) */
// 磁头号。
32 #define ST0_NR 0x08 /* Not Ready */
// 磁盘驱动器未准备好。
33 #define ST0_ECE 0x10 /* Equipment chech error */
// 设备检测出错(零磁道校准出错)。
34 #define ST0_SE 0x20 /* Seek end */
// 寻道或重新校正操作执行结束。
35 #define ST0_INTR 0xC0 /* Interrupt code mask */
// 中断代码位(中断原因),00 - 命令正常结束;
// 01 - 命令异常结束;10 - 命令无效;11 - FDD就绪状态改变。
36
37 /* Bits of FD_ST1 */
/*状态字节1(ST1)各比特位的含义 */
38 #define ST1_MAM 0x01 /* Missing Address Mark */
// 未找到地址标志(ID AM)。
39 #define ST1_WP 0x02 /* Write Protect */
// 写保护。
40 #define ST1_ND 0x04 /* No Data - unreadable */
// 未找到指定的扇区。
41 #define ST1_OR 0x10 /* OverRun */
// 数据传输超时(DMA控制器故障)。
42 #define ST1_CRC 0x20 /* CRC error in data or addr */
// CRC检验出错。
43 #define ST1_EOC 0x80 /* End Of Cylinder */
// 访问超过一个磁道上的最大扇区号。
44
45 /* Bits of FD_ST2 */
/*状态字节2(ST2)各比特位的含义 */
46 #define ST2_MAM 0x01 /* Missing Addess Mark (again) */
// 未找到数据地址标志。
47 #define ST2_BC 0x02 /* Bad Cylinder */
// 磁道坏。
48 #define ST2_SNS 0x04 /* Scan Not Satisfied */
// 检索(扫描)条件不满足。
49 #define ST2_SEH 0x08 /* Scan Equal Hit */
// 检索条件满足。
50 #define ST2_WC 0x10 /* Wrong Cylinder */
// 磁道(柱面)号不符。
51 #define ST2_CRC 0x20 /* CRC error in data field */
// 数据场CRC校验错。
52 #define ST2_CM 0x40 /* Control Mark = deleted */
// 读数据遇到删除标志。
53
54 /* Bits of FD_ST3 */
/*状态字节3(ST3)各比特位的含义 */
55 #define ST3_HA 0x04 /* Head (Address) */
// 磁头号。
56 #define ST3_TZ 0x10 /* Track Zero signal (1=track 0) */
// 零磁道信号。
57 #define ST3_WP 0x40 /* Write Protect */
// 写保护。
58
59 /* Values for FD_COMMAND */
/* 软盘命令码 */
60 #define FD_RECALIBRATE 0x07 /* move to track 0 */
// 重新校正(磁头退到零磁道)。
61 #define FD_SEEK 0x0F /* seek track */
// 磁头寻道。
62 #define FD_READ 0xE6 /* read with MT, MFM, SKip deleted */
// 读数据(MT多磁道操作,MFM格式,跳过删除数据)。
63 #define FD_WRITE 0xC5 /* write with MT, MFM */
// 写数据(MT,MFM)。
64 #define FD_SENSEI 0x08 /* Sense Interrupt Status */
// 检测中断状态。
65 #define FD_SPECIFY 0x03 /* specify HUT etc */
// 设定驱动器参数(步进速率、磁头卸载时间等)。
66
67 /* DMA commands */
/* DMA 命令 */
68 #define DMA_READ 0x46 // DMA读盘,DMA方式字(送DMA端口12,11)。
69 #define DMA_WRITE 0x4A // DMA写盘,DMA方式字。
70
71 #endif
72