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

来源:互联网 发布:windows phone上的ide 编辑:程序博客网 时间:2024/05/16 12:32

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

一、认识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_MMUenable_mmu:/* enable domain access */ldrr5, =0x0000ffffmcrp15, 0, r5, c3, c0, 0/* load domain access register *//* Set the TTB register */ldrr0, _mmu_table_baseldrr1, =CONFIG_SYS_PHY_UBOOT_BASEldrr2, =0xfff00000bicr0, r0, r2orrr1, r0, r1mcrp15, 0, r1, c2, c0, 0/* Enable the MMU */mrcp15, 0, r0, c1, c0, 0orrr0, r0, #1/* Set CR_M to enable MMU *//* Prepare to enable the MMU */adrr1, skip_hw_initandr1, r1, #0x3fcldrr2, _TEXT_BASEldrr3, =0xfff00000andr2, r2, r3orrr2, r2, r1bmmu_enable.align 5/* Run in a single cache-line */mmu_enable:mcrp15, 0, r0, c1, c0, 0nopnopmovpc, r2#endif

    但在OS启动前不能开启MMU(因为启动kernel要bootloader跳转物理地址);因此,在类似S3C6400这种情况下、u-boot在执行跳转之前还需要先关闭MMU。见:

    u-boot-2009.03/cpu/arm920t或arm1176$ gedit start.S

#ifndef CONFIG_SKIP_LOWLEVEL_INITcpu_init_crit:/* * flush v4 I/D caches */movr0, #0mcrp15, 0, r0, c7, c7, 0/* flush v3/v4 cache */mcrp15, 0, r0, c8, c7, 0/* flush v4 TLB *//* * disable MMU stuff and caches */mrcp15, 0, r0, c1, c0, 0bicr0, r0, #0x00002300@ clear bits 13, 9:8 (--V- --RS)bicr0, r0, #0x00000087@ clear bits 7, 2:0 (B--- -CAM)orrr0, r0, #0x00000002@ set bit 2 (A) Alignorrr0, r0, #0x00001000@ set bit 12 (I) I-Cachemcrp15, 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. */movip, lr#ifdefined(CONFIG_AT91RM9200EK)#elsebllowlevel_init#endifmovlr, ipmovpc, 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。

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