`
lobin
  • 浏览: 444469 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于os的一些整理:第十九篇:软盘

 
阅读更多

软盘

软盘有160k, 180k, 320k, 360k, 720k, 1.2M, 1.44M, 1.68M, 1.72M以及 2.88M.我们比较常用的是1.44M的软盘。

 

软盘的扇区

扇区编号顺序连贯的,对应磁盘上的物理位置也是连贯的。


1.44M

 

1.44M软盘有2个盘面(0和1),每个盘面有80条磁道(或称磁柱),一个磁道有18个扇区,一个扇区大小为512个字节。

1.44M软盘总容量计算: 2 * 80 * 18 * 512 bytes = 1474560 bytes = 1.44M

 

FDC

FDC即Floppy Disk Controller,软盘控制器。

 

Model 30

Model 30即PS/2 Model 30。

 

PS/2

 

PC/AT

这是一种软盘控制器,即PC/AT Floppy Disk Controller。

 

还有Standard IBM PC/AT Floppy Disk Controller,标准IBM PC/AT软盘控制器,以及82077AA PC/AT Floppy Disk Controller,即82077AA PC/AT软盘控制器。

 

PC/XT

 

 

 

82072

 

 

8272A

 

 

寄存器

状态寄存器A

Status Register A

 

状态寄存器B

Status Register B

 

数字输出寄存器

Digital Output Register或者DOR。该寄存器是个8-位只写寄存器。

写道
// +-+-+-+-+-+-+-+-+
// |M|M|M|M|D|R|D|D|
// |O|O|O|O|M|E|R|R|
// |T|T|T|T|A|S|1|0|
// |D|C|B|A| |T| | |
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^ ^ ^|<->|
// | | | | | | |
// | | | | | | |DSEL1 and 0: Drive select
// | | | | | |Controller reset
// | | | | |DMA and IRQ channel
// | | | |Motor control for floppy drive A
// | | |Motor control for floppy drive B
// | |Motor control for floppy drive C
// |Motor control for floppy drive D

 

写道
// +-+-+-+-+-+-+-+-+
// | | | | | | | | |
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^ ^ ^ ^ ^
// | | | | | | | |DRIVE SEL 0
// | | | | | | |DRIVE SEL 1
// | | | | | |RESET
// | | | | |DMA GATE
// | | | |MOT EN0
// | | |MOT EN1
// | |MOT EN2
// |MOT EN3

DMA GATE

DMA GATE位只有在PC-AT和Model 30模式下才会开启。如果DMA GATE位设置为低电位,INT和DRQ输出将被跟踪,并且DACK和TC输入将被禁用。DMA GATE位设置为高电位将开启到系统的INT,DRQ,以及DACK。在PS/2模式下,DMAGATE对INT、DRQ、TC或DACK引脚没有影响,它们总是处于活动状态。

 

 

磁带驱动器寄存器

Tape Drive Register

 

主状态寄存器

Main Status Register或者MSR

 

 

写道

 

// +-+-+-+-+-+-+-+-+
// |M|D|N|B|A|A|A|A|
// |R|I|D|U|C|C|C|C|
// |Q|O|M|S|T|T|T|T|
// | | |A|Y|D|C|B|A|
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^|<----->|
// | | | | |Drive D, C, B, A in positioning mode
// | | | |Instruction (device busy)
// | | |non-DMA mode
// | |Data input/output
// |Main Request

 

 

数据比率选择寄存器

DataRate Select Register,其低2位(bit0-1)指定数据传输率,表示从驱动器读取数据或者向驱动器写入数据的传输速率。对于1.44MB或者1.2MB的软盘,应该将这两位设置为0。

 

数据比率

驱动器类型  数据率   设置值

2.88M       1Mbps        3

1.44M       500Kbps      0

 

1.2M        500Kbps      0

 

数据FIFO寄存器

Data FIFO Register或者FIFO寄存器,有些资料也叫Data Register,数据寄存器,或者DR

 

数字输入寄存器

Digital Input Register或者DIR

 

配置控制寄存器

Configuration Control Register或者CCR

 

另外还有几个状态寄存器

Status Register 0

写道
+--+-+-+-+-+--+
|IC|S|E|/|H|DD|
| |E|C| | |SS|
| | | | | |10|
+--+-+-+-+-+--+
| | | | | |Drive Select
| | | | |Head Address
| | | |Unused. This bit is always ``0''.
| | |Equipment Check
| |Seek End
|Interrupt Code

 

 

Status Register 1

写道
+-+-+-+-+-+-+-+-+
|E|/|D|O|/|N|N|M|
|N| |E|R| |D|W|A|
+-+-+-+-+-+-+-+-+
| | | | | | | |Missing Address Mark
| | | | | | |Not Writable
| | | | | |No Data
| | | | |Unused. This bit is always ``0''.
| | | |Overrun/Underrun
| | |Data Error
| |Unused. This bit is always ``0''.
|End of Cylinder

 

 

Status Register 2

写道
+-+-+-+-+-+-+-+-+
|/|C|D|W|/|/|B|M|
| |M|D|C| | |C|D|
+-+-+-+-+-+-+-+-+
| | | | | | | |Missing Data Address Mark
| | | | | | |Bad Cylinder
| | | | | |Unused. This bit is always ``0''.
| | | | |Unused. This bit is always ``0''.
| | | |Wrong Cylinder
| | |Data Error in Data Field.
| |Control Mark
|Unused. This bit is always ``0''.

 

 

Status Register 3

写道
+-+-+-+-+-+-+--+
|/|W|/|T|/|H|DD|
| |P| |0| |D|SS|
| | | | | | |10|
+-+-+-+-+-+-+--+
| | | | | | |
| | | | | | |Drive Select
| | | | | |Head Address
| | | | |Unused. This bit is always ``1''.
| | | |Indicates the status of the TRK0 pin.
| | |Unused. This bit is always ``1''.
| |Write Protected
|Unused. This bit is always ``0''.

  

 

NEC765A/B

 

 

82077AA

82077AA兼容Personal System/2s、PC/AT以及PC/XT软盘控制器子系统。Personal System/2s就是PS/2?

 

因此82077AA兼容PS/2, PC/AT以及PS/2 Model 30操作模式。

 

PS/2模式

 

PC/AT模式

 

PS/2 Model 30模式

 

 

命令

使用命令字节来表示要发送的命令。因此命令使一个8-位的值,命令值小于32,发送(写入)到数据FIFO寄存器。如果有需要发送参数的话,每个命令后面跟着指定的参数字节。如果有返回数据的话,后面同时会有返回字节需要读取。

 

82077AA处理命令分为3个阶段:Command阶段, Execution阶段以及Result阶段。

 

所有的命令都有Command阶段,如果命令执行有返回信息的话,那么这个命令就有Result阶段。另外就是Execution阶段,有些命令有Execution阶段,有些命令没有Execution阶段,需要看具体命令说明。

 

 

命令字节

Command Byte

 

参数字节

parameter bytes

 

返回字节

result bytes

 

可选位

Option bits

 

命令说明

 

READ TRACK

读磁道

 

 

SPECIFY

设置驱动器参数

 

SRT

SRT即Step Rate Time,步率时间,表示磁头在连续相邻的磁道之间移动时,控制器需要等待的时间。对于现代3.5英寸软盘驱动器,一个合理的时间是3毫秒。6到8毫秒是个安全值。

 

对应SRT值计算公式

SRT值 = 16 - (milliseconds * data_rate / 500000)

 

对于1.44 MB软盘,SRT值可以这样计算:SRT值 = 16 - (8 * 500000 / 500000) = 8。

 

HLT

HLT即Head Load Time,磁头搭载时间,表示在激活头部和实际执行读/写之间,控制器应该等待的时间。

合理的时间是10毫秒,30毫秒是个安全值。

 

对应HLT值计算公式

HLT值 = milliseconds * data_rate / 1000000

 

对于1.44 MB软盘,HLT值可以这样计算:HLT值 = 10 * 500000 / 1000000 = 5。

 

HUT

HUT即Head Unload Time,磁头卸载时间,表示在解除(deactivate)磁头,使磁头无效之前,控制器应该等待的时间。

 

对应HUT值计算公式

HUT值 = milliseconds * data_rate / 8000000

 

对于1.44 MB软盘,这个HUT时间为240毫秒,即milliseconds=240,那么HUT值可以这样计算:HUT值 = 240 * 500000 / 8000000 = 15。

 

HUT值最好设置为0,表示在任何模式下都是最大值。

 

设置驱动器参数说明

1、写入命令0x3

2、写入第1个参数字节:SRT值 << 4 | HUT值

3、写入第2个参数字节:HLT值 << 1 | NDMA

 

写道
// SPECIFY
// Command byte:
// +----+----+
// |0000|0011|
// +----+----+
// The 1st parameter byte:
// +----+----+
// |SRT |HUT |
// +----+----+
// The 2nd parameter byte:
// +----+---+-+
// |HLT |N|
// | |D|
// +----+---|-+
// ^
// |When this bit is "1", the NONDMA mode is selected, and when ND is "0", the DMA mode is selected.

 

 

SENSE DRIVE STATUS

检测驱动器状态

 

 

WRITE DATA

写数据

 

READ DATA

读数据

写道
// READ DATA
// Command byte:
// +----+----+
// |MMS0|0110|
// |TFK | |
// | M | |
// +----+----+
// Parameter byte:
// The 1st parameter byte:
// +----+----+
// |0000|0HDD|
// | | DSS|
// | | S10|
// +----+----+
// The 2nd parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |C
// The 3rd parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |H
// The 4th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |R
// The 5th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |N
// The 6th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |EOT
// The 7th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |GPL
// The 8th parameter byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |DTL
// Result byte:
// The 1st result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |ST0
// The 2nd result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |ST1
// The 3rd result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |ST2
// The 4th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |C
// The 5th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |H
// The 6th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |R
// The 7th result byte:
// +----+----+
// | | |
// +----+----+
// |<------->|
// ^
// |N

 

 

 

RECALIBRATE

重新矫正

 

SENSE INTERRUPT STATUS

检测中断

 

WRITE DELETED DATA

写入删除数据

 

READ ID

读ID

 

READ DELETED DATA

读取删除数据

 

FORMAT TRACK

格式化磁道

 

DUMPREG

备份寄存器

 

SEEK

查找

 

RELATIVE SEEK

 

 

VERSION

获取版本

 

SCAN EQUAL

扫描(等于)

 

PERPENDICULAR MODE

P模式(Pmode)

 

CONFIGURE

配置

写道
// CONFIGURE
// Command byte:
// +----+----+
// |0001|0011|
// +----+----+
// The 1st parameter byte:
// +----+----+
// |0000|0000|
// +----+----+
// The 2nd parameter byte:
// +-+-+-+-+----+
// |0| | | | |
// +-+-+-+-+----+
// ^ ^ ^|<-->|
// | | | ^
// | | | |FIFOTHR.
// | | |POLL
// | |EFIFO
// |EIS
// The 3rd parameter byte:
// +--------+
// |PRETRK |
// +--------+

 

 

LOCK

锁定

 

VERIFY

验证

 

SCAN LOW OR EQUAL

扫描(小于等于)

 

SCAN HIGH OR EQUAL

扫描(大于等于)

 

以上命令有执行阶段的有:READ DATA,READ DELETED DATA,WRITE DATA,WRITE DELETED DATA,READ TRACK,VERIFY,FORMAT TRACK,SCAN EQUAL,SCAN LOW OR EQUAL,SCAN HIGH OR EQUAL,RECALIBRATE,SEEK,DUMPREG,READ ID。所有涉及到读写的命令都有执行阶段。

 

Command阶段

 

 

Execution阶段

执行阶段

 

Result阶段

 

返回阶段

 

所有的数据传输,向82077AA发送数据或从82077AA接收数据,都在Execution阶段。这里有两种模式:DMA或者non-DMA模式。这可以在SPECIFY(设置驱动器参数)命令中指定。

 

数据传输模式

通过SPECIFY(设置驱动器参数)命令指定数据传输模式,即DMA模式还是non-DMA模式。non-DMA模式即PIO模式。

 

DMA

 

PIO

 

中断

通过以下函数检查中断是否屏蔽:

// 0X40 -> 0100 0000
#define O_IRQ6 0X40

pic_irq_is_enable(O_IRQ6)

 

 

DMA

参考8237/8237A以及DMA控制器。

 

DRQ

DRQ即DMA request,DRQ请求。

 

DMA channel

DMA channel即DMA通道

 

设置DMA通道2

 

 

 

初始化FDC

初始化FDC启动motor的时候需要延迟等待一段时间,等motor速度上来。

 

要延迟等待多久?

如果是3.5"软盘,建议延迟等待300毫秒;如果是5.25"软盘,建议延迟等待500毫秒。

 

如果使用DMA进行数据传输,在初始化FDC之前,需要设置DMA,设置DMA Channel 2,即DMA 通道#2。

 

通过以下函数设置DMA 通道#2:

setup_dma2(FLOPPY_DMA_TRANSFER_ADDRESS, FLOPPY_DMA_TRANSFER_LENGTH - 1);

 

 

相关结构和定义

#define DOR_REST 0x04
#define DOR_DMA  0x08
#define DOR_MOTA 0x10
#define DOR_MOTB 0x20
#define DOR_MOTC 0x40
#define DOR_MOTD 0x80

 

#define DOR_MOTX(A,B,C,D) (DOR_MOTA | DOR_MOTB | DOR_MOTC | DOR_MOTD)
#define DOR_MOTY(BA,BB,BC,BD) ((BA ? DOR_MOTA : 0) | (BB ? DOR_MOTB : 0) | (BC ? DOR_MOTC : 0) | (BD ? DOR_MOTD : 0))
#define DOR_MOTZ(drive) (1 << (drive + 4))

 

enum floppy_command_t {
	COMMAND_READ_TRACK = 2, 
	COMMAND_SPECIFY    = 3, 
	COMMAND_SENSE_DRIVE_STATUS = 4, 
	COMMAND_WRITE_DATA = 5, 
	COMMAND_READ_DATA  = 6, 
	COMMAND_RECALIBRATE        = 7, 
	COMMAND_SENSE_INTERRUPT    = 8, 
	COMMAND_WRITE_DELETED_DATA = 9, 
	COMMAND_READ_ID    = 10, 
	COMMAND_READ_DELETED_DATA  = 12, 
	COMMAND_FORMAT_TRACK       = 13, 
	COMMAND_DUMPREG    = 14, 
	COMMAND_SEEK       = 15, 
	COMMAND_VERSION    = 16, 
	COMMAND_SCAN_EQUAL = 17, 
	COMMAND_PERPENDICULAR_MODE = 18, 
	COMMAND_CONFIGURE  = 19, 
	COMMAND_LOCK       = 20, 
	COMMAND_VERIFY     = 22, 
	COMMAND_SCAN_LOW_OR_EQUAL  = 25, 
	COMMAND_SCAN_HIGH_OR_EQUAL = 29
};

 

void floppy_init(u1 drive);

void floppy_ready();
void floppy_wait();

void floppy_set_datarate(u1 rate);

void floppy_send_command(u1 command, u1 option, byte* parameter_bytes, byte* result_bytes);

 

数据传输模式

// the mode of data transfer. return zero if in DMA mode 
int floppy_get_mode()
{
  u1 msr = floppy_read_msr();
  return msr & MSR_NDMA; // MSR_NDMA = 0x20, if bit5 of MSR set, in non-DMA mode, else in DMA mode.
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics