在Windows下写了一个很简单的WDM驱动程序,在用READ_REGISTER_UCHAR函数去读PCI卡的内存空间时发现一个好奇怪的问题,那就是所有奇数地址(BaseAddress + 0x00F1)的内存读出来的值是正确的,而偶数地址(BaseAddress + 0x00F0)的内存读出来的值却是随机的,这是怎么回事啊?用READ_REGISTER_USHORT读取16位寄存器地址的值总是返回FFFF,只有一次成功过,这是为啥?
怎么没人回复啊,都没遇到过这种情况吗?是不是地址对齐的问题?
是不是 数据总线宽度 16与 8的问题?
帮顶下。
多谢楼上的回复,我在linux下用ioread8和ioread16可以正常读取,但到了windows下就不知道怎么回事。今天呢,READ_REGISTER_USHORT这个函数可以读板卡上功能0的那个设备的ID寄存器(该寄存器地址偏移是0x0000),读出来的是正确值。但其他寄存器没法读写。而READ_REGISTER_UCHAR依然是那个德行,奇数地址正确,偶数地址随意,NND
我的卡是一个PCI设备,其中设备的功能0的数据宽度是16位,功能1的数据宽度是8位
我在linux下遇到过同样的问题,每次调用ioread8读出来的寄存器值都不一样,后来偶然发现一个规律,就是在读取连续几个寄存器值时,每个值都是上一个读取的寄存器值,也就是说,第一次读取的时候没有获取到正确的寄存器值,而第二次读取的时候才得到正确的值,所以我在自己的函数里连续调用两次ioread8,解决了问题。之所以会出现这种情况,估计是因为读写异步的原因,因为我那设备没有读写同步时钟信号。我是这样猜测的,没有证据
我的驱动在使用PCI资源部分有一些地方没有到位,让底层处理好IRP后就能正常访问了,不过也是需要读两次才能读到正确寄存器的值
請到我的博客參考,http://blog.eeworld.net/IcePhoenix/archive/2010/04/25/5526379.aspx這是一個讀取PCI數據的範例,源代碼請到 http://bbs.codeheaven.com.tw/htm_data/2/1004/1.html 下載.