返回该小组首页 回复主题
lybinger

lybinger

小组等级:     E币:91  (E币换礼)

#1楼主:UDMA通道的建立

文章发表于:2008-08-21 02:01

我用FPGA连接主机与硬盘,查询主机写的命令寄存器,如果查询到主机往命令寄存器写C8(DMA读)或CA(DMA写),就转入UDMA数据传输模块,否则让主机与硬盘的数据线以及控制线直连。

但这样做的话,硬盘的工作模式总是处于PIO或者MDMA模式,无法进入UDMA模式。请问一下,主机与硬盘之间是怎样建立UDMA通道的?谢谢!

riple

   小组等级:    E币:4247  (E币换礼)

#2

文章发表于:2008-09-03 23:46

主机和硬盘之间会通过identify命令和set feature命令进行传输协议约定,确定一下在你的系统中主机开机后这两条命令的执行情况。捕获一下set feature命令的参数,这里会有是否采用UDMA的信息。确保硬盘收到了正确的UDMA信息。

一个疑问,你如何确认硬盘进入了MDMA模式呢?

lybinger

   小组等级:    E币:91  (E币换礼)

#3

文章发表于:2008-09-07 15:01

当主机识别出硬盘后,查看硬盘的工作模式。我想请教一下,如果自己手动对硬盘进行SET FEATURES设置工作模式,主机能否识别出我设置的模式?

主机在发出SET FEATURES命令后,然后读ERROR OUT,根据状态寄存器来确认硬盘是否接收到了命令,在这个时候,是否要自己手动设置状态寄存器?

riple

   小组等级:    E币:4247  (E币换礼)

#4

文章发表于:2008-09-07 19:47

从你的设计看,FPGA是一个硬盘代理。那么你可以“伪造”任何硬盘信息给主机,也可以选择透明的状态和数据“中继”。如果你模拟的行为和主机期望的硬盘行为不一致,那么主机肯定不会“承认”或“确认”当前连接的是一块硬盘。

所以,对你的问题我认为应该设置一个正确状态返回值给主机。

IDE协议里对每一条命令都给出了正确或错误的返回值。你可以参考协议。

再有,Set Feature命令是有“子命令”的。在硬盘初始化的过程中,主机会多次发送Set Feature命令,但是采用不同的子命令,完成多个不同参数的设定。不知道你的设计里考没考虑区分多条子命令,并完成相应的处理。这些命令你需要转发给硬盘,否则只是主机和硬盘代理之间完成了初始化工作,代理和硬盘之间还没有约定好传输方式。

lybinger

   小组等级:    E币:91  (E币换礼)

#5

文章发表于:2008-09-11 14:55

我的设计思路是:分两个模块,一个模块是用来进行命令识别,在这个模块里,主机发出的读写寄存器命令,在FPGA里面全都不经过处理,直接转发给硬盘,硬盘和主机之间的数据传输也不做处理,使他们处于直通的状态。

当识别到主机发出读写DMA的命令后,跳出这个模块,转入到UDMA处理模块。在UDMA模块里面,完全遵守UDMA协议,自己搭建了一个“中间代理”,用来处理传输的数据。

但现在问题是程序跳不到UDMA模块,一直停留在命令识别模块里面。我看到协议里面说主机在发出读写DMA命令后,要再读状态寄存器的状态,然后才查询DMARQ状态。

我的程序里漏掉了读状态寄存器这个过程,在识别到有读写DMA命令发出后,就直接进入到查询DMARQ状态了,这一个漏洞会不会是我的程序存在问题的关键呢?

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章