Bootloader移植(上)

  • Bootloader 介绍
  • 什么是Bootloader
  • Bootloader的特点
  • Bootloader的操作模式
  • 常用bootloader介绍
  • U-boot介绍
  • U-boot命令介绍
  • 环境设置命令
  • 数据传输命令
  • 存储器访问命令
  • 加载运行命令
  • U-boot的配置编译
  • U-boot目录结构
  • 编译U-boot
  • U-boot编译生成的映像文件
  • U-boot镜像下载烧录


Bootloader 介绍

什么是Bootloader

  • Bootloader是硬件启动的引导程序,是运行操作系统的前提;
  • 在操作系统内核或用户应用程序运行之前运行的一小段代码对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
  • 在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。

Bootloader的特点

  • Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
  • 在移植系统时,首先为开发板移植Bootloader。
  • Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。

Bootloader的操作模式

  • 自启动模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
  • 交互模式:在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。可以被 Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。也可以通过串口接收用户的命令。

常用bootloader介绍

嵌入式 移植javascript 嵌入式 移植docker_嵌入式 移植javascript

U-boot介绍

u-boot(Universal Boot Loader)是德国DENX小组开发的用于多种嵌入式CPU的bootloader程序。遵循GPL条款。
从FADSROM、8xxROM 、PPCBOOT、Armboot逐步发展演化而来;

U-boot的特点:

  • 代码结构清晰、易于移植(见目录结构)
  • 支持多种处理器体系结构(见arch目录)
  • 支持众多开发板(目前官方包中有200多种,见board目录)
  • 命令丰富、有监控功能
  • 支持网络协议、USB、SD等多种协议和设备
  • 支持文件系统
  • 更新较活跃,使用者多,有助于解决问题

U-boot命令介绍

命令分类:

环境设置、数据传输、存储器访问、加载运行

环境设置命令

printenv 显示所有环境变量

嵌入式 移植javascript 嵌入式 移植docker_物联网_02


setenv 设置新的环境变量该变量临时存放在内存中,重启板子之后,该变量会消失。要用saveenv保存一下。

嵌入式 移植javascript 嵌入式 移植docker_开发板_03

saveenv 将当前定义的所有的环境变量值存入flash中

setenv + 变量名 在saveenv :删除变量

数据传输命令

U-boot # setenv ethaddr 11:22:33:44:55:66 //设置开发板的物理地址

U-boot # setenv  ipaddr  192.168.2.10
   U-boot # setenv  serverip  192.168.2.231
   U-boot # tftp  41000000  application.bin
   U-boot # tftp  41000000  zImage

存储器访问命令

Flash分为Nor Flash和NAND Flash,掉电不消失,内存掉电会消失,速度比内存满。一般使用Nor Flash做启动引导

区别:

Nor Flash

NAND Flash

按字节访问

按块访问

Nor Flash:

嵌入式 移植javascript 嵌入式 移植docker_开发板_04


NAND Flash:

嵌入式 移植javascript 嵌入式 移植docker_开发板_05

movi命令:

嵌入式 移植javascript 嵌入式 移植docker_开发板_06

加载运行命令

bootcmd 自启动命令

如果定义了该变量,在自启动模式下将会执行该环境变量中的命令。
将文件通过tftp自动下载到指定的地址
U-boot # setenv bootcmd tftp 41000000 uImage; bootm 41000000
U-boot # saveenv

嵌入式 移植javascript 嵌入式 移植docker_物联网_07


第一个命令下载内核,第二个命令下载设备树,第三个命令运行内核

go addr 执行内存中的二进制代码,简单的跳转到指定地址(运行裸机程序)

bootm kernel-addr ramdisk-addr dtb-addr

嵌入式 移植javascript 嵌入式 移植docker_物联网_08

引导内核为内核传参,其中内核和ramdisk通常为mkimage处理过的二进制文件。
从这个地址处自动启动程序

嵌入式 移植javascript 嵌入式 移植docker_嵌入式 移植javascript_09

U-boot的配置编译

U-boot目录结构

  • 平台相关
    arch, board, include…
  • 平台无关
    common, net, fs, drivers…
  • 工具和文档
    tools, doc

编译U-boot

U-boot的编译
整个工程通过Makefile来组织编译。顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像

顶层目录下的 Makefile
它负责u-boot整体配置和编译
在Makefile中指定使用的交叉工具链
配置u-boot: make origen_config
编译: make

使用build.sh编译
linux@linux:~/u-boot-2013.01-fs4412$ ./build.sh

#!/bin/sh

sec_path="CodeSign4SecureBoot/"
CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')
ROOT_DIR=$(pwd)
CUR_DIR=${ROOT_DIR##*/}

case "$1" in
	clean)
		echo make clean
		make mrproper
		;;
	*)
			
		if [ ! -d $sec_path ]
		then
			echo "**********************************************"
			echo "[ERR]please get the CodeSign4SecureBoot first"
			echo "**********************************************"
			return
		fi
		
		make fs4412_config
		
		make -j$CPU_JOB_NUM
		
		if [ ! -f checksum_bl2_14k.bin ]
		then
			echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
			echo "There are some error(s) while building uboot, please use command make to check."
			echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
			exit 0
		fi
		
		cp -rf checksum_bl2_14k.bin $sec_path
		cp -rf u-boot.bin $sec_path
		rm checksum_bl2_14k.bin
		
		cd $sec_path
		cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-fs4412.bin
		mv u-boot-fs4412.bin $ROOT_DIR
		
		rm checksum_bl2_14k.bin
		rm u-boot.bin

		echo 
		echo 
		;;
		
esac

U-boot编译生成的映像文件

嵌入式 移植javascript 嵌入式 移植docker_开发板_10

U-boot镜像下载烧录

烧录编译产生的镜像 u-boot.bin
初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录

专用的烧录工具如h-jtag或DNW等
在u-boot已经能工作,升级或修正U-boot时,可用U-boot中的命令来烧录

其它方式 如SD卡 , Fastboot命令
镜像固化位置
ROM、NOR FLASH、NAND FLASH EMMC等

u-boot-fs4412.bin

u-boot.bin是u-boot编译源码后直接产生的,一般的的开发板,直接烧写这个文件就可以了

但是三星的cortex_a9 exynos4412这款CPU把uboot中一些初始化时钟等的代码剥离出去了,所以,编译好的这个u-boot.bin还要加上被剥离出去的部分,才可以正常使用

所以在build.sh脚本文件中,在u-boot.bin之前加上了剥离出去的部分后,生成了u-boot-fs4412.bin

嵌入式 移植javascript 嵌入式 移植docker_嵌入式 移植javascript_11