20.UBOOT
20.UBOOT
uboot作为bootloader的一种,负责初始化DDR等外设、将linux内核从flash中拷贝到ddr中、启动linux内核
1、配置和编译uboot
将厂商提供的uboot进行解压
tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz
使用如下命令进行配置uboot以及编译
方法一:
make ARCH=arm CROSS_COMPILE=arm-linux-guneabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-guneabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-guneabihf- -j12
先清除一下工程,再make 一下mx6ull_14x14_ddr512_emmc_defconfig为解压出来的配置文件
方法二:
使用sh脚本将上述指令编写到脚本中
创建mx6ull_alientek_emmc.sh
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-guneabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-guneabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-guneabihf- -j12
chmod授权后执行即可,执行命令
./mx6ull_alientek_emmc.sh
方法三:
在解压出来的顶层Makefile中定义全局变量,大概在247行endif后面添加如下内容:
endif
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
arm-linux-gnueabihf-后面不能有空格
接着直接使用make命令即可。
按照上面方法编译之后,会在当前文件夹下多出来几个重要的文件
u-boot.bin 二进制的编译后的程序,需要加上头部信息变成了下面的imx文件
头部信息文件在/uboot/board/freescale/mx6ullevk/imximage.cfg文件中,包括DDR的初始化
u-boot.cfg 前面生成了配置文件
u-boot.imx 可以直接烧写的imx文件。
烧写
方式一:
将之前的烧写工具imxdownload工具拷贝到当前目录下
使用下面命令烧写到sd卡中
./imxdownload u-boot.imx /dev/sdb
插入板子后sd卡启动即可将刚编译的uboot烧写到板子中,且只有uboot程序,无设备树、linux内核等程序。
方式二:
使用正点原子的mfgtool,将编译出来的u-boot.imx重命名为u-boot-imx6ull-14x14-emmc.imx替换\mfgtool\Profiles\Linux\OS Firmware\firmware下的同名文件
将编译出来的u-boot.imx再重命名为u-boot-imx6ull-14x14-ddr512-emmc.imx替换掉\mfgtool\Profiles\Linux\OS Firmware\files\boot的同名文件
最后启动方式为OTG、链接OTG线、启动板子、打开Mfgtool2-eMMC-ddr512-eMMC.vbs进行识别到设备后点击start烧写,done之后再stop,exit即可重启板子即可,
总结:烧写时间长,原因是不止烧写了uboot还有设备树、linux内核等程序。因此采用单独烧写uboot的sd方式来进行后续学习。
u-boot命令使用
在启动板子的3m内,在串口中任意键盘输入,会进入到u-boot命令行模式,可以使用uboot命令行来执行相关的命令;3s内没有输入,则uboot会以默认参数来启动linux内核。
uboot中的命令可以配置、需要使用什么命令使能即可。学习默认支持的命令
uboot也支持自动补全tab
help //查看所有命令的帮助
? //同上
help cmd //查看某个命令的使用方式
? cmd //同上//信息查询命令
bdinfo //查看板子信息如ddr大小、启动参数保存地址、波特率、sp起始地址等信息
printenv //输出环境配置,环境配置是以字符串的形式保存,可以改变环境配置
version //查看uboot的版本号//环境变量的操作//修改和新建
setenv [变量名] [值] //修改环境变量
setenv bootdelay 5 //修改进入uboot倒计时
setenv author YL //不存在环境变量值,会直接新建一个
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'saveenv //保存环境变量//删除环境变量
setenv author //给一个空值即删除该环境变量//内存操作//读取指定的地址值
md[.b, .w, .l] address [# of objects]uboot 命令中的数字都是十六进制的!不是十进制的!
=> md.b 80000000 10
80000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
=> md.w 80000000 10
80000000: ffff ffff ffff ffff ffff ffff ffff ffff ................
80000010: ffff ffff ffff ffff ffff ffff ffff ffff ................
=> md.l 80000000 10
80000000: ffffffff ffffffff ffffffff ffffffff ................
80000010: ffffffff ffffffff ffffffff ffffffff ................
80000020: ffffffff ffffffff ffffffff ffffffff ................
80000030: ffffffff ffffffff ffffffff ffffffff ................//修改指定地址的内存值
nm [.b, .w, .l] address=> nm.l 80000000
80000000: ffffffff ? 12345678
80000000: 12345678 ? q
=> md.l 80000000 1
80000000: 12345678 xV4.//连续修改指定地址的内存值
mm [.b, .w, .l] address=> mm.l 80000000
80000000: 12345678 ? 87654321
80000004: ffffffff ? 12345678
80000008: ffffffff ? q
=> md.l 80000000 3
80000000: 87654321 12345678 ffffffff !Ce.xV4.....//使用一个指定的数据填充一段内存
mw [.b, .w, .l] address value [count]
=> mw.l 80000000 0A0A0A0A 10
=> md.l 80000000 10
80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000010: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000020: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000030: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................//数据拷贝命令用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor
Flash 中的数据拷贝到 DRAM 中。
cp [.b, .w, .l] source target count=> cp.l 80000000 80000100 10
=> md.l 80000000 10
80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000010: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000020: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000030: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
=> md.l 80000100 10
80000100: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000110: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000120: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................
80000130: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a ................//比较命令,用于比较两段内存的数据是否相等
cmp [.b, .w, .l] addr1 addr2 count
cmp.l 80000000 80000100 10=> cmp 80000000 80000100 10
word at 0x00000000 (0xe59ff01c) != word at 0x80000100 (0xa0a0a0a)
Total of 0 word(s) were the same
=> cmp.l 80000000 80000100 10
Total of 16 word(s) were the same
=> nm.l 80000100
80000100: 0a0a0a0a ? B0b0b0b0
80000100: b0b0b0b0 ? q
=> cmp.l 80000000 80000100 10
word at 0x80000000 (0xa0a0a0a) != word at 0x80000100 (0xb0b0b0b0)
Total of 0 word(s) were the same
=> mm.l 80000100
80000100: b0b0b0b0 ? 0a0a0a0a
80000104: 0a0a0a0a ? 10101010
80000108: 0a0a0a0a ? q
=> cmp.l 80000000 80000100 10
word at 0x80000004 (0xa0a0a0a) != word at 0x80000104 (0x10101010)
Total of 1 word(s) were the same
网络相关
网络环境要求较高,后续在来实现
//网络操作命令//手动设置网络
=> 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
Saving Environment to MMC...
Writing to MMC(0)... done//自动配置网络
=> dhcp
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
BOOTP broadcast 4
BOOTP broadcast 5
DHCP client bound to address 192.168.1.137 (7962 ms)
***Warning: no boot file name; using 'COA80189.img'
Using FEC1 device
TFTP from server 192.168.1.1;0ur IP address is 192.168.1.137
Filename 'C0A80189.img'.
Load address: Ox80800000
Loading: T T T T
//开发板通过 dhcp 获取到的 IP 地址为 192.168.1.137。同时可以看到“warning: no boot file name;”、“TFTP from server 192.168.1.1”这样的字样。
这是因为 DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来启动 linux 内核
BOOT 操作命令
uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有: bootz、 bootm 和 boot。
1、 bootz 命令
bootz 命令用于启动 zImage 镜像文件
bootz [addr [initrd[:size]] [fdt]]
命令 bootz 有三个参数, addr 是 Linux 镜像文件在 DRAM 中的位置, initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可, fdt 就是设备树文件在 DRAM 中的地址。
使用 tftp 命令将zImage 下载到DRAM的0X80800000地址处,然后将设备树imx6ull-14x14-emmc-7-1024x600- c.dtb 下载到 DRAM 中的 0X83000000 地址处,最后之后命令 bootz 启动,
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000
2、 bootm 命令
