niggasmokey
驱动牛犊
驱动牛犊
  • 注册日期2004-03-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:972回复:1

用driverstudio,访问pci9030的配置寄存器问题

楼主#
更多 发布于:2004-11-16 12:12
通过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);

}

最新喜欢:

zhaobingyizhaobi...
niggasmokey
驱动牛犊
驱动牛犊
  • 注册日期2004-03-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-17 10:35
艾,没有人理我,好再自己高明白了。我来自问自答一下吧。
bar0和bar1是给本地配置寄存器(local configuration registers)
分配的空间,因此我读出的是本地配置寄存器偏移量为0x00上的值(值为0x0ff00000,之前一直以为这个数值是读错的值)。
而pci配置寄存器(pci configuration registers)的读使用的是
kKPciConfigurationl类下的ReadHeader方法.读出的值为我想要的
0x903010B5。
我连这两种寄存器的概念都没搞清楚
游客

返回顶部