阅读:987回复:1
用driverstudio,访问pci9030的配置寄存器问题
通过guid方式,已经成功将设备打开。
现我欲在应用程序中用DeviceIoContronl函数送一pci9030的配置寄存器的偏移地址0x00 到驱动程序中。在驱动程序中的相应控制代码处,返回该地址处的双字值。pci9030的 0x00处应该试DeviceID和VendorID,也就是9030 10B5;但我返回的值不正确。 控制代码是buffer方式。系统分配的资源为内存段E9100000-E910007F;io段E400-e47F; 内存段:E9000000-E90FFFFF. 根据9030的资料p116,我认为前两个资源是9030配置寄存器的资源bar0和bar1,第三个则 是bar2因此我从io资源段(bar1)中的首址读值出来。具体程序如下: 注:我已经在windriver生成的诊断程序中用它提供的readpcireg()函数正确读出了 9030 10B5。说明硬件正常 NTSTATUS Pci9030Device::OnStartDevice(KIrp I) { NTSTATUS status = STATUS_SUCCESS; I.Information() = 0; PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources(); PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources(); KPciConfiguration PciConfig(m_Lower.TopOfStack()); status = m_MemoryRange0.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0) //bar0初始化 ); if (!NT_SUCCESS(status)) { t<<"shit,memoryrange0 failed!!\n"; Invalidate(); return status; } status = m_IoPortRange0.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(1) //为bar1初始化 ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } status = m_MemoryRange1.Initialize( pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(2) //为bar2初始化 ); if (!NT_SUCCESS(status)) { t<<"shit,memoryrange2 failed!!\n"; Invalidate(); return status; } return status; } 控制代码段: ULONG kernel_add; ULONG Output=0; kernel_add=*(ULONG*)I.IoctlBuffer(); //传入的偏移地址 t<<"input add:"<<kernel_add<<EOL; //Output=m_MemoryRange0.ind(kernel_add); //bar0 Output=m_IoPortRange0.ind(kernel_add); //bar1输出一样,但是都不对 *(ULONG*)I.IoctlBuffer()=Output; t<<"output data:"<<Output<<EOL; I.Information() = sizeof(ULONG); 应用程序段: if (DeviceIoControl(hDevice, //已经成功找到设备,并获得句柄 READLCR, 控制代码名称,buffer方式 &input, //输入值为0 4, &output, 20, &nOutput, //返回值4,正确 NULL) ) { printf("%x",output); } |
|
最新喜欢:zhaobi... |
沙发#
发布于:2004-11-17 10:35
艾,没有人理我,好再自己高明白了。我来自问自答一下吧。
bar0和bar1是给本地配置寄存器(local configuration registers) 分配的空间,因此我读出的是本地配置寄存器偏移量为0x00上的值(值为0x0ff00000,之前一直以为这个数值是读错的值)。 而pci配置寄存器(pci configuration registers)的读使用的是 kKPciConfigurationl类下的ReadHeader方法.读出的值为我想要的 0x903010B5。 我连这两种寄存器的概念都没搞清楚 |
|