讯为4412开发板嵌入式学习(十)uboot源代码结构

2023-11-03 07:00

本文主要是介绍讯为4412开发板嵌入式学习(十)uboot源代码结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 三、uboot源代码结构
      • (一)、各文件/文件夹说明
    • 四、编译脚本build_uboot.sh分析

上一篇:讯为4412开发板嵌入式学习(九)uboot启动过程
下一篇:讯为4412开发板嵌入式学习(十一)Makefile代码分析

三、uboot源代码结构

uboot目录下文件列表如下:

在这里插入图片描述

(一)、各文件/文件夹说明

  • COPYING:版权相关的说明文档。
  • CREDITS:工作人员的名单。
  • E4212:和4212板子相关的文件。
  • E4412_N.bl1.bin:三星提供的BL1二进制文件。
  • MAINTAINERS:维护者名单
  • MAKEALL:编译相关文件。
  • Makefile:编译脚本。
  • README和readme.txt:项目说明文档。
  • System.map:
  • all00_padding.bin:用0补全的二进制文件。
  • api:常用的接口。
  • board:常用的主板文件,这里只保留4412开发板的主板相关目录/board/samsung/smdkc210。
  • build_uboot.sh:编译脚本。
  • common:与架构无关的通用文件。
  • config.mk:配置文件。
  • cpu:cpu相关的文件,可根据所使用的cpu选择。这里只保留和4412相关的文件夹arm_cortexa9。
  • disk:实现磁盘分区的接口。
  • doc:uboot相关说明文档。
  • drivers:uboot中的驱动文件,如外设iic、spi、gpio、usb、watchdog、dma和mmc等。
  • examples:uboot上可运行的例程
  • fs:操作系统内的文件系统,和文件系统格式化相关,如fat、ext2、ubifs、yaffs2、jffs2等文件系统。
  • include:包含通用的头文件以及与架构相关的文件,这里删除除asm-arm以外的以asm- 为前缀的文件夹。
  • lib前缀的文件:库相关的文件。只保留lib_arm、lib_generic和libfdt,删除其他以lib_为前缀的文件。可执行下列操作删除文件sudo rm -rf lib_avr32 lib_blackfin lib_i386 lib_m68k lib_microblaze lib_mips lib_nios lib_nios2 lib_ppc lib_sh lib_sparc
  • mkbl2:编译相关文件。
  • mkconfig:编译配置文件。
  • mkuboot:编译uboot脚本文件。
  • nand_spl和onenand_ipl:eMMC相关,可删除。sudo rm -rf and_spl onenand_ipl
  • net:网络驱动文件。
  • paddingaa:补丁文件。
  • post:自检文件。
  • rules.mk:脚本编译的说明文件。
  • sdfuse和sdfuse_q:sd卡烧写相关
  • tc4_cmm.cmm和uboot_readme.txt:三星tc4开发板相关文档。
  • tools:编译烧写等工具。
  • CodeSign4SecureBoot_POP和CodeSign4SecureBoot_SCP:安全启动相关的加密文件。

四、编译脚本build_uboot.sh分析

#!/bin/sh
#上面这句话用于指定脚本的解释器路径#$1代表传入的第一个参数,($0表示脚本文件名)-z是判断后面的参数是否为零
if [ -z $1 ]
then	
#如果无传入参数,则输出错误信息并退出脚本echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"echo "Please use correct make config.for example make SCP_1GDDR for SCP 1G DDR CoreBoard linux,android OS"echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"exit 0
fi
#如果输入参数$1的值是字符串"SCP_1GDDR"|"SCP_2GDDR"|"SCP_1GDDR_Ubuntu"|"SCP_2GDDR_Ubuntu"则执行下一步
if   [ "$1" = "SCP_1GDDR" ] ||   [ "$1" = "SCP_2GDDR" ] || [ "$1" = "SCP_1GDDR_Ubuntu" ] ||   [ "$1" = "SCP_2GDDR_Ubuntu" ]
then #根据传入参数设置对应的sec路径和核心板类型,这部分程序是三星提供的加密相关的文件sec_path="../CodeSign4SecureBoot_SCP/"CoreBoard_type="SCP"elif [ "$1" = "POP_1GDDR" ] || [ "$1" = "POP_1GDDR_Ubuntu" ]
thensec_path="../CodeSign4SecureBoot_POP/"CoreBoard_type="POP"elif [ "$1" = "POP_2GDDR" ] ||  [ "$1" = "POP_2GDDR_Ubuntu" ]
thensec_path="../CodeSign4SecureBoot_POP/"CoreBoard_type="POP2G"
elseecho "make config error,please use correct params......"exit 0
fi#获取CPU的核心数
#指令grep processor /proc/cpuinfo 输出
#processor	: 0
#processor	: 1
#processor	: 2
#processor	: 3
#$NF表示最后一个列(field),即输出最后一个字段的内容,即field=3,然后打印field+1
CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')
#获取当前目录
ROOT_DIR=$(pwd)
# '##*/'指的是ROOT_DIR目录最右面的/,即当前路径名。 另外'#/'指的是最左面的/
CUR_DIR=${ROOT_DIR##*/}#清除所有生成的文件
make distclean#删除板子和CPU相关的链接文件
rm ${ROOT_DIR}/board/samsung/smdkc210/lowlevel_init.S	
rm ${ROOT_DIR}/cpu/arm_cortexa9/s5pc210/cpu_init.S#判断传入参数$1是哪种情况
case "$1" in
#执行清除指令clean)#删除大多数的编译生成文件,但是会保留内核的配置文件.configecho make clean#删除所有的编译生成文件、内核配置文件(.config文件)和各种备份文件make mrproper;;
#除了clean以外	*)#判断是否存在三星提供的加密解密目录(directory)$sec_pathif [ ! -d $sec_path ]#不存在该目录thenecho "**********************************************"echo "[ERR]please get the CodeSign4SecureBoot first"echo "**********************************************"return#存在该目录fi#判断是何种输入参数,从而执行相关编译配置指令if [ "$1" = "SCP_1GDDR" ]thenmake itop_4412_android_config_scp_1GDDRelif [ "$1" = "SCP_2GDDR" ]thenmake itop_4412_android_config_scp_2GDDRelif [ "$1" = "POP_1GDDR" ]thenmake itop_4412_android_config_pop_1GDDRelif [ "$1" = "POP_2GDDR" ]thenmake itop_4412_android_config_pop_2GDDRelif [ "$1" = "SCP_1GDDR_Ubuntu" ]	thenmake itop_4412_ubuntu_config_scp_1GDDRelif [ "$1" = "SCP_2GDDR_Ubuntu" ]thenmake itop_4412_ubuntu_config_scp_2GDDRelif [ "$1" = "POP_1GDDR_Ubuntu" ]thenmake itop_4412_ubuntu_config_pop_1GDDRelif [ "$1" = "POP_2GDDR_Ubuntu" ]thenmake itop_4412_ubuntu_config_pop_2GDDRfi	#这部分使用上面获取的最大cpu核心数进行编译(最快速度)make -j$CPU_JOB_NUM#判断是否存在文件(file)BL2校验和文件if [ ! -f checksum_bl2_14k.bin ]thenecho "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"echo "There are some error(s) while building uboot, please use command make to check."echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"exit 0fi#复制BL2校验和文件、u-boot文件cp -rf checksum_bl2_14k.bin $sec_pathcp -rf u-boot.bin $sec_path#删除BL2校验和文件rm checksum_bl2_14k.bin#进入安全启动文件目录cd $sec_path#./codesigner_v21 -v2.1 checksum_bl2_14k.bin BL2.bin.signed.4412 Exynos4412_V21.prv -STAGE2#gernerate the uboot bin file support trust zone#cat E4412.S.BL1.SSCR.EVT1.1.bin E4412.BL2.TZ.SSCR.EVT1.1.bin all00_padding.bin u-boot.bin E4412.TZ.SSCR.EVT1.1.bin > u-boot-iTOP-4412.bin#根据核心板类型,将几个二进制文件连接起来 BL1+BL2+padding+u-boou.bin+TZSW = u-boot-iTOP-4412.binif  [ "$CoreBoard_type" = "SCP" ]thencat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-iTOP-4412.binelif [ "$CoreBoard_type" = "POP" ]thencat E4412.S.BL1.SSCR.EVT1.1.bin E4412.BL2.TZ.SSCR.EVT1.1.bin all00_padding.bin u-boot.bin E4412.TZ.SSCR.EVT1.1.bin > u-boot-iTOP-4412.binelif [ "$CoreBoard_type" = "POP2G"  ]thencat bl2.bin u-boot.bin E4412.TZ.SSCR.EVT1.1.bin > u-boot-iTOP-4412.binelseecho  "make uboot image error......" fi#移动u-boot-iTOP-4412.bin文件到uboot目录下mv u-boot-iTOP-4412.bin $ROOT_DIR#移除校验和文件和u-boot.bin文件rm checksum_bl2_14k.bin#rm BL2.bin.signed.4412rm u-boot.binecho echo ;;
esac

参考资料:
ARM 中断状态和SVC状态的堆栈切换 (异常)

ARM官方手册

IRAM IROM 区别

Linux grep 命令

Linux awk 命令

makefile下$^,$@,$?定义使用详解

Linux sed 命令

Shell 传递参数

makefile中的:BUILD_DIR解释

cat <<EOF

Tcsh脚本编程

makefile之findstring函数

$(origin variable)详解

uboot笔记之makefile分析

u-boot.lds链接文件详解

x86 Assembly Language Reference Manual

ARM Assembly Language Programming

这篇关于讯为4412开发板嵌入式学习(十)uboot源代码结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336425

相关文章

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]