U-Boot移植DM9000网卡

发布者:幸福微风最新更新时间:2016-04-25 来源: eefocus关键字:U-Boot  移植  DM9000网卡 手机看文章 扫描二维码
随时随地手机看文章
根据书《嵌入式Linux应用开发完全手册》移植网卡驱动,对于Jz2440开发板好像并不适用,Jz2440开发板使用的是DM9000网卡,已经不是书上讲的CS8900网卡了。DM9000网卡与CS8900网卡接口方式不一样,经过几天的折腾,终于移植成功,现将笔记整理如下。

一、移植环境
 

1.u-boot版本1.1.6

2.开发板Jz2440(ARM9 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.设置存储控制器,也就是设置S3C2440的BANK以使用DM9000;

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

3.设置IP、serverIP等。


三、设置存储控制器
 

根据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)。

 

#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位,使用WAIT和nBE信号。

#define B4_Tacs 0x0

#define B4_Tcos 0x3

#define B4_Tacc 0x7

#define B4_Tcoh 0x1

#define B4_Tah 0x3

#define B4_Tacp 0x6

#define B4_PMC 0x0

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


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

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

 

#if 0

#define CONFIG_DRIVER_CS8900 1

#define CS8900_BASE 0x19000300

#define CS8900_BUS16 1

#endif

#define CONFIG_DRIVER_DM9000 1

#define CONFIG_DM9000_USE_16BIT 1

#define CONFIG_DM9000_BASE 0x20000000

#define DM9000_DATA 0x20000004

#define DM9000_IO 0x20000000

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

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


五、设置IP、serverIP
 

在配置文件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| \
\
\
\
\

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

看到开发板的IP、serverIP已经修改成功。我们使用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-boot,u-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.c到u-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)

 

static inline int is_zero_ether_addr(const u8 *addr)

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

}

 

 


 

 

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 IP为192.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网卡移植成功!

关键字:U-Boot  移植  DM9000网卡 引用地址:U-Boot移植DM9000网卡

上一篇:6410平台上配置Linux的DDR参数
下一篇:ARM汇编书写格式及符号(symbol)和表达式(expr)

推荐阅读最新更新时间:2024-03-16 14:51

JZ2440移植uboot
开发板:JZ2440V3 U-Boot版本:u-boot-2012.04.01 1.首先下载源码,上传到服务器,解压缩。 tar -jxvf u-boot-2012.04.01.tar.bz2 2.新建一个项目,这个版本的uboot自带的有smdk2410项目的,通过阅读源码根目录下的README文件发现,新建一个项目主需要以下几步: (1)在根目录下的boards.cfg文件中,仿照smdk2410项目,添加下面这段话: jz2440 arm arm920t jz2440 samsung s3c24x0 (2)在board/samsung/目录先新建文件夹jz2440; cp -fr smdk2410 j
[单片机]
关于FreeRTOS移植到STM32F103上的步骤以及注意事项
因为最近比较有时间,而且发现自己对于STM上可以跑的操作系统相对陌生。所以选择几个操作系统进行移植和玩几个DEMO理解一下。虽然理解的不是很深入,但是如果项目需要的话,只是移植,进行多任务的操作。应付一下还是绰绰有余的。之前移植了uCosII.后续有需要会总结一下。这里先对FreeRTOS相关的问题进行总结。因为个人能力有限。有什么不对的地方请大家批评,写这个主要是为了记录一下自己的移植过程。 1、第一步肯定是先到官网去下载关于FreeRTOS的源码 下面的网址是官方最新源码的下载地址: https://sourceforge.net/projects/freertos/files/latest/download?source=
[单片机]
关于FreeRTOS<font color='red'>移植</font>到STM32F103上的步骤以及注意事项
带全速USB接口的PIC18F4550应用设计
引 言 随着USB(Universal Serial Bus)技术的发展,特别是高速(480 Mbps)USB2.0协议的出现,几乎所有的PC外设都可以移植到USB上,所以USB的PC外设的发展空间是巨大的,甚至在不久的将来,USB将完全取代异步串口和打印机并口,PC机厂商将不会再生产机箱上带异步串口和打印机并口的PC机了,机箱上也不会再有那么多的连线了。 USB是一种快速的、双向同步传输的、廉价并可以进行热插拔的串行接口。利用USB总线技术,开发适用于科学研究和工业牛产的各种仪器仪表设备,借以取代传统计算机测控系统中采用串行RS232或并行接口的仪器仪表设备,使计算机测控系统更加高效实时,方便灵活。 利用USB总线的数据采
[应用]
S3C6410 移植Android 内核
主要过程: . 安装lunux 环境 . 安装编译工具 . 下载Linux kernel . 安装 Android SDK . 获得root file system . 修改Linux kernel 源码 . 配置Linux kernel . 修改root file system . 编译Linux kernel . 下载kernel Image 1.安装linux 环境 安装Ubuntu Linux 系统,从网站上下载操作系统安装光盘映像,地址: http://mirror.lupaworld.com/ubuntu/releases/8.04/ 下载ubuntu-8.04.2-desktop-i386.iso,刻录成光盘安装,
[单片机]
S3C6410 <font color='red'>移植</font>Android 内核
将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题(2)
开始移植fatfs遇到了诸多问题,很是苦恼啊,移植成功思来之不易,特分享一下经验。硬件是STM32F103RBT6内存只有20kB,Flash只有128KB,考虑到内存有限,就不能支持长文件名了,在原子论坛上下载的所以要改动,在此感谢原子论坛给我带来的帮助还有安富莱论坛 http://bbs.armfly.com/read.php?tid=3601 给我带来的启示。另外硬件还有一个大的相机的SD卡,网上买的模块当然也可以自己焊接一个,采用SPI接口,SPI1和SPI2都行,看图 移植前做了大量准备,在网上尤其是原子论坛翻看各种其他人移植的心得,去fatfs的官方网站下载0.10版本的程序,看各种相关的移植心得,文档版本众多,眼
[单片机]
将FATFS<font color='red'>移植</font>STM32RBT6遇到的挂载不成功和返回值问题(2)
ARM9 2410移植之ARM中断原理, 中断嵌套的误区,中断号的怎么来的
几天前一个学生问我ARM中断嵌套的问题,我才发现原在我心中理所当然的事对学生来说理解实属不易。 ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin. 在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。 先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1的时候,IRQ和FIQ全部处 于禁止状态。无论你在irq pin和fiq pin上面发什么样的中断信号,ARM是不会理你的,你根本不能打断他,因为他耳聋了,眼也瞎了
[单片机]
UCOS在S3C2410上的移植
反反复复弄了一个多星期,参考了不少资料,终于让UCOS在自己的板子上跑起来了。期间遇到了不少问题,还好坚持下来,挺 了过去.....复习一下,记录下来,以当后用: 1.在ADS中建产工程,进入工程界面后,先建立两个组,一个为命名为UCOSII,另一个为S3C2410。 UCOSII,下再建两个组,一个为ARM,添加移植要修改的三个文件,另一个sourc则添加与处理器无关的 UCOS源文件。 S3C2410下主要存放一些与开发板初始化等有关的文件。 2.移植的重点主要在三个有处理器有关的文件OS_CPU.H,Os_cpu_a.s 和Os_cpu_c.c三个文件的编写。 (1)根据书上的移植说明及相关的参考文件,OS
[单片机]
UCOS在S3C2410上的<font color='red'>移植</font>
在ARM处理器上移植uCOS II的中断处理
uCOS II是一个源码公开、可移植、可固化、可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写。总量约200行的汇编语言部分被压缩到最低限度,以便于移植到任何一种其它的CPU上。 uCOS II最多可支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore (信号量)、Mailbox (邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,uCOS II公开所有的源代码.并可以免费获得,只对商业应用收取少量License费用。 uCOS II移植跟OS_CUP_C.C、OS_CPU_A.
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved