#1楼主:UDMA通道的建立
文章发表于:2008-08-21 02:01
我用FPGA连接主机与硬盘,查询主机写的命令寄存器,如果查询到主机往命令寄存器写C8(DMA读)或CA(DMA写),就转入UDMA数据传输模块,否则让主机与硬盘的数据线以及控制线直连。
但这样做的话,硬盘的工作模式总是处于PIO或者MDMA模式,无法进入UDMA模式。请问一下,主机与硬盘之间是怎样建立UDMA通道的?谢谢!
#2
文章发表于:2008-09-03 23:46
主机和硬盘之间会通过identify命令和set feature命令进行传输协议约定,确定一下在你的系统中主机开机后这两条命令的执行情况。捕获一下set feature命令的参数,这里会有是否采用UDMA的信息。确保硬盘收到了正确的UDMA信息。
一个疑问,你如何确认硬盘进入了MDMA模式呢?
#3
文章发表于:2008-09-07 15:01
当主机识别出硬盘后,查看硬盘的工作模式。我想请教一下,如果自己手动对硬盘进行SET FEATURES设置工作模式,主机能否识别出我设置的模式?
主机在发出SET FEATURES命令后,然后读ERROR OUT,根据状态寄存器来确认硬盘是否接收到了命令,在这个时候,是否要自己手动设置状态寄存器?
#4
文章发表于:2008-09-07 19:47
从你的设计看,FPGA是一个硬盘代理。那么你可以“伪造”任何硬盘信息给主机,也可以选择透明的状态和数据“中继”。如果你模拟的行为和主机期望的硬盘行为不一致,那么主机肯定不会“承认”或“确认”当前连接的是一块硬盘。
所以,对你的问题我认为应该设置一个正确状态返回值给主机。
IDE协议里对每一条命令都给出了正确或错误的返回值。你可以参考协议。
再有,Set Feature命令是有“子命令”的。在硬盘初始化的过程中,主机会多次发送Set Feature命令,但是采用不同的子命令,完成多个不同参数的设定。不知道你的设计里考没考虑区分多条子命令,并完成相应的处理。这些命令你需要转发给硬盘,否则只是主机和硬盘代理之间完成了初始化工作,代理和硬盘之间还没有约定好传输方式。
#5
文章发表于:2008-09-11 14:55
我的设计思路是:分两个模块,一个模块是用来进行命令识别,在这个模块里,主机发出的读写寄存器命令,在FPGA里面全都不经过处理,直接转发给硬盘,硬盘和主机之间的数据传输也不做处理,使他们处于直通的状态。
当识别到主机发出读写DMA的命令后,跳出这个模块,转入到UDMA处理模块。在UDMA模块里面,完全遵守UDMA协议,自己搭建了一个“中间代理”,用来处理传输的数据。
但现在问题是程序跳不到UDMA模块,一直停留在命令识别模块里面。我看到协议里面说主机在发出读写DMA命令后,要再读状态寄存器的状态,然后才查询DMARQ状态。
我的程序里漏掉了读状态寄存器这个过程,在识别到有读写DMA命令发出后,就直接进入到查询DMARQ状态了,这一个漏洞会不会是我的程序存在问题的关键呢?