【嵌入式移植】3、编译U-Boot

编译U-Boot

  • 0 U-Boot及本文所选硬件
  • 1 获取U-Boot源码
  • 2 获取工具链
  • 3 BL31
  • 4 编译
    • 4.1 yylloc
    • 4.2 u_boot_dtsi
  • 5 烧写
  • 6 上电验证

0 U-Boot及本文所选硬件

Das U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。

本文对U-Boot进行移植,笔者目前有FriendlyElec NanoPi Duo2、NanoPi NEO2、NanoPi Fire3等硬件,考虑要玩比较新的体系(比如ARMv8),而且U-Boot又给出了Allwinner SoC based boards相关资料,因此选择了NanoPi NEO2这个硬件平台,采用全志64位四核A53处理器H5, 内置Mail450 GPU, 标配512M DDR3内存。

1 获取U-Boot源码

根据FriendlyElec提供的手册Building U-boot and Linux for H5/H3/H2+,选用u-boot-2017.11,源码默认配置中包含nanopi_neo2_defconfg。

2 获取工具链

本文在ubuntu环境下编译,可以使用上一篇文章制作的交叉编译工具链进行编译,也可以直接安装对应的交叉编译工具链

sudo apt install gcc-aarch64-linux-gnu

本文先使用安装的交叉编译工具链进行编译,后续再针对自己制作的工具链进行试用。

根据U-Boot文档安装可能需要的依赖项

sudo apt-get install bc bison build-essential coccinelle \device-tree-compiler dfu-util efitools flex gdisk graphviz imagemagick \liblz4-tool libgnutls28-dev libguestfs-tools libncurses-dev \libpython3-dev libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl \pkg-config python3 python3-asteval python3-coverage python3-filelock \python3-pkg-resources python3-pycryptodome python3-pyelftools \python3-pytest python3-pytest-xdist python3-sphinxcontrib.apidoc \python3-sphinx-rtd-theme python3-subunit python3-testtools \python3-virtualenv swig uuid-dev

3 BL31

根据U-Boot的手册,对于使用基于 Allwinner ARM 的 SoC(“sunxi”)的主板,编译时需要bl31.bin这个文件,在硬件板子提供的u-boot-sunxi-v2017.x源码根目录下找到此文件,复制到u-boot-2017.11根目录下,并设置临时环境变量

export BL31=~/arm/u-boot/u-boot-2017.11/bl31.bin

4 编译

执行配置

make nanopi_neo2_defconfig

请添加图片描述
执行编译

make CROSS_COMPILE=aarch64-linux-gnu-     

发生报错 ̄□ ̄||
请添加图片描述
这里报错信息为multiple definition of `yylloc’,即yylloc重复定义了,报错位置位于scripts/dtc/dtc-lexer.lex.o,即scripts/dtc/dtc-lexer.lex.c文件中

4.1 yylloc

在u-boot-2017.11目录下进行查找(其实上述报错信息已经提示在scripts/dtc/dtc-lexer.lex.c文件中了),这里的-r选项表示递归地在指定目录(此处为.)及其子目录中进行搜索

cd ~/arm/u-boot-u-boot-2017.11
grep -r "yylloc" .

请添加图片描述
可知yylloc在dtc-parser.tab.c、dtc-lexer.lex.c均存在定义。

./scripts/dtc/dtc-parser.tab.c:YYLTYPE yylloc
....
./scripts/dtc/dtc-lexer.lex.c:YYLTYPE yylloc;
....

根据报错信息,应对dtc-lexer.lex.c文件中的定义进行修改。考虑其它文件中使用extern关键字,这里同样可以在dtc-lexer.lex.c文件中的yylloc定义前增加extern关键字,避免重复定义。使用vi修改dtc-lexer.lex.c文件

vi scripts/dtc/dtc-lexer.lex.c

使用鼠标滚轮向下翻找,使用方向键移动光标,找到对应代码,按i修改
请添加图片描述
修改完成后按ESC,输入 :wq 保存并退出,保险起见可使用

cat scripts/dtc/dtc-lexer.lex.c

查看文件修改完成,再次运行编译命令

make CROSS_COMPILE=aarch64-linux-gnu-     

4.2 u_boot_dtsi

又发生报错 (╬ ̄皿 ̄)=○请添加图片描述从报错信息来看,与scripts/Makefile.lib:319: arch/arm/dts/sun50i-h5-nanopi-neo2.dtb的编译有关(这里根据错误信息可知为arch/arm/dts/.sun50i-h5-nanopi-neo2.dtb.pre.tmp文件中第87行1~10列存在语法错误):

Error: arch/arm/dts/.sun50i-h5-nanopi-neo2.dtb.pre.tmp:87.1-10 syntax error
FATAL ERROR: Unable to parse input tree
make[2]: *** [scripts/Makefile.lib:319: arch/arm/dts/sun50i-h5-nanopi-neo2.dtb] Error 1
make[1]: *** [dts/Makefile:43: arch-dtbs] Error 2
make: *** [Makefile:876: dts/dt.dtb] Error 2

至于这个arch/arm/dts/.sun50i-h5-nanopi-neo2.dtb.pre.tmp文件是哪儿来的呢。

查看scripts/Makefile.lib第319行,这里先安装vim,然后设置vim显示行号(在~/.vimrc文件中输入set nu,按ESC,输入:wq保存并退出)

sudo apt install vim
vim ~/.vimrc

请添加图片描述

然后查看scripts/Makefile.lib,找到第319行(这里配色方案有点奇怪。。。先不管了)
请添加图片描述
307~322行内容复制出来如下

quiet_cmd_dtc = DTC     $@
# Modified for U-Boot
# Bring in any U-Boot-specific include at the end of the file
cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \(cat $<; $(if $(u_boot_dtsi),echo '\#include "$(u_boot_dtsi)"')) > $(pre-tmp); \$(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $(pre-tmp) ; \$(DTC) -O dtb -o $@ -b 0 \-i $(dir $<) $(DTC_FLAGS) \-d $(depfile).dtc.tmp $(dtc-tmp) ; \cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)$(obj)/%.dtb: $(src)/%.dts FORCE$(call if_changed_dep,dtc) pre-tmp = $(subst $(comma),_,$(dot-target).pre.tmp)
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)

由于其中含有许多变量,具体内容不太好看,因此重新编译,增加参数V=1(查看完整的编译信息)

make CROSS_COMPILE=aarch64-linux-gnu- V=1

请添加图片描述
报错位置附近所执行的语句为(按分号分隔)

  mkdir -p arch/arm/dts/ ; 

这里是创建arch/arm/dts/目录,-p参数表示若无上层目录则同时创建上层目录。

  (cat arch/arm/dts/sun50i-h5-nanopi-neo2.dts; echo '\#include "sunxi-u-boot.dtsi"') > arch/arm/dts/.sun50i-h5-nanopi-neo2.dtb.pre.tmp; 

这一条语句是读取arch/arm/dts/sun50i-h5-nanopi-neo2.dts文件中的内容,并在最后增加一行

\#include "sunxi-u-boot.dtsi”

一起写入arch/arm/dts/.sun50i-h5-nanopi-neo2.dtb.pre.tmp文件中,查看此文件,其最后其一行确实相比arch/arm/dts/sun50i-h5-nanopi-neo2.dts文件增加了一行#include "sunxi-u-boot.dtsi”(此文件同时设置了用于输出u-boot启动过程信息的端口为uart0,波特率115200,对应引脚为PF5、PF6等相关信息)

/** Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>* Copyright (C) 2017 Jagan Teki <jteki@openedev.com>** This file is dual-licensed: you can use it either under the terms* of the GPL or the X11 license, at your option. Note that this dual* licensing only applies to this file, and not this project as a* whole.**  a) This library is free software; you can redistribute it and/or*     modify it under the terms of the GNU General Public License as*     published by the Free Software Foundation; either version 2 of the*     License, or (at your option) any later version.**     This library is distributed in the hope that it will be useful,*     but WITHOUT ANY WARRANTY; without even the implied warranty of*     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the*     GNU General Public License for more details.** Or, alternatively,**  b) Permission is hereby granted, free of charge, to any person*     obtaining a copy of this software and associated documentation*     files (the "Software"), to deal in the Software without*     restriction, including without limitation the rights to use,*     copy, modify, merge, publish, distribute, sublicense, and/or*     sell copies of the Software, and to permit persons to whom the*     Software is furnished to do so, subject to the following*     conditions:**     The above copyright notice and this permission notice shall be*     included in all copies or substantial portions of the Software.**     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,*     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES*     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND*     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT*     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,*     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING*     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR*     OTHER DEALINGS IN THE SOFTWARE.*//dts-v1/;#include "sun50i-h5.dtsi"#include <dt-bindings/gpio/gpio.h>/ {model = "FriendlyARM NanoPi NEO 2";compatible = "friendlyarm,nanopi-neo2", "allwinner,sun50i-h5";aliases {serial0 = &uart0;};chosen {stdout-path = "serial0:115200n8";};reg_vcc3v3: vcc3v3 {compatible = "regulator-fixed";regulator-name = "vcc3v3";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;};
};&mmc0 {compatible = "allwinner,sun50i-h5-mmc","allwinner,sun50i-a64-mmc","allwinner,sun5i-a13-mmc";pinctrl-names = "default";pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin>;vmmc-supply = <&reg_vcc3v3>;bus-width = <4>;cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */status = "okay";
};&uart0 {pinctrl-names = "default";pinctrl-0 = <&uart0_pins_a>;status = "okay";
};
\#include "sunxi-u-boot.dtsi"

其实在这里根据前述的错误信息,可知是第87行,新增的\#include "sunxi-u-boot.dtsi"中\#include这部分存在语法错误。分析可知去掉前面的\即可。

修改scripts/Makefile.lib第311行

vim scripts/Makefile.lib

将311行中的\去掉

改之前:(cat $<; $(if $(u_boot_dtsi),echo '\#include "$(u_boot_dtsi)"')) > $(pre-tmp); \
改之后:(cat $<; $(if $(u_boot_dtsi),echo '#include "$(u_boot_dtsi)"')) > $(pre-tmp); \

改好之后按ESC,输入:wq保存并退出。再次执行编译

make CROSS_COMPILE=aarch64-linux-gnu-     

请添加图片描述

5 烧写

插入SD卡,通过fdisk命令查看设备名称,这里我的SD为/dev/sdb

sudo fdisk -l
....
Disk /dev/sda: 128 GiB, 137438953472 bytes, 268435456 sectors
Disk model: Virtual disk    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: ********-****-****-****-************Device       Start       End   Sectors   Size Type
/dev/sda1     2048   1050623   1048576   512M EFI System
/dev/sda2  1050624 268433407 267382784 127.5G Linux filesystem....
Disk /dev/sdb: 14.88 GiB, 15974006784 bytes, 31199232 sectors
Disk model: SD Card Reader  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x********Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1        2048 31197183 31195136 14.9G  7 HPFS/NTFS/exFAT

将编译生成的sunxi-spl.bin和u-boot.itb烧写到SD卡上,其中/dev/sdX为实际的SD设备名

sudo dd if=spl/sunxi-spl.bin of=/dev/sdX bs=1024 seek=8
sudo dd if=u-boot.itb of=/dev/sdX bs=1024 seek=40

6 上电验证

将SD卡插入nanopi neo2的插槽,将UART0接到电脑上,使用相关串口工具接收串口信息。从前述分析可知,波特率为115200,上电,u-boot成功启动,输出信息如下
请添加图片描述
输入help可以获取u-boot命令行的相关命令,这里就不做展示了

本章完结撒花✿✿ヽ(°▽°)ノ✿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

seata分布式事务(与dubbo集成)

1.seata是什么? Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.seata的注解 GlobalTransactional&#xff1a;全局事务注解&#xff0c;添加了以后可实现分布式事务的回滚和提交&#xff0c;用法与spring…

【.NET Core】Lazy<T> 实现延迟加载详解

【.NET Core】Lazy 实现延迟加载详解 文章目录 【.NET Core】Lazy<T> 实现延迟加载详解一、概述二、Lazy<T>是什么三、Lazy基本用法3.1 构造时使用默认的初始化方式3.2 构造时使用指定的委托初始化 四、Lazy.Value使用五、Lazy扩展用法5.1 实现延迟属性5.2 Lazy实现…

MySQL 日志之二进制日志-binlog

1、简介 MySQL 的二进制日志记录了对 MySQL 所有的更改操作&#xff0c;不包括 select 和 show 等操作。二进制日志文件主要有&#xff1a;数据恢复、主从复制、审计&#xff08;判断是否有注入攻击&#xff09;等作用。 2、二进制日志参数配置 2.1、文件参数配置 linux 中 My…

安装nvidia driver出现 the cc vision check falied

这里提示说的需要gcc12,但是我只有gcc11,所以就报错了&#xff0c;说一说我自己的解决方法&#xff1a; 安装gcc12和g12,再切换版本为gcc12 安装gcc12: sudo apt install gcc-12安装g12: sudo apt -y install g-12切换版本&#xff1a;参考博客

Linux的SSH服务

一.SSH服务简介 1.什么是SSH SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在应…

【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(文件处理指令-上)

文件处理指令-上 背景前言专栏介绍面向对象重点内容文件处理命令file格式[options] 主要参数简单说明使用案例 mkdir格式[options] 主要参数应用实例 grep格式主要参数[optionsl 主要参数 应用实例pattern正则表达式主要参数 应用实例fgrep和egrep dd格式[options]主要参数 应用…

linux 网络设置

查看linux基础的网络配置 命令 网关route -nip 地址ifconfig / ip aDNS 服务器cat /etc/resolv.conf主机名hostname路由route -n网络连接状态ss / netstat 一&#xff0c;ifconfig 查看网络接口信息 &#xff08;一&#xff09;ifconfig …

设计模式—— 单例设计模式

单例设计模式 什么是单例模式 单例模式是一种对象创建型模式&#xff0c;使用单例模式&#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说&#xff0c;在整个程序空间中&#xff0c;该类只存在一个实例对象。 为什么使用单例模式 在应用系统开发中&#xff0c;我…

【MIdjourney】镜头效果关键词

1.景深(depth of field) 景深&#xff08;DOF&#xff09;&#xff0c;是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。镜头光圈、镜头距离、及焦平面到拍摄物的距离是影响景深的重要因素。 在MIdjourney中&#xff0c;该关键字会使得…

数字化时代,CDMP/CDGA认证企业个人都需要

&#x1f3af;数字化时代&#xff0c;CDMP(数据管理专业人士)和CDGA(数据治理工程师)认证对于企业和个人来说都是非常重要的。 &#x1f4d2;对于企业而言&#xff1a; ✅为企业赋能 数字化培训是企业在数字化转型中的重要考核标准之一。国资委、工信部、银保监会等都有明确的要…

Python之jieba分词相关介绍

1.jieba分词的安装 直接在cmd窗口当中pip install即可 2.jieba分词的介绍 jieba分词是目前比较好的中文分词组件之一&#xff0c;jieba分词支持三种模式的分词(精确模式、全模式、搜索引擎模式)&#xff0c;并且支持自定义词典(这一点在特定的领域很重要&#xff0c;有时候…

SpringBoot使用MockMVC单元测试Controller

对模块进行集成测试时&#xff0c;希望能够通过输入URL对Controller进行测试&#xff0c;如果通过启动服务器&#xff0c;建立http client进行测试&#xff0c;这样会使得测试变得很麻烦&#xff0c;比如启动速度慢&#xff0c;测试验证不方便&#xff0c;依赖网络环境等&#…

GitHub项目推荐-incubator

项目地址 Github地址&#xff1a;GitHub - apache/incubator-anser 官网&#xff1a;Apache Answer | Free Open-source Q&A Platform 项目简述 这是Apache的一个开源在线论坛&#xff0c;也可以部署成为一个自有的QA知识库。项目主要使用了Go和Typescript来开发&#…

【MATLAB源码-第109期】基于matlab的哈里斯鹰优化算发(HHO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 哈里斯鹰优化算法&#xff08;Harris Hawk Optimization, HHO&#xff09;是一种受自然界捕食行为启发的优化算法。它基于哈里斯鹰的捕猎策略和行为模式&#xff0c;主要用于解决各种复杂的优化问题。这个算法的核心特征在于…

层叠布局(Stack)

目录 1、概述 2、开发布局 3、对齐方式 3.1、TopStart 3.2、Top 3.3、TopEnd 3.4、Start 3.5、Center 3.6、End 3.7、BottomStart 3.8、Bottom 3.9、BottomEnd 4、Z序控制 5、场景示例 1、概述 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一…

31 树的存储结构二

DIsplay() 递归显示 :图示 求树的高度时&#xff0c;递归的技巧 在递归的过程中&#xff1a;ret单独和任意一个子树的子高度比较&#xff0c;如果ret<max&#xff0c;retmax ------------- 注意&#xff1a;组织链表和子链表的【元素类型】都是TLNode* 链表都要先通过TLNod…

Validation--自定义校验

前言&#xff1a; 今天学到这个&#xff0c;闲着也是闲着&#xff0c;就写一个记录一下&#xff0c;也算是总结 我们的步骤是这样的 1.自定义注解State 2.自定义校验数据的类StateValidation实现ConstrainValidator接口 3.在需要校验的地方使用自定义注解 1.自定义注解 这…

C语言如何提高程序的可读性?

一、问题 可读性是评价程序质量的一个重要标准&#xff0c;直接影响到程序的修改和后期维护&#xff0c;那么如何提高程序的可读性呢? 二、解答 提高程序可读性可以从以下几方面来进行。 &#xff08;1&#xff09;C程序整体由函数构成的。 程序中&#xff0c;main()就是其中…

Mysql事务隔离级别是怎么实现的?

Mysql事务 事务概念事务特性事务并发事务隔离级别MVCC多版本并发控制 事务概念 小钢同学今天发工资了&#xff0c;赶紧打开招商银行app看看工资到账了没有&#xff0c;查看余额300 嗯&#xff0c;今天心情好&#xff0c;给对象转账50大元买lv包包去&#xff0c;最后的结果肯定…

Vmware虚拟机问题解决方案 运行虚拟机系统蓝屏 运行虚拟机时报错VT-x

1. 运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2. 卸载Vmware步骤 1). 卸载已经安装的VMware 弹出确认框, 点击…