阅读:2261回复:14
9054驱动代码一份,顺便请教一个问题
小弟在这里请教各位高手2个问题:
1. 用DS做的9054例子中的SerialRead和Read这两个例程有什么关系? 2. 我一直搞不懂PCI端基地址寄存器和本地端基地址寄存器在写驱动时各有什么作用,以及两者之间又没什么关系,我看过了9054的datasheet但是没什么感觉,没读懂这方面的动些,忘各位指教一二。 谢谢! |
|
|
沙发#
发布于:2007-04-10 15:06
自己先顶一下
|
|
板凳#
发布于:2007-04-11 09:10
从代码中就可以看出来啊。还问。看看DATA再说吧。
|
|
|
地板#
发布于:2007-04-11 14:51
我看了一些代码里面的Read例程好像没做什么实质性的工作,重要的都在SerialRead里面,那不要Read例程可以吗?
有哪位高人能讲清楚点呢? 谢谢! |
|
驱动牛犊
|
地下室#
发布于:2007-04-13 00:05
如果你上位机用了read_file 去进行通信,那么DS自然的给你提供一个派遣例程
让你的IRP有个落脚的地方啊(俗了点&^&),就像DDK里的 IRP_mj_read 对应的DISPATCHREAD例程一样的呀。IO管理器已经把你的IRP和具体的 派遣函数通过函数指针方式(回调)联系起来了。 DS中的 irp---》read---》startIO---》searialread---》进行DMA的传输 当然这个IRP是排队的 |
5楼#
发布于:2007-04-13 09:57
谢谢!
似乎有些明白了 |
|
6楼#
发布于:2007-04-19 07:42
谢谢楼主的代码,先研究一下!!!
|
|
7楼#
发布于:2007-05-13 15:18
谢谢楼主分享源代码。
|
|
8楼#
发布于:2007-06-13 16:08
当IRP 位 IRP_MJ_READ 的时候,驱动就是靠这个例程来响应 。。
|
|
9楼#
发布于:2007-06-13 17:08
现在知道了
|
|
10楼#
发布于:2007-06-15 09:31
怎么下的是php文件阿
|
|
11楼#
发布于:2007-06-15 09:33
这回好了,直接点右键,目标另存为就可以了,:)
|
|
驱动小牛
|
12楼#
发布于:2007-09-06 12:57
谢了,学习中
|
13楼#
发布于:2007-10-08 10:43
谢谢楼主分享源代码
|
|
14楼#
发布于:2007-10-19 16:59
研究了楼主的代码,楼主要是多给点注释就好了。下面说发现的几个问题。
1、楼主的STARTIO例程是不是有点问题? VOID BPSKDevice::StartIo(KIrp I) { if ( !I.TestAndSetCancelRoutine( LinkTo(CancelQueuedIrp), NULL, CurrentIrp()) ) { return; } switch (I.MajorFunction()) { case IRP_MJ_READ: SerialRead(I); break; case IRP_MJ_WRITE: SerialWrite(I); break; //case IRP_MJ_DEVICE_CONTROL: //注释的我认为是我加上的,这个应该不能省调吧 // DeviceControl(I); // break; default: ASSERT(FALSE); PnpNextIrp(I); break; } } 2、CONFIG_SYMBOL_RATE_Handler(KIrp I)这个例程中的一句 SYMBOL_RATE_STRUCT *SymbolRate= (SYMBOL_RATE_STRUCT *)(I.IoctlBuffer()); SYMBOL_RATE_STRUCT 是楼主自己定义的结构体, typedef struct { DWORD ControlWord[100];//控制字,有效位为最低字节,格式 000000xx(十六进制); DWORD BytesCount; }SYMBOL_RATE_STRUCT; 你把I.IoctlBuffer()的返回值PVOID*类型转成这个结构体,是否妥当?如果可以实现,请问BytesCount是怎么赋值的?除非访问I.IoctlBuffer()的返回值是有这个字节数参数?请楼主解释一下! 3、CONFIG_SYMBOL_RATE_Handler(KIrp I)这个例程中的一句 BYTE TEMP=m_IoPortRange1.inb(0xf0);//0xf0:Range for PCI-to-Local Address Space 1 我想问定义TEMP有什么用处?后面的例程也有定义这样的, BYTE *ModulMode=(BYTE *)(I.IoctlBuffer()); BYTE TEMP=*ModulMode; 我不知道用处,希望知道的告诉我一下。 4、楼主的程序是否真的能运行啊?还是你把别人的发上来的,如果是别人的,是否也能成功运行吗?如果能的话,我就该好好研究我发现的问题了。 谢谢! |
|