先看一下收发的CONFIGURATION有没有设置好。具体的寄存器是 TxConfig = 0x40,
RxConfig = 0x44。
如果设置好的话,ISSUECMD之后,网卡就开始DMA数据,发包。然后产生一个中断告诉驱动发送完成。不过是否产 ...
accessory,
对中断设置再次检查后,没发现配置上的问题。因此,想再请问一下:
1、对于PCI网卡中断处理的理解:通过PCI配置空间得知PCI网卡(这里指我使用的RTL8139网卡)在BIOS中分配的中断号,假如是11,这个中断号应该对应8259A芯片中的第11号引脚,因此将该中断号与中断处理程序关联上并打开8259A芯片的第11号引脚的终端屏蔽就可以让网卡的中断处理程序工作了(当然,对于rtl8139,还要设置IMR寄存器的)。
2、对于发包的过程,应该是重复使用TASD0-4和TSD0-4这4对寄存器,每发送一个包都会发送到FIFO对应存储器,如果是一个完整的包或包的大小超过TSD“阀值”,这时就会触发“发送中断”并调用ISR函数进行处理。
对于1,我的理解对吗?
对于2,TSD的阀值在哪里可以查看并设置?ISR函数是指我自己编写的中断处理函数吗?如果是,哪ISR函数跟rtl8139中的ISR寄存器是否有关联?(即是否要将我写的中断处理函数的入口地址写到ISR寄存器中?)
[ 本帖最后由 sherf 于 2009-11-5 12:31 编辑 ] 1。关于中断注册这部分,一般是操作系统来做的。不同的操作系统可以用不同的方法。比如windows和 linux就不一样。所以我还想问你,在什么环境下跑的?有没有操作系统支持?如果有,是什么操作系统?如果想知道怎么关联中断,可以看看 linux 相关代码。
另外,实模式下和保护模式下的中断操作也不一样。你应该是在保护模式下把?
对于2,TSD的阀值在哪里可以查看并设置?
--看手册。
ISR函数是指我自己编写的中断处理函数吗?
--是。
如果是,哪ISR函数跟rtl8139中的ISR寄存器是否有关联?(即是否要将我写的中断处理函数的入口地址写到ISR寄存器中?)
--不用。在你的isr里读入 rtl8139 isr register的值。从而判断是发送完成?接收完成?还是其他事件。 原帖由 accessory 于 2009-11-5 13:52 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
1。关于中断注册这部分,一般是操作系统来做的。不同的操作系统可以用不同的方法。比如windows和 linux就不一样。所以我还想问你,在什么环境下跑的?有没有操作系统支持?如果有,是什么操作系统?如果想知道怎 ...
accessory,
发送还是不成功(中断已成功关联),检测各个寄存器后发现,IMR的值为0,但是我已按照demo上的设置将IMR设成 0x7F(已直接改用数字代替宏的名称,结果照样是0)。在网上翻了很久,但都没找到相关的资料。accessory,你以前碰到过这样的问题吗?是不是对于qemu的虚拟网卡要进行一些设置才行?
另,关于我使用的环境,是从裸机上通过其他程序boot起来的,没有操作系统支持的。 IMR是哪个寄存器?偏移是多少?
你可以在QEMU/HW/RTL8139.C 的 rtl8139_transmit_one() 函数里加一些PRINTF输出。看看你到底把发送命令写下去了没有。网卡又是如何处理的?
另外,你用的BOOT程序都干了啥?有没有设置好IDT?
回复 #33 accessory 的帖子
IMR,中断屏蔽寄存器,0x3C你说的rtl8139_transmit_one()应该是source里面的改动吧,我用的是qemu的window版(0.90).......
IDT已设置好,中断的关联应该没问题
另,通过发包前、后的对比,在发包后TOK已置1,但IMR一直没变都是0,因此估计是IMR屏蔽了发送的中断
[ 本帖最后由 sherf 于 2009-11-6 14:01 编辑 ] IMR如果是0的话,表示所有的中断都禁止了。所以你的程序收不到中断。
应该把IMR中相应的中断位设置位1,例如:
static const u16 rtl8139_intr_mask =
PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver |
TxErr | TxOK | RxErr | RxOK;
RTL_W16 (IntrMask, rtl8139_intr_mask);
这一步是在你的驱动已经准备好了的时候设置。因为一设置后,可能马上有中断。如果你的程序还没初始化完,就会有比较奇怪的事情发生。
你为啥要看IMR有没有变?如果你想看是否有中断,什么中断,应该读 IntrStatus = 0x3E 啊。 原帖由 accessory 于 2009-11-7 00:57 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
IMR如果是0的话,表示所有的中断都禁止了。所以你的程序收不到中断。
应该把IMR中相应的中断位设置位1,例如:
static const u16 rtl8139_intr_mask =
PCIErr | PCSTimeout | RxUnderrun | RxOverflow | Rx ...
在对ISR的检测过程中发现,ISR在发包的前、后都为0xFFFF,这是十分奇怪的。而且,ISR最高位为1是PCI总线的错误,我只是读取过PCI配置空间的数据而已,哪来的PCI总线错误...........搞不懂 在发数据之前,你有没有把卡复位过? 原帖由 accessory 于 2009-11-7 11:24 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
在发数据之前,你有没有把卡复位过?
有,
out_byte(IOBase + CR, CR_RST);