【Tiny4412】Tiny4412编译和烧写uboot
发布日期:2021-06-29 20:47:22 浏览次数:2 分类:技术文章

本文共 7092 字,大约阅读时间需要 23 分钟。

00. 目录

文章目录

01. Uboot简介

1.1 Uboot概述

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序

1.2 uboot目录结构

  • api 是uboot提供接口的函数
  • arch 是体系架构相关的代码
  • board 目标板相关文件,主要包含SDRAM、FLASH驱动;
  • common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;
  • disk 磁盘分区相关代码
  • doc 文档
  • cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;
  • driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)
  • doc U-Boot的说明文档;
  • examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;
  • fs 文件系统目录 支持嵌入式常见的文件系统
  • include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;
  • lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;
  • nand_spl nand存储器相关代码
  • net 与网络功能相关的文件目录,如bootp,nfs,tftp;
  • post 上电自检文件目录。尚有待于进一步完善;
  • rtc RTC驱动程序;
  • tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;

1.3 工作模式

U-Boot的工作模式有启动加载模式下载模式

启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式操作系统从FLASH中加载到SDRAM中运行,整个过程是自动的。

下载模式就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的FLASH中。用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。

1.4 Uboot启动流程

大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

1、 stage1(start.s代码结构)
U-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:
(1) 定义入口。由于一个可执行的image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在rom(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2)设置异常向量(exception vector)。
(3)设置CPU的速度、时钟频率及中断控制寄存器。
(4)初始化内存控制器 。
(5)将rom中的程序复制到ram中。
(6)初始化堆栈 。
(7)转到ram中执行,该工作可使用指令ldrpc来完成。

2、 stage2(C语言代码部分)

lib_arm/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如下操作:
(1)调用一系列的初始化函数。
(2)初始化flash设备。
(3)初始化系统内存分配函数。
(4)如果目标系统拥有nand设备,则初始化nand设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网络设备,填写ip,c地址等。
(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

1.5 常用的bootloader

U-Boot

U-Boot(Universal BootLoader)是遵循GPL条款的开放源码项目,是在PPCBoot以及ARMBoot的基础上逐步发展和演化而来,现在U-Boot已经能够支持PowerPC、ARM、X86、MIPS等体系结构的上百种开发板,已经成为功能最多、灵活性最强,并且开发最积极的开放源码的BootLoader。

vivi

vivi是由韩国Mizi公司开发的一种BootLoader,专门针对ARM9处理器而设计,支持S3C2410x处理器。和所有的BootLoader一样,vivi有两种工作模式,即启动加载模式和下载模式。当vivi处于下载模式时,它为用户提供一个命令行接口,通过该接口可以使用vivi提供的一些命令。

Blob

Blob(BootLoader Object)是由Jan-Derk Bakker和Erik Mouw发布,专为StrongARM构架下的LART设计的BootLoader。
Blob支持SA1100的LART主板,但用户也可以自行修改移植。Blob也提供两种工作模式,在启动时处于正常的启动加载模式,但是它会延时10秒等待终端用户按下任意键而将Blob 切换到下载模式。如果在10秒内没有用户按键,则Blob继续启动Linux内核。

ARMboot

ARMboot是一个ARM平台的开源固件项目,它严重依赖于PPCBoot。ARMboot支持的处理器构架有StrongARM,ARM720T,PXA250等,是为基于ARM或者StrongARM CPU的嵌入式系统所设计的。ARMboot的目标是成为通用的、容易使用和移植的引导程序,非常轻便地运用于新的平台上。总得来说,ARMboot介于大、小型BootLoader之间,相对轻便,基本功能完备,缺点是缺乏后续支持。ARMboot发布的最后版本为ARMboot–1.1.0,2002年终止了ARMboot的维护,其发布网址为:http://sourceforge.net/projects/armboot。

Redboot

RedBoot是标准的嵌入式调试和引导解决方案,是一个专门为嵌入式系统定制的引导工具,最初由Redhat开发,是嵌入式操作系统eCos的一个最小版本,是随eCos发布的一个BOOT方案,是一个开源项目。现在交由自由软件组织FSF管理,遵循GPL。集BootLoader、调试、Flash烧写于一体。支持串口、网络下载、执行嵌入式应用程序。既可以用在产品的开发阶段(调试功能),也可以用在最终的产品上(Flash更新、网络启动)。

RedBoot支持的处理器构架有ARM、MIPS、PowerPC、x86等,是一个完善的嵌入式系统BootLoader。

02. 安装交叉编译器

交叉编译器:在宿主机上编译出能够在目标机上运行的代码的工具。咱们的压缩包为arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz。

2.1 解压交叉编译器工具

[root@itcast tools]# tar -xzvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz

2.2 创建arm目录

[root@itcast tools]# mkdir /usr/local/arm[root@itcast tools]#

2.3 拷贝对应的文件到arm目录

[root@itcast tools]# cp opt/FriendlyARM/toolschain/4.5.1/ /usr/local/arm/ -rf[root@itcast tools]#

2.4 设置环境变量

[root@itcast /]# vim ~/.bash_profile PATH=$PATH:$HOME/bin# 新增加的内容如下PATH=/usr/local/arm/4.5.1/bin:$PATH

2.5 注销系统

Ctrl + Alt + BackSpace 重新登录

2.6 测试交叉编译器

#输入arm-linux- 按两下tab键 如果出现如下内容表示环境已经设置好[root@itcast tools]# arm-linux-arm-linux-addr2line  arm-linux-cpp        arm-linux-gprof      arm-linux-populatearm-linux-ar         arm-linux-g++        arm-linux-ld         arm-linux-ranlibarm-linux-as         arm-linux-gcc        arm-linux-ldd        arm-linux-readelfarm-linux-c++        arm-linux-gcc-4.5.1  arm-linux-nm         arm-linux-sizearm-linux-cc         arm-linux-gccbug     arm-linux-objcopy    arm-linux-stringsarm-linux-c++filt    arm-linux-gcov       arm-linux-objdump    arm-linux-strip

03. 编译Uboot

3.1 解压uboot

[root@itcast tools]# tar -xjvf uboot_tiny4412-master.tar.bz2

3.2 配置uboot

[root@itcast tools]# cd uboot_tiny4412-master[root@itcast uboot_tiny4412-master]# make tiny4412_config awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg > .boards.dependConfiguring for tiny4412 board...[root@itcast uboot_tiny4412-master]#

3.3 编译uboot

[root@itcast uboot_tiny4412-master]# make -j4....arm-linux-ld: warning: creating a DT_TEXTREL in object.arm-linux-objcopy -O srec u-boot u-boot.srecarm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin

3.4 生成对应工具

[root@itcast sd_fuse]# lsMakefile  sd_fdisk.c  tiny4412  V310-EVT1-mkbl2.c[root@itcast sd_fuse]# make gcc -o	mkbl2 V310-EVT1-mkbl2.c gcc -o	sd_fdisk sd_fdisk.c[root@itcast sd_fuse]#

04. 烧写Uboot

4.1 解挂SD卡

[root@itcast /]# umount /media/*[root@itcast /]#

4.2 格式化SD卡

[root@itcast /]# dd if=/dev/zero of=/dev/sdb bs=1024 count=1024记录了1024+0 的读入记录了1024+0 的写出1048576字节(1.0 MB)已复制,1.79304 秒,585 kB/秒[root@itcast /]#

4.3 烧写Uboot到SD卡

[root@itcast tiny4412]# pwd/home/tools/uboot_tiny4412-master/sd_fuse/tiny4412[root@itcast tiny4412]# ./sd_fusing.sh  /dev/sdb/dev/sdb reader is identified.---------------------------------------BL1 fusing记录了16+0 的读入记录了16+0 的写出8192字节(8.2 kB)已复制,0.0816119 秒,100 kB/秒---------------------------------------BL2 fusing记录了28+0 的读入记录了28+0 的写出14336字节(14 kB)已复制,0.255752 秒,56.1 kB/秒---------------------------------------u-boot fusing记录了540+1 的读入记录了540+1 的写出276932字节(277 kB)已复制,4.6861 秒,59.1 kB/秒---------------------------------------TrustZone S/W fusing记录了184+0 的读入记录了184+0 的写出94208字节(94 kB)已复制,2.49234 秒,37.8 kB/秒---------------------------------------U-boot image is fused successfully.Eject SD card and insert it again.[root@itcast tiny4412]#

到此,uboot已经烧写到SD中。

05. 测试Uboot

在Linux平台我们使用minicom作为串口调试工具。

5.1 安装minicom(如果没有安装minicom的话)

[root@itcast sd_fuse]# yum install minicom.x86_64

5.2 设置minicom

[root@itcast sd_fuse]# minicom -s# 选择第三个选项 按下回车

在这里插入图片描述

按下回车

在这里插入图片描述

备注:

115200 波特率

8N1: 8数据位 N 奇校验 1停止位

保存为默认配置,下次启动就不需要配置。

在这里插入图片描述

5.3 启动minicom

此时板子上电,从SD卡启动,输出如下信息

[root@itcast /]# minicom U-Boot 2010.12 (Jun 04 2020 - 17:01:06) for TINY4412     CPU:    S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]        APLL = 1400MHz, MPLL = 800MHzBoard:  TINY4412DRAM:   1023 MiBvdd_arm: 1.2vdd_int: 1.0vdd_mif: 1.1BL1 version:  N/A (TrustZone Enabled BSP)Checking Boot Mode ... SDMMCREVISION: 1.1MMC Device 0: 7580 MBMMC Device 1: 3728 MBMMC Device 2: N/A*** Warning - using default environmentNet:    No ethernet found.Hit any key to stop autoboot:  0 TINY4412 #

此时uboot已经启动了。

06. 常见问题解决

6.1 问题一 没有那个文件或目录

[root@itcast uboot_tiny4412-master]# arm-linux-gcc -vbash: /usr/local/arm/4.5.1/bin/arm-linux-gcc: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录[root@itcast uboot_tiny4412-master]#

解决办法:

[root@itcast uboot_tiny4412-master]# yum install glibc.i686[root@itcast uboot_tiny4412-master]# arm-linux-gcc -vUsing built-in specs.COLLECT_GCC=arm-linux-gcc

6.2 问题二:找不到libz.so动态库

编译过程中

在这里插入图片描述

解决办法

[root@itcast uboot_tiny4412-master]# yum install zlib*.i686

07. 附录

7.1 arm-linux-gcc下载:

7.2 uboot下载:

转载地址:https://dengjin.blog.csdn.net/article/details/106554062 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Tiny4412】Tiny4412烧写uboot脚本分析
下一篇:【Tools】TeamViewer安装教程

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月12日 00时42分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章