Tiny210 s5pv210 uboot移植(编译过程)

时间:2022-04-04 16:29:47

 基于从官方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

既然能跑起来了,以后就可以慢慢玩了,very good!

分享一个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 <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>

4.配置完后需创建对应的s5pv210目录和文件

把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


6.编译,测试一下

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 <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/tiny210.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
~
同样路径下产生了config.mk,内容如下

ARCH   = arm
CPU = armv7
BOARD = tiny210
VENDOR = samsung
SOC = s5pv210
可见board.cfg的内容都录入到这个路径了。
                 
小结:每个芯片的配置都非常不同,一定要找到相同设计的,不能随便拿一个来移植,例如你不能拿s5pc210来移植,虽然文字上看起来差不多。但代码差距非常大。如stage2的初始化,uboot_src/board/samsung/smdkc100/lowlevel_init.S的片段如下,非常多地址和寄存器操作,如果芯片不同,是要重新设计的。

	.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/cpu.h>,变为了#include <asm/arch/cpu.h>。详细对比下,路径指向了别的地方,就是上面搜到的那个。      

而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/

但,发现arch/arm/cpu/armv7/s5pv210是个空文件,看来是我之前编译的时候,没修改,导致的,事实上,这个文件夹是不存在的,相关的文件都在同样路径的s5pc1xx文件夹下。因为SOC我命名为s5pc1xx了。不过,如果对文件路径很熟,相信可以全部改为s5pv210。