fannwong
驱动牛犊
驱动牛犊
  • 注册日期2003-01-31
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1214回复:7

jst7792看过来,9054高人看过来!

楼主#
更多 发布于:2003-05-09 10:07
jst7792:
  请问你所说的“84h写读回的PCI物理地址”是什么?
从哪里读回的?我清楚direct slave方式pci base address的分
配(eeprom中为space 0/1配置range,开机后系统根据配置的
range 为pci card动态分配资源---pci base address,对吗?)。
但dma的pci base address系统是如何分配的?(eeprom中只有
对dma arbitration的设置)

  第2个问题:dos下pci card的资源是如何分配的--系统动态?
or人工设置?    曾有一份贴子说道是由bios动态分配的,如果
是这样,具体情况?

  第3个问题:dos下如何看资源分配?

最新喜欢:

flyingflying
jst7792
论坛版主
论坛版主
  • 注册日期2001-12-10
  • 最后登录2006-11-16
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-09 11:36
1.这只是DMA运行使用的参数.
2.非pnp的操作系统资源分配靠bios,启动时分配.当然启动后也可以改,但最好别动.
3.调中断.
兄弟们,给点分吧
fannwong
驱动牛犊
驱动牛犊
  • 注册日期2003-01-31
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-10 21:52
第一、三个问题清讲详细些,多谢!
fannwong
驱动牛犊
驱动牛犊
  • 注册日期2003-01-31
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-12 00:07
这里很冷清啊!!??
fannwong
驱动牛犊
驱动牛犊
  • 注册日期2003-01-31
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-21 11:18
50分相送 !请指教!
sandybull
驱动牛犊
驱动牛犊
  • 注册日期2002-09-30
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-21 11:44
我也是菜鸟的说,可以讨论讨论
^_^
在dos下直接访问PCI卡的寄存器就可以查看系统分配的资源了
有两种方法:
1。调用中断实现(我没用过),不过很多文章都写道了
2。使用两个专用的端口实现,端口号忘了,不过很多地方都有相关的文章和程序,好像PCI规范上就有专门的说明
fannwong
驱动牛犊
驱动牛犊
  • 注册日期2003-01-31
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-23 23:53
我知道你说的,你给出内存的映射范围、局部地址,
而由windows动态分配pci bus地址,
但在dos下,不知由谁分配?如何读出?
jst7792说用中断,几号?如何?
sandybull
驱动牛犊
驱动牛犊
  • 注册日期2002-09-30
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-24 10:34
发信人: wangzi (穷且益坚,不坠青云之志), 信区: Circuit
标  题: Re: 请教大虾:pci板卡的调试
发信站: BBS 水木清华站 (Tue Apr  9 10:37:11 2002)

windriver会自动给你的板卡生成一个inf文件的,启动机器的时候,指定这个inf文件给你的板卡作驱动,就可以在设备管理器里面看到系统为你的板卡自动分配的资源了,当然,这个inf文件你可以自己试着改改,呵呵

至于I/O资源和其他寄存器的读写,我都是用bios中断地方法实现的
很多计算机上的书都介绍了两种方法用于这种实现:

1。用int1A中断,我记不清楚了
2。通过读取0xcf8和0xcfc这两个口来得到PCI的配置信息

我用的就是后面这种方法,很多书上都有这个方法的详细介绍的
下面这段程序是我写的,可以给你做个参考:

DWORD DWORD_IN(WORD io_port)  //从指定端口io_port中读取双字节数据的子程序
{
 _DX=io_port ;   //将端口送到dx寄存器中
 __emit__(0x66,0xed);  //从端口中读数据送入eax寄存器中
 return(_EAX);   //返回读到得数据
}

DWORD DWORD_OUT(WORD io_port,DWORD val) //向端口io_port中输出双字节数据val的子程序

{
 _DX=io_port;   //将端口送到dx寄存器中
 _EAX=val;   //将val送到eax寄存器中
 __emit__(0x66,0xef);  //向端口输出数据
}

