《micro2440开发》第八章:micro/mini2440上移植uboot

====================================================================================================================================

一、认识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。

====================================================================================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值