这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于vxWorks系统ATA硬盘的DMA的方面的资料

共6条 1/1 1 跳转至

关于vxWorks系统ATA硬盘的DMA的方面的资料

菜鸟
2007-08-22 12:53:02     打赏

谢谢版主,我很需要这方面的资料。。。
我的邮箱是:stillwell006@163.com
我的qq号:284017710




关键词: 关于     vxWorks     系统     硬盘     方面的     面的         

高工
2007-08-22 15:44:07     打赏
2楼

找到这个笔记,不知道对你有没有帮助!!

最近我在s3c4510b的demo板上加了一块硬盘,现在已可以成功的进行文件的读写操作,下面我将具体的实现方法描述一下。

一、硬件连接:

s3c4510b ide

d0~d15 d0~d15

a0~a2 a0~a2

ecs0 ecs1 cs0 cs1

nwbe0 noe diow dior

int3 intrq

这里要注意的是由于是采用直连的方式,而不是利用cpld进行了时序处理,所有对于片选信号的选用要使用ecs0和ecs1,因为external i/o空间可以进行读写信号与片选信号之间前后沿的调整,而用rom bank空间时,读写信号与片选信号的建立和保持时间是固定的。这样会造成读写时序同ide标准不一致,这也同你的硬盘的传输模式有关系,具体要参考ata的手册。当然如果用上cpld的话,就可以对读写或片选信号进行调整,也就没有这个问题了。

另外还要注意cache的问题,当使能cache时,在一次16bit的读操作中,对于外部rom空间,在rcs片选信号有效期间,地址会连续变化8次;对于外部io空间,ecs片选信号会同地址一同变化8次,这是我用逻辑分析仪发现的结果。将cache关掉就正常了。

--------------------------------------------------------------------------------

二、软件的修改说明:

我的tornado的版本是2.0的。

1、先可能要修改一下bsp,主要是将external io空间映射出来,同时要设置外部io接

入控制寄存器。我的具体参数如下:

external io空间从地址0x3600000开始,

snds_extacon0 = 0x0e490e49;

snds_extacon1 = 0x0e490e49;

这主要同时序有关系,因为我的硬盘最大只支持到pio3。

2、 src/drv/hdsik/atadrv.c以及atashow.c考到自己建的工程中。

具体的修改如下:

第一步:

由于ataresources没有在外部定义,所以在这里自己进行了定义,它主要就是定义ide寄存器的地址映射,我这里定义如下:

uint32 iostart[2] = {0x3600000,0x3604000};

pctrl->data = ata_data (iostart[0]);

pctrl->error = ata_error (iostart[0]);

pctrl->feature = ata_feature (iostart[0]);

pctrl->seccnt = ata_seccnt (iostart[0]);

pctrl->sector = ata_sector (iostart[0]);

pctrl->cyllo = ata_cyl_lo (iostart[0]);

pctrl->cylhi = ata_cyl_hi (iostart[0]);

pctrl->sdh = ata_sdh (iostart[0]);

pctrl->command = ata_command (iostart[0]);

pctrl->status = ata_status (iostart[0]);

pctrl->astatus = ata_a_status (iostart[1]);

pctrl->dcontrol = ata_d_control (iostart[1]);

pctrl->daddress = ata_d_address (iostart[1]);

第二步:

设置atadrv()函数的参数值,我是在函数体内直接设好了。具体参数如下:

ctrl = 0; /* ide0 */

drives = 1; /* 只有一块硬盘 */

configtype = 0x066b; /*配置类型,就是选择transfer mode、transfer bits、transfer unit、geometry parameters 等参数 */

wdgtimeout = 10; /*软件狗定时 */

semtimeout = 10; /*信号量超时 */

第三步:

中断连接,我用的是外部中断3,如下:

(void) intconnect ((voidfuncptr *)int_lvl_extint3,

(voidfuncptr)ataintr, ctrl);

intenable (int_lvl_extint3); /* unmask the interrupt level */

第四步:

重新定义io操作函数,如下:

uint8 atainbyte (uint32 port)

{

return (*(volatile uint8 *)port);

}

void atainwordstring (uint32 port, uint16 *pdata, int count)

