U-boot-200908在FL2440上的移植(三)--移植DM9000

hah,经过两天的努力终于把DM9000 给Ping 通了,搞死了,下面介绍一下移植的过程

1.打开/driver/net/dm9000x.c,定位到大概377行在dm9000_init函数中修改如下:

     DM9000_iow(DM9000_IMR, IMR_PAR);
378 #if 1
379 
380         i = 0;
381         while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
382                 udelay(1000);
383                 i++;
384                 if (i == 1650) { //3000
385                         //printf("could not establish link\n");
386                         break;
387                         //return 0;
388                 }
389         }
390 #endif



2。对于NFS,增加了延时,否则会出现“*** ERROR: Cannot mount”的错误。打开


打开/net/nfs.c,定位到36行,修改如下:


#if defined(CONFIG_CMD_NET) && defined(CONFIG_CMD_NFS)
#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */
#define NFS_RETRY_COUNT 30
#define NFS_TIMEOUT (CONFIG_SYS_HZ/1000*2000UL) //2000UL

3.添加网卡芯片(DM9000)的初始化函数


int dram_init (void)
{
 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
 return 0;
}

#include <net.h>
#include <netdev.h> 
extern int dm9000_initialize(bd_t *bis);//implicit declaration of function 'dm9000_initialize'
#ifdef CONFIG_DRIVER_DM9000
int board_eth_init(bd_t *bis)
{
 return dm9000_initialize(bis);
}
#endif

4.修改配置文件,在mini2440.h中加入相关定义


打开/include/configs/mini2440.h,

(1)定位到60行附近,修改如下:

/*
 * Hardware drivers
 */
#if 0
#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
#define CS8900_BASE  0x19000300
#define CS8900_BUS16  1 /* the Linux driver does accesses as shorts */
#endif 
#define CONFIG_NET_MULTI  1
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x20000300 //网卡片选地址
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4) //网卡数据地址
#define CONFIG_DM9000_NO_SROM  1
//#define CONFIG_DM9000_USE_16BIT
#undef CONFIG_DM9000_DEBUG


注意:
u-boot-2009.08 可以自动检测DM9000网卡的位数,根据开发板原理图可知网卡的数据位为16位,并且网卡位
于CPU的BANK4上,所以只需在 board/samsung/mini2440/lowlevel_init.S中设置 #define B4_BWSCON (DW16) 即
可,不需要此处的 #define CONFIG_DM9000_USE_16BIT 1


(2)给u-boot加上ping命令,用来测试网络通不通
/*
 * Command line configuration.
 */
#include <config_cmd_default.h>
#define CONFIG_CMD_CACHE
#define CONFIG_CMD_DATE
#define CONFIG_CMD_ELF
#define CONFIG_CMD_NAND
#define CONFIG_CMD_JFFS2  /* JFFS2 Support*/
#define CONFIG_CMD_PING /*ping command support*/

(3)恢复被注释掉的网卡MAC地址和修改你合适的开发板IP地址以及内核启动参数:

#define CONFIG_BOOTDELAY        3
/*#define CONFIG_BOOTARGS       "root=ramfs devfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR          00:12:34:56:80:49   /*08:00:3e:26:0a:5b */
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR           192.168.80.254
//#define CONFIG_SERVERIP             
#define CONFIG_GATEWAYIP        192.168.80.1
//#define CONFIG_OVERWRITE_ETHADDR_ONCE
//#define CONFIG_DM9000_DEBUG
#undef CONFIG_DM9000_DEBUG



5.打开drivers/net/dm9000x.c ,定位到456行附近,屏蔽掉dm9000_halt函数中的内容:

/*
  Stop the interface.
  The interface is stopped when it is brought.
*/
static void dm9000_halt(struct eth_device *netdev)
{
#if 0 
 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 */
#endif 
}

6.打开/drivers/net/dm9000x.c,定位到595行附近,修改如下:

/*
   Read a word from phyxcer
*/
static u16
phy_read(int reg)
{
 u16 val;
 /* Fill the phyxcer register into REG_0C */
 DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
 DM9000_iow(DM9000_EPCR, 0xc); /* Issue phyxcer read command */

-----------------------------------------------
 udelay(1000); //udelay(100);   /* Wait read complete */
-------------------------------------------------------
 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;
}

这个延时其实很重要的啦,不然会有时出现"operating at unknown: 0 mode"

7.修改drivers/net/dm9000x.c


(1)修改函数:phy_read将 udelay(100); 替换为下面:

 int i;
    …… ……
    //udelay(100);            /* Wait read complete */        
    i=0;
        while(DM9000_ior(DM9000_EPCR) & 0x01)   /* Wait read complete */
        {
                udelay(100);
                i++;
                if (i == 1000) {
                        printf("DM9000 access error/n");
                        return 0;
                }
        }

(2)修改函数phy_write将 udelay(500); 替换为下面:

 int i;
    …… ……
    //udelay(500);
    i=0;
        while(DM9000_ior(DM9000_EPCR) & 0x01)   /* Wait read complete */
        {
                udelay(100);
                i++;
                if (i == 1000) {
                        printf("DM9000 access error/n");
                        return 0;
                }
        }

(3)注释掉下面函数的调试信息部分,有助于看清调试的信息

static u16
phy_read(int reg)

//DM9000_DBG("phy_read(0x%x): 0x%x/n", reg, val);

(4)修改函数 dm9000_init

将语句
if (i == 10000) {
    printf("could not establish link/n");
    return 0;
}
替换为
/*if (i == 10000) {
    printf("could not establish link/n");
    return 0;
}*/
if (i == 1650) {
    break;
}

8.修改文件/net/net.c  

(1)大概在104行

# define ARP_TIMEOUT        5000UL    /* Milliseconds before trying ARP again */
替换成
# define ARP_TIMEOUT        (CONFIG_SYS_HZ/1000*5000UL)

(2)575行

NetSetTimeout (10000UL, startAgainTimeout);
替换成
NetSetTimeout (10000UL*CONFIG_SYS_HZ/1000, startAgainTimeout);

(3)586行

NetSetTimeout (10000UL, startAgainTimeout);
替换成
NetSetTimeout (10000UL*CONFIG_SYS_HZ/1000, startAgainTimeout);

(4)757行

NetSetTimeout (10000UL, PingTimeout);
替换成
NetSetTimeout (10000UL*CONFIG_SYS_HZ/1000, PingTimeout);

(5)781行

#define CDP_TIMEOUT            250UL    /* one packet every 250ms */
替换成
#define CDP_TIMEOUT            (250UL*CONFIG_SYS_HZ/1000)

9.很多人建议对UPLL MPLL的设置变换顺序

在 board/samsung/fl2440/fl2440.c 的 board_init 函数


很奇怪,就是开机后,把开发板和主机用网线连起来后,电脑上提示网线未连接,但是我ping 192.168.80.44(我主机上的ip),这样


后,主机上的网络开始搜网了,然后ping的话就可以ping通了,很多网友将这是正常的,我就也没担心了。反正就是好了!!嘎嘎


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值