llllllllg
驱动牛犊
驱动牛犊
  • 注册日期2005-01-19
  • 最后登录2015-01-08
  • 粉丝0
  • 关注0
  • 积分53分
  • 威望7点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1941回复:4

关于如何读取 pci bus 信息

楼主#
更多 发布于:2005-02-01 11:16
     如何在 2000 下读取 pci bus 的信息呢,我对这个问题非常感兴趣,我发现了如下的一段代码,可在 2000 下无法使用 in  and  out
所以,想在此求助!
#include "stdio.h"
#include "windows.h"
DWORD DWORD_In(WORD io_Port)
{
DWORD val;
_asm{
mov dx,io_Port
//in eax,dx
   //write_port_ulong(eax,dx)
mov val,eax
   }
return val;
}

DWORD DWORD_Out( WORD io_Port,DWORD val)
{
_asm{
mov dx,io_Port
mov eax,val
//out dx,eax
//write_port_ulong(dx,eax)
   }
return 0;
}

int main()
{
DWORD io_CF8; // port 0xcf8    
DWORD io_CFC; // port 0xcfc    
int i;
io_CF8=0x80000000; //because the first bit is enable/disable
for(;;)
{
DWORD_Out(0xcf8,io_CF8);
io_CFC = DWORD_In(0xcfc);
if(io_CFC != 0xffffffff)   //if = 0xffffffff, then is a invalid bu number and device number
{
printf("\n PCI device has found , the pci config address = %1x\n", io_CF8);
printf("its Bus Number is %1x \n",(io_CF8 & 0x0000f800)/0x800);
printf("this device's deviceID and vendorID= %1x\n",io_CFC);

for(i=0;i<=15;i++)
{
DWORD_Out(0xcf8,io_CF8 + 4*i);  //read DWORD


switch (i)
{
case 0:
  printf("Status and Command = ");
break;
case 2:
printf("Class Code and Revision ID = ");
break;
case 3:
printf("Bist and Header Type and Latency Timer and Cacne Line Size = ");
break;
case 4: // PCI Configration has 6 base address
case 5: // register
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 13:
case 14:
printf("Reserved = ");
break;
case 12:
printf("Expansion ROM Base Address = ");
break;

case 15: // attention:the interrupt IRQ = this result & 0xff

printf("Max_Lat Min_Gnt Interrupt Pin Interrrupt line = ");
break;
}
printf("%1x\n", DWORD_In(0xcfc));


}
getchar();
}
io_CF8 =io_CF8 + 0x800 ;
if(io_CF8 >= 0x80FFFF00)
{
break;
}

}

return 0;


}

email  :   llllllllg@126.com      8  L  











经典之作 , 成就经典之人 !
llllllllg
驱动牛犊
驱动牛犊
  • 注册日期2005-01-19
  • 最后登录2015-01-08
  • 粉丝0
  • 关注0
  • 积分53分
  • 威望7点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-01 16:14
我在一家网络产品公司做产品测试,写一些产品测试程序,已接触到一些
firmware 的代码,可才疏学浅,资历不够,都没敢看。现在只想在班半年内做 3 件事:
  1 : 在 2000 下能过读出 pci bus 的信息
  2 : 在 2000 下,能够读写网卡 eeprom 的内容
  3 : 在 2000 下,能够调用 device 的驱动函数。
吾深知非常困难,故不敢祈求太多,只想大家多给些建议 !
 


经典之作 , 成就经典之人 !
llllllllg
驱动牛犊
驱动牛犊
  • 注册日期2005-01-19
  • 最后登录2015-01-08
  • 粉丝0
  • 关注0
  • 积分53分
  • 威望7点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-02 11:14
     我觉得 对于读写 pci bus 信息的问题 对于各位大虾来说有些可笑了,可这个问题是出学者很干兴趣的,虽然网上有很多地方都介绍了,但对于我这样理论不是很强的人来说,如果不给出完整的代码是很困难的...

不过这个问题,我已经找到了解决方法了,虽然没有做出来,但一让我欣喜不已。先要写一个读写端口的驱动,然后在应用程序中调用这个驱动。哎,为了一个小小的木的,要这么麻烦!

不过,我现在又想到一个问题,就是对于一个刚装上的 device ,它的端口和数据存储的地方地址是多少,由什么决定的呢 ?

每每我想做一件事情,劳苦而无所获常另我非常苦恼。尤其是部知道解决方法的时候。
经典之作 , 成就经典之人 !
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-02 11:37
我在一家网络产品公司做产品测试,写一些产品测试程序,已接触到一些
firmware 的代码,可才疏学浅,资历不够,都没敢看。现在只想在班半年内做 3 件事:
  1 : 在 2000 下能过读出 pci bus 的信息
  2 : 在 2000 下,能够读写网卡 eeprom 的内容
  3 : 在 2000 下,能够调用 device 的驱动函数。
吾深知非常困难,故不敢祈求太多,只想大家多给些建议 !
 

你的志向也太高远了,可能有一天腾然回首,才发现原来如此呀
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
llllllllg
驱动牛犊
驱动牛犊
  • 注册日期2005-01-19
  • 最后登录2015-01-08
  • 粉丝0
  • 关注0
  • 积分53分
  • 威望7点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-03 08:44
   我不晓得有没有回首的一天,也算不上什么志向,只是兴趣而已。

   不过厂里给我们提供了很好的空间,从 adsl,switch 到 wireless ap , 网卡,可以接触到很多。自己也希望多了解一些。

   其实我想向嵌入系统发展,不过工作需要先做好无线网卡的测试。所以需要用到我提到的三件事了。
经典之作 , 成就经典之人 !
游客

返回顶部