shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
阅读:1737回复:14

写过pci驱动的进来(给分40或更多)

楼主#
更多 发布于:2002-07-01 14:00
这是我的读写pci内存的程序(bufferio方式):

NTSTATUS WdmPciRead( IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PWDMPCI_DEVICE_EXTENSION dx = (PWDMPCI_DEVICE_EXTENSION)fdo->DeviceExtension;
if( !dx->GotPortOrMemory)
return CompleteIrp( Irp, STATUS_INSUFFICIENT_RESOURCES);
if( dx->IODisabled)
return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED);
if (!LockDevice(dx))
return CompleteIrp( Irp, STATUS_DELETE_PENDING);

PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
ULONG BytesTxd = 0;

// Get call parameters
ULONG ReadLen = IrpStack->Parameters.Read.Length;
PULONG Buffer = (PULONG)Irp->AssociatedIrp.SystemBuffer;
NTSTATUS status=STATUS_SUCCESS;

PVOID newbuffer=ExAllocatePool(NonPagedPool,16384);

// DebugPrint(\"读 %d 字节 \",(int)ReadLen);
READ_REGISTER_BUFFER_ULONG(PULONG(dx->PortBase+0x00),PULONG(newbuffer),ReadLen/4);
RtlCopyMemory(Buffer,newbuffer,ReadLen);
// DebugPrintMsg(\"内存read字符串\");

// Complete IRP
CompleteIrp(Irp,status,ReadLen);
UnlockDevice(dx);
return status;
}

/////////////////////////////////////////////////////////////////////////////
// WdmIoWrite:
//
// Description:
// Handle IRP_MJ_WRITE requests
//
// Arguments:
// Pointer to our FDO
// Pointer to the IRP
// IrpStack->Parameters.Write.xxx has write parameters
// User buffer at: AssociatedIrp.SystemBuffer (buffered I/O)
// MdlAddress (direct I/O)
//
// Return Value:
// This function returns STATUS_XXX

NTSTATUS WdmPciWrite(IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PWDMPCI_DEVICE_EXTENSION dx = (PWDMPCI_DEVICE_EXTENSION)fdo->DeviceExtension;
if( !dx->GotPortOrMemory)
return CompleteIrp( Irp, STATUS_INSUFFICIENT_RESOURCES);
if( dx->IODisabled)
return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED);
if (!LockDevice(dx))
return CompleteIrp( Irp, STATUS_DELETE_PENDING);

PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

// Get call parameters
ULONG WriteLen = IrpStack->Parameters.Write.Length;
PULONG Buffer = (PULONG)Irp->AssociatedIrp.SystemBuffer;
NTSTATUS status=STATUS_SUCCESS;

LONG Bytes=4096;
ULONG LoopNo=(WriteLen/4)/Bytes;
ULONG EndBytes=(WriteLen/4)%Bytes;
if(EndBytes==0)
LoopNo--;

for(ULONG i=0;i<=LoopNo;i++)
{
if(i==LoopNo && EndBytes!=0)
{
WRITE_REGISTER_BUFFER_ULONG(PULONG(dx->PortBase+0x00),Buffer+i*Bytes,EndBytes-1);
}
else
{
WRITE_REGISTER_BUFFER_ULONG(PULONG(dx->PortBase+0x00),Buffer+i*Bytes,Bytes);
}
}
// DebugPrintMsg(\"内存写字符串\");
// DebugPrint(\"Write: %d bytes written\",(int)WriteLen);

// Complete IRP
CompleteIrp(Irp,status,WriteLen);
UnlockDevice(dx);
return status;
}
//////////////////////////////////////////////////////////
这样的读取方式会不会对pci的传输速度有影响?
我的pci程序对板卡进行读写操作速度只有500k/s,
请教各位一般正常的pci读写操作速度? :D

最新喜欢:

cb615cbcb615c...
喂,小孩,你的小JJ露出来了!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-07-01 14:07
是500K byte/s?
用IO的方法速度不会很快的,可以用DMA方式。
我见过100K sample/s的数据采集卡,一个sample是DWORD类型的话,就是400kb/s了。
能满足你的速度要求就行了呀。
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-01 14:14
DMA方式对硬件要求很高,硬件电路设计比较复杂,所以只能采用这种缓冲方式,是不是缓冲方式的速度很慢?
还有的就是,我是帮我们的硬件工程师来测板子,现在只有这种速度,肯定不行,他设计的标准是33M主频(我不是很懂这些东西),最起码每秒要超过10M才行。
喂,小孩,你的小JJ露出来了!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-01 14:15
bufferio本身也会影响速度
他要将数据在应用层和核心层之间来回对拷
这适用于慢速设备

试试directio,适用快速设备
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-01 14:17
应该是500KB/S :D

[编辑 -  7/1/02 by  shengws]
喂,小孩,你的小JJ露出来了!
JackyWu
驱动小牛
驱动小牛
  • 注册日期2001-10-25
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-01 14:18
10Mbytes/s?
PIO够呛阿。DMA吧。
DMA的硬件好像不是很复杂吧。呵呵。。。。
多年以后,我又回来了。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-07-01 14:22
好像讨论过?
理论上最多也就133Mb/s,但是这不可能的。
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-01 14:28
我现在快疯了,我只想找出来是那里出的问题,是PIO方式出的问题?一般PIO方式能比DMA方式慢多少? :D
喂,小孩,你的小JJ露出来了!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-01 14:32
慢多了
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-01 14:33
采用DMA方式必须要硬件支持才行吗? :D
喂,小孩,你的小JJ露出来了!
JackyWu
驱动小牛
驱动小牛
  • 注册日期2001-10-25
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-01 14:40
硬件上基本都是支持的,不需要另外加什么东西吧。你用的是专用芯片还是fpga自己写pci core的?
多年以后,我又回来了。
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-01 14:46
是actel公司的A54SX16A PQ208芯片,然后我们的硬件工程师烧录的pci协议 :D
喂,小孩,你的小JJ露出来了!
JackyWu
驱动小牛
驱动小牛
  • 注册日期2001-10-25
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-01 14:50
你的卡是slave模式的吧?如果是的话,没有道理不支持系统的dma通道啊!
各位兄弟,你们说是不是阿?
多年以后,我又回来了。
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-07-01 14:51
对于PCI的传输速度你可以这样计算:比如说普通的PCI(时钟频率为33m/s,每个时钟周期传输32位的数据)那么它的最大传输速度为:33x32/8=133,也就是每秒钟133兆字节(byte)。当然还有64位,和主频66m/s的PCI。如果不想改硬件,可以考虑在应用程序开多个缓冲用异步I/O的方式,但速度可以提高多少还要看你的实际应用。另外zydcat说的用directio来减少系统拷贝的次数也是个提高速度的好方法。
leerom
fulminate
驱动小牛
驱动小牛
  • 注册日期2002-05-16
  • 最后登录2006-11-27
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-01 16:32
leerom的说法没错,一般的PCI读取速度应该是这样算,主频是33M的话是133M字节。
还有DMA应该都会支持的啊!

==========腾蛟起凤,孟学士之词宗;紫电青霜,王将军之武库==========
游客

返回顶部