文档章节

u-boot移植:解决 Retry count exceeded; starting again

宁宁爸
 宁宁爸
发布于 2016/01/19 13:30
字数 1771
阅读 1499
收藏 0
点赞 1
评论 0

搞了一整天的U-boot,现在终于可以使用tftp下载内核镜像了,现在终于成功了,呵呵!先前在移植网卡驱动的时候可以在U-boot中PING通我的主机,没有任何问题,可就是使用tftp服务不能下载,通过在网上搜索,也没有找到一个很好的解决方案。网上说的首先要配置好tftp服务器,我的Ubuntu操作系统,通过安装tftp服务,并经过测试,没有问题了。主机上的防火墙也已经关闭。有时,小点的文件可以成功的下载,而大点的文件就会出现下面的错误。

[U-Boot@mini2440]#tftp 30008000 u-boot.bin 
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode 
MAC: 08:00:3e:26:0a:5b 
operating at 100M full duplex mode 
Using dm9000 device 
TFTP from server 10.27.10.48; our IP address is 10.27.10.23 
Filename 'u-boot.bin'. 
Load address: 0x30008000 
Loading: T T T T #T T T T T T T ##T T T T T T T T T T T ##T T T T T #T T T T ###
done 
Bytes transferred = 154764 (25c8c hex) //文件不到200KB还是出现断断续续的 
[U-Boot@mini2440]#tftp 30008000 zImage  //文件达到2MB就没有出现成功过
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode 
MAC: 08:00:3e:26:0a:5b 
operating at 100M full duplex mode 
Using dm9000 device 
TFTP from server 10.27.10.48; our IP address is 10.27.10.23 
Filename 'zImage'. 
Load address: 0x30008000 
Loading: T T T T T T T T T T T T T T #T T T T T T T T T T T T ##T T T T T T T T#
         ###T T #T T T T T 
Retry count exceeded; starting again 
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode 
MAC: 08:00:3e:26:0a:5b 
operating at 100M full duplex mode 
Using dm9000 device 
TFTP from server 10.27.10.48; our IP address is 10.27.10.23 
Filename 'zImage'. 
Load address: 0x30008000 
Loading: T T T T T T T T T T #T T T T T T T T T #T T T T T T T T #T T T T T T ##
         ####T T T T T T T T ######################T T T #####
         ###T T #T T T T T T ##T T ##T T ##### 
Retry count exceeded; starting again 
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode 
MAC: 08:00:3e:26:0a:5b 
operating at 100M full duplex mode 
Using dm9000 device 
TFTP from server 10.27.10.48; our IP address is 10.27.10.23 
Filename 'zImage'. 
Load address: 0x30008000 
Loading: T T T T T #T T T T T T T T #T T T T T T T T T T T T #T T T T T T T T T#
         ####T T T T #T T T T T T T ##########T T ########T T T ##T T ##
         ##T T #T T T T T T T T T #####T T ######T T #####T T #####T T 
         T T ##
Retry count exceeded; starting again 
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode 
MAC: 08:00:3e:26:0a:5b 
operating at 100M full duplex mode 
Using dm9000 device 
TFTP from server 10.27.10.48; our IP address is 10.27.10.23 
Filename 'zImage'. 
Load address: 0x30008000 
Loading: T T T T T #T T T T T T T T T T T ###T T T T T T T T T ##T T T  T #
   ####T T T T T T ##T T T T #####T T T ##################
  ####T T T T T T #T T T T ##T T #############T T ##T T ##T T ### 
Retry count exceeded; starting again //会一直循环下去,无休无止的


从网上不断的搜索,还有的说是lowlevel_init.S文件中的BANK没有设置对,不过我也检查一下我的BANK的设置,我的DM9000在BANK4上面,下面是我的lowlevel_init.S文件的部分配置,位宽是16Bit的。

#define BWSCON    0x48000000
/* BWSCON */
#define DW8            (0x0)
#define DW16            (0x1)
#define DW32            (0x2)
#define WAIT            (0x1<<2)
#define UBLB            (0x1<<3)

#define B1_BWSCON        (DW32)
#define B2_BWSCON        (DW16)
//#define B3_BWSCON        (DW16 + WAIT + UBLB)
#define B3_BWSCON        (DW16+UBLB)
#define B4_BWSCON        (DW16 + UBLB)
#define B5_BWSCON        (DW16)
#define B6_BWSCON        (DW32)
#define B7_BWSCON        (DW32)

再次修改了修改drivers/net/dm9000x.c文件中phy_read()函数和phy_write函数

