使用READ_REGISTER_UCHAR函数遇到的怪问题

liyanjun120   2010-3-8 15:46 楼主
在Windows下写了一个很简单的WDM驱动程序,在用READ_REGISTER_UCHAR函数去读PCI卡的内存空间时发现一个好奇怪的问题,那就是所有奇数地址(BaseAddress + 0x00F1)的内存读出来的值是正确的,而偶数地址(BaseAddress + 0x00F0)的内存读出来的值却是随机的,这是怎么回事啊?用READ_REGISTER_USHORT读取16位寄存器地址的值总是返回FFFF,只有一次成功过,这是为啥?

回复评论 (9)

怎么没人回复啊,都没遇到过这种情况吗?是不是地址对齐的问题?
点赞  2010-3-8 16:56
是不是 数据总线宽度 16与 8的问题?

帮顶下。
点赞  2010-3-8 20:15
多谢楼上的回复,我在linux下用ioread8和ioread16可以正常读取,但到了windows下就不知道怎么回事。今天呢,READ_REGISTER_USHORT这个函数可以读板卡上功能0的那个设备的ID寄存器(该寄存器地址偏移是0x0000),读出来的是正确值。但其他寄存器没法读写。而READ_REGISTER_UCHAR依然是那个德行,奇数地址正确,偶数地址随意,NND
点赞  2010-3-9 11:06
我的卡是一个PCI设备,其中设备的功能0的数据宽度是16位,功能1的数据宽度是8位
点赞  2010-3-9 11:11
顶一下
点赞  2010-3-18 20:15
我在linux下遇到过同样的问题,每次调用ioread8读出来的寄存器值都不一样,后来偶然发现一个规律,就是在读取连续几个寄存器值时,每个值都是上一个读取的寄存器值,也就是说,第一次读取的时候没有获取到正确的寄存器值,而第二次读取的时候才得到正确的值,所以我在自己的函数里连续调用两次ioread8,解决了问题。之所以会出现这种情况,估计是因为读写异步的原因,因为我那设备没有读写同步时钟信号。我是这样猜测的,没有证据
点赞  2010-4-21 10:16
引用: 引用 6 楼 he11o 的回复:

我在linux下遇到过同样的问题,每次调用ioread8读出来的寄存器值都不一样,后来偶然发现一个规律,就是在读取连续几个寄存器值时,每个值都是上一个读取的寄存器值,也就是说,第一次读取的时候没有获取到正确的寄存器值,而第二次读取的时候才得到正确的值,所以我在自己的函数里连续调用两次ioread8,解决了问题。之所以会出现这种情况,估计是因为读写异步的原因,因为我那设备没有读写同步时钟信号。我是……

回头我试试看
点赞  2010-4-23 12:08
我的驱动在使用PCI资源部分有一些地方没有到位,让底层处理好IRP后就能正常访问了,不过也是需要读两次才能读到正确寄存器的值
点赞  2010-4-24 23:19
請到我的博客參考,http://blog.eeworld.net/IcePhoenix/archive/2010/04/25/5526379.aspx這是一個讀取PCI數據的範例,源代碼請到 http://bbs.codeheaven.com.tw/htm_data/2/1004/1.html 下載.
点赞  2010-4-25 12:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复