{

while(count--)

{

*pdata++ = *((volatile uint16 *)port);

}

}

void atainlongstring (uint32 port, uint32 *pdata, int count)

{

while(count--)

{

*pdata++ = *((volatile uint32 *)port);

}

}

void ataoutbyte (uint32 port, uint8 data)

{

*((volatile uint8 *)port) = data;

}

void ataoutwordstring (uint32 port, uint16 *pdata, int count)

{

while(count--)

{


*((volatile uint16 *)port) = *pdata++;

}

}

void ataoutlongstring (uint32 port, uint32 *pdata, int count)

{

while(count--)

{

*((volatile uint32 *)port) = *pdata++;

}

}

第五步:

在atarw()函数的读部分中,信号量的获取应该在写完ata读命令后开始获取,也就是在:

ata_io_byte_write (pctrl->command, ata_cmd_read_multi);

后面,而不是在while循环里面,否则如果总的要读的扇区大于一次最大的读扇区数block个之后,在传完block个扇区后,ide控制器不会产生新的中断,程序就会阻塞在那里。

第六步:


在atashow.c程序中,将presource变量删除,默认只有ata-local设备,没有ata-pcmcia设备。

3、 将\config\comps\src目录下的usrata.c加入到工程中。

4、 编译工程,将其下载到板上,启动vxworks。

5、 执行atadrv

6、 执行atashow,观察返回的数是否正确

7、 执行usrataconfig 0,0,”/ata0”

执行devs,即可看到自己添加的硬盘设备了

--------------------------------------------------------------------------------

三、读写硬盘速率测试:

我实验用的硬盘是540mb,最大速率支持到pio3,通过ftp下载文件观察,平均下载速率在70kbyte/s,读取速度大概是130 kbyte/s,还是挺慢的。现在初步考虑换新的硬盘,采用dma方式,利用s3c4510b的gdma口进行传输,速率应该会提高不少,但是因为涉及到要重新设计电路以适应dma传输,这个实验就没法做了,但是具体的应用还是要采用dma方式的。


菜鸟
2007-08-22 18:44:44     打赏
3楼

谢谢tony版主,上面有的参数设置和我早先设置有些一样,,,我自己在仔细看看,,
应该会有很大帮助。。。甚谢!


菜鸟
2007-08-22 22:40:28     打赏
4楼

configtype = 0x066b; /*配置类型,就是选择transfer mode、transfer bits、transfer unit、geometry parameters 等参数 */
请问"0x066b"是什么意思,是怎么得来的。。?^_^
在config.h中(ataresources那块位置)设置了transfer mode、transfer bits、transfer unit、geometry parameters 等参数后,还要再ataDrv()中再设置么?
谢谢!


菜鸟
2007-08-24 09:04:21     打赏
5楼

请问第4步中的I/O操作函数是tornado文件中的还是自定义的?
我在tornado2.2中找过了,好像没有这些函数啊。。。?

第四步:

重新定义io操作函数,如下:

uint8 atainbyte (uint32 port)

{

return (*(volatile uint8 *)port);

}

void atainwordstring (uint32 port, uint16 *pdata, int count)

{

while(count--)

{

*pdata++ = *((volatile uint16 *)port);

}

}

void atainlongstring (uint32 port, uint32 *pdata, int count)

{

while(count--)

{

*pdata++ = *((volatile uint32 *)port);

}

}

void ataoutbyte (uint32 port, uint8 data)

{

*((volatile uint8 *)port) = data;

}

void ataoutwordstring (uint32 port, uint16 *pdata, int count)

{

while(count--)

{


*((volatile uint16 *)port) = *pdata++;

}

}

void ataoutlongstring (uint32 port, uint32 *pdata, int count)

{

while(count--)

{

*((volatile uint32 *)port) = *pdata++;

}

}


菜鸟
2007-09-06 18:34:04     打赏
6楼

在设置相关参数的后,用fopen与fwrite函数写硬盘,80M文件用时15妙,硬盘的缓存为512K的,,,,是否是此种硬盘的DMA了,,,感觉还不太快啊。。。
有谁这方面比较有经验些,,,,指点下,谢谢了


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]