阅读:1628回复:6
用ds的kpciconfiguration读配置空间
用driverworks写了个驱动读pci的配置空间,使用
KPciConfiguration类的headread函数, 具体情况是这样: 先在设备类中定义了一个KPciConfiguration类型的 成员,在设备类的构造函数中初始化; 在DeviceIoControl添加了一个cfg_read的控制码, 有一个函数来处理这个代码。测试程序是用的ds自己 生成的测试程序,结果应用程序一运行系统就重启了, 不知是怎么回事。我的卡已经插在机器上了,驱动程序 也已经正确安装。我没有用过ds,这个程序的目的只是 为了看看自己写的东西是不是有效,结果一上来就是 一个下马威。 我在水木的bbs上也看到有人碰到这个问题,但是没有 解决,不知道这里的牛人能否解答一下。 |
|
最新喜欢:Ice_Bi... |
沙发#
发布于:2002-06-16 11:26
KPciConfiguration::;ReadHeader函数要求运行在PASS_LEVL中断级,
你的DeviceIoControl控制代码调用发生在DISPATCH_LEVL中断级。当然不行了。你可在初始化例程中调用此函数。 |
|
板凳#
发布于:2002-06-16 12:44
我昨天晚上刚刚想到了这个问题,就是不敢确定,
现在松了一口气了。 但是如果在初始化中调用readheader,那么怎么 把配置内容传递给上层的应用程序呢? 如果把配置传递给应用程序,是不是要使用自旋锁? 我刚入门,对于一些问题只有模糊的概念,呵呵 |
|
地板#
发布于:2002-06-16 18:15
你可以去看看有关驱动方面的书!这样子你久可以明白许多!然后再到网上来.
|
|
地下室#
发布于:2002-06-16 20:30
我正在看,只是有些东西不明白。
如果我打扰了你,我道歉。 如果你知道又愿意告诉我,我会感谢你。 |
|
5楼#
发布于:2002-06-17 11:09
你可以先保存你得到的配置呀。
然后在deviceiocontrol返回给app不就可以? |
|
6楼#
发布于:2002-06-18 10:55
在类定义中声明:
class MyDevice : public KPnpDevice{ public: KPciConfiguration m_cfg; …… protected: ULONG baseaddress0; …… } 在构造函数中加上: MyDevice::MyDevice(PDEVICE_OBJECT Pdo, ULONG Unit) : KPnpDevice(Pdo, &MyDevice_Guid), m_cfg(NULL){ …… m_Lower.Initialize(this, Pdo); //下面是得到配置空间的代码 m_cfg.Initialize(m_Lower.DeviceObject()); if ( !m_cfg.IsValid() ){ // constructor succeeded t<<\"the pci configration area isn\'t valid.\\n\"; } else{ t<<\"the pci configration area is valid.\\n\"; baseaddress0=m_cfg.ReadBaseAddress(0); //如果映射在内存空间: if(!(baseaddress0&0x00000001)){ baseaddress0&=0xFFFFFFF0; } //如果映射在io空间: else{ baseaddress0&=0x0000FFFC; } } //上面得到了配置空间基址 SetLowerDevice(&m_Lower); SetPnpPolicy(); } 这样,baseaddress0中就是配置空间基址,程序的其他地方可以随便调用了。 |
|
|