免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sherf
打印 上一主题 下一主题

RTL8139 programming guide [复制链接]

论坛徽章:
0
31 [报告]
发表于 2009-11-05 12:29 |只看该作者
原帖由 accessory 于 2009-11-5 01:39 发表
先看一下收发的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 编辑 ]

论坛徽章:
0
32 [报告]
发表于 2009-11-05 13:52 |只看该作者
1。关于中断注册这部分,一般是操作系统来做的。不同的操作系统可以用不同的方法。比如windows和 linux就不一样。所以我还想问你,在什么环境下跑的?有没有操作系统支持?如果有,是什么操作系统?如果想知道怎么关联中断,可以看看 linux 相关代码。
另外,实模式下和保护模式下的中断操作也不一样。你应该是在保护模式下把?

对于2,TSD的阀值在哪里可以查看并设置?
--看手册。

ISR函数是指我自己编写的中断处理函数吗?
--是。

如果是,哪ISR函数跟rtl8139中的ISR寄存器是否有关联?(即是否要将我写的中断处理函数的入口地址写到ISR寄存器中?)
--不用。在你的isr里读入 rtl8139 isr register的值。从而判断是发送完成?接收完成?还是其他事件。

论坛徽章:
0
33 [报告]
发表于 2009-11-06 04:56 |只看该作者
原帖由 accessory 于 2009-11-5 13:52 发表
1。关于中断注册这部分,一般是操作系统来做的。不同的操作系统可以用不同的方法。比如windows和 linux就不一样。所以我还想问你,在什么环境下跑的?有没有操作系统支持?如果有,是什么操作系统?如果想知道怎 ...


accessory,

发送还是不成功(中断已成功关联),检测各个寄存器后发现,IMR的值为0,但是我已按照demo上的设置将IMR设成 0x7F(已直接改用数字代替宏的名称,结果照样是0)。在网上翻了很久,但都没找到相关的资料。accessory,你以前碰到过这样的问题吗?是不是对于qemu的虚拟网卡要进行一些设置才行?

另,关于我使用的环境,是从裸机上通过其他程序boot起来的,没有操作系统支持的。

论坛徽章:
0
34 [报告]
发表于 2009-11-06 06:43 |只看该作者
IMR是哪个寄存器?偏移是多少?

你可以在QEMU/HW/RTL8139.C 的 rtl8139_transmit_one() 函数里加一些PRINTF输出。看看你到底把发送命令写下去了没有。网卡又是如何处理的?

另外,你用的BOOT程序都干了啥?有没有设置好IDT?

论坛徽章:
0
35 [报告]
发表于 2009-11-06 13:55 |只看该作者

回复 #33 accessory 的帖子

IMR,中断屏蔽寄存器,0x3C

你说的rtl8139_transmit_one()应该是source里面的改动吧,我用的是qemu的window版(0.90).......

IDT已设置好,中断的关联应该没问题

另,通过发包前、后的对比,在发包后TOK已置1,但IMR一直没变都是0,因此估计是IMR屏蔽了发送的中断

[ 本帖最后由 sherf 于 2009-11-6 14:01 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2009-11-06 17:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
37 [报告]
发表于 2009-11-07 00:57 |只看该作者
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 啊。

论坛徽章:
0
38 [报告]
发表于 2009-11-07 06:33 |只看该作者
原帖由 accessory 于 2009-11-7 00:57 发表
IMR如果是0的话,表示所有的中断都禁止了。所以你的程序收不到中断。
应该把IMR中相应的中断位设置位1,例如:
static const u16 rtl8139_intr_mask =
        PCIErr | PCSTimeout | RxUnderrun | RxOverflow | Rx ...


在对ISR的检测过程中发现,ISR在发包的前、后都为0xFFFF,这是十分奇怪的。而且,ISR最高位为1是PCI总线的错误,我只是读取过PCI配置空间的数据而已,哪来的PCI总线错误...........搞不懂

论坛徽章:
0
39 [报告]
发表于 2009-11-07 11:24 |只看该作者
在发数据之前,你有没有把卡复位过?

论坛徽章:
0
40 [报告]
发表于 2009-11-07 12:11 |只看该作者
原帖由 accessory 于 2009-11-7 11:24 发表
在发数据之前,你有没有把卡复位过?


有,

out_byte(IOBase + CR, CR_RST);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP