免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7342 | 回复: 9
打印 上一主题 下一主题

移植支持dm9000的u-boot-1.1.6问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-10 11:14 |只看该作者 |倒序浏览
本帖最后由 yians 于 2010-06-10 11:18 编辑

由于一些原因选用了u-boot-1.1.6移植到mini2440,现在在dm9000网卡驱动这卡住了。
问题是这样的:
我将dm9000的一些宏定义添加完后在编译烧写,启动u-boot,串口会出现“Net:No ethernet found.”。我发现它是在net/eth.c中的eth_initialize()里打印的:
00255:        if (!eth_devices) {
00256:                puts ("No ethernet found.\n" );
而eth_initialize()是在lib-arm/board.c中start_armboot()中调用。
于是我去找给eth_devices赋值的地方,可是在eth_initialize()中除了在初始的地方给eth_devices=NULL以外,并没有更改,也就是这种错误是应该的?那dm9000的初始化应该在哪做的呢?

还有我发现eth.c中和dm9000x.c中都定义eth_init(),eth_halt()等函数,这不会导致冲突吗?其实这个问题对于cs8900也是一样的。到底如何解释呢?
这在最新版的u-boot里没有问题,最新版中dm9000x.c已经改为dm9000_init(),dm9000_halt(),初始化过程与1.1.6也不一样,所以希望能从1.1.6给出解释。

真的谢谢了,我实在是自己解决不了了。
1.1.6版本的u-boot可以在 http://www.icdev.com.cn/batch.viewlink.php?itemid=1694 里下。期待好心人啊。

eth_initialize()的代码如下:
int eth_initialize(bd_t *bis)
{
        char enetvar[32], env_enetaddr[6];
        int i, eth_number = 0;
        char *tmp, *end;

        eth_devices = NULL;
        eth_current = NULL;

#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
        miiphy_init();
#endif

#ifdef CONFIG_DB64360
        mv6436x_eth_initialize(bis);
#endif
#ifdef CONFIG_CPCI750
        mv6436x_eth_initialize(bis);
#endif
#ifdef CONFIG_DB64460
        mv6446x_eth_initialize(bis);
#endif
#if defined(CONFIG_4xx) && !defined(CONFIG_IOP480) && !defined(CONFIG_AP1000)
        ppc_4xx_eth_initialize(bis);
#endif
#ifdef CONFIG_INCA_IP_SWITCH
        inca_switch_initialize(bis);
#endif
#ifdef CONFIG_PLB2800_ETHER
        plb2800_eth_initialize(bis);
#endif
#ifdef SCC_ENET
        scc_initialize(bis);
#endif
#if defined(CONFIG_MPC5xxx_FEC)
        mpc5xxx_fec_initialize(bis);
#endif
#if defined(CONFIG_MPC8220_FEC)
        mpc8220_fec_initialize(bis);
#endif
#if defined(CONFIG_SK98 )
        skge_initialize(bis);
#endif
#if defined(CONFIG_MPC85XX_TSEC1)
        tsec_initialize(bis, 0, CONFIG_MPC85XX_TSEC1_NAME);
#elif defined(CONFIG_MPC83XX_TSEC1)
        tsec_initialize(bis, 0, CONFIG_MPC83XX_TSEC1_NAME);
#endif
#if defined(CONFIG_MPC85XX_TSEC2)
        tsec_initialize(bis, 1, CONFIG_MPC85XX_TSEC2_NAME);
#elif defined(CONFIG_MPC83XX_TSEC2)
        tsec_initialize(bis, 1, CONFIG_MPC83XX_TSEC2_NAME);
#endif
#if defined(CONFIG_MPC85XX_FEC)
        tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME);
#else
#    if defined(CONFIG_MPC85XX_TSEC3)
        tsec_initialize(bis, 2, CONFIG_MPC85XX_TSEC3_NAME);
#    elif defined(CONFIG_MPC83XX_TSEC3)
        tsec_initialize(bis, 2, CONFIG_MPC83XX_TSEC3_NAME);
#    endif
#    if defined(CONFIG_MPC85XX_TSEC4)
        tsec_initialize(bis, 3, CONFIG_MPC85XX_TSEC4_NAME);
#    elif defined(CONFIG_MPC83XX_TSEC4)
        tsec_initialize(bis, 3, CONFIG_MPC83XX_TSEC4_NAME);
#    endif
#endif
#if defined(CONFIG_MPC86XX_TSEC1)
       tsec_initialize(bis, 0, CONFIG_MPC86XX_TSEC1_NAME);
#endif

#if defined(CONFIG_MPC86XX_TSEC2)
       tsec_initialize(bis, 1, CONFIG_MPC86XX_TSEC2_NAME);
#endif

#if defined(CONFIG_MPC86XX_TSEC3)
       tsec_initialize(bis, 2, CONFIG_MPC86XX_TSEC3_NAME);
#endif

#if defined(CONFIG_MPC86XX_TSEC4)
       tsec_initialize(bis, 3, CONFIG_MPC86XX_TSEC4_NAME);
#endif

#if defined(FEC_ENET) || defined(CONFIG_ETHER_ON_FCC)
        fec_initialize(bis);
#endif
#if defined(CONFIG_AU1X00)
        au1x00_enet_initialize(bis);
#endif
#if defined(CONFIG_IXP4XX_NPE)
        npe_initialize(bis);
#endif
#ifdef CONFIG_E1000
        e1000_initialize(bis);
#endif
#ifdef CONFIG_EEPRO100
        eepro100_initialize(bis);
#endif
#ifdef CONFIG_TULIP
        dc21x4x_initialize(bis);
#endif
#ifdef CONFIG_3COM
        eth_3com_initialize(bis);
#endif
#ifdef CONFIG_PCNET
        pcnet_initialize(bis);
#endif
#ifdef CFG_GT_6426x
        gt6426x_eth_initialize(bis);
#endif
#ifdef CONFIG_NATSEMI
        natsemi_initialize(bis);
#endif
#ifdef CONFIG_NS8382X
        ns8382x_initialize(bis);
#endif
#if defined(CONFIG_RTL8139)
        rtl8139_initialize(bis);
#endif
#if defined(CONFIG_RTL8169)
        rtl8169_initialize(bis);
#endif

        if (!eth_devices) {
                puts ("No ethernet found.\n" );
        } else {
                struct eth_device *dev = eth_devices;
                char *ethprime = getenv ("ethprime" );

                do {
                        if (eth_number)
                                puts (", " );

                        printf("%s", dev->name);

                        if (ethprime && strcmp (dev->name, ethprime) == 0) {
                                eth_current = dev;
                                puts (" [PRIME]" );
                        }

                        sprintf(enetvar, eth_number ? "eth%daddr" : "ethaddr", eth_number);
                        tmp = getenv (enetvar);

                        for (i=0; i<6; i++) {
                                env_enetaddr = tmp ? simple_strtoul(tmp, &end, 16) : 0;
                                if (tmp)
                                        tmp = (*end) ? end+1 : end;
                        }

                        if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) {
                                if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) &&
                                    memcmp(dev->enetaddr, env_enetaddr, 6))
                                {
                                        printf ("\nWarning: %s MAC addresses don't match:\n",
                                                dev->name);
                                        printf ("Address in SROM is         "
                                               "%02X:%02X:%02X:%02X:%02X:%02X\n",
                                               dev->enetaddr[0], dev->enetaddr[1],
                                               dev->enetaddr[2], dev->enetaddr[3],
                                               dev->enetaddr[4], dev->enetaddr[5]);
                                        printf ("Address in environment is  "
                                               "%02X:%02X:%02X:%02X:%02X:%02X\n",
                                               env_enetaddr[0], env_enetaddr[1],
                                               env_enetaddr[2], env_enetaddr[3],
                                               env_enetaddr[4], env_enetaddr[5]);
                                }

                                memcpy(dev->enetaddr, env_enetaddr, 6);
                        }

                        eth_number++;
                        dev = dev->next;
                } while(dev != eth_devices);

#ifdef CONFIG_NET_MULTI
                /* update current ethernet name */
                if (eth_current) {
                        char *act = getenv("ethact" );
                        if (act == NULL || strcmp(act, eth_current->name) != 0)
                                setenv("ethact", eth_current->name);
                } else
                        setenv("ethact", NULL);
#endif

                putc ('\n');
        }

        return eth_number;
}

论坛徽章:
0
2 [报告]
发表于 2010-06-10 12:12 |只看该作者
lz看清楚编译条件,有的函数是不被编译的。

论坛徽章:
0
3 [报告]
发表于 2010-06-10 12:34 |只看该作者
eth.c中和dm9000x.c中都定义eth_init(),eth_halt()等函数,

请注意

  1. #if defined(CONFIG_RTL8139)
  2.          #endif
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-06-10 14:40 |只看该作者
本帖最后由 yians 于 2010-06-10 14:51 编辑

回复 3# aaaaa5aa


    你好,这儿的网卡是dm9000,不是rtl8139网卡,你说的宏是不被定义的。

论坛徽章:
0
5 [报告]
发表于 2010-06-10 14:47 |只看该作者
回复 2# klanet


     这里不光是被编译的问题。您能解释一下dm9000要正常工作,是如何得到struct eth_device变量,接着eth_register(strcuct eth_device *)的吗?
   移植dm9000部分时,并没有添加这种相关代码,一般都是添加一些宏。或者说cs8900也没有。

