关于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

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

在 Spring Boot 中连接 MySQL 数据库的详细步骤

《在SpringBoot中连接MySQL数据库的详细步骤》本文介绍了SpringBoot连接MySQL数据库的流程,添加依赖、配置连接信息、创建实体类与仓库接口,通过自动配置实现数据库操作,... 目录一、添加依赖二、配置数据库连接三、创建实体类四、创建仓库接口五、创建服务类六、创建控制器七、运行应用程序八

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

解决Failed to get nested archive for entry BOOT-INF/lib/xxx.jar问题

《解决FailedtogetnestedarchiveforentryBOOT-INF/lib/xxx.jar问题》解决BOOT-INF/lib/xxx.jar替换异常需确保路径正确:解... 目录Failed to get nested archive for entry BOOT-INF/lib/xxx

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指