uClinux下移植Ne2000兼容的网卡驱动程序
2012-06-02

反复陷入中断,很容易想到就是中断模式配置的问题,8019的中断是高电平有效,看看S3C44B0上的配置,果然不对。这个配置是在Bootloader中做好了的,改一下,就好了。我把他改成了上升沿触发。

别人的批注:

最好改为高电平触发,我就吃过这样的苦头,当时我那个驱动不太稳定,一旦有错误,就死活不工作,后来发现是8019的中断线一直为高,显示有中断,但CPU不知什么原因,开始的时候没有检测到上升沿,因此以后就再也收不到中断了,把触发方式改了以后,就非常稳定了

另外,因为S3C44B0是IO空间和存储器统一编址。这就容易忽视一个问题,就是缓冲。对于存储器,加上片内的缓冲可以提高效率,不过对于外部设备比如这个8019,就不能使用缓冲。记住,缓冲的范围一定要配置正确,我开始就弄错了,产生了一些莫名其妙的问题,耽误了不少时间。

上述问题都解决了,启动的时候可以找到网卡,可以配置好物理地址,启动以后ifconfig eth0也没有问题,这次应该没有问题了吧。可是,结果还是ping通。这次就比较麻烦了,没有内核跟踪调试的手段,只能靠printk来输出?不知道应该从哪里入手了。不过还好,调试以太网,有Sniffer(一个功能强大的抓包软件,在局域网内的数据包都是抓到)。就靠它了,在我的PC上运行,抓包。在uClinux下ping主机的IP。果然能抓到数据包。分析抓取的数据包发现问题。

按理说,ping的时候,第一次不知道目的主机的Mac地址,所以,应该发送ARP广播,发送的数据大概的格式开头应该是FF FF FF FF FF FF AA BB CC DD EE FF…………(AABB CC DD EE FF表示发送方的Mac地址),可是我抓到的数据包是FF FF FF FF FF FF AA AA BB BB CC CC DD DD EE EE FF FF…… 看明白了,这个问题应该是网卡发送的时候,向网卡写入数据连续写了两次。这个问题最容易让人想到是S3C44B0的挂8019的那个Bank的数据宽度配置错了。可是,我仔细的看了,不是这个问题。那就只有再仔细看看源码了。还是在drivers/net/ne.c里面,ne_block_output函数--这个就是8019发送时候调用的函数了,里面有代码:

if (ei_status.word16) {

outsw(NE_BASE + NE_DATAPORT, (void*)buf, count>>1);

} else {

outsb(NE_BASE + NE_DATAPORT, (void*)buf, count);

}

我跟踪了一下,ei_status.word16=1,这个没有问题。那么,问题就出在outsw函数上了。用SourceInsight一层层的跟踪(做一个函数右一个宏的,定义的可真多,好多不同模式或者处理器下的相同定义,要看清楚自己的),最后,终于把目标锁定在了arch/armnommu/lib/ io-writesw-armv3.S和io-writesw-armv4.S两个汇编文件。到底是哪个呢?

熟悉ARM家族的人应该知道ARMv3和ARMv4的一些区别,看看这两汇编,就可以开出来他们对16位数读写操作的不同,按照道理S3C44B0应该是ARMv4(我记得应该是,不到出处了,至少看了那个两汇编文件,我认定应该用ARMv4那个),可是,看了一下便一输出的.o文件,是io-writesw-armv3.o,显然弄错了,这里就是问题了。那么为什么要编译ARMv3而不是ARMv4这个文件呢?在Makefile和Config.in中经过一番寻找,终于找,原来在定义arch/armnommu/config.in中,定义CONFIG_ARCH_S3C44B0的时候,没有定义

CONFIG_CPU_32v4

那么,默认情况下,就定义CONFIG_CPU_32v3,用它来编译。好了。把ARMv4的定义添上。顺便把前面说的ARM_NE2000_BASE和ARM_NE2000_IRQ的定义以添加到这里,让用户可以自己定义裁剪。

hex 'Base Address for NE2000 ethernet' ARM_NE2000_BASE youraddr

hex 'IRQ for NE2000 ethernet' ARM_NE2000_IRQ yourinterrupt

好了,编译通过。运行,果然没有问题了。Ping可以,telnet可以,在内核中把NFS打开,mount -t nfs ……也好用。哈哈。太好了。至此,8019在S344B0组成的uclinux平台上的驱动,移植成功。相信其他的网卡芯片移植驱动程序应该也基本是这个思路。现在写出来与大家共享。希望对新手入门有所帮助,同时文章中有我理解错误的地方,也希望高手指教。

最后,再总结一下,移植过程中需要注意的几个问题:

  • 确定网卡的基地址、中断无误
  • 注意网卡的数据总线宽度,地址是否连续,如果不连续,如何映射
  • 注意网卡的中断的模式和处理对应的外部中断是不是一致
  • 对于IO和RAM统一编址的处理器,注意缓冲区范围的设置
  • 注意ARMv3和ARMv4等一些和处理器结构相关的底层函数库带来的问题
  • 用抓包软件可以帮助分析定位问题所在

Btw,我的PC平台是在WindowsXP+Virtual PC下安装的Red Hat linux 8.0,我觉得这样调试起来比较方便,可以用SoureInsigh来阅读,编写代码,可以在Linux编译。充分发挥两个操作系统的优势。很适合于像我这样的,不熟悉Linux人开发。

共 3 页   上一页123
可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号