====================================================================================================================================
一、认识u-boot
需要强调的是:在S3C2440之类的片子在u-boot里边是没有打开mmu的、见:
u-boot-2009.03/cpu/arm920t$ gedit start.S
而在S3C6400这类比较高端的CPU里u-boot阶段已经打开mmu;
因为cache的使用依赖与mmu,为了提高执行效率、打开mmu;见:
u-boot-2009.03/cpu/arm1176$ gedit start.S
#ifdef CONFIG_ENABLE_MMU
enable_mmu:
/* enable domain access */
ldr r5, =0x0000ffff
mcr p15, 0, r5, c3, c0, 0 /* load domain access register */
/* Set the TTB register */
ldr r0, _mmu_table_base
ldr r1, =CONFIG_SYS_PHY_UBOOT_BASE
ldr r2, =0xfff00000
bic r0, r0, r2
orr r1, r0, r1
mcr p15, 0, r1, c2, c0, 0
/* Enable the MMU */
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #1 /* Set CR_M to enable MMU */
/* Prepare to enable the MMU */
adr r1, skip_hw_init
and r1, r1, #0x3fc
ldr r2, _TEXT_BASE
ldr r3, =0xfff00000
and r2, r2, r3
orr r2, r2, r1
b mmu_enable
.align 5
/* Run in a single cache-line */
mmu_enable:
mcr p15, 0, r0, c1, c0, 0
nop
nop
mov pc, r2
#endif
但在OS启动前不能开启MMU(因为启动kernel要bootloader跳转物理地址);因此,在类似S3C6400这种情况下、u-boot在执行跳转之前还需要先关闭MMU。见:
u-boot-2009.03/cpu/arm920t或arm1176$ gedit start.S
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*
* flush v4 I/D caches
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0, 0
/*
* before relocating, we have to setup RAM timing
* because memory timing is board-dependend, you will
* find a lowlevel_init.S in your board directory.
*/
mov ip, lr
#if defined(CONFIG_AT91RM9200EK)
#else
bl lowlevel_init
#endif
mov lr, ip
mov pc, lr
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
从以上分析可以知道:为了提高u-boot阶段代码的执行效率,在u-boot启动的第一阶段(也就是我们经常说的编译后大小为4K的全由汇编写的代码段)开启了mmu功能。
完成硬件设备初始化;在(开启MMU和cache、设置异常向量、CPU进入SVC模式、设置控制寄存器地址、关闭看门狗、屏蔽中断、设置MPLLCON,UPLLCON, CLKDIVN
)这些片段时mmu都是开启的;在(关闭MMU和cache、初始化RAM控制寄存器、复制U-Boot第二阶段代码到RAM、设置堆栈、清除BSS段、跳转到第二阶段代码入口)
这些片段时mmu已经关闭。
当从NAND FLASH启动时,可以复习如下文章:《micro2440开发》第六章:micro2440从NAND FLASH启动原理分析u-boot启动的第二阶段代码在SDRAM中执行、由C语言写的;完成开发板配置,时钟、环境变量和串口控制台的初始化、打印u-boot版本和编译时间、配置并显示可用RAM大小、NOR FLASH和NAND FLASH的初始化等工作后进入loop循环;等待命令将kernel从flash拷贝至内存,并跳转让kernel启动。
====================================================================================================================================
1.交叉编译器版本arm-linux-gcc 4.4.3符合EABI标准的交叉编译器,http://www.arm9.net/mini2440-linux.asp
2.下载uboot-2009-03,http://download.csdn.net/download/wjg198576/1363633
====================================================================================================================================
二、uboot的顶层makefile做如下修改
1.添加如下内容
tankai2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t tankai2440 tankai s3c24x0
#注意:第二行tankai2440是开发板的型号,对应与board/tankai/tankai2440目录;
第二行tankai是开发者名字。
2.修改交叉编译器
export CROSS_COMPILE = /home/qemuformini2440/tools/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-
三、添加板级支持
1.在board目录下创建作者tankai子目录,在作者tankai子目录下创建tankai2440板子目录
将board/smdk2410/所有文件拷贝至board/tankai/tankai2440/,并将smdk2410.c改为tankai2440.c;修改Makefile里边smdk2410.o为tankai2440.o。
2.在incluede/configs/目录下将smdk2410.h复制一份并改名为tankai2440.h
四、编译
make tankai2440_config
make -j4
遇到问题请看:http://yebaoshan.blog.163.com/blog/static/2042311672012273191763/
生成目录:跟目录下u-boot.bin
注意:由于过早版本的uboot没有提供对EABI交叉编译器的支持,会导致编译不过;所以,需要使用较新的uboot。
====================================================================================================================================