论坛徽章:
0
6 [报告]
发表于 2010-06-10 17:05 |只看该作者
你要自己初始化eth_device。
参考一下其他网卡的代码。应该有共性。

论坛徽章:
0
7 [报告]
发表于 2010-06-10 20:41 |只看该作者
回复 6# klanet

我认为也是这样,我就不知道‘网上一般的方法’光修改添加个宏怎么就能用了。
我准备用新版的u-boot了,希望以后能有机会把这个问题弄明白。

论坛徽章:
0
8 [报告]
发表于 2010-06-10 22:20 |只看该作者
我的意思是你自己那定义了
  1. #ifdef CONFIG_NS8382X
  2.         ns8382x_initialize(bis);
  3. #endif
  4. #if defined(CONFIG_RTL8139)
  5.         rtl8139_initialize(bis);
  6. #endif
  7. #if defined(CONFIG_RTL8169)
  8.         rtl8169_initialize(bis);
  9. #endif
复制代码
是你自己的代码,我的意思是一旦定义了就不会再重复定义

所以不会导致冲突

论坛徽章:
2
2015年亚洲杯之阿曼
日期:2015-03-23 18:11:212015亚冠之大阪钢巴
日期:2015-09-07 13:54:16
9 [报告]
发表于 2010-06-11 21:49 |只看该作者
net_eth.c里面实际上是有2个eth_initialize()的。分别为定义了CONFIG_NET_MULTI和没有定义。
如果定义了CONFIG_NET_MULTI那么最后链接的时候必然会出现eth_init()重复定义。
如果没有定义CONFIG_NET_MULTI的话。net_eth.c其实主要是初始化各个网卡的mac。并没有调用eth_init,并且其实现了一个通用的eth_init。
具体网卡的收发是在cmd_net.c里面实现的。包括间接调用eth_init等等。

所以其实板子的初始化并没有初始化dm9000,打印No ethernet found。
你所贴的eth_initialize()是定义了CONFIG_NET_MULTI。

论坛徽章:
0
10 [报告]
发表于 2011-01-06 17:33 |只看该作者
你好, 我是爱欣文科技的 ,有关于DM9000AEP的问题我们可以提供技术支持。
                        现在用到的加我QQ1667698625        以后我们可以多多交流!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP