一、移植前说明:
1、 特别声明:此文档是我的学习文档,里面肯定有错误地方,仅供参考!
2、移植平台:友善之臂Tiny4412SDK1306平台。
3、移植系统:Ubuntu12.04
4、移植原始CODE:平台光盘中由Samsung提供的U-Boot-samsung-dev.tar.bz2。为什么用这个,只能说因为我也菜鸟,我找了u-boot官网最新的代码看了一下,我没有在board\samsung目录下找到与Exynos4412芯片很相关的平台目录,估计是有的,只是由于我很菜,不清楚是那一个,为了省自学时间,还是用三星提供的U-Boot源码。
5、参考文档:各相关手册,主要手册是Exynos4412 RISC Microprocessor Revision 1.0 完整版,其实三星公司资料对个人来讲,挺难弄到手的,没有签署NDA,基本上很难从其官网上找到什么有用的资料,虽然他是为自己公司的种种利益,但对我们这些个人菜鸟来讲,没有找到好的手册,就是个恶梦呀,这里小小的鄙视一下三星!其他有一些芯片厂商的资料提供的好很多。但还好,谢谢网络的发达,有网友分享了一份完整版的手册。
另非常感谢作者:南山一梦的《Tiny210(S5PV210)U-BOOT》的移植说明,我也是刚学UBOOT移植,所有思路过程均参考此博文进行,部分原理说明内容也出自于此,所以,此文档也并非完全原创,本来这也是我自己学习记录的文档,这么多年我都是吸血的,本无意分享的,但网上关于exynos4412的学习资料太少,exynos4412学习起来诸多不易,我自己费了好多时间,走了好多弯路,才走到这一步,我想至少这份文档肯定会有一些参考价值的,整理后发出来仅供学习之用,请务商业化,谢谢!
6、备注:以下内容中我说手册的多少页,没有特殊说明手册名称的,一律都指Exynos4412 RISC Microprocessor Revision 1.0完整版手册。很多地方为省时省事,我也比较懒,敲不动中文了,直接就复制手册,上英文吧,大家也当练练英语嘛!
对应的代码我稍后会整理发出,我会要一两个资源分。我会给出三个版本代码,V0.1对应第一章裁剪后的代码。v0.2对应第二章到第14章的代码。v0.3对应后面增加LCD驱动的代码,主要是第19章代码的变动,发出三个版本来是方便大家学习比较修改点。
V0.1大家可以不用下载吧,你买了tiny4412的板子,里面就有三星公司的源代码了,v0.1我也只是裁剪了一下,你完全可以参考下面的说明完成。
费话不多说,下面开始吧!说明一下UBOOT代码架构和进行一下简单裁剪。
二、U-BOOT简介
1、U-Boot简介以及源码获取
1.1 、U-Boot简介
这里对U-Boot做简单的介绍,对于新手来说,总不能对这个“敌人”一无所知吧,在此做一个小小的扫盲吧。
U-Boot全称UniversalBootLoader,即通用bootloader。它是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系统。UBoot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
1.2 、U-Boot源码获取以及解压方法
U-Boot的代码可以从官方的FTP服务器上获取,地址是:ftp://ftp.denx.de/pub/U-Boot/。代码是按照一定时间周期更新的,命名方式由以前的数字命名更换为以时间的方式命名,笔者认为这样更直接更简单。当然,可以拿比较新的版本跟以前的老版本比较,结构和代码的具体实现是有很多差异的,笔者认为新版的U-Boot结构更合理,代码更简练,移植更方便。不管工程结构和代码怎么变,不变的是原理和整体框架,只要牢牢抓住这些本质的东西,你就能所向披糜。
下载代码后,在Ubuntu中可以直接鼠标右键,使用归档管理器解压到当前目录下。当然也可以终端中,先使用cd命令切换到代码包的目录下,例如,如果源码包是U-Boot-2013.01.01.tar.bz2,那么应该使用:
sudo tar-xvf U-Boot-2013.01.01.tar.bz2,即可解压到当前目录下。
1.3、U-Boot代码结构介绍
解压后我们看看新版本U-Boot的代码结构,如下图1-6所示。那么我们就来逐一介绍一下各个目录的功能和内容。如果需要更详细的目录介绍信息,请参阅U-Boot根目录下的README文件。
图1-1、U-Boot框架图
1). api:一些系统调用,包含有显示用的api,网络部分的api,和一些跟平台相关但独立出来的api。是一个扩展应用的独立的api库。
2). arch:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm就是我们开发板上使用的硬件体系目录。而arch/arm/目录下的cpu目录就是对应ARM体系的cpu目录,里边的armv7就是我们此次移植的重点对象,s5pv210就是armv7架构的cpu。
3). board:和一些已有开发板有关的文件.每一个开发板都以一个子目录出现在当前目录中。例如,smdkc100就是官方以s5pc100为核心的开发板的相关文件。该目录和上一个arch目录是严重依赖硬件平台的,移植之初要改动最多的也是这两个目录。
4). common目录:主要实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令对应就是cmd_bootm.c。
5). disk:对磁盘的支持。
6). doc:文档目录。Uboot的文档还是比较完善的,推荐大家参考阅读。
7). drivers:Uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB。
8). dts:从U-Boot的readme文件中获取到的信息,我的理解是dts = device trees ,有兴趣的可以参考U-Boot的readme文件中对ONFIG_OF_IDE_FIXUP和CONFIG_OF_EMBED这两个宏的描述。
9). examples:一些独立运行的应用程序的例子。
10). fs:支持文件系统的文件,U-Boot现在支持cramfs、fat、fdos、jffs2、yaffs和registerfs。
11). Include:头文件,还有对各种硬件平台支持的会变文件,系统的配置文件和对文件系统支持的文件。
12). lib:通用的多功能库函数实现。例如字符串的一些常用函数就在string.c中实
13). nand_spl:支持从nand flash启动,但支持的cpu的种类也不是很
14). net:与网络有关的代码,BOOTP协议、TFTP协议RARP协议和NFS文件系统的实现。
15). post:上电自检程序。
16). spl:镜像分离的实现,一般用在SD卡启动。
17). test:测试命令的实现,测试系统是否运行正常时使用。
18). tools:创建S-Record格式文件和U-BOOT images的工具。
19). boards.cfg:目标板配置参数文件,里边有很多种目标板的配置参数。
20). config.mk:这个文件里面主要定义了交叉编译器及选项和编译规则。
21). COPYING:软件的使用条款声明。
22). CREDITS:U-Boot开发者的联系方式。
23). helper.mk:生成U-Boot.list文件,文件包含程序编译对象信息等。
24). MAINTAINERS:各个硬件架构软件维护者的联系方式。
25). MAKEALL:创建多个目标板的配置,一般用不到。
26). Makeflie:U-Boot的makefile,主要用来编译链接并生成U-Boot镜像。
27). mkconfig:建立工程需要的一些软链接并创建配置文件config.h。
28). README:U-Boot的介绍信息,最好能花点时间看看,多了解一些关于U-Boot的信息。
29). rules.mk:U-Boot工程编译依赖规则。
30). snapshot.commit:U-Boot序列号和发布时间的快照。
2、解压裁剪
解压三星光盘中U-Boot-samsung-dev.tar.bz2,由于U-Boot源码中其实有很多东西我们不需要的,可以适当进行裁剪,把我们不要的代码都给删除,其实不删除也没有什么关系的,U-boot在编译时会根据我们的配置要求,一一编译相应内核的代码,其他不相关的代码是不会被编译的。至少我认为是这样,如果大家能把makefile文件看的明明白白的话,就一定能很清楚的知道针对自己的板子,那些代码是有用的,那些代码是不会被编译进自己的内核的。我也只是简单的看了一下makefile文件,很多地方也不明白,这里不对makefile进行分析了。
我们把不相关的代码裁剪了,有什么的具体的好处呢,我想可能无非就是不碍眼,改起来代码少,拷贝方便等等,废话就此为止,建议删除前先留下个备份,下面删除过程仅供参考,我没有完全按此进行,我只做了第1步、第6步和第7步和第8步。
1、删除:/arch/目录下,与arm无关的代码文件夹,其他文件夹都是与其他内核相关,所以可以删除。
2、进入/arch/arm/目录下,可以删除dts和imx-common两个目录。
3、进入/arch/arm/cpu目录下,可以删除与armv7无关的其他arm内核版本的文件夹,如有其他非文件夹文件留下不要删除。为什么只留下armv7呢,Exynos4412是armv7版本核。
4、进入/arch/arm/cpu/armv7/目录下,留下exynos和s5p-common文件夹和该目录下的文件,其他文件夹可以删除,他们分别是其他厂商生厂的armv7版本的内核。
其实这一步我不是很清楚s5p-common有没有用,不过为了不除错,还是先留着吧。
5、进入/arch/arm/include/asm目录下,留下arch-armv7、arch-exynos和proc-armv文件夹和此文件夹下的文件,其它文件夹可以删除。
6、进入/board/目录下,删除samsung以外的所有目录,因为我们移植的板子是三星的,所以其他的全部可以删除。
7、进入/board/Samsung/目录下,留下smdk4212目录文件,其他的全部可以删除,我们将与这个目录下的文件来进行移植,针对Tiny4412的电路板,我复制了/board/samsung/smdk4212的代码进行移植,为什么用smdk4212文件夹呢,我们知道SMDK4212,SMDK4412是三星自家的评估板,这两个板子都是用这个文件夹下的代码,其评估板所用的CPU也是Exynox4412,这一点可以从UBOOT根目录下的boards.cfg文件可以确定,打开看看下面的截图,可见,用smdk4212这个文件夹进行移植,会相对简单一些。一会大家可以复制一份进行修改移植,也可以直接在此文件上进行修改移植,建议重新复制一份。
如果大家是从uboot官网下载的代码,那么建议留下smdkv310和common。其他的可以删除,我用的是三星公司的一个版的uboot内部文件夹可能不太一样,大家根据自己手上的uboot版本进行修改吧,建议从uboot的官网上下载最新的uboot进行学习移植。
8、进入到/include/configs/目录下后,留下smdk4212.h和smdk4412.h即可,如果是从uboot官网下载,留下smdkv310.h。
3、创建平台
1、进入/board/Samsung/目录下,复制smdk4212为zthtiny4412。进入zthtiny4412进行如下文件名字修改:
clock_init_smdk4212.S ―――》 clock_init_zthtiny4412.S
mem_init_smdk4212.S ―――》 mem_init_zthtiny4412.S
smdk4212.c ―――》 zthtiny4412.c
smdk4212_val.h ―――》 zthtiny4212_val.h
smdk4412_val.h ―――》 zthtiny4412_val.h
2、修改clock_init_zthtiny4412.S
定位到16行,修改为:
#ifdef CONFIG_EXYNOS4412
#include"zthtiny4412_val.h"
#else
#include"zthtiny4212_val.h"
#endif
3、修改lowlevel_init.S
定位到17行,修改为:
#include<asm/arch/s5p_nand.h>
#ifdefCONFIG_EXYNOS4412
#include "zthtiny4412_val.h"
#else
#include "zthtiny4212_val.h"
#endif
4、修改zthtiny4212_val.h
定位到13行,修改为:
#ifndef_VAL_ZTHTINY4212_H
#define_VAL_ZTHTINY4212_H
5、修改zthtiny4412_val.h
定位到13行,修改为:
#ifndef_VAL_ZTHTINY4412_H
#define_VAL_ZTHTINY4412_H
6、修改makefile
定位到33到38行,修改为:
COBJS-y := zthtiny4412.o
COBJS-y += pmic.o
COBJS-y += smc.o
SOBJS := lowlevel_init.o
SOBJS += mem_init_zthtiny4412.o
SOBJS += clock_init_zthtiny4412.o
7修改u-boot.lds
定位到40行,修改为:
board/samsung/zthtiny4412/libzthtiny4412.o(.text)
8、复制include/configs/smdk4412.h为zthtiny4412.h
9、修改主目录下的makefile
定位到24行,修改为:
VERSION = 2014
PATCHLEVEL = 01
10、修改根目录下的/boards.cfg的文件,既然是针对自己的板子进行修改,此文件中的其他设置可以不用了,增加自己板子的设置后,删除其他设置。这里我保留了三行,如下图1-2所示。
图1-2 boards.cfg示意图
简要的载剪工作到此为此,下一章说明启动过程。
10、编译
这一步主要是查看我们平台搭建成了没有:进入linux进行编译:
可能用到的命令并列如下以供参考
cp -R /media/sf_sharelinux/test/zhang_new_uboot/u-boot_zth/.
chmod -R 777 /u-boot_zth /
cd /u-boot_zth /
make zthtiny4412_config
make
结果如下图1-3所示,由下图结果所示,已看到了其产生了u-boot.bin文件了,后面的错误是由于目录下的mkbl2执行来产生BL2文件的错误,此错误我们搭建移植平台无关,可以打开主目录下的makefile,定位到350行左右注释了以下代码:
#ifeq ($(CONFIG_S5PC210),y)
# ./mkbl2u-boot.bin bl2.bin 14336
#endif
#ifeq ($(CONFIG_CPU_EXYNOS5250),y)
# ./mkbl2u-boot.bin bl2.bin 14336
#endif
也可以去include/configs/zthtiny4412.h文件下,把CONFIG_S5PC210和CONFIG_CPU_EXYNOS525给注释了。
下一节,开始分析启动过程。
图1-3 编译结果程序图