[驱动开发笔记]第27章 U-boot使用实验
[驱动开发笔记及避坑]第27章 U-Boot使用实验
前言
不积跬步,无以至千里;不积小流,无以成江海。下面记录学习《原子嵌入式Linux开发详解》一书第27章的笔记以及避坑。
避坑是一大重点,目前教材仍有不少疏漏,所以将坑记录下来,避免弯路。标注“避坑”的部分,则需要按照说明安装插件/执行指令,否则会报错。
本文是本书的第三篇,系统移植。移植Linux需要:
-
移植bootloader代码,其中常用的bootloader就是U-Boot。用于启动Linux内核。
-
移植Linux内核。
-
移植根文件系统(rootfs)。
U-Boot、内核和rootfs三者构成了一个完整的Linux系统。
27.1 U-Boot 简介
有3种uboot代码:uboot官方代码、半导体厂商的代码、开发板厂商的代码。
官方代码支持常用芯片,半导体厂商对自家芯片支持最好,开发板厂商适配自己开发板。
27.2 U-Boot 首次编译
避坑1:安装gcc, make
在编译uboot之前,需要安装make, gcc:
sudo apt install make
sudo apt install gcc
避坑2:安装gcc-arm-linux-gnueabihf 4.9.4
需要安装gcc-arm-linux-gnueabihf,但不能使用apt install gcc-arm-linux-gnueabihf安装最新版,会报错(书P11有讲)。如果不小心安装了最新版,先卸载:
sudo apt remove --auto-remove gcc-arm-linux-gnueabi*
安装4.9.4版则不会报错,参考书中1.3节 - Ubuntu交叉编译工具链的安装(资源链接)。需要添加的环境变量:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
27.3 U-Boot 烧写与启动
提示1:imxdownload的位置
imxdownload在正点原子提供的资料包中,路径为“05、开发工具 - 02、Ubuntu下裸机烧写软件”。在Ubuntu新建文件夹,将3个文件拖拽到其中。
提示2:虚拟机不识别USB 3.0端口的问题
如果使用USB3.0端口,可能会出现虚拟机不识别的问题。只需在虚拟机设置 - 硬件 - USB控制器中,将兼容性设置为USB3.1即可(参考链接)。
提示3:设置启动方式(参考链接)
找开发板上的红色拨码开关,默认“10100110”为EMMC启动,拨为“10000010”即可设置为SD卡启动。
27.4 U-Boot 命令使用
27.4.1 信息查询命令
查看环境变量:printenv
27.4.2 环境变量命令
修改环境变量:setenv 变量名 值
新建环境变量:setenv 新变量名 值
删除环境变量:setenv 变量名
保存:saveenv
27.4.3 内存操作命令
27.4.4 网络操作命令
如果网线连接开发板和计算机(虚拟机),则需要按照如下方法配置(参考链接):
开发板和计算机(虚拟机)相连的网络配置
-
设置当前虚拟机为桥接模式
![img]()
-
VMWare菜单栏 - 编辑 - 虚拟网络编辑器,在窗口右下角点击“更改设置”,选择桥接网卡(选连接到开发板的网卡):
![img]()
-
此时虚拟机无网络,宿主机连接无线网络,在网络适配器选项中右键“WLAN” - 属性 - 共享,勾选“允许其他网络用户通过此计算机的Internet 连接来连接(N)”,选择“以太网”(连接到开发板的网卡),之后虚拟机即可上网:
![img]()
-
在虚拟机中使用
ifconfig查看IP,假设查看到的IP是192.168.137.98; -
配置U-boot环境变量:
setenv ipaddr 192.168.137.2
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.137.1
setenv netmask 255.255.255.0
setenv serverip 192.168.137.98
saveenv
- ping测试:
ping 192.168.137.98,即可ping通。
经测试,此时ping自身、ping网关都无法ping通,只有虚拟机可以ping通,可能是uboot不支持的原因吧。
nfs报错ERROR: File lookup fail(待解决)
=> nfs 80800000 192.168.137.57:/home/user/linux/nfs/zImage
Using FEC1 device
File transfer via NFS from server 192.168.137.57; our IP address is 192.168.137.2
Filename '/home/user/linux/nfs/zImage'.
Load address: 0x80800000
Loading: *** ERROR: File lookup fail
一开始传输提示TTTT,后来直接报上述错误了,已经尝试了常见方法:
- 改配置,增加-V 2(也有说增加-V 2,3,4的,都尝试了)
- 配置etc/hosts
- 修改bootargs变量
- 重装nfs-kernel-server
下面的方法比较先进,但做了还是不行,有待解决...
https://zhuanlan.zhihu.com/p/658077180
tftp
tftp使用很顺利。目标文件夹名称不必是tftpboot,可以自定义,如tftp。
注:P425 图27-37下方有一处文字错误,"tftpboot"误写为"tftboot"。
27.4.5 EMMC和SD卡操作命令
eMMC是embedded MultiMediaCard(嵌入式多媒体卡)的简称。eMMC和SD卡二者统称为MMC。
eMMC烧写Linux系统后,有3个分区:uboot,Linux镜像与设备树,根文件系统。使用fstype mmc查看各设备分区格式:
fstype mmc 1:0 # uboot分区,输出Unrecognized filesystem type,因为没有格式化,文件系统格式未知
fstype mmc 1:1 # Linux镜像和设备树分区,输出fat
fstype mmc 1:2 # 根文件系统分区,输出ext4
27.4.9 BOOT操作命令
有2种方式将Linux镜像和设备树写入DRAM:
- 通过tftp将文件从虚拟机下载到DRAM;
- 通过MMC将文件复制到DRAM。
bootz
bootz 镜像地址 [initrd] 设备树地址,其中不使用initrd时用-代替。举例:
bootz 80800000 - 83000000
bootm
用于加载uImage。
bootm 镜像地址 [initrd] 设备树地址
boot
boot指令的作用是执行环境变量bootcmd中的指令。bootcmd中有关于启动的指令。
27.4.10 其他常用命令
reset:复位。go <addr>:执行DRAM<addr>处的指令。run <env>:运行环境变量中自定义的命令。mtest <start> <end>:测试指定区域的内存。




浙公网安备 33010602011771号