目录
SD卡下载
使用imxdownload软件,先将sd卡挂载在ubuntu中,查出sd在ubuntu的dev文件夹显示的文件。
./imxdownload led.bin /dev/sdd
产生的文件led.imx就是led.bin文件添加了一些数据头以后生成的。设置sd卡启动,烧写即可。
启动方式选择
芯片是根据BOOT_MODE[1:0]的设置来选择 BOOT 方式。
BOOT_MODE[1:0] | BOOT类型 |
---|---|
00 | 从FUSE启动 |
01 | 串行下载 |
10 | 内部BOOT模式 |
11 | 保留 |
uboot编译
使用命令解压uboot压缩包
tar -vxjf uboot.tar.bz2
然后依次执行以下命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
# 其中的上面相当于以下
# ARCH=arm 指定架构,CROSS_COMPILE=arm-linux-gnueabihf- 指定编译器
# make distclean 清除工程
# make mx6ull_14x14_ddr512_emmc_defconfig 配置uboot
# make -j12 编译uboot
上面的可以编写到一个shell脚本中执行即可
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
根据自己需求配置uboot,其中mx6ull_14x14_ddr512_emmc_defconfig
是正点原子针对 I.MX6U-ALPHA
的 EMMC 核心板编写的配置文件。存放在uboot/configs
文件中。
烧写后使用串口连接,屏幕上显示“Hit any key to stop autoboot: ”
倒计时的时候按下键盘上的回车键,默认是 3 秒倒计时,在 3 秒倒计时结束以后如果没有按下回车键的话 uboot 就会使用默认参数来启动 Linux 内核。在这世间段按下回车键,那么就可以进入uboot命令行模式。
uboot烧写
chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload u-boot.bin /dev/sdd //烧写到 SD 卡,不能烧写到/dev/sda 或 sda1 设备里面
uboot命令行
help 或者? --> 显示uboot支持的命令
help bootz或者? bootz --> 查看bootz命令的详细信息
信息查询命令
bdinfo --> 查看板子信息
printenv --> 输出环境变量信息
version --> 查看uboot版本号
环境变量操作命令
# 修改环境变量
setenv bootdelay 5 --> 设置uboot倒计时5秒
saveenv --> 保持环境变量设置
修改bootargs、bootcmd的时候需要使用单引号引起来
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
# 新建环境变量
setenv author dongfang --> 新建环境变量author 对应为dongfang
saveenv
# 删除环境变量
setenv author --> 删除环境变量,也就是设置为空
saveenv
内存操作命令
用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、nm、 mm、mw、cp 和 cmp
md命令
用于显示内存值
md[.b, .w, .l] address [# of objects]
[.b .w .l]对应 byte、word 和 long,分别代表1、2、4字节。
address 就是要查看的内存起始地址。
[# of objects]表示要查看的数据长度(len * 第一个参数代表长度)
md.b 80000000 14 --> 查看80000000地址开始的0x14个字节的内存值
md.w 80000000 14 --> 查看80000000地址开始的0x14 * 2个字节的内存值
md.l 80000000 14 --> 查看80000000地址开始的0x14 * 4个字节的内存值
nm命令
用于修改指定地址的内存值
nm[.b, .w, .l] address
nm.l 80000000 --> 修改以80000000为起始地址的4个字节的内存值
80000000: 00000000 ? 12345678 --> 修改为12345678
80000000: 12345678 ? q --> 退出
mm命令
用于修改指定地址的内存值,只不过地址会自增
mm.l 80000000 --> 修改以80000000为起始地址的4个字节的内存值
80000000: 00000000 ? 12345678 --> 修改为12345678
80000004: 00000000 ? 12345678 --> 修改以80000004为起始地址的4个字节的内存值为12345678
80000008: 00000000 ? 12345678 --> 修改以80000008为起始地址的4个字节的内存值为12345678
8000000c: 00000000 ? q
nw命令
用于使用一个指定的数据填充一段内存
mw[.b, .w, .l] address value [count]
mw.l 80000000 0A0A0A0A 10 --> 使用0A0A0A0A填充以80000000起始地址的0x10 * 4个字节的内存值
cp命令
用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,
或者把 Nor Flash 中的数据拷贝到 DRAM 中
cp[.b, .w, .l] source target count
source 为源地址,target 为目的地址,count 为拷贝的长度
cp.l 80000000 80000100 10 --> 使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处
长度为 0x10个内存块(0x10 * 4=64 个字节)
cmp命令
用于比较两段内存的数据是否相等
cmp[.b, .w, .l] addr1 addr2 count
cmp.l 80000000 80000100 10 --> 使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据
是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)
网络操作命令
uboot 支持dhcp、ping、nfs 和 tftpboot等网络相关命令
设置网络相关环境变量
setenv ipaddr 192.168.239.50 --> 开发板ip地址,可以不设置,使用dhcp命令来从路由器获取IP地址
setenv ethaddr b8:ae:1d:01:00:00 --> 开发板的MAC地址,一定要设置
# 如果在同一个网段内有多个开发板的话一定要保证每个开发板的ethaddr是不同的,否则通信会有问题
setenv gatewayip 192.168.239.1 --> 网关地址
setenv netmask 255.255.255.0 --> 子网掩码
setenv serverip 192.168.239.129 --> 服务器IP地址,也就是Ubuntu主机IP地址,用于调试代码。
saveenv
ping命令
查看网络是否可用
ping 192.168.239.129
# 只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping
dhcp命令
用于从路由器获取 IP 地址,前提得开发板连接到路由器上的
dhcp
DHCP client bound to address 192.168.239.100 (7964 ms)
--> 说明动态分配了ip地址为192.168.239.100
nfs命令
通过 nfs 可以在计算机之间通过网络来分享资源。
将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中
的 linux 镜像和设备树下载到开发板的 DRAM 中
首先ubuntu中需要安装好nfs,并且新建nfs使用目录,将所有需要使用nfs访问的文件放到该目录下。
nfs [loadAddress] [[hostIPaddr:]bootfilename]
# loadAddress 是要保存的 DRAM 地址
# [[hostIPaddr:]bootfilename]是要下载的文件地址
nfs 80800000 192.168.239.129:/home/dongfang/linux/nfs/zImage
tftp命令
作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中
首先需要在ubuntu中安装好tftp服务器,并且文件夹和文件都需要设置为777权限。设置tftp文件夹,
将所有需要使用tftp访问的文件放到该目录下。
tftpboot [loadAddress] [[hostIPaddr:]bootfilename
# loadAddress 是文件在 DRAM 中 的 存 放 地 址 ,
# [[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件
tftp 80800000 zImage
emmc和sd卡操作命令
命令 | 描述 |
---|---|
mmc info | 输出MMC设备信息 |
mmc read | 读取MMC中的数据 |
mmc write | 向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 setsdr | 设置DSR寄存器的值 |
在uboot中更新uboot
# SD卡烧写
tftp 80800000 u-boot.imx // 下载u-boot.imx到DRAM中
mmc dev 0 0 //切换到SD卡(SD卡的mmc设备号是0)的0分区(专门存放uboot的分区)
mmc write addr blk# cnt //将DRAM的addr地址的数据写入到第blk个块开始的地方
//一共写cnt个块(块和扇区是一个意思,一个块512字节)
mmc write 80800000 2 346 //下载时发现文件大小是429056个字节,刚好838个块,16进制就是346
# EMMC烧写
mmc dev 1 0 //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 346 //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步
## 注意
千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!
# 要擦除 MMC 设备的指定块就是用命令“mmc erase”
mmc erase blk# cnt
blk 为要擦除的起始块,cnt 是要擦除的数量。没事不要用 mmc erase 来擦除 MMC 设备!!
文件系统格式命令
FAT格式
跟文件操作相关的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite
- fatinfo
# 用于查询指定 MMC 设备分区的文件系统信息
fatinfo <interface> [<dev[:part]>]
interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区
fatinfo mmc 1:1 --> 查询mmc分区1的文件系统信息
- fatls
# 用于查询 FAT 格式设备的目录和文件信息
fatls <interface> [<dev[:part]>] [directory]
interface是要查询的接口,比如 mmc,dev 是要查询的设备号,
part 是要查询的分区,directory是要查询的目录
fatls mmc 1:1 --> 查询mmc分区1的FAT格式设备目录和文件信息
- fstype
# 用于查看 MMC 设备某个分区的文件系统格式
fstype <interface> <dev>:<part>
fstype mmc 1:0 --> 查看 MMC 设备0分区的文件系统格式
- fatload
# 用于将指定的文件读取到 DRAM 中
fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
interface 为接口,part 是分区,addr 是保存在 DRAM 中的起始 地址,filename 是要读取的文件名字。
bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。
pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。
fatload mmc 1:1 80800000 zImage
--> 将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的0X80800000 地址处
- fatwrite
# 用于将 DRAM 中的数据写入到 MMC 设备中
fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
可以通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树
fatwrite mmc 1:1 80800000 zImage 6788f8
--> 将DRAM中起始位置80800000处开始写入到 EMMC 的分区 1 中,大小为0x6788f8字节,文件名字为 zImage
EXT格式
uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:
ext2load、ext2ls、ext4load、ext4ls 和 ext4write。这些命令的含义和使用与 fatload、fatls 和 fatwrite
一样,只是 ext2 和 ext4 都是针对 ext 文件系统的
ext4ls mmc 1:2 --> 查询 EMMC 的分区 2 中的文件和目录
boot操作命令
bootz
bootz 命令用于启动 zImage 镜像文件
bootz [addr [initrd[:size]] [fdt]]
addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在DRAM 中的地址
如果不使用 initrd 的话使用‘-’代替即可,fdt 就是设备树文件在 DRAM 中的地址
- 使用tftp 网络下载zImage和dtb,并启动
tftp 80800000 zImage #下载zImage
tftp 83000000 imx6ull-alientek-emmc.dtb #下载设备树
bootz 80800000 – 83000000 #启动
- 从emmc读取zImage和dtb,并启动
fatload mmc 1:1 80800000 zImage # 将mmc中的ZImage复制到DRAM中
fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb # 将mmc中的设备树复制到DRAM中
bootz 80800000 - 83000000
bootm
bootm 和 bootz 功能类似,但是 bootm 用于启动 uImage 镜像文件
- 不使用设备树
bootm addr --> addr是uImage在DRAM中的首地址
- 使用设备树
bootm [addr [initrd[:size]] [fdt]] --> 和bootz是一样的,只不过,addr是uImage在DRAM中的首地址
boot
boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统 ,其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合 ,具体的引导命令内容是可以修改的。
- 使用 tftp 命令从网络启动 Linux
#设置bootcmd环境变量:tftp网络下在镜像、设备树,并启动
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
saveenv #保存环境变量
boot #启动,boot命令会执行bootcmd环境变量
- 使用 mmc启动 Linux
setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ullalientek_emmc.dtb; bootz 80800000 - 83000000'
savenev
boot
在启动 Linux 内核的时候可能会遇到如下错误:
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
这是因为没有根文件系统造成的
其他常用的命令
- reset
复位重启
- go
用于跳到指定的地址处执行应用
go addr [arg ...]
tftp 87800000 printf.bin
go 87800000 --> 执行printf.bin裸机应用
- run
用于运行环境变量中定义的命令
setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-
14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
setenv mybootnand 'nand read 80800000 4000000 800000;nand read 83000000 6000000
100000;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb;
bootz 80800000 - 83000000'
saveenv
run mybootemmc
run mybootnand
run mybootnet
- mtest
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR
mtest [start [end [pattern [iterations]]]]
start 是要测试的 DRAM 开始地址,end 是结束地址,
比如我们测试 0X80000000~0X80001000 这段内存,
输入“mtest 80000000 80001000”