phy_write(int reg, u16 value)
{ 
    int i;
    /* Fill the phyxcer register into REG_0C */
    DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);

    /* Fill the written data into REG_0D & REG_0E */
    DM9000_iow(DM9000_EPDRL, (value & 0xff));
    DM9000_iow(DM9000_EPDRH, ((value >> 8) & 0xff));
    DM9000_iow(DM9000_EPCR, 0xa);    /* Issue phyxcer write command */
    //udelay(500);            /* Wait write complete */

    i=0;
    while(DM9000_ior(DM9000_EPCR) & 0x01)
    {
        udelay(100);
        i++;                //替换 udelay(500)
        if(i==1000)
        {
            printf("DM9000 access error\n");
            return 0;
        }
    }
    DM9000_iow(DM9000_EPCR, 0x0);    /* Clear phyxcer write command */
    DM9000_DBG("phy_write(reg:0x%x, value:0x%x)\n", reg, value);
}

static u16
phy_read(int reg)
{
    u16 val;
         int i;
    /* Fill the phyxcer register into REG_0C */
    DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
    DM9000_iow(DM9000_EPCR, 0xc);    /* Issue phyxcer read command */ i=0;
    //udelay(100);            /* Wait read complete */

    while(DM9000_ior(DM9000_EPCR) & 0x01)
    {
        udelay(100);
        i++;                //替换udelay(100)
        if(i==1000)
            {
                printf("DM9000 access error\n");
                return 0;
            }
    }
    DM9000_iow(DM9000_EPCR, 0x0);    /* Clear phyxcer read command */
    val = (DM9000_ior(DM9000_EPDRH) << 8) | DM9000_ior(DM9000_EPDRL);

    /* The read data keeps on REG_0D & REG_0E */
    DM9000_DBG("phy_read(0x%x): 0x%x\n", reg, val);
    return val;
}

注释掉dm9000_halt 的函数体

static void dm9000_halt(struct eth_device *netdev)
{
    //DM9000_DBG("%s\n", __func__);


    /* RESET devie */
    //phy_write(0, 0x8000);    /* PHY RESET */

    //DM9000_iow(DM9000_GPR, 0x01);    /* Power-Down PHY */

    //DM9000_iow(DM9000_IMR, 0x80);    /* Disable all interrupt */

    //DM9000_iow(DM9000_RCR, 0x00);    /* Disable RX */

}

还要继续修改,修改文件/net/net.c中的内容
在104行附近

//# define ARP_TIMEOUT        5000UL    /* Milliseconds before trying ARP again */
将上面的一句替换成下面这句
# define ARP_TIMEOUT        (CONFIG_SYS_HZ/1000*5000UL) 

在573行附近

#ifndef CONFIG_NET_MULTI
    //NetSetTimeout (10000UL, startAgainTimeout);
将上面的一句替换成下面这句
    NetSetTimeout (10000UL*CONFIG_SYS_HZ/1000, startAgainTimeout);
    NetSetHandler (startAgainHandler);

在585行附近

