[驱动开发笔记]第27章 U-boot使用实验

[驱动开发笔记及避坑]第27章 U-Boot使用实验

前言

不积跬步,无以至千里;不积小流,无以成江海。下面记录学习《原子嵌入式Linux开发详解》一书第27章的笔记以及避坑。

避坑是一大重点,目前教材仍有不少疏漏,所以将坑记录下来,避免弯路。标注“避坑”的部分,则需要按照说明安装插件/执行指令,否则会报错。

本文是本书的第三篇,系统移植。移植Linux需要:

  1. 移植bootloader代码,其中常用的bootloader就是U-Boot。用于启动Linux内核。

  2. 移植Linux内核。

  3. 移植根文件系统(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 网络操作命令

如果网线连接开发板和计算机(虚拟机),则需要按照如下方法配置(参考链接):

开发板和计算机(虚拟机)相连的网络配置

  1. 设置当前虚拟机为桥接模式
    img

  2. VMWare菜单栏 - 编辑 - 虚拟网络编辑器,在窗口右下角点击“更改设置”,选择桥接网卡(选连接到开发板的网卡):
    img

  3. 此时虚拟机无网络,宿主机连接无线网络,在网络适配器选项中右键“WLAN” - 属性 - 共享,勾选“允许其他网络用户通过此计算机的Internet 连接来连接(N)”,选择“以太网”(连接到开发板的网卡),之后虚拟机即可上网:
    img

  4. 在虚拟机中使用ifconfig查看IP,假设查看到的IP是192.168.137.98;

  5. 配置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
  1. 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,后来直接报上述错误了,已经尝试了常见方法:

  1. 改配置,增加-V 2(也有说增加-V 2,3,4的,都尝试了)
  2. 配置etc/hosts
  3. 修改bootargs变量
  4. 重装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:

  1. 通过tftp将文件从虚拟机下载到DRAM;
  2. 通过MMC将文件复制到DRAM。

bootz

bootz 镜像地址 [initrd] 设备树地址,其中不使用initrd时用-代替。举例:

bootz 80800000 - 83000000

bootm

用于加载uImage。
bootm 镜像地址 [initrd] 设备树地址

boot

boot指令的作用是执行环境变量bootcmd中的指令。bootcmd中有关于启动的指令。

27.4.10 其他常用命令

  1. reset:复位。
  2. go <addr>:执行DRAM<addr>处的指令。
  3. run <env>:运行环境变量中自定义的命令。
  4. mtest <start> <end>:测试指定区域的内存。
posted @ 2023-11-27 22:36  Digitzh  阅读(193)  评论(0)    收藏  举报