网络操作命令 uboot是支持网络的,我们在移植uboot的时候一般都要调通网络功能,因为在移植linux kernel的时候需要使用到uboot的网络功能做调试。uboot支持大量的网络相关命令,比如dhcp、ping、nfs和tftpboot,我们接下来依次学习一下这几个和网络有关的命令。 在使用uboot的网络功能之前先用网线将开发板的ENET2接口和电脑或者路由器连接起来,I.MX6U-ALPHA开发板有两个网口:ENET1和ENET2,一定要连接ENET2,不能连接错了,ENET2接口如图所示。
建议开发板和主机PC都连接到同一个路由器上!最后设置表中所示的几个环境变量。 环境变量 描述 ipaddr 开发板ip地址,可以不设置,使用dhcp命令来从路由器获取IP地址。 ethaddr 开发板的MAC地址,一定要设置。 gatewayip 网关地址。 netmask 子网掩码。 serverip 服务器IP地址,也就是Ubuntu主机IP地址,用于调试代码。 表30.4.4.1 网络相关环境变量 表30.4.4.1中环境变量设置命令如下所示: setenv ipaddr 192.168.1.50 setenv ethaddr b8:ae:1d:01:00:00 setenv gatewayip 192.168.1.1 setenv netmask 255.255.255.0 setenv serverip 192.168.1.253 saveenv 注意,网络地址环境变量的设置要根据自己的实际情况,确保Ubuntu主机和开发板的IP地址在同一个网段内,比如我现在的开发板和电脑都在192.168.1.0这个网段内,所以设置开发板的IP地址为192.168.1.50。ethaddr为网络MAC地址,是一个48bit的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的ethaddr是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。
1、ping命令 开发板的网络能否使用,是否可以和服务器(Ubuntu主机)进行通信,通过ping命令就可以验证,直接ping服务器的IP地址即可,比如我的服务器IP地址为192.168.1.253,命令如下: ping 192.168.1.253
192.168.1.253这个主机存在,说明ping成功,uboot的网络工作正常。 注意!只能在uboot中ping其他的机器,其他机器不能ping uboot,因为uboot没有对ping命令做处理,如果用其他的机器ping uboot的话会失败!
2、dhcp命令 dhcp用于从路由器获取IP地址,前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么dhcp命令就会失效。直接输入dhcp命令即可通过路由器获取到IP地址。
?
开发板通过dhcp获取到的IP地址为192.168.1.137。同时在图中可以看到“warning:no boot file name;”、“TFTP from server 192.168.1.1”这样的字样。这是因为DHCP不单单是获取IP地址,其还会通过TFTP来启动linux内核,输入“? dhcp”即可查看dhcp命令详细的信息,
3、nfs命令 nfs(Network File System)网络文件系统,通过nfs可以在计算机之间通过网络来分享资源,比如我们将linux 镜像和设备树文件放到Ubuntu中,然后在uboot中使用nfs命令将Ubuntu中的linux 镜像和设备树下载到开发板的DRAM中。这样做的目的是为了方便调试linux镜像和设备树,也就是网络调试,通过网络调试是Linux开发中最常用的调试方法。原因是嵌入式linux开发不像单片机开发,可以直接通过JLINK或STLink等仿真器将代码直接烧写到单片机内部的flash中,嵌入式Linux通常是烧写到EMMC、NAND Flash、SPI Flash等外置flash中,但是嵌入式Linux开发也没有MDK,IAR这样的IDE,更没有烧写算法,因此不可能通过点击一个“download”按钮就将固件烧写到外部flash中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有MDK、IAR的一键下载方便,在Linux内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的linux镜像和设备树文件下载到DRAM中,然后就可以直接运行。 我们一般使用uboot中的nfs命令将Ubuntu中的文件下载到开发板的DRAM中,在使用之前需要开启Ubuntu主机的NFS服务,并且要新建一个NFS使用的目录,以后所有要通过NFS访问的文件都需要放到这个NFS目录中。 uboot中的nfs命令格式如下所示: nfs [loadAddress] [[hostIPaddr:]bootfilename] loadAddress是要保存的DRAM地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。
4、tftp命令 tftp命令的作用和nfs命令一样,都是用于通过网络下载东西到DRAM中,只是tftp命令使用的TFTP协议,Ubuntu主机作为TFTP服务器。因此需要在Ubuntu上搭建TFTP服务器,需要安装tftp-hpa和tftpd-hpa,命令如下: sudo apt-get install tftp-hpa tftpd-hpa sudo apt-get install xinetd 和NFS一样,TFTP也需要一个文件夹来存放文件,在用户目录下新建一个目录,命令如下: mkdir /home/zuozhongkai/linux/tftpboot chmod 777 /home/zuozhongkai/linux/tftpboot 注意!我们要给tftpboot文件夹权限,否则的话uboot不能从tftpboot文件夹里面下载文件。 最后配置tftp,安装完成以后新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d目录的话自行创建,然后在里面输入如下内容:
1 ?server tftp 2 ?{ 3 ? ? ?socket_type ?? ?= dgram 4 ? ? ?protocol ? ??? ??? ?= udp 5 ? ? ?wait ? ? ? ??? ??? ?= yes 6 ? ? ?user ? ? ? ??? ??? ?= root 7 ? ? ?server ? ? ??? ??? ?= /usr/sbin/in.tftpd 8 ? ? ?server_args ?? ?= -s /home/zuozhongkai/linux/tftpboot/ 9 ? ? ?disable ? ? ?? ??? ?= no 10 ? ? per_source ??? ?= 11 11 ? ? cps ? ? ? ? ?? ??? ?= 100 2 12 ? ? flags ? ? ? ?? ??? ?= IPv4 13 } 完了以后启动tftp服务,命令如下
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa文件,将其修改为如下所示内容:
1 # /etc/default/tftpd-hpa 2? 3 TFTP_USERNAME="tftp" 4 TFTP_DIRECTORY="/home/zuozhongkai/linux/tftpboot"? 5 TFTP_ADDRESS=":69" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6 TFTP_OPTIONS="-l -c -s"? 将zImage镜像文件拷贝到tftpboot文件夹中,并且给予zImage相应的权限,命令如下: cp zImage /home/zuozhongkai/linux/tftpboot/ cd /home/zuozhongkai/linux/tftpboot/ chmod 777 zImage 万事俱备,只剩验证了,uboot中的tftp命令格式如下: tftpboot [loadAddress] [[hostIPaddr:]bootfilename] 看起来和nfs命令格式一样的,loadAddress是文件在DRAM中的存放地址,[[hostIPaddr:]bootfilename]是要从Ubuntu中下载的文件。但是和nfs命令的区别在于,tftp命令不需要输入文件在Ubuntu中的完整路径,只需要输入文件名即可。比如我们现在将tftpboot文件夹里面的zImage文件下载到开发板DRAM的0X80800000地址处,命令如下: tftp 80800000 zImage 5、EMMC和SD卡操作命令
mmc命令 从图30.4.5.1可以看出,mmc后面跟不同的参数可以实现不同的功能,如表30.4.5.1所示: 命令 描述 mmc info 输出MMC设备信息 mmc read 读取MMC中的数据。 mmc wirte 向MMC设备写入数据。 mmc rescan 扫描MMC设备。 mmc part 列出MMC设备的分区。 mmc dev 切换MMC设备。 mmc list 列出当前有效的所有MMC设备。 mmc hwpartition 设置MMC设备的分区。 mmc bootbus…… 设置指定MMC设备的BOOT_BUS_WIDTH域的值。 mmc bootpart…… 设置指定MMC设备的boot和RPMB分区的大小。 mmc partconf…… 设置指定MMC设备的PARTITION_CONFG域的值。 mmc rst 复位MMC设备 mmc setdsr 设置DSR寄存器的值 1、mmc info命令 mmc info命令用于输出当前选中的mmc info设备的信息,输入命令“mmc info”即可
2、mmc rescan命令 mmc rescan命令用于扫描当前开发板上所有的MMC设备,包括EMMC和SD卡,输入“mmc rescan”即可。 3、mmc list命令 mmc list命令用于来查看当前开发板一共有几个MMC设备,输入“mmc list”
4.mmc dev命令 mmc dev命令用于切换当前MMC设备,命令格式如下: mmc dev [dev] [part] [dev]用来设置要切换的MMC设备号,[part]是分区号。如果不写分区号的话默认为分区0。使用如下命令切换到SD卡: mmc dev 0 //切换到SD卡,0为SD卡,1为eMMC
5、mmc part命令 有时候SD卡或者EMMC会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看EMMC的分区情况,输入如下命令: mmc dev 1 //切换到EMMC mmc part //查看EMMC分区
mmc read命令 mmc read命令用于读取mmc设备的数据,命令格式如下: mmc read addr blk# cnt addr是数据读取到DRAM中的地址,blk是要读取的块起始地址(十六进制),一个块是512字节,这里的块和扇区是一个意思,在MMC设备中我们通常说扇区,cnt是要读取的块数量(十六进制)。比如从EMMC的第1536(0x600)个块开始,读取16(0x10)个块的数据到DRAM的0X80800000地址处,命令如下: mmc dev 1 0 //切换到MMC分区0 mmc read 80800000 600 10 //读取数据 mmc write命令 要将数据写到MMC设备里面,可以使用命令“mmc write”,格式如下: mmc write addr blk# cnt addr是要写入MMC中的数据在DRAM中的起始地址,blk是要写入MMC的块起始地址(十六进制),cnt是要写入的块大小,一个块为512字节。我们可以使用命令“mmc write”来升级uboot,也就是在uboot中更新uboot。这里要用到nfs或者tftp命令,通过nfs或者tftp命令将新的u-boot.bin下载到开发板的DRAM中,然后再使用命令“mmc write”将其写入到MMC设备中。我们就来更新一下SD中的uboot,先查看一下SD卡中的uboot版本号,注意编译时间,输入命令: mmc dev 0 //切换到SD卡 version //查看版本号
?
|