void check_pci()  //检验计算机上的PCI设备的子程序
{
 int i;
 io_cf8=0x80000000;   //初始值
 for(;;)     //从0x80000000开始不断循环
 {
  DWORD_OUT(0xcf8,io_cf8);  //向0xcf8口输出有效控制字
  io_cfc=DWORD_IN(0xcfc);   //从0xcfc口读入返回值
  if(io_cfc!=0xffffffff)   //如果io_cfc不是无效值,即找到了PCI设备
  {
   for(i=0;i<=15;i++)    //从io_cf8这个地址开始得0h-63h得地址范围内读取该设备PCI配置寄存器得值

   {
    DWORD_OUT(0xcf8,io_cf8+4*i);  //每次读双字节数据,也即32bit,所以每次地址加4h
    buffer=DWORD_IN(0xcfc);  //将依次读入得PCI配置寄存器得值送入数组存储
   }
   (DWORD *) PCIConfigHeader=buffer;  //将定义得struct结构指针指向buffer数组中所存得PCI配置寄存器得值
   printf(\\A PCI device has found....\\n the Device ID and Vendor ID is %4.4X | %4.4X\\n\\,PCIConfigHeader->DID,PCIConfigHeader->VID); //报告找到PCI设备的id号
     printf(\\its Bus Number | Device Number | Function Number is:0x%2.2X | 0x%2.2X | 0x%1.1X\\n\\,(io_cf8&0x00ff0000)/0x10000,(io_cf8&0x0000f800)/0x800,(io_cf8&0x700)/0x100);

   /* 提取此时io_cf8中Bus Number得值bit 23-bit16
   提取此时io_cf8中Device Number得值bit 15-bit 11
   提取此时io_cf8中Function Number得值bit 10-bit 8*/
   printf(\\\\n\\);
   fprintf(fp,\\A PCI device has found....\\n the Device ID and Vendor ID is %4.4X%4.4X\\n\\,PCIConfigHeader->DID,PCIConfigHeader->VID); //报告找到PCI设备的id号
    fprintf(fp,\\its Bus Number | Device Number | Function Number is:0x%2.2X | 0x%2.2X | 0x%1.1X\\n\\,(io_cf8&0x00ff0000)/0x10000,(io_cf8&0x0000f800)/0x800,(io_cf8&0x700)/0x100);
   fprintf(fp,\\\\n\\);
   if(PCIConfigHeader->VID==0x10b5)       //如果找到PLX得PCI9052芯片设备得时候

   {
    PCI_CONFIG_REGISTERS_BASE=io_cf8;    //将基地址赋值以便下一步得访问工作

    PCI9052_FOUND=1;      //将PCI9052_FOUND赋1,说明找到PCI9052设备
   }
   getch();        //输入任意键继续寻找下一个设备
  }
  io_cf8+=0x800;    //将控制字加上0x800重新开始读取
  if(io_cf8>=0x80ffff00)   //循环结束条件
  break;     //跳出循环
 }
 if(PCI9052_FOUND==0)   //如果没有发现PCI9052设备


 {
  printf(\\\\n\\);
  printf(\\\\n\\);
  printf(\\sorry,not found the PLX\'s PCI9052 core\\n\\); //说明没有PCI9052设备
  choice=\'0\';      //给choice赋值返回界面
  delay(2000);      //延时显示上面的信息
  printf(\\\\n\\);
  printf(\\\\n\\);
 }

 if(PCI9052_FOUND==1)   //如果发现PCI9052设备
 {
  printf(\\\\n\\);
  printf(\\\\n\\);
  printf(\\hehe,had found the PLX\'s PCI9052 core\\n\\); //说明没有PCI9052设备
  choice=\'0\';      //给choice赋值返回界面
  delay(2000);      //延时显示上面的信息
  printf(\\\\n\\);
  printf(\\\\n\\);
 }
}
游客

返回顶部