if (NetDevExists && !once) {
            //NetSetTimeout (10000UL, startAgainTimeout);
将上面的一句替换成下面这句
            NetSetTimeout (10000UL*CONFIG_SYS_HZ/1000, startAgainTimeout);

在757行附近

//NetSetTimeout (10000UL, PingTimeout);
将上面的一句替换成下面这句
    NetSetTimeout (10000UL*CONFIG_SYS_HZ/1000, PingTimeout);

在781行附近

//#define CDP_TIMEOUT            250UL    /* one packet every 250ms */
将上面的一句替换成下面这句
#define CDP_TIMEOUT            (250UL*CONFIG_SYS_HZ/1000)

上面这些都改完以后还是不能使用tftp下载。还是会断断续续的。在网上继续搜索,又找到一个地方需要修改的。看的一个网友是这样分析的

一、问题原因分析:

1、下载与我操作系统版本(fedora 10)一致的tftp server源代码tftp-hpa-0.48.tar.bz2,编译通过后,替换系统的tftpd程序,通过在源代码中添加调试信息,发现是由于 Uboot 端 tftp 程序传过来的Timeout参数不符合服务器端定义引起的:

 Nov 11 10:46:12 HardWare in.tftpd[18275]: client timeout = 7810 , server timeout = 1-255 tftp客户端传过来的timeout是7810,而服务器端定义的范围在1-255秒之间,不是服务器的问题,而是uboot中tftp参数设置的问题。

继续修改/net/tftp.c文件中的下面这句

#define TIMEOUT   60000UL //5000UL   /* Millisecs to timeout for lost pkt */

一开始改变的太小,改成10000UL,直接把后面的UL去掉还是不行,不过改完这里就真的可以了,我都不敢相信这是真的。不过确实是真的,就是这里TIMEOUT的问题,我的板子是通过交换机和主机相连的。
  TIMEOUT 的值是跟据板子配置文件中的 
CONFIG_SYS_HZ 值计算出来的,我的配置文件时从 Uboot目录 include/configs/mini2410.h 复制过来的,值为 1562500,算出来后就等于7810.也就是上面分析的tftp的超时的值。
下面就是成功后的下载界面:

[U-Boot@mini2440]#tftp 30000000 zImage 
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode 
MAC: 08:00:3e:26:0a:5b 
operating at 100M full duplex mode 
Using dm9000 device 
TFTP from server 10.27.10.48; our IP address is 10.27.10.23 
Filename 'zImage'. 
Load address: 0x30000000 
Loading: ################################################################# 
         ################################################################# 
         ################################################################# 
         ################################################################# 
         ################################################################# 
         ################################################################# 
         ################### 
done 
Bytes transferred = 2092932 (1fef84 hex)

本文转载自:http://blog.chinaunix.net/uid-13245160-id-3056726.html

共有 人打赏支持
宁宁爸
粉丝 80
博文 57
码字总数 25735
作品 0
高级程序员
uboot使用tftp下载失败

SMDKV210 # ping 192.168.0.10 dm9000 i/o: 0xa8000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:40:5c:26:0a:5b operating at 100M full duplex mode host 192.168.0.10 is......

首席吹牛官 ⋅ 2013/11/19 ⋅ 1

u-boot 移植步骤详解

1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boo...

nothingfinal ⋅ 2012/04/22 ⋅ 0

U-boot主循环main_loop分析

原文在我博客:http://blog.csdn.net/andywsj/article/details/8614905 最近在写cortex-M3的一个裸机程序,写的过程中突然想到,虽然这个程序很简单 但是我并没有关心cortex-M3的启动代码,很...

cubieboard ⋅ 2014/08/17 ⋅ 0

u-boot-2009-11移植之stage1(支持从nand启动)

目标板:FL2440 硬件资源:64M SDRAM/256M nandflash(k9f2g08u0a)/4M nor flash(JS28F320) 开发环境:fedora 14 源码:u-boot-2009.11 交叉编译工具链:cross-3.3.2.tar.bz2 参考资料:h...

liufazhang ⋅ 2011/10/24 ⋅ 1

Hi3519V101开发环境搭建(二)

前言 前面已经搭建好了Ubuntu下的海思开发环境,现在对编译Uboot和Kernel的过程做一个简单的记录。参考文档《Hi3519V101 U-boot 移植应用开发指南.pdf》和《Hi3519V101 Linux开发环境用户指南...

simonforfuture ⋅ 2017/11/12 ⋅ 0

pcDuino + busybox 成功搭建最小linux系统

经过一周的尝试,我的pcDuino mini linux系统跑起来了。下面可以专心做驱动开发,以及移植自己的Android系统。 准备一张tf卡,我用的1G Kingstorm。准备文件:sunxi-spl.bin、u-boot.bin、s...

pc朵拉 ⋅ 2013/07/03 ⋅ 0

Cubieboard开发环境与Uboot的SD启动卡制作

原文在我博客:http://blog.csdn.net/andy_wsj/article/details/8515197 拿到Cubieboard已经蛮久了,平时上班比较忙,只能晚上玩一会,年关将近,周末都要加班呀.... 所谓U-boot 移植,其实别...

cubieboard ⋅ 2014/09/03 ⋅ 0

pcDuino的u-boot移植与分析

一、准备工作 1.获取支持pcDuino的u-boot源码 https://github.com/linux-sunxi/u-boot-sunxi 在XP下直接点ZIP即可开始下载 2.获取交叉编译链 http://code.google.com/p/smp-on-qemu/downloa...

pc朵拉 ⋅ 2013/07/02 ⋅ 0

Linux: ARC CPU Linux kernels and GNU tools

ARC CPU Linux kernels and GNU tools http://sourceforge.net/projects/arc-linux/files/ 1)ARC GNU Toolchain 编译工具链,支持ARC700 # ./buildelf32.sh $INSTALLDIR # ./builduclibc.sh......

长平狐 ⋅ 2012/06/20 ⋅ 0

一起移植 U-BOOT

现在有没有人对移植 U-BOOT 感兴趣呢,我现在移植到我手头的 芯片上,对 U-BOOT 的组织形式有一定的了解。 一个人做没大意思,想和有兴趣的朋友一起移植。我本来移植用的 不是常见的板子。刚...

張3. ⋅ 2010/12/31 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 33分钟前 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部