配置uboot参数
setenv ipaddr 192.168.0.10;setenv serverip 192.168.0.40;setenv gatewayip 192.168.0.1;setenv netmask 255.255.255.0
setenv bootargs 'mem=512M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 rw init=/init mtdparts=hinand:1M(boot),4M(kernel),64M(rootfs),64M(appfs),64M(datafs),59M(backup)'
setenv bootcmd 'nand read 0x42000000 0x100000 0x400000;bootm 0x42000000'
setenv slave_autostart 0
sa
配置好了tftp服务器的ip地址192.168.0.40,uboot自身的ip为192168.0.10
windows上配置好文件夹位置和服务器IP
内存操作指令
tftp操作指令
tftp命令解析
tftp 42000000 uImage_hi3536
这就是通过tftp将uImage_hi3536在服务器下载到板子的地址为42000000位置的内存
md指令
uboot下输入指令md,会提示md的用法,memory display,即内存显示。
U-Boot-PetaLinux> md
md - memory display
Usage:
md [.b, .w, .l] address [# of objects]
分为三种类型
b:8位
w:16位
l:32位(默认值)
例子:
其他两种md.w和md.l同md.b用法相同,第三个参数一定是16进制
上述42000000是要显示内存的那个地址,后面的数字4000000是输出的个数,注意是16进制的。
直接输入md来显示,默认是以32位为单位输出 。
mw指令
uboot下输入指令mw,会提示md的用法,memory write,即向内存中写入数据。
U-Boot-PetaLinux> mw
mw - memory write (fill)
Usage:
mw [.b, .w, .l] address value [count]
b\w\l的意思同上,address是要写入内存的地址,value是要写入的值,count是从address开始要写入多少个数,这些都是16进制数。
示例:
图一
图二
uImage_hi3536的属性显示带下为3862656字节,0x400000转为10进制为4194304,这样大小完全足够
nand操作指令
以上面的图二为例分析
nand erase 100000 400000;nand write 42000000 100000 400000
1)先说nand erase:
nand erase/clean [off] [size]
清除flash,从off 偏移地址开始的size大小的数据,最小单位是一个page。
2)再说nand write
nand write [addr] [off] [size]
将内存地址addr开始的size大小数据写入到flash的off偏移地址去,该命令会自动跳过坏块。
uboot中其他命令
信息查询命令
常用的和信息查询有关的命令有 3 个: bdinfo、 printenv 和 version。
bdinfo 查询板子信息(我这块板子上的uboot没有这个命令)
1)version uboot的版本
2)printenv 打印环境变量
直接输入“print”也可以。
可以看到很多的环境变量,比如 baudrate、 board_name、 board_rec、 boot_fdt、 bootcmd等等。 uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认bootdelay=1,也就默认延时 1秒。前面说的 1 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s了。
环境变量操作命令
环境变量的操作涉及到两个命令: setenv 和 saveenv,命令 setenv 用于设置或者修改环境变量的值。命令 saveenv 用于保存修改后的环境变量,一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值。
命令 saveenv 使用起来很简单,格式为:
saveenv
或
sa
比如我们要将环境变量 bootdelay 改为 5,就可以使用如下所示命令:
setenv bootdelay 5
saveenv 或 sa
当我们使用命令 saveenv 保存修改后的环境变量的话会有保存过程提示信息,根据提示可以看出环境变量保存到了 MMC(0)中,也就是 SD 卡中。因为我们现在将 uboot烧写到了 SD 卡里面,所以会保存到 MMC(0)中。如果烧写到 EMMC 里面就会提示保存到MMC(1),也就是 EMMC 设备,同理,如果是 NAND 版本核心板的话就会提示保存到 NAND中。
有时候我们修改的环境变量值可能会有空格, 比如 bootcmd、 bootargs 等, 这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs 的值:
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
saveenv
上面命令设置 bootargs 的值为“console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw”,其中“console=ttymxc0,115200”、“root=/dev/mmcblk1p2”、“rootwait”和“rw”相当于四组“值”,这四组“值”之间用空格隔开,所以需要使用单引号‘’将其括起来,表示这四组“值”都属于环境变量 bootargs。
命令 setenv 也可以用于新建命令,用法和修改环境变量一样,比如我们新建一个环境变量author, author 的值为: yyy,那么就可以使用如下命令:
setenv author yyy
saveenv
新建命令 author 完成以后重启 uboot,然后使用命令 printenv 查看当前环境变量。
删除环境变量也是使用命令 setenv,要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的 author 这个环境变量,命令如下:
setenv author
saveenv
上面命令中通过 setenv 给 author 赋空值,也就是什么都不写来删除环境变量 author。重启uboot 就会发现环境变量 author 没有了。
网络操作命令
关键的几个环境变量
环境变量 描述
环境变量 | 描述 |
---|---|
ipaddr | 开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址 |
ethaddr | 开发板的 MAC 地址,一定要设置。 |
gatewayip | 网关地址 |
netmask | 子网掩码 |
serverip | 服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码 |
设置命令: |
setenv ipaddr 192.168.0.10 //设置本地地址
setenv ethaddr b8:ae:1d:01:00:00 //设置本机mac地址
setenv gatewayip 192.168.0.1 //设置网关
setenv netmask 255.255.255.0 //设置子网掩码
setenv serverip 192.168.0.40 //设置服务器IP
saveenv 保存参数
也可以一句直接全部设置出来
setenv ipaddr 192.168.0.10;setenv serverip 192.168.0.40;setenv gatewayip 192.168.0.1;setenv netmask 255.255.255.0
sa
通过";"号分隔开,这样一次就将所有的网络参数设置成功了
注意,网络地址环境变量的设置要根据自己的实际情况,确保主机和开发板的 IP地址在同一个网段内,比如我现在的开发板和电脑都在 192.168.0.1 这个网段内,所以设置开发板的 IP 地址为 192.168.0.10,我的 windows的 主机的地址为 192.168.0.40,因此 serverip 就是192.168.0.40。 ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。
ping 命令
开发板的网络能否使用,是否可以和服务器(主机)进行通信,通过 ping 命令就可以验证,直接 ping 服务器的 IP 地址即可,比如我的服务器 IP 地址为 192.168.0.40,命令如下:
可以看出, 192.168.0.40这个主机存在,说明 ping 成功, uboot 的网络工作常。
注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!
dhcp 命令
dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址
tftp 命令
前面讲了用windows作为主机,使用tftp32或者tftp64的软件作为服务器,现在看一下使用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 的 目 录 ( 文 件 夹 ) , 路 径 为/home/zuozhongkai/linux/tftpboot。注意!我们要给 tftpboot 文件夹权限,否则的话 uboot 不能从tftpboot 文件夹里面下载文件。
最后配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp, 如果没有/etc/xinetd.d 目录的话自行创建, 然后在里面输入如下内容:
server tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/zuozhongkai/linux/tftpboot/
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
完了以后启动 tftp 服务,命令如下:
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/zuozhongkai/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。
最后输入如下命令, 重启 tftp 服务器:
sudo service tftpd-hpa restart
tftp 服务器已经搭建好了,接下来就是使用了。将 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 文件夹里面的 uImage_hi3536文件下载到开发板 DRAM 的 0X42000000 地址处,命令如下:
tftp 42000000 uImage_hi3536