谢谢版主,我很需要这方面的资料。。。
我的邮箱是:stillwell006@163.com
我的qq号:284017710
关于vxWorks系统ATA硬盘的DMA的方面的资料
找到这个笔记,不知道对你有没有帮助!!
最近我在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方式的。
configtype = 0x066b; /*配置类型,就是选择transfer mode、transfer bits、transfer unit、geometry parameters 等参数 */
请问"0x066b"是什么意思,是怎么得来的。。?^_^
在config.h中(ataresources那块位置)设置了transfer mode、transfer bits、transfer unit、geometry parameters 等参数后,还要再ataDrv()中再设置么?
谢谢!
请问第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++;
}
}
在设置相关参数的后,用fopen与fwrite函数写硬盘,80M文件用时15妙,硬盘的缓存为512K的,,,,是否是此种硬盘的DMA了,,,感觉还不太快啊。。。
有谁这方面比较有经验些,,,,指点下,谢谢了
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |