您的位置 首页 IOT

U-Boot移植DM9000网卡

根据书《嵌入式Linux应用开发完全手册》移植网卡驱动,对于Jz2440开发板好像并不适用,Jz2440开发板使用的是DM9000网卡,已经不是书上讲的C…

依据书《嵌入式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网卡移植成功!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/264772.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部