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

来源:互联网 发布:js点击关闭弹出框 编辑:程序博客网 时间:2024/06/05 20:06
对于嵌入式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]# lsuboot_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]# lsapi         common       CREDITS  examples  MAINTAINERS  nand_spl     README           System.map  u-boot.ldsarch        config.mk    disk     fs        MAKEALL      net          rules.mk         tools       u-boot.mapboard       COPYING      doc      include   Makefile     onenand_ipl  sd_fuse          u-boot      u-boot.srecboards.cfg  COPYING.txt  drivers  lib       mkconfig     post         snapshot.commit  u-boot.bin
我们可以看到里面已经生成有 u-boot 的二进制文件但是这不一定就是针对tiny4412开发板的
所以我们还要进行处理一下:
执行以下命令
[root@localhost uboot_tiny4412-sdk1506]# make cleanmake: arm-linux-gcc:命令未找到/bin/sh: arm-linux-gcc: command not founddirname: 缺少操作数请尝试执行"dirname --help"来获取更多信息。[root@localhost uboot_tiny4412-sdk1506]# make distcleanmake: arm-linux-gcc:命令未找到/bin/sh: arm-linux-gcc: command not founddirname: 缺少操作数请尝试执行"dirname --help"来获取更多信息。/bin/sh: arm-linux-gcc: command not founddirname: 缺少操作数请尝试执行"dirname --help"来获取更多信息。/bin/sh: arm-linux-gcc: command not founddirname: 缺少操作数请尝试执行"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]# lsMakefile  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]# lsE4412_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 ]then    echo "usage: ./sd_fusing.sh <SD Reader's device file>"    exit 0fi//以上是shell脚本的if语句以fi结束//主要功能是判断执行脚本时是否跟了参数//如果没有跟参数,提示你执行脚本时要加上你的设备名,并退出脚本执行if [ -b $1 ]then    echo "$1 reader is identified."else    echo "$1 is NOT identified."    exit 0fi//上面同样是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 1fi//判断 设备块小于0 输出在设备里没有发现介质if [ ${BDEV_SIZE} -gt 32000000 ]; thenecho "Error: Block device size (${BDEV_SIZE}) is too large"exit 1fi//判断设备块大于32000000,提示块设备存储块太大##################################### check filesE4412_UBOOT=../../u-boot.binMKBL2=../mkbl2//定义两个变量//第一个 生成的u-boot目录//第二个 mkbl2文件的目录if [ ! -f ${E4412_UBOOT} ]; thenecho "Error: u-boot.bin NOT found, please build it & try again."exit -1fi//判断u-boot.bin文件是否存在//不存在 就提示文件不存在 重新编译建立if [ ! -f ${MKBL2} ]; thenecho "Error: can not find host tool - mkbl2, stop."exit -1fi//判断mkbl2文件是否存在//不存在 就提示文件不存在 #<make bl2>${MKBL2} ${E4412_UBOOT} bl2.bin 14336//将u-boot.bin 转化为bl2.bin 具体怎样实现查看上一级目录的生成mkbl2的相关文件##################################### fusing imagessigned_bl1_position=1bl2_position=17uboot_position=49tzsw_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卡                                                                                                   




























原创粉丝点击