关于PCI,可以看下下面的连接,虽然老了点,但是基础知识变化不大。英文的。
http://tldp.org/LDP/tlk/dd/pci.html
另外,LZ你的开发环境是啥?不是windows?也不是LINUX?如果是WINDOWS,可以在设备管理器里 ...
accessory,
我是通过一个引导程序从裸机引导的,因此我的程序不能使用操作系统(如windows,linux等)的资源,只能自己去读BIOS。但偏偏老不成功............
另,在通过CF8、CFC对PCI配置空间信息进行读取前,还需要设置其它的吗? 附代码如下:
PRIVATE int findirq(u32 *iobase,u32 *irq)
{
u32 i,j,pci;
j = 0x80000000;
i = 0;
while(i<32)
{
out_word(0xCF8,j);
delay(30);
//pci为vendorID和DeviceID(但我每次得到的都是0xFFFFFFFF)
pci = in_word(0xCFC);
i++;
j += 0x800;
}
........
}
[ 本帖最后由 sherf 于 2009-10-31 01:16 编辑 ] while(i<32)
32 这个范围太小了,改成8191试试。
回复 #21 accessory 的帖子
accessory,问题已解决,是bochs模拟器的问题,更新版本后可以了。
但是,又出现了一个新的问题,如何测试收/发包?
收/发包的代码我已仿照godbach所提供的第1篇文章里的例子写了,但不知道如何在bochs环境下调试收/发包。各位有什么好的建议。 如果是在QEMU下很简单。一种方法是在模拟RTL8139硬件的C文件里加一些DEBUG 输出。或者可以在HOST上用TCPDUMP看QEMU的虚拟网卡。
BOCHS就不清楚了。也许有类似的方法。 原帖由 accessory 于 2009-11-2 01:49 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
如果是在QEMU下很简单。一种方法是在模拟RTL8139硬件的C文件里加一些DEBUG 输出。或者可以在HOST上用TCPDUMP看QEMU的虚拟网卡。
BOCHS就不清楚了。也许有类似的方法。
accessory,
还有一点,对于网卡的中断处理(发送/接收引起的中断),为何demo里要变更中断号?附godbach提到的第一篇文章里的demo中有关变更中断号的代码如下(其中IrqNumber是在配置空间中找到的网卡中断号):
int ComputeInterrupt(int IrqNumber)
{
if(IrqNumber <= 8 )
return IrqNumber+8;
else
return IrqNumber+0x68;
}
回复 #24 sherf 的帖子
另,MAC地址是存放在“配置空间”中的Expansion ROM中吗?如果是的话,为何我每次取都是0? 改中断号那个我也不懂。MAC地址的在另外一个帖子里回了。 原帖由 accessory 于 2009-11-2 01:49 发表 http://linux.chinaunix.net/bbs/images/common/back.gif如果是在QEMU下很简单。一种方法是在模拟RTL8139硬件的C文件里加一些DEBUG 输出。或者可以在HOST上用TCPDUMP看QEMU的虚拟网卡。
BOCHS就不清楚了。也许有类似的方法。
accessory,
能说的详细一些吗?我现在已改用qemu,并且已能拿到MAC,目前我想进行收发包的验证
回复 #27 sherf 的帖子
accessory,对于demo里的中断处理程序,我做了发包的测试,但是结果发觉根本没转去中断处理程序执行。为此,我重新review了自己的代码,发现已经将分配到的IRQ与demo里的中断处理程序进行关联......
另外,想问一下有关中断处理程序执行的开始点(发包)。如果中断处理程序已正确关联,那进行发包测试过程中当使用 issuecmd()函数 时是不是就是这个时候“自动‘转去执行中断处理程序(发包中断)?
void
IssueCMD(unsigned char descriptor)
{
unsigned long offset = descriptor << 2;
outpdw(IOBase + TSAD0 + offset, TxDesc.PhysicalAddress);
outpdw(IOBase + TSD0 + offset , TxDesc.PacketLength);
} 先看一下收发的CONFIGURATION有没有设置好。具体的寄存器是 TxConfig = 0x40,
RxConfig = 0x44。
如果设置好的话,ISSUECMD之后,网卡就开始DMA数据,发包。然后产生一个中断告诉驱动发送完成。不过是否产生这个中断也许依赖于设置。可以看看RTL8139的 DATA SHEET和 LINUX 8139TOO.C的代码。
如果想从QEMU里的虚拟网卡来调试,可以在 QEMU/HW/RTL8139.C 文件里加一些相关的PRINTF输出。