免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3089 | 回复: 3
打印 上一主题 下一主题

[其他] 请问如何遍历并获取PCI配置空间的数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-18 09:26 |只看该作者 |倒序浏览
我是在网上看到的,它是用DJGPP的C语言写的,可是我取到的Vendor ID都是FFFFh,
我是从XP下先运行DJGPP网站提供的BAT文件,然后再运行RHIDE(如果在纯DOS下运行
bat文件,系统提示出错),
请问我的代码错在哪了,如何修改?
请看:
#include <stdio.h>
#include <dpmi.h>
#include <pc.h>

typedef unsigned long      UDWORD;
typedef unsigned short int UWORD;

int main()
{

    __dpmi_regs regs;
    UWORD flags;
    UDWORD i, busNo, deviceNo, funcNo, regVal, retVal;
    UWORD  vendorID, devID, class1, class2, class3;

        regs.x.ax = 0xb108;
    regs.x.bx =0x10;
        regs.x.di=0;
    __dpmi_int(0x1a, &regs);
    flags=regs.x.flags;

        if((flags & 0x01)==0)
        {
                printf("\nSupport PCI BIOS.";
        }
        else
        {
                printf("\nNot Support PCI BIOS.";
                return 1;

        }

        UDWORD i, busNo, deviceNo, funcNo, regVal, retVal;
        UWORD  vendorID, devID, class1, class2, class3;

        i = 0;
        for(busNo = 0; busNo < 5; busNo++)               // bus No
        {                                       
           for(deviceNo = 0; deviceNo < 32; deviceNo++)  // device no
           {      
                 for (funcNo = 0; funcNo < 8; funcNo++)     // Function No
                  {
                          regVal = 0x80000000                       // bit31 使能
                 + (busNo << 16)                        // Bus No
                 + (deviceNo << 11)                     // Device No
                 + (funcNo << ;                       // Function No
            
                outportl(0x0CF8, regVal);
                retVal = inportl(0x0CFC);                  // 得到配置空间偏移为0的双字
                         if ((UWORD)retVal != 0xffff)                  // 设备存在
                          {   
                                  i++;
                                  vendorID = retVal & 0xffff;                    // 得到供应商代码
                  devID    = (retVal >> 16) & 0xffff;            // 得到设备代码
                  regVal += 0x08;                                // 得到配置空间偏移为08H的双字
                  outportl(0x0CF8, regVal);
                  retVal = inportl(0x0CFC);
                  retVal = retVal >> 8;                         // 滤掉版本号
                  class3 = retVal & 0x0FF;                      // 得到三个分类代码
                  class2 = (retVal >> &0x0FF;
                  class1 = (retVal >> &0x0FF;
                  printf("\n%03d   %04x/%04x       %02x       %02x       %02x      %02x-%02x-%02x",
                               i, vendorID, devID, busNo, deviceNo, funcNo, class1, class2, class3);
                            if (funcNo == 0)                    // 如果是单功能设备,则不再查funcNo>0的设备
                              {     
                                          regVal = (regVal & 0xFFFFFFF0) + 0x0C;  //配置空间偏移0X0C
                      outportl(0x0CF8, regVal);
                      retVal = inportl(0x0CFC);
                      retVal = retVal >> 16;                 //偏移0X0E为投标类型字段
                      if ((retVal & 0x80) == 0) funcNo = 8;  //bit 7为0表示单功能设备,不再查该设备的其他功能
                                  }
                          }
                  }
           }
        }


    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2012-09-18 15:01 |只看该作者
补充:在纯DOS会出现:Load error:no DPMI-Get csdpmi*b.zip
请问怎么解决?

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
3 [报告]
发表于 2012-09-18 18:08 |只看该作者
v86模式不允许直接访问pci寄存器吧

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2012-09-18 19:30 |只看该作者
回复 3# selfrun


    不可以访问。
在DOS下直接就可以访问了。
看看PCI的总线的资料,自已写一个吧。不难,就是有点不麻烦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP