一 、开发环境
PC OS : Ubuntu 14.04
SOC : 基于ARM Cortex-a8 核的S5PC100
开发板 : FSC100
u_boot : u-boot-2010.03
编译器 : arm-cortex_a8-linux-gnueabi-gcc version 4.4.6
二、目标
1.Uboot 能从FSC100的 Nand Flash 正常启动
2.Uboot 支持DM9000 网卡
3.Uboot 支持Nand Flash 读、写、擦除
4.Uboot 支持Linux 内核引动
好了,接下来就进行移植uboot到FSC100开发板吧 。
三、建立自己的平台
1、 下载源码
我们可以在下面这个网站上下载最新的和以前任一版本的 uboot
ftp://ftp.denx.de/pub/u-boot/
2、 解压 uboot 源码并进入目录
tar zxvf u-boot-2010.03.tar.gz
cd u-boot-2010.03
u-boot-2010.3 源码中已经支持了SMDKC100了(SMDKC100是三星公司基于SOC : S5PC100设计的一块开发板)。我们的FSC100使用的SOC也是S5PC100,所以我们只需要稍加修改Uboot支持的SMDC100代码,就可以编译出支持我们的FSC100开发板的uboot了。
1.修改 u-boot 顶层目录下的 Makefile,指定交叉工具链
在
ifeq ($(HOSTARCH, $(ARCH))
CROSS_COMPILE ?=
endif
下添加:
ifeq (arm, $(ARCH))
CROSS_COMPILE ?= arm-cortex_a8-linux-gnueabi
endif
2.在 u-boot 顶层目录下的 Makefile 中添加 fsc100 配置信息
在
smdkc100_config: unconfig
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 smdkc100 samsung s5pc1xx
下添加:
fsc100_config: unconfig
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 fsc100 samsung s5pc1xx
3. 添加 fsc100 平台信息
(1)进入board/samsung目录
(2)拷贝smdkc100 为 fsc100
(3)进入fsc100目录下修改smdkc100.c 为fsc100.c
修改Makefile中的smkc100.o 为fsc100.o
(4)进入include/configs目录,拷贝smdkc100.h为fsc100.h
include/configs目录下的.h文件为对应开发板的配置文件。smdkc100.h 为SMDKC100开发板的配置文件,所以
我们把smdkc100.h文件拷贝成fsc100.h,作为我们FSC100开发板的配置文件。
四、配置和编译uboot
1.配置我们自己的开发板fsc100
2.编译uboot
编译完成后生成的 u-boot.bin 是二进制的文件。但是该文件只能在 smdkc100 平台上运行,我们需要对 u-boot 源代码进行相应的修改。
五、如何快速的调试uboot我想很多人在移植uboot的时候,都经历过,为了调试uboot,每次修改代码,编译好后,都需要将它烧写到开发板上这个过程。当然,并不是一次修改后,烧写到开发板上就一定可以成功启动。大多数情况都是启动开发板后,没有任何反应的结果。需要多次调试。
究其原因,无非以下几种情况。
(1)内存初始化代码有问题
(2)从Nand Flash启动的时候,读Nand Flash 的代码有问题
(3)SOC的时钟初始化有问题,导致串口输出乱码
每次调试,将uboot烧写到Nand Flash是一个很耗时、很繁琐的操作。其实,很多时候我们拿到一块开发板的时候,这块开发板中已经有一个uboot 了,我们可以利用这个uboot来进行调试。
FSC100开发板,从Nand Flash启动后,已经有一个uboot了。这个uboot支持网络、NAND Flash操作等功能。我们可以利用uboot的TFTP 服务将我们的调试的uboot下载到内存中去,然后利用uboot中的go 命令运行我们调试的uboot 。
好了,接下来我们就按照这个思路来进行吧!
哦!还不能立即进行,我们还需要修改一下uboot代码。通过前面对uboot 的分析,大家应该知道uboot启动的时候,会初始化系统时钟和内存。要知道,我们开发板自带的uboot在启动的时候,已经初始化好了系统时钟和内存。如果再次初始化系统时钟或内存,我们的内存就不能正常工作了。
嗯,我们修改以下几个地方。
(1)修改cpu/arm_cortexa8/start.S , 去掉内存初始化和系统时钟初始化
(2)修改board/samsung/fsc100目录下的config.mk文件。
config.mk文件中,存放的是代码段运行的起始地址。它的内容如下:
S5PC100 的内存映射图如下:
从上图可以知道,TEXT_BASE的默认值,不符合当前情况。
FSC100上接了256M内存,所以能使用的地址范围为 : 0x20000000 ~
0x2fffffff。在这里我们将TEXT_BASE的值修改为 0x20f00000。
是不是一定是这个值?不是,其他值也可以。当然不是这个范围的任意一个值都可以,要想知道原因,你就必须知道uboot内存的分配情况了。这里就不说了,前面已经说过了。
嗯,修改完成后,编译uboot。编译完成后,将uboot拷贝到tftp的工作目录下。
启动开发板,通过tftp 下载uboot到0x20f00000
用go命令运行uboot,效果如下:下载本文