基于从官方git clone下来的uboot进行修改。只是修改了框架,使得编译通过,熟悉下uboot的架构,要使得板子可用,还要显示菜单,需要自己加好多代码,关于NandFlash和NorFlash还有很多外围器件,需要根据datasheet作修改,网上有人已经作了整合:http://blog.csdn.net/liukun321/article/details/8610868。
我把它的ver4.0的uboot里的tiny210-uboot.bin通过友善之臂的minitool上的android bootloader选项,烧录到tiny210板子上,可以跑起来!真的很省事,如下
Superboot-210
Ver: 1.22a(20140106)
CPU: S5PV210 1GHz
RAM: 512MB
NAND: 256MB(SLC) ID:ECDA1095
Touch Device: 1-wire
LCD Type: S70(Auto)
USB Mode: Waiting...
USB Mode: Connected
Installing bootloader...
Installing bootloader succeed
OKOKraise: Signal # 8 caught
########################################################
# Modified by GJGJ http://blog.csdn.net/liukun321 #
########################################################
U-Boot 2011.06 (Jan 31 2013 - 16:53:18) for FriendlyLEG-TINY210
CPU: S5PC110@1000MHz
Board: FriendlyLEG-TINY210
DRAM: 512 MiB
WARNING: Caches not enabled
PWM Moudle Initialized.
NAND: 256 MiB
MMC: SAMSUNG SD/MMC: 0, SAMSUNG SD/MMC: 1
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: Please set ethaddr!
dm9000Warning: failed to set MAC address
分享一个uboot移植手册http://download.csdn.net/detail/xzongyuan/7615757,看了之后,感触,要移植uboot,不是简单的增删一些代码那么简单,虽然你可以根据别人的说明文档和既有代码一步步来。但如果要你自己移植,你必须对裸板开发有很深入的学习,不然,是很难判断在哪个地方作什么样的改动的。而且,要特别注重学习flash的裸板开发。本来我想大概了解裸板开发就行了,发现,如果不对每个模块都深入学习,看懂uboot移植会很吃力。
下面是我自己搞的源码编译,只能算是移植前的准备吧,先把关键文件都准备好,代码细节还得以后慢慢研究。
1.在Makefile中增加交叉编译工具
CROSS_COMPILE = arm-linux-
#在这附近加上面的代码
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
2. make之前需要make xx_config,配置板子的参数,这一功能通过Makefile中下面代码实现,其中MKCONFIG对应根目录的mkconfig。
源码:
%_config:: outputmakefile
@$(MKCONFIG) -A $(@:_config=)
config配置方法一:修改Makefile
s5pv210_config : outconfig
@$(MKCONFIG) $(@:_config=) arm armv7 tiny210 samsung s5pv210
$0 $1 $2 $3 $4板子名 $5 vendor $6 Soc
@代表的是target smdk2410_config,那么$(@:_config=)就是将smdk2410_config中的_config替换为空(删掉“:”后面的那部分字)!得到
mkconfig -A smdk2440a ;你可以用echo自己打印出来看看就明白了!如果要移植友善之臂的tiny210则要根据datasheet修改这里,我是参照s5pc210来改的。
方法二:修改boards.cfg
在boards.cfg里加入一行配置,mkconfig会判断,如果Makefile这里没输入参数,则会到boards.cfg里找。见下面第三条。
3.接下来看mkconfig作了什么事,里面定义了如下参数,通过读取根目录下的boards.cfg里面的一行,扫描出对应的参数,赋值给它们。
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
TARGETS=""
arch=""
cpu=""
board=""
vendor=""
soc=""
options=""
实现扫描参数的代码,可以看到用awk工具处理$srctree/boards.cfg文件。然后打印出$1~$8的参数给line变量。
if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then
# Automatic mode
line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' $srctree/boards.cfg`
if [ -z "$line" ] ; then
echo "make: *** No rule to make target \`$2_config'. Stop." >&2
exit 1
fi
set ${line}
# add default board name if needed
[ $# = 3 ] && set ${line} ${1}
fi
注意,awk根据$2_config来找对应的行的,可以看失败的那行 "No rule to make target $2_config"。而这个$2就是
mkconfig -A s5pv210中的s5pv210
$0 $1 $2
这个句子在Makefile中作了转换。
boards.cfg中,我增加了这样一行.
Active arm armv7 s5pv210 samsung tiny210 tiny210
( $1 $2 $3 $4 $5 $6 $7 这行是解释行)
给出s5pc1xx作参考(s5pv210内核与s5pc110相同,只是封装不一样,上网找到的信息,后面会提到)
Active arm armv7 s5pc1xx samsung smdkc100 smdkc100
根据awk的规则,$0表示整行,$1表示第一个字段。他们的赋值关系如下参数对应表:
$1 => Active
$2 => arm——架构arch
$3 => cpu / spl_cpu ---armv7 CPU类型
$4 => soc ----- s5pv210
$5 => vendor --- samsung
$6 => board --- tiny210
$7 => CONFIG_NAME ---- tiny210
$8 => tmp / option -- blank
mkconfig前面部分是读cfg文件,然后给参数赋值,后半部分代码是把这些参数echo输入到config.h文件中。源码一开始没有config.h,看来是编译后才会产生的。下面的代码可以看到,向头文件输入了很多
#define CONFIG_SYS_xxxx
这些参数都是boards.cfg里配置好的
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
for i in ${TARGETS} ; do
i="`echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`"
echo "#define CONFIG_${i}" >>config.h ;
done
echo "#define CONFIG_SYS_ARCH \"${arch}\"" >> config.h
echo "#define CONFIG_SYS_CPU \"${cpu}\"" >> config.h
echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h
[ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
[ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h
[ "${board}" ] && echo "#define CONFIG_BOARDDIR board/$BOARDDIR" >> config.h
cat << EOF >> config.h
#include
#include
#include
把board/samsung/上的smdkc100复制为tiny210,这是板子名,要注意和board.cfg的一致,不然找不到。
norton@norton-laptop:~/learning/friendly/uboot/board/samsung$ mv smdkc100.c tiny210.c
norton@norton-laptop:~/learning/friendly/uboot/board/samsung$ ls
arndale common goni origen smdk2410 smdk5250 smdk5420 smdkc100 smdkv310 tiny210 trats trats2 universal_c210
然后把tiny210文件夹里的smdkc100.c改为tiny210.c,并把makeflie里对应的.o文件也改名。
搜到资料,发现s5pc210是CortextA9的,而S5pv210是Cortex A8的。而s5pc110和s5pv210同设计,不同封装,所以要用smdkc100的板子配置。
蜂鸟,Cortex-A8,包括S5PC110(S5PC111)以及S5PV210
其中S5PC110(111)是小尺寸封装的,为了节省空间一般把RAM通过POP放在主控上,主要用于手机,还有三星自家的平板
S5PV210是大尺寸封装的,RAM单独的放在PCB上
猎户座,双核A9,包括S5PC210和S5PV310
其中S5PC210(111)是小尺寸封装的,为了节省空间一般把RAM通过POP放在主控上,主要用于手机
S5PV310是大尺寸封装的,RAM单独的放在PCB上
5.include/config文件夹下有smdkc100.h这个板子用s5pc1xx,与s5pv210内部设计相同,用这个来修改。
uboot/include/configs$ cp smdkc100.h tiny210.h
make tiny210_config
norton@norton-laptop:~/learning/friendly/uboot$ make tiny210_config -j36
Configuring for tiny210 board...
如前面的分析,这个命令主要是运行mkconfig,会产生下面提到的配置文件,应该没什么大问题,运行正常。。
在include/config.h下产生了如下内容。我怀疑如果s5pv210要改成s5pc1xx,可能会报错,不过先看看效果。
/* Automatically generated - do not edit */
#define CONFIG_SYS_ARCH "arm"
#define CONFIG_SYS_CPU "armv7"
#define CONFIG_SYS_BOARD "tiny210"
#define CONFIG_SYS_VENDOR "samsung"
#define CONFIG_SYS_SOC "s5pv210"
#define CONFIG_BOARDDIR board/samsung/tiny210
#include
#include
#include
#include
#include
#include
~
同样路径下产生了config.mk,内容如下
ARCH = arm
CPU = armv7
BOARD = tiny210
VENDOR = samsung
SOC = s5pv210
可见board.cfg的内容都录入到这个路径了。
.globl lowlevel_init
lowlevel_init:
mov r9, lr
/* r5 has always zero */
mov r5, #0
ldr r8, =S5PC100_GPIO_BASE
/* Disable Watchdog */
ldr r0, =S5PC100_WATCHDOG_BASE @0xEA200000
orr r0, r0, #0x0
str r5, [r0]
/* setting SRAM */
ldr r0, =S5PC100_SROMC_BASE
ldr r1, =0x9
str r1, [r0]
/* S5PC100 has 3 groups of interrupt sources */
ldr r0, =S5PC100_VIC0_BASE @0xE4000000
ldr r1, =S5PC100_VIC1_BASE @0xE4000000
ldr r2, =S5PC100_VIC2_BASE @0xE4000000
/* Disable all interrupts (VIC0, VIC1 and VIC2) */
mvn r3, #0x0
str r3, [r0, #0x14] @INTENCLEAR
str r3, [r1, #0x14] @INTENCLEAR
str r3, [r2, #0x14] @INTENCLEAR
/* Set all interrupts as IRQ */
str r5, [r0, #0xc] @INTSELECT
str r5, [r1, #0xc] @INTSELECT
str r5, [r2, #0xc] @INTSELECT
/* Pending Interrupt Clear */
str r5, [r0, #0xf00] @INTADDRESS
str r5, [r1, #0xf00] @INTADDRESS
str r5, [r2, #0xf00] @INTADDRESS
/* for UART */
bl uart_asm_init
/* for TZPC */
bl tzpc_asm_init
make
编译出现错误
include/configs/tiny210.h:24:57: fatal error: asm/arch/cpu.h: No such file or directory
compilation terminated.
看来uboot目录结构变化导致错误了阿,奇怪了,我编译了下smdkc100,没有这个问题。
看来是boards.cfg中的soc那一个,我设置为s5pv210的原因,我把它改为s5pc1xx,如下
Active arm armv7 s5pc1xx samsung tiny210 tiny210
重新配置一下,不然soc的设置没被改动。
make tiny210_config
make
通过了!竟然给我猜对了,毫无压力地编译通过了。
LD u-boot
arm-linux-ld: warning: creating a DT_TEXTREL in object.
OBJCOPY u-boot.srec
OBJCOPY u-boot.bin
我搜了下cpu.h
norton@norton-laptop:~/learning/friendly/uboot$ find -name cpu.h
./arch/m68k/cpu/mcf52x2/cpu.h
./arch/arm/cpu/arm720t/tegra-common/cpu.h
./arch/arm/include/asm/arch-imx/cpu.h
./arch/arm/include/asm/arch-orion5x/cpu.h
./arch/arm/include/asm/arch-s5pc1xx/cpu.h
./arch/arm/include/asm/arch-pantheon/cpu.h
./arch/arm/include/asm/arch-omap4/cpu.h
./arch/arm/include/asm/arch-armada100/cpu.h
./arch/arm/include/asm/arch-kirkwood/cpu.h
./arch/arm/include/asm/arch-sunxi/cpu.h
./arch/arm/include/asm/arch-am33xx/cpu.h
./arch/arm/include/asm/arch-omap5/cpu.h
./arch/arm/include/asm/arch-lpc32xx/cpu.h
./arch/arm/include/asm/arch-exynos/cpu.h
./arch/arm/include/asm/arch-omap3/cpu.h
./arch/blackfin/cpu/cpu.h
可能是哪个Makefile把asm/arch-s5pc1xx/cpu.h 包含进去了,我再搜tiny210.h看一下内容,发现#include "
而arch/arm/include/sam/arch会链接到到具体的soc文件夹arch-$SOC,这里因为config.mk中SOC定义为s5pc1xx。看来有Makefile在判断,如果能找到对应的arch-$SOC,则用文件链接关联目录,如果没有匹配的,才去arch/arm/下找cpu.h.如下面运行结果:
norton@norton-laptop:~/learning/friendly/uboot/arch/arm/include/asm$ ll arch
lrwxrwxrwx 1 norton norton 12 2014-07-09 17:26 arch -> arch-s5pc1xx/