U-Boot移植DM9000网卡(附:程序、源代码、测试程序)

本文详细介绍了在Jz2440开发板上移植U-Boot支持DM9000网卡的过程,包括设置存储控制器、配置使用DM9000网卡、设置IP等步骤,并解决了ping不通的问题。
 

U-Boot移植DM9000网卡

——西伯利亚的风

    根据书《嵌入式Linux应用开发完全手册》移植网卡驱动,对于Jz2440开发板好像并不适用,Jz2440开发板使用的是DM9000网卡,已经不是书上讲的CS8900网卡了。DM9000网卡与CS8900网卡接口方式不一样,经过几天的折腾,终于移植成功,现将笔记整理如下。


一、移植环境

1.u-boot版本1.1.6

2.开发板Jz2440ARM9       S3C2440

                          NAND       K9F2G08

                          SDRAM     K4S561632 * 2

             网卡      DM9000

3.Linux: ubuntu 9.10


二、移植思路

       查看u-boot-1.1.6源码发现,u-boot中已经包含dm9000的驱动文件dm9000x.c,所以我们只需要设置u-boot支持网卡就行。总体思路主要完成以下几件事情:

       1.设置存储控制器,也就是设置S3C2440BANK以使用DM9000

       2.配置u-boot使用DM9000网卡;

       3.设置IPserverIP等。


三、设置存储控制器

       根据Jz2440开发板的原理图可知,DM9000网卡  使用的是BANK4,如图3.1所示。


原理图1.jpg(57.34 K)
2012-3-20 21:26:58

3.1 DM9000原理图

       由图可知,DM9000网卡使用的片选信号是nGCS 4,也就说明DM9000使用了BANK4。修改lowlevel_init.S(路径:board/smdk2410/lowlevel_init.S)。

/* 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)

#if 0

#define B3_BWSCON    (DW16 + WAIT + UBLB)

#endif

#define B3_BWSCON    (DW16 + UBLB)

#define B4_BWSCON    (DW16 + WAIT + UBLB)

#define B5_BWSCON    (DW16)

#define B6_BWSCON    (DW32)

#define B7_BWSCON    (DW32)

    修改前BANK3外接的CS8900网卡,将BANK3注释掉,修改数据宽度为16位,设置BANK4数据宽度16位,使用WAITnBE信号。

#define B4_Tacs    0x0    /*0clk */

#define B4_Tcos    0x3    /*4clk */

#define B4_Tacc    0x7    /* 14clk */

#define B4_Tcoh    0x1    /*1clk */

#define B4_Tah      0x3    /*4clk */

#define B4_Tacp    0x6    /*6clk */

#define B4_PMC    0x0    /* normal */

    根据DM9000数据手册设置时序,具体见DM9000数据手册。


四、配置u-boot使用DM9000网卡

       修改配置文件smdk2410.h(路径:include/configs/smdk2410.h)。

/** 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_DRIVER_DM9000      1 /* we have a DM9000 on-board */

#define CONFIG_DM9000_USE_16BIT 1

#define CONFIG_DM9000_BASE          0x20000000

#define DM9000_DATA                        0x20000004

#define DM9000_IO                             0x20000000

    注释掉CS8900的信息,添加DM9000的配置信息。

    宏定义CONFIG_DRIVER_DM90001表示配置使用DM9000网卡,u-boot编译时会将DM9000相关的驱动编译进去。其中0x20000000DM9000的基址(BANK4),由于DM9000只有一条地址线CMDLADDR2,见图3.1)用于区别是数据还是地址(CMD为低时数据总线上传输的是地址信号,CMD为高时传输的是数据信号),所以DM9000_DATA0x20000004DM9000_IO0x20000000


五、设置IPserverIP

       在配置文件smdk2410.h(路径:include/configs/smdk2410.h)中根据实际情况修改开发板的IP地址,serverIP

    修改前:

#define CONFIG_NETMASK    255.255.255.0

#define CONFIG_IPADDR       10.0.0.110

#define CONFIG_SERVERIP    10.0.0.1

    修改后:

#define CONFIG_NETMASK    255.255.255.0

#define CONFIG_IPADDR       192.168.1.6

#define CONFIG_SERVERIP    192.168.1.2

    我的PC和开发板使用路由器相连,PC IP地址为192.168.1.2,开发板设置为192.168.1.6,保证在同一个网段就行。

增加ping命令:

#define CONFIG_COMMANDS \
               (CONFIG_CMD_DFL| \

                  CFG_CMD_CACHE| \

                /*CFG_CMD_NAND|*/ \

           /*CFG_CMD_EEPROM |*/ \

                     /*CFG_CMD_I2C|*/ \

                    /*CFG_CMD_USB|*/ \

                 FG_CMD_REGINFO| \

                     CFG_CMD_PING| \
                     CFG_CMD_DATE| \

                        CFG_CMD_ELF)


    仿照CMD命令格式,我们使用CFG_CMD_PING增加对ping的支持。


六、遇到问题vs解决方案

       以上任务完成,在u-boot根目录下编译,编译成功!

使用OpenJtag将编译完成的u-boot.bin烧入开发板运行。u-boot启动后,使用print命令查看u-boot的参数:

Jz2440 # print

bootdelay=3

baudrate=115200

ethaddr=08:00:3e:26:0a:5b

ipaddr=192.168.1.6

serverip=192.168.1.2

netmask=255.255.255.0

stdin=serial

stdout=serial

stderr=serial

    看到开发板的IPserverIP已经修改成功。我们使用ping命令ping一下PC 192.168.1.2

Jz2440 # ping 192.168.1.2

dm9000 i/o: 0x20000000, id: 0x90000a46

MAC: 50:50:50:50:50:50

could not establish link

ping failed; host 192.168.1.2 is not alive


        host is not alive
ping不通,看来存在问题!

    上网搜索了很久,网上的都是教你屏蔽这一段代码,屏蔽那一段代码,然后就可以了,都没有详细的分析,看不大明白。后来,通过研究高版本的u-boot,发现了问题所在。

    打开高版本u-bootu-boot-1.3.4中的dm9000x.c,可以看到如下更新说明:

06/03/2008    Remy Bohmer <[url=mailtonux@bohmer.net]linux@bohmer.net[/url]>

-Fixed the driver to work with DM9000A.


    发现DM9000驱动在后续版本中更新了,老版本的(u-boot-1.1.6)对DM9000支持可能存在问题。

    发现了问题,马上更新试试看,复制u-boot-1.3.4中的dm9000x.cu-boot-1.1.6中,覆盖掉原来的dm9000x.c,然后编译。

出现了错误!

drivers/dm9000x.c:480: undefined reference to `is_zero_ether_addr'

/drivers/dm9000x.c:480: undefined reference to `is_multicast_ether_addr'

make: *** [u-boot] Error 1

    很明显,缺少两个函数定义。网上搜索也没有找到,干脆对u-boot-1.3.4建立SourceInsight工程搜索这两个函数。发现这两个函数都存在于net.h中(路径:include/net.h)。

    复制这两个函数,到自己的u-boot(目前为u-boot-1.1.6)的net.h中(路径:include/net.h

/*

*
* is_zero_ether_addr - Determine if give Ethernet address is all zeros.

* @addr: Pointer to a six-byte array containing the Ethernet address

*

* Return true if the address is all zeroes.

*/

static inline int is_zero_ether_addr(const u8 *addr)

{
    return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);

}


/*

*
* is_multicast_ether_addr - Determine if the Ethernet address is a multicast.

* @addr: Pointer to a six-byte array containing the Ethernet address

*

* Return true if the address is a multicast address.

* By definition the broadcast address is also a multicast address.

*/

static inline int is_multicast_ether_addr(const u8 *addr)

{
    return (0x01 & addr[0]);

}


    然后编译,通过!

    烧写到开发板,ping主机192.168.1.2

Jz2440 # ping 192.168.1.2

ERROR: resetting DM9000 -> not responding

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:00:3e:26:0a:5b

could not establish link

host 192.168.1.2 is alive

    “host 192.168.1.2 is alive”, ping通了,DM9000移植OK


七、网络测试

1.测试tftp

     通过tftp传输一个程序到内存中运行试试看。在主机上打开tftp软件,将leds.bin(运行地址在0x30000000)放在tftp软件目录中,在u-boot界面,输入命令:

Jz2440 # tftp 0x30000000 leds.bin

ERROR: resetting DM9000 -> not responding

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:00:3e:26:0a:5b

could not establish link

TFTP from server 192.168.1.2; our IP address is 192.168.1.6

Filename 'leds.bin'.

Load address: 0x30000000

Loading: #

done

Bytes transferred = 168 (a8 hex)

    传输成功,在u-boot界面使用go命令运行程序

Jz2440 # go 0x30000000

## Starting application at 0x30000000 ...

    可以看到Jz2440开发板上led已经在循环闪烁了。


2.测试nfs

    由于虚拟机Linux上开启了nfs服务,虚拟机Linux IP192.168.1.3,需要先更改serverIP

Jz2440 # setenv serverip 192.168.1.3

Jz2440 # saveenv

    然后将leds.bin放在nfs目录,/work/nfs_root/,在u-boot界面使用nfs传输文件

Jz2440 # nfs 0x30000000 192.168.1.3:/work/nfs_root/leds.bin

ERROR: resetting DM9000 -> not responding

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:00:3e:26:0a:5b

could not establish link

File transfer via NFS from server 192.168.1.3; our IP address is 192.168.1.6

Filename '/work/nfs_root/leds.bin'.

Load address: 0x30000000

Loading: #

done

Bytes transferred = 168 (a8 hex)

    传输成功,在u-boot界面使用go命令运行程序

Jz2440 # go 0x30000000

## Starting application at 0x30000000 ...

    可以看到Jz2440开发板上led已经在循环闪烁了。

    至此,DM9000网卡移植成功!


参考资料:

《嵌入式Linux应用开发完全手册》 15 15.2.5 移植 U-BootP274

《嵌入式Linux应用开发完全手册》 22 22.2   网卡驱动程序移植(P441

附件:
    移植好DM9000,编译好的u-boot.bin文件(目前支持串口、DM9000网卡)
u-boot_DM9000.rar ( 47.92 K, 下载次数:0)
  

    修改后的DM9000驱动文件

dm9000x_1.3.4.c(请文件名改为dm9000x.c存放于u-boot-1.1.6/driver/

net.h                 (请存放于 u-boot-1.1.6/include/
dm9000x_1.3.4.rar ( 6.07 K, 下载次数:0)

net.rar ( 4.72 K, 下载次数:0)

    测试程序
leds_0x30000000.rar ( 7.11 K, 下载次数:0)



声明:本文为个人原创,边移植边写,完全来自实践。本文首先发表在百问网(www.100ask.net)转载请指明出处。

原文地址:http://www.100ask.net/forum/showtopic-3655.aspx

 

免费视频下载地址:

1期共33个视频,免费,下载后可以直接观看,下载地址:
http://115.com/folder/fa55184z#
http://dl.dbank.com/c03o1ebwlo
第一期视频从Linux安装开始,讲解了SDRAMNAND FLASHLCD等硬件操作,U-Boot的移植、内核移植、简单字符驱动的编写,非常详尽。

第二期视频主要是驱动深入讲解,精华啊!

第二期视频需要收费的哦,具体见韦东山老师淘宝店铺:

http://100ask.taobao.com/

 

书籍资料下载:

《嵌入式Linux应用开发完全手册》及相关资源电炉可以下载:

http://www.verycd.com/topics/2828590/

       嵌入式linux应用开发完全手册光盘里的驱动和例子源代码.rar 详情

嵌入式linux应用开发完全手册.pdf 详情

 

如果能买一块韦东山老师的开发板,加上视频讲解,加上书,那学起来就太Easy了!

淘宝店铺上http://100ask.taobao.com/ 全套都有了!!!

 

dm9000最详细的中文数据手册 最全的中文 DM9000A数据手册 目 录 1. 概述 5 2. 模块图 5 3. 特性 5 4. 引脚配置 6 4.1(16位模式) 6 4.2(8位模式) 7 5. 引脚描述 7 5.1处理器接口 7 5.1.1 8位模式引脚 8 5.2 EEPROM接口 8 5.3时钟引脚 9 5.4 LED接口 9 5.5 10/100 PHY/Fiber 9 5.6其他 10 5.7电源引脚 10 5.8捆绑引脚列表(Strap pins table) 10 6. 控制和状态寄存器列表 10 6.1网络控制寄存器(NCR) 12 6.2网络状态寄存器(NSR) 13 6.3发送控制寄存器(TCR) 13 6.4数据包1发送状态寄存器1(TSR I) 13 6.5数据包2发送状态寄存器2(TSR II) 14 6.6接收控制寄存器(RCR) 14 6.7接收状态寄存器(RSR) 15 6.8接收溢出计数寄存器(ROCR) 15 6.9背压阈值寄存器(BPTR) 15 6.10流控制阈值寄存器(FCTR) 16 6.11接收/发送流控制寄存器(RTFCR) 16 6.12 EEPROM与PHY控制寄存器(EPCR) 17 6.13 EEPROM与PHY地址寄存器(EPAR) 17 6.14 EEPROM与PHY数据寄存器(EPDRL/EPDRH) 18 6.15唤醒控制寄存器(WCR) 18 6.16物理地址(MAC)寄存器(PAR) 18 6.17多播地址寄存器(MAR) 19 6.18通用目的控制寄存器(GPCR) 19 6.19通用目的寄存器(GPR) 19 6.20 TX SRAM读指针地址寄存器(TRPAL/TRPAH) 20 6.21 RX SRAM写指针地址寄存器(RWPAL/RWPAH) 20 6.22厂家ID寄存器(VID) 20 6.23产品ID寄存器(PID) 20 6.24芯片版本寄存器(CHIPR) 20 6.25发送控制寄存器2(TCR2) 20 6.26操作测试控制寄存器(OCR) 21 6.27特殊模式控制寄存器(SMCR) 21 6.28即将发送控制/状态寄存器(ETXCSR) 22 6.29校验和控制寄存器(TCSCR) 22 6.30接收校验和控制状态寄存器(RCSCSR) 22 6.31内存数据预取读命令寄存器(地址不加1)(MRCMDX) 23 6.32内存数据读命令寄存器(地址不加1)(MRCMDX1) 23 6.33内存数据读命令寄存器(地址加1)(MRCMD) 23 6.34内存数据读地址寄存器(MRRL/ MRRH) 23 6.35内存数据写命令寄存器(地址不加1)(MWCMDX) 23 6.36内存数据写命令寄存器(地址加1)(MWCMD) 24 6.37内存数据写地址寄存器(MWRL/ MWRH) 24 6.38发送数据包长度寄存器(TXPLL/TXPLH) 24 6.39中断状态寄存器 (ISR) 24 6.40中断屏蔽寄存器(IMR) 24 7.EEPROM格式 25 8.PHY寄存器描述 26 8.1基本模式控制寄存器(BMCR) 27 8.2基本模式状态寄存器(BMSR) 28 8.3 PHY ID标识符寄存器#1(PHYID1) 29 8.4 PHY ID标识符寄存器#2(PHYID1) 29 8.5自动协商通知寄存器(ANAR) 30 8.6自动协商连接对象寄存器(ANLPAR) 31 8.7自动协商扩展寄存器(ANER) 32 8.8 DAVICOM指定配置寄存器(DSCR) 33 8.9 DAVICOM指定配置和状态寄存器(DSCSR) 34 8.10 10BASE-T配置/状态(10BTCSR) 36 8.11掉电控制寄存器(PWDOR) 36 8.12指定配置寄存器(SCR) 37 9. 功能描述 38 9.1 主机接口(HI) 38 9.2 直接内存访问控制(DMAC) 38 9.3 数据包发送(PT) 38 9.4 数据包接收(PR) 39 9.5 100Base-TX操作 39 9.5.1 4B5B编码器 39 9.5.2扰频器(Scrambler) 39 9.5.3 并--串转换 39 9.5.4 NRZ码到NRZI码转换 39 9.5.5 NRZI码到MLT-3码转换 39 9.5.6 MLT-3驱动 40 9.5.7 4B5B编码 40 9.6 100Base-TX接收器 40 9.6.1 信号检测 41 9.6.2 自适应补偿 41 9.6.3 MLT-3到NRZI解码 41 9.6.4 时钟复原模块 41 9.6.5 NRZI 到NRZ 41 9.6.6 串-并转换 41 9.6.7 扰频器 41 9.6.8 编码组对齐模块 42 9.6.9 4B5B解码 42 9.7 10Base-T操作 42 9.8 冲突检测 42 9.9 载波检测 42 9.10 自动协商 42 9.11 省电模式 42 9.11.1 掉电模式 43 9.11.2 降低发送损耗模式 43 10 DC与AC电器特性 43 10.1 最大绝对额定值 43 10.1.1 工作条件 43 10.2 DC电器特性(VDD=3.3V) 44 10.3 AC电器特性与时序 44 10.3.1 TP接口 44 10.3.2 晶振/振荡时钟 44 10.3.3 I/O读时序 45 10.3.4 I/O写时序 45 10.3.5 EEPROM接口时序 46 11应用说明 46 11.1网络接口信号接线 46 11.2 10Base-T/100Base-TX自动MDIX应用 47 11.3 10Base-T/100Base-TX无自动MDIX变压器应用 47 11.4电源退偶电容 47 11.5地平面布局 48 11.6电源平面分割 49 11.7铁氧体磁珠选择指导 50 11.8晶振选择指导 50 12封装信息 50 13订购信息 52
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值