对于嵌入式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 ]
then
    echo "usage: ./sd_fusing.sh <SD Reader's device file>"
    exit 0
fi
//以上是shell脚本的if语句以fi结束
//主要功能是判断执行脚本时是否跟了参数
//如果没有跟参数,提示你执行脚本时要加上你的设备名,并退出脚本执行
if [ -b $1 ]
then
    echo "$1 reader is identified."
else
    echo "$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 ]; then
	echo "Error: NO media found in card reader."
	exit 1
fi
//判断 设备块小于0 输出在设备里没有发现介质
if [ ${BDEV_SIZE} -gt 32000000 ]; then
	echo "Error: Block device size (${BDEV_SIZE}) is too large"
	exit 1
fi
//判断设备块大于32000000,提示块设备存储块太大
####################################
# check files


E4412_UBOOT=../../u-boot.bin
MKBL2=../mkbl2
//定义两个变量
//第一个 生成的u-boot目录
//第二个 mkbl2文件的目录
if [ ! -f ${E4412_UBOOT} ]; then
	echo "Error: u-boot.bin NOT found, please build it & try again."
	exit -1
fi
//判断u-boot.bin文件是否存在
//不存在 就提示文件不存在 重新编译建立
if [ ! -f ${MKBL2} ]; then
	echo "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 images


signed_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卡                                                                                                   




























Logo

更多推荐