网络功能是UBOOT重要的功能之一,实现了网络功能之后UBOOT可以很方便的下载内核到板子上。毕竟通过JTAG来烧录实在是一种煎熬。
在UBOOT中,集成了一些设备的驱动代码。这些代码一般都分类存放于drivers/目录下面,而网络设备驱动存于drivers/net目录下面。可以看到UBOOT有dm9000x.c和dm9000x.h两个文件存在。说明UBOOT已经集成了DM9000的驱动程序,现在就来将这个驱动集成到UBOOT中。
其实多移植几次就会发现,UBOOT的移植修改还是遵循着一定的规律。即是先在配置头文件中打开相关宏定义支持,再到板级初始化(一般是第二阶段初始化过程)代码中添加需要支持功能的初始化函数。对于学习板子来说,很多芯片在UBOOT中都找得到驱动。所以省去了很多事,如同本次的网络功能调试支持一样。
UBOOT的网络结构分析
支持调试还算是简单,但是掌握相关流程更加重要。在以后碰到其他板子或者新芯片的时候也可以模仿成熟的构架添加相关的支持。
配置头文件修改说明
启动网络功能的时候首先需要定义宏CONFIG_NET_MULTI,这个宏就如同一个总开关一样。其他的宏往往都和具体芯片有关,要如何定义也应该是各个驱动作者来定义。所以上面DM9000的相关宏定义都是参考其他使用该芯片的板子和对驱动文件本身的理解而成型的。毕竟是开源工程,相关文档确实不是很完善。
DM9000的驱动中,宏CONFIG_DRIVER_DM9000是启动该驱动代码的总开关(打开dm9000.h第一句就有#ifdef CONFIG_DRIVER_DM9000,这就是原因。)。然后我们需要自己去指定芯片所在的基地址,OK6410的基地址是0x18800300,这个也就是DM9000的IO口的基地址,数据接口的基地址是IO口的基地址加4得到。前者用于一些设置之类的,后者就是数据传输。当然还会有中断之类的概念,不过UBOOT这里没有用到就不需要了。最后关于CONFIG_DM9000_NO_SROM这个宏是用于DM9000芯片没有用EEPROM的时候所需要的一个宏。一般一个网卡都会有MAC地址之类的信息,而这些信息都是存储到网络芯片的EEPROM中,但是OK6410上没有这样设计,所以这些信息就只有编译到UBOOT让UBOOT在运行的时候指定。这个宏打开过后,一些从EEPROM芯片获取MAC信息的操作就不会被编译到UBOOT中了。
最后需要注意一个宏CONFIG_CMD_NET这个宏默认在config_cmd_default.h文件中已经得到了定义。不要再配置头文件中重复了。
下面是配置过程:
1.修改/include/configs/smdk6410.h
屏蔽掉CS8900宏定义这部分,
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x18800300
#define CONFIG_CS8900_BUS16 /* follow the Linux driver */
#endif
加上DM9000的宏定义:
#define CONFIG_DM9000 //定义DM9000 回头初始化驱动,就判断这个宏
#define CONFIG_DM9000_NO_SROM 1 // 此处说明,该网卡没有eeprom存储..其实dm9000是有的,只是没用,所以只好说没有了
#define CONFIG_DRIVER_DM9000 1 //开启DM9000驱动的代码
#define CONFIG_DM9000_BASE 0x18800300 //这个宏是定义网卡连接到你的arm上面的地址.属于sram1地址区域
#define DM9000_IO CONFIG_DM9000_BASE //根据网卡手册,指定I/O DATA操作地址
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT //指明使用16位数据模式,该宏其实是为了方便知道网卡信息
配置网卡信息
#define CONFIG_ETHADDR 00:40:5c:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.10
#define CONFIG_SERVERIP 192.168.1.3
#define CONFIG_GATEWAYIP 192.168.1.1
2.修改board/samsung/smdk6410/smdk6410.c
board_eth_init()函数中改为
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DM9000
rc = dm9000_initialize(bis);
#endif
3.打印板子信息
sfluboot>>pri
baudrate=115200
bootargs=console=ttySAC,115200
bootcmd=nandread 0x50008000 0x100000 0x500000;bootm 50008000
bootdelay=5
ethact=dm9000
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.1.1
ipaddr=192.168.1.10
netmask=255.255.255.0
serverip=192.168.1.3
stderr=serial
stdin=serial
stdout=serial
可见DM9000网络配置信息正常,ping ubuntu 宿主机
sfluboot>>ping192.168.1.3
dm9000 i/o:0x18800300, id: 0x90000a46
DM9000: runningin 16 bit mode
MAC:00:40:5c:26:0a:5b
operating at100M full duplex mode
Using dm9000device
host 192.168.1.3is alive
可见网络通信正常,如果通信失败有以下解决办法:1、查看网线是否连接正常;2、虚拟机网络连接设为桥接模式,如果是NAT模式则网络不通。3、网络防火墙的问题,看看Linux有没有开启防火墙,如果有请关闭防火墙。接下来可以进行TFTP设置,并可以通过TFTFP直接下载程序到Nandflash中。4. 安装设置TFTP,创建/tftpboot,并且赋予/tftpboot最大的权限。
TFTP简介:TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。详细说明:http://baike.baidu.com/link?url=PPSNMBn1rqUjlQK_0qZVPOihMDogluMBxK2Qg8Poc-ahNyg9z9BsqjyW3dx4TRyKQTptXNHyI8t5Dk-9mbjR0q
sudo apt-get install tftp-hpa tftpd-hpa
mkdir /tftpboot
chmod 777 tftpboot
修改tftp设置
sudo vim /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
#TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
#TFTP_OPTIONS="--secure"
TFTP_OPTIONS="-l-c-s"
完成之后重启tftp服务即可
sudo service tftpd-hpa restart
5、通过tftp下载程序到Nandflash
5.1、首先将编译产生的u-boot-nand.bin文件拷贝到/tftpboot 文件夹下
sfl@ubuntu:/tftpboot$ ls
u-boot-nand.bin
5.2、将虚拟机运行到tftp状态
sfl@ubuntu:/tftpboot$ tftp
(to)
5.3、现在就可以将u-boot-nand.bin下载到Nandflash中了
在串口超级终端中执行
sfluboot>>tftp 50008000 u-boot-nand.bin
将程序下载到50008000位置
sfluboot>>tftp 50008000 u-boot-nand.bin
dm9000 i/o: 0x18800300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:40:5c:26:0a:5b
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.3; our IP address is 192.168.1.10
Filename 'u-boot-nand.bin'.
Load address: 0x50008000
Loading: ###################
800.8 KiB/s
done
Bytes transferred = 276392 (437a8 hex)
速度很快比JTAG爽多了。