作者:杨硕,华清远见嵌入式培训中心讲师。

最近在将u-boot1.3.4移植到三星s5pc100 SOC平台发现u-boot启动之后无法ping通主机,也不能用tftp下载内核。硬件平台用的网卡芯片是dm9000aep,这是一款全集成,性价比高的快速以太网MAC控制器,支持8-bit和16-bit数据宽度,带有一个通用处理器接口,EEPROM接口,10M/100M自适应,带有16KB的SRAM(13KB作为接受FIFO,3KB作为发送FIFO)。Dm9000a在嵌入式平台中应用非常广。

因为在开发过程中我们需要经常修改重新编译Linux内核,所以每次改完之后都重新烧写内核到nandflash里面很麻烦。所以一定要解决u-boot对dm9000a网卡的支持问题。

我们首先需要确定硬件上有没有问题。鉴于Linux内核启动之后可以通过nfs挂在根文件系统,并且工作正常,所以可以确定内核对dm9000a的支持是没问题的,也就是说硬件上没有问题。接下来将注意力集中到软件上。

我首先怀疑是u-boot下对dm9000a的驱动有问题。找到驱动源代码:driver/net/dm9000x.c。 在代码一开始的注释中说“Fixed the driver to work with DM9000A”。看了之后很疑惑,既然源码作者都说他的驱动已经支持了DM9000A,那为什么网卡在u-boot下还不能工作?带着半信半疑的态度我进去查看源代码。首先最重要的网卡初始化的代码,在函数eth_init()中,这里面主要是设置网卡的工作模式,数据总线宽度,设置MAC地址并使能网卡等工作。为了确认这段代码是否正确,我又查看了Linux内核中DM9000A的驱动代码dm9000.c,发现两者在关键部分的设置都是一样的,只不过内核里面采用中断的工作模式,而在u-boot中采用轮询的工作模式。如果初始化代码没有问题的话,我继续查看关键的接收以及发送函数,即eth_send()和eth_rx(),发现这两部分也和内核里面是一样的。

这下我就更加困惑了,似乎驱动代码是没有问题的,但是问题出在什么地方呢?为了深入的分析原因,我打开了DM9000a的调试接口宏:define CONFIG_DM9000_DEBUG。然后在超级终端ping我的主机,ping的时候会调用eth_init()激活网卡,终端打印出下面的初始化信息:

Dm90000 i/o : 0x88000300, id : 0x90000a46
        Dm9000 : running in 16 bit mode
        MAC : 11:22:33:44:55:66
        Operating at 100M full duplex mode

看来初始化是没有问题的,可以读出id号这说明s5pc100和dm9000a数据交互肯定没有问题。但是ping还是会失败。之后打印的信息如下所示:

Transmit done
        Receiving packet
        Rx status: 0x0101 rx len: 24158
        Rx fifo error
        Rx length too big

问题出在这里了,我们看到主机回传给开发板的数据包的长度是24158Byte,即23.59KB。从前面的介绍我们知道接收fifo只有13KB,这个长度显然太大了,所以后面有fifo error和length too big的提示。在主机端用抓包软件抓包,发现抓到的来自开发板的数据包都不对,MAC地址并不是板子的MAC地址,Protocol是unknown。

如果驱动没错的话怎么会是这样的结果?这时我想到会不会是总线宽度设置的不正确导致数据流出错?接着通过查看硬件原理图找到dm9000a接到片选1上,也就是s5pc100的SMC Bank 1上。然后在SMC的控制器中查看相应的控制寄存器,找到每个Bank的总线宽度是在SMC_BW寄存器中配置的,其中4~7位是配置Bank 1的。

这时我想到既然dm9000a在内核里面工作正常,那就应该去内核代码里面看看内核是怎么设置的。我在驱动代码里面没有找到设置Bank1的代码。一般来说如果驱动里面不设置的话,那就应该是在平台代码里面做。平台代码位于:arch/arm/mach-s5pc100/mach-smdkc100.c,在平台初始化函数smdkc100_machine_init中,我找到了smdkc100_dm9000_set函数,这个函数里面就是将SMC_BW寄存器里面的4~7位全部设置为1。我们注意这里第四位DataWidth1就是控制数据总线宽度的,设为1就是工作在16位模式。

再回到u-boot中,在u-boot的板级初始化文件:board/smdkc100/smdkc100.c中,我在board_init函数中没有找到初始化dm9000a的代码,在整个文件中也没有。因此可以确定u-boot确实没有设置Bank 1的数据总线宽度,而SMC_BW里面4~7位的默认值都是0,因此上电后默认就是8-bit的数据总线宽度。看来终于找到问题所在了,我在board_init中加了一个dm9000aep_pre_init函数,里面将总线宽度配置为16位的,重新编译u-boot,通过dnw烧写到nandflash里面。重启之后再ping主机,果然就可以ping通了。通过抓包工具我们可以清晰看到开发板和主机之间数据包的交互过程:

最后还有一个问题,每次ping结束后,网线的物理连接就断掉了,也就是说开发板和主机端的网络指示灯都灭了。跟到u-boot的实现ping的源代码里面,发现每次ping结束之前会调用一下eth_halt函数,这个函数会把网卡禁用掉。所以我在dm9000x.c中将eth_halt中禁用网卡的几行代码注释掉,再重新烧写u-boot,问题就可以解决了。

嵌入式及3G相关资源及学习请点击:嵌入式开发视频android开发视频android培训3G培训QT培训QT开发视频物联网培训物联网技术视频嵌入式学习

Dm9000aep在u-boot下网卡驱动调试笔记相关推荐

  1. [linux kernel] 内核下ksz8081驱动调试

    系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 - ...

  2. Linux下网卡驱动安装及故障排除

    Linux下网卡驱动安装及故障排除 赛迪网 2007-4-26 9:10:00文/forgiven 网卡是Linux服务器中最重要网络设备.据统计,Linux网络故障有35%在物理层.25%在数据链路 ...

  3. 4G网卡驱动调试-ec20

    4G网卡驱动调试分三步走: 一.基本概念 USB 部分的功能接口 APN 二.驱动移植 USB Driver GobiNet Driver 或者 QMI WWAN PPP 拨号配置 三.RIL 移植 ...

  4. linux网卡驱动离线安装_Linux下网卡驱动的安装

    //Linux下网卡驱动的安装 //从intel网站上下载下来的Linux驱动是e1000-5.2.52.tar.gz rpm -qa|grep kernel- //source查看是否安装了这个包, ...

  5. Vivado工程配置petalinux实现linux下网卡驱动

    0.说明 基于Vivado工程配置petalinux实现linux下控制PL端GPIO 完成对linux网卡的驱动 实验内容: 完成一个vivado工程,导出硬件信息 创建petalinux工程,导入 ...

  6. linux 网卡驱动分析,基于linux下网卡驱动分析及实现技术研究

    摘    要 Linux技术是当前计算机技术中最大的一个热点,在我国以及全世界得到了迅猛的发展,被广泛的应用于嵌入式系统.服务器.网络系统.安全等领域.从而使得掌握在 Linux环境下的开发技术,成为 ...

  7. ubuntu18.04下双机驱动调试

    环境搭建: https://blog.51cto.com/haidragon/2337256 这里要先说下如果要下内核断点要先在编译前去掉写保护,但是下自己写的驱动可以不要. 第二个最好编译完后压缩v ...

  8. linux端口绑定moute,Linux下网卡驱动的安装(未完结)

    这两天装一台Linux服务器,主板太另类了,在一台1u的机箱里面装了两台机器,每个都是4u的X3210,主板是X38ML,在intel首页上面都没多少介绍,找了半天才找到网卡驱动,安装debian的时 ...

  9. 安卓11(AndroidR)展锐 sc9863a驱动调试笔记1

    1.先来看下新代码包的所使用的文件所在: Source和lunch 58之后(58. s9863a1h10_go_32b_2g-userdebug-native),配置了一些环境变量: ======= ...

最新文章

  1. dataframe构建
  2. 本地Yum仓库搭建部署
  3. POJ 3080 多个串最长公共子序列
  4. 统计简单学_常用统计图表
  5. sepFilter2D函数
  6. CentOS7使用ISO镜像文件作为离线Yum源
  7. 光纤交换机光纤通道协议介绍
  8. Oracle RAC学习笔记:基本概念及入门
  9. Random Forest随机森林概述
  10. Bootstrap 编码规范之HTML5 Doctype
  11. 三顺,因为你,我笑了。
  12. cas-server Jdbc 连接读取用户(5)
  13. 华为系统p40pro计算机,华为P40 Pro:我来了!
  14. 《安富莱嵌入式周报》第259期:2022.03.28--2022.04.03
  15. LeetCode 08.04 幂集
  16. 高频头极化角调整+用什么本振的高频头
  17. idea 有时提示找不到类或者符号
  18. matlab单容建模仿真,大学毕业论文-—基于matlab的过程控制系统仿真研究
  19. win7系统设置电脑自动开机的操作方法
  20. oracle中查看pga大小,关于oracle pga大小限制

热门文章

  1. BIM+GIS智慧工地数字化管理解决方案
  2. [转] 文本相似性算法Simhash原理及实践
  3. 一道大厂测试开发面试真题,你需要几分钟解答?
  4. [62量化交易] tushare下载行情所有数据
  5. 基于Hexo和Github的炫酷个人博客(进阶篇)
  6. python word转excel题库_将word版题库转换为Excel版
  7. 手保守教你使用All in one seo
  8. VMWare ESXi创建虚拟机并在虚拟机上搭建私有git
  9. springboot 整合 oss进行文件上传
  10. Python pandas给excel表格排序(扩展当前区域)并保存至新表格中