关于tiny4412开发板SD卡烧写u-boot脚本sd_fusing.sh的解释

2023-10-10 07:50

本文主要是介绍关于tiny4412开发板SD卡烧写u-boot脚本sd_fusing.sh的解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于嵌入式linux开发而言拿到tiny4412开发板
第一件事就是将定制好linux内核跟板子实现很好的挂接
CPU跟MCU(单片机)不同,单片机内部集成了RAM、ROM,在大多数情况下单个芯片就可以完成
程序的存储以及运行。
但是CPU,一般内部不集成或者只集成很小的RAM ROM空间,
只提供芯片进行最基本的开机配置或者进行程序引导来使用。
CPU生来为运行大型任务或者操作系统而生,运行的程序或者系统占用空间比较大,
将他们存放到CPU内部显然不现实,就需要将他们存放到cpu外部存储设备。
就像电脑要发挥作用需要为芯片额外配置内存条、硬盘一样。
tiny4412开发板板载芯片是三星公司的Exynos4412芯片,该款芯片支持的启动设备包括:
General NAND flash memory:NAND Flash
SD/MMC memory card:SD卡
eMMC memory:eMMc
USB device:USB设备
在tiny4412开发板核心板上集成DDR3 1G大小的RAM(相当于电脑内存条),4GB eMMc存储(相当于计算机硬盘)
还有额外的SD卡座(相当于计算机硬盘)。
开发板提供了一个开关进行启动设备的切换(SD启动 eMMc启动);
为了方便起见,在学习测试时还是以上面两种方式为主
为了保险,防止学习测试时频繁擦写或者操作意外导致eMMc损坏变“砖”的情况,建议初学者还是以SD卡方式启动(将SD卡作为‘硬盘’)。
毕竟SD易得,核心板不易得。SD卡在进行u-boot烧写之前用光盘里的sd格式化工具格式化,否则不能烧写成功。
从光盘将uboot安装包uboot_tiny4412-sdk1506.2.19.tgz拷贝到虚拟机
利用tar xf uboot_tiny4412-sdk1506.2.19.tgz解压安装包得到解压文件夹       
[root@localhost zhangchao]# tar xf uboot_tiny4412-sdk1506.2.19.tgz 
[root@localhost zhangchao]# ls
uboot_tiny4412-sdk1506  uboot_tiny4412-sdk1506.2.19.tgz
解压完毕就可以看到 uboot_tiny4412-sdk1506这个文件夹
里面就是uboot源码和烧写uboot的脚本文件还有一些其他平台的支持文件(不止用于tiny4412)
打开文件夹查看内容
root@localhost zhangchao]# cd uboot_tiny4412-sdk1506
[root@localhost uboot_tiny4412-sdk1506]# ls
api         common       CREDITS  examples  MAINTAINERS  nand_spl     README           System.map  u-boot.lds
arch        config.mk    disk     fs        MAKEALL      net          rules.mk         tools       u-boot.map
board       COPYING      doc      include   Makefile     onenand_ipl  sd_fuse          u-boot      u-boot.srec
boards.cfg  COPYING.txt  drivers  lib       mkconfig     post         snapshot.commit  u-boot.bin
我们可以看到里面已经生成有 u-boot 的二进制文件但是这不一定就是针对tiny4412开发板的
所以我们还要进行处理一下:
执行以下命令
[root@localhost uboot_tiny4412-sdk1506]# make clean
make: arm-linux-gcc:命令未找到
/bin/sh: arm-linux-gcc: command not found
dirname: 缺少操作数
请尝试执行"dirname --help"来获取更多信息。
[root@localhost uboot_tiny4412-sdk1506]# make distclean
make: arm-linux-gcc:命令未找到
/bin/sh: arm-linux-gcc: command not found
dirname: 缺少操作数
请尝试执行"dirname --help"来获取更多信息。
/bin/sh: arm-linux-gcc: command not found
dirname: 缺少操作数
请尝试执行"dirname --help"来获取更多信息。
/bin/sh: arm-linux-gcc: command not found
dirname: 缺少操作数
请尝试执行"dirname --help"来获取更多信息。
[root@localhost uboot_tiny4412-sdk1506]# 
会出现报错找不到 arm-linux-gcc编译器
gcc编译器运行在windows x86平台,arm平台的gcc为arm-linux-gcc
交叉编译器arm-linux-gcc的安装:
将光盘里arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz拷贝到虚拟机
# tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 
复制解压目录下的toolschain目录 到/opt目录下
# vim /etc/profile
export PATH=/opt/toolschain/4.5.1/bin:$PATH
声明系统变量 
# source /etc/profile
更新文件
执行arm-linux-gcc -v命令
若成功打印出交叉编译器版本则证明安装成功
接下来在uboot解压目录uboot_tiny4412-sdk1506下执行make clean;make distclean;两条指令
make clean:清除生成目标信息 执行完后可以发现uboot.bin文件全都消失
make distclean:清除板子配置信息(默认可能不是4412)
执行完两条指令后再执行 make tiny4412_config命令进行单板配置
执行完毕 执行make 生成与tiny_4412开发板对应的uboot.bin文件
顶层makefile本篇文章先不分析,主要分析向SD卡烧写uboot的sh脚本
以上操作执行完毕,进入sd_fush文件夹
[root@localhost uboot_tiny4412-sdk1506]# cd sd_fuse/
[root@localhost sd_fuse]# ls
Makefile  mkbl2  sd_fdisk  sd_fdisk.c  tiny4412  V310-EVT1-mkbl2.c
[root@localhost sd_fuse]# 
如果文件夹下有mkbl2文件不用执行make  若没有执行make生成mkbl2文件先不解释为什么
进入tiny4412文件夹
[root@localhost sd_fuse]# cd tiny4412/
[root@localhost tiny4412]# ls
E4412_N.bl1.bin  E4412_tzsw.bin  fast_fuse.sh  sd_fusing.sh  uboot_tiny4412-sdk1506.tar.bz2
[root@localhost tiny4412]# 
执行SD烧写脚本(前提是SD卡已经挂载到虚拟机)
[root@localhost tiny4412]# ./sd_fusing.sh /dev/sdb
这样就把u-boot烧写进入SD卡,烧写完毕将卡插到开发板,启动设备选择开关拨到SD启动,开发板的串口线连接到
电脑,打开串口助手,打开发板电源就能看见u-boot启动过程。
u-boot是干嘛的?
u-boot类似电脑BIOS一样是引导系统用的,是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,
从而将系统的软硬件环境带到一个合适的状态,
以便为最终调用操作系统内核准备好正确的环境
除此之外它的好处还不少:
选择U-Boot的理由:
① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;

额,废话不多讲,我们在执行./sd_fusing.sh /dev/sdb时完成了u-boot的烧写,那么sd_fusing.sh文件中到底是怎样执行的呢?
接下来我们分析一下源码:
#
# Copyright (C) 2011 Samsung Electronics Co., Ltd.
#              http://www.samsung.com/
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
####################################
//上面的部分是一些介绍没什么讲的
//在shell脚本中$1代表传入的第二个参数,脚本自身算作第一个参数。
if [ -z $1 ]
thenecho "usage: ./sd_fusing.sh <SD Reader's device file>"exit 0
fi
//以上是shell脚本的if语句以fi结束
//主要功能是判断执行脚本时是否跟了参数
//如果没有跟参数,提示你执行脚本时要加上你的设备名,并退出脚本执行
if [ -b $1 ]
thenecho "$1 reader is identified."
elseecho "$1 is NOT identified."exit 0
fi
//上面同样是if判断语句
//判断设备是否是块文件设备
// /dev/sdb 属于SD卡设备属于块设备
//如果属于块设备 打印 <设备>被辨认出
//如果不是块设备 打印 <设备>没有被辨认####################################
#<verify device>BDEV_NAME=`basename $1`
BDEV_SIZE=`cat /sys/block/${BDEV_NAME}/size`
//定义两个变量 
//第一个是设备名称 也就是SD卡
//第二个是 设备扇区 块大小
if [ ${BDEV_SIZE} -le 0 ]; thenecho "Error: NO media found in card reader."exit 1
fi
//判断 设备块小于0 输出在设备里没有发现介质
if [ ${BDEV_SIZE} -gt 32000000 ]; thenecho "Error: Block device size (${BDEV_SIZE}) is too large"exit 1
fi
//判断设备块大于32000000,提示块设备存储块太大
####################################
# check filesE4412_UBOOT=../../u-boot.bin
MKBL2=../mkbl2
//定义两个变量
//第一个 生成的u-boot目录
//第二个 mkbl2文件的目录
if [ ! -f ${E4412_UBOOT} ]; thenecho "Error: u-boot.bin NOT found, please build it & try again."exit -1
fi
//判断u-boot.bin文件是否存在
//不存在 就提示文件不存在 重新编译建立
if [ ! -f ${MKBL2} ]; thenecho "Error: can not find host tool - mkbl2, stop."exit -1
fi
//判断mkbl2文件是否存在
//不存在 就提示文件不存在 
#<make bl2>
${MKBL2} ${E4412_UBOOT} bl2.bin 14336
//将u-boot.bin 转化为bl2.bin 具体怎样实现查看上一级目录的生成mkbl2的相关文件
####################################
# fusing imagessigned_bl1_position=1
bl2_position=17
uboot_position=49
tzsw_position=705
//定义扇区编号
#<BL1 fusing>
echo "---------------------------------------"
echo "BL1 fusing"
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=$1 seek=$signed_bl1_position
//前两行输出提示信息
//第三行烧写指令dd  iflag=dsync oflag=dsync保持同步读写IO
//if输出到of这er
//seek偏移量 这里是1 空出SD卡上0扇区储存卡的分区配置等信息 
//BL1从第一扇区开始存储 BL1 8k字节,SD每个扇区512B 1-16扇区正好是8K 17扇区开始存储BL2
#<BL2 fusing>
echo "---------------------------------------"
echo "BL2 fusing"
dd iflag=dsync oflag=dsync if=./bl2.bin of=$1 seek=$bl2_position
//前两行输出提示信息
//dd解释同上  具体为什么这样可以参考exynos4412启动流程
#<u-boot fusing>
echo "---------------------------------------"
echo "u-boot fusing"
dd iflag=dsync oflag=dsync if=${E4412_UBOOT} of=$1 seek=$uboot_position
//前两行输出提示信息
//dd解释同上
#<TrustZone S/W fusing>
echo "---------------------------------------"
echo "TrustZone S/W fusing"
dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=$1 seek=$tzsw_position
//前两行输出提示信息
//dd通上 E4412_tzsw.bin为厂家自带,从名字上看是关于trustzone的,不去理会
#<flush to disk>
sync
//更新到介质
####################################
#<Message Display>
echo "---------------------------------------"
echo "U-boot image is fused successfully."
echo "Eject SD card and insert it again."
//输出u-boot烧写成功信息

附:

   tiny4412 SD卡启动流程

 

基于以下环境的测试:

虚拟机:VMware12版本 CentOS7系统  arm-linux-gcc 4.5.1版本 SD卡闪迪8G SD卡                                                                                                   




























这篇关于关于tiny4412开发板SD卡烧写u-boot脚本sd_fusing.sh的解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI