阅读:1638回复:5
pci硬件状态检测(分)
在驱动中如何判断pci硬件是否正常?要读哪个寄存器?
我是这样做的(用ds):测试程序发出ioctl:TS_IOCTL_HW_CHECK 驱动中: NTSTATUS status = STATUS_SUCCESS; t << \"Entering TsDevice::TS_IOCTL_HW_CHECK_Handler, \" << I << EOL; I.Information() = 0; if((I.IoctlBuffer())==NULL){ t<<\"wrong parameters of TS_IOCTL_HW_CHECK\\n\"; status=STATUS_INVALID_PARAMETER; return status; } m_cfg.WriteBaseAddress(0,0XFFFFFFFF); //m_cfg是KPciConfiguration的实例。 ULONG baseadd=(m_cfg.ReadBaseAddress(0)); if(!(baseadd&0x00000001)){ strcpy(PCHAR(I.IoctlBuffer()),\"ERROR!\"); t<<\"the configration isn\'t valid\"; I.Information()=strlen(\"ERROR!\"); }//卡是io空间映射的。 else{ baseadd&= 0xFFFFFFFC; ULONG name = READ_PORT_ULONG(PULONG(baseadd+MCSR)); //mcsr是s5933的状态寄存器偏移值。 *(PULONG(I.IoctlBuffer()))=name; I.Information()=sizeof(ULONG); } return status; 资料上说,5933的mcsr寄存器的加电检测值应该是000000C6,可我得到的总是FFFFFFFF,谁能告诉我是为什么?我的配置空间基址算法有没有错误? 我的基本功很差,大家不要笑。 [编辑 - 6/7/02 by brucezh] |
|
最新喜欢:![]()
|
沙发#
发布于:2002-06-07 15:48
最重要的是我对配置空间的理解对不对。
|
|
|
板凳#
发布于:2002-06-10 08:30
怎么没有人指点一下?难道大家都认为不值一笑吗?
我要问的就是,配置空间基址取出来后可以直接用来加上偏移值计算各寄存器的地址吗,要不要进行一些处理? |
|
|
地板#
发布于:2002-06-10 18:03
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-06-11 08:18
安装是正常的。在设备管理器中显示没什么错误。
只是我得不到正确的io地址。 |
|
|
5楼#
发布于:2002-06-11 09:46
问题解决了。
基址寄存器中存储的是系统再分配的地址,直接读出就对了。我向其中写入全1再读取就只能读出卡上硬件要求实现的空间范围,也就是说,这个值只能用来计算地址空间大小,跟地址没什么关系。 还是给大家加分,请以后多多指点。 |
|
|