阅读:1214回复:7
jst7792看过来,9054高人看过来!
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下如何看资源分配? |
|
最新喜欢:flying |
沙发#
发布于:2003-05-09 11:36
1.这只是DMA运行使用的参数.
2.非pnp的操作系统资源分配靠bios,启动时分配.当然启动后也可以改,但最好别动. 3.调中断. |
|
|
板凳#
发布于:2003-05-10 21:52
第一、三个问题清讲详细些,多谢!
|
|
地板#
发布于:2003-05-12 00:07
这里很冷清啊!!??
|
|
地下室#
发布于:2003-05-21 11:18
50分相送 !请指教!
|
|
5楼#
发布于:2003-05-21 11:44
我也是菜鸟的说,可以讨论讨论
^_^ 在dos下直接访问PCI卡的寄存器就可以查看系统分配的资源了 有两种方法: 1。调用中断实现(我没用过),不过很多文章都写道了 2。使用两个专用的端口实现,端口号忘了,不过很多地方都有相关的文章和程序,好像PCI规范上就有专门的说明 |
|
6楼#
发布于:2003-05-23 23:53
我知道你说的,你给出内存的映射范围、局部地址,
而由windows动态分配pci bus地址, 但在dos下,不知由谁分配?如何读出? jst7792说用中断,几号?如何? |
|
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\\); } } |
|