uboot12移植到2440运行.docx
《uboot12移植到2440运行.docx》由会员分享,可在线阅读,更多相关《uboot12移植到2440运行.docx(8页珍藏版)》请在冰豆网上搜索。
uboot12移植到2440运行
u-boot-2010.12移植到2440运行
Smdk2410可以编译通过之后,即可进入2440的移植了。
2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下以smdk2410为模板建立自己目标板的项目,取名叫smdk2440。
(代码中的修改用红色表示)
一、首先建立目标板文件
#cp-rfsmdk2410/*smdk2440///将2410下所有的代码复制到2440下
#cdsmdk2440//进入smdk2440目录
#mvsmdk2410.csmdk2440.c//将smdk2440下的smdk2410.c改名为smdk2440.c
#cd../../..///回到u-boot根目录
#cpinclude/configs/smdk2410.hinclude/configs/smdk2440.h//建立2440头文件
#geditboard/samsung/smdk2440/Makefile
修改smdk2440下Makefile的编译项,如下:
COBJS:
=smdk2440.oflash.o//因在smdk2440下我们将smdk2410.c改名为smdk2440.c
老版本的uboot是需要修改顶层makefile文件
在其中加入:
smdk2440_config:
unconfig//2440编译选项格式
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2440samsungs3c24x0
但是新版本的文件组织结构有很大变化,需要在boards.cfg文件中smdk2410的下面增加类似的一条:
smdk2440armarm920t-samsungs3c24x0
然后,测试下编译情况:
Makedistclean
Makesmdk2440_config
Makeall
不幸,出现如下错误:
board.c:
Infunction'board_init_f':
board.c:
279:
error:
'CONFIG_SYS_TEXT_BASE'undeclared(firstuseinthisfunction)
board.c:
279:
error:
(Eachundeclaredidentifierisreportedonlyonce
board.c:
279:
error:
foreachfunctionitappearsin.)
make[1]:
***[board.o]错误1
make[1]:
离开目录“/home/bsc/samba/u-boot-2010.12/arch/arm/lib”
make:
***[arch/arm/lib/libarm.o]错误2
这说明我们前面为了编译通过而增加的宏定义可能是有问题的,事实上我们可以在网上查到一个patch,可以解决这些问题。
但是这里,为了深入了解问题所在,我们手动一点点来修改而不是直接打上patch。
include/configs/smdk2410.hinclude/configs/smdk2440.h文件中删除上面添加的宏定义:
#defineCONFIG_SYS_SDRAM_BASE0x00000000
#defineCONFIG_SYS_INIT_SP_ADDR(CONFIG_SYS_TEXT_BASE-GENERATED_GBL_DATA_SIZE)
添加如下宏定义(参考该patch)
#defineCONFIG_SYS_SDRAM_BASEPHYS_SDRAM_1
#defineCONFIG_SYS_INIT_SP_ADDR(CONFIG_SYS_SDRAM_BASE+0x1000-GENERATED_GBL_DATA_SIZE)
然后再次编译,此次编译可以通过至此我们建立起了目标板的框架,我们可以开始修改代码以适应我们的目标板。
二、目标板u-boot的硬件设备初始化。
(1)入口代码分析
一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。
那么我们的2440开发板u-boot的这个链接文件就是cpu/arm920t/u-boot.lds,打开该文件部分代码如下:
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
OUTPUT_ARCH(arm)//定义生成文件的目标平台是arm
ENTRY(_start)//定义程序的入口点是_startSECTIONS
{
//其他一些代码段、数据段等分配
.=0x00000000;.=ALIGN(4);
.text:
{
cpu/arm920t/start.o(.text)
*(.text)
}
..................
..................
}
知道了程序的入口点是_start,那么我们就打开2440开发板u-boot第一个要运行的程序cpu/arm920t/start.S,查找到_start的位置如下:
.globl_start
_start:
bstart_code//将程序的执行跳转到start_code处
从这个汇编代码可以看到程序又跳转到start_code处开始执行,那么再查找到start_code处的代码如下:
/*
*theactualstartcode
*/start_code:
/*
*setthecputoSVC32mode
*/
mrsr0,cpsr
bicr0,r0,#0x1f
orrr0,r0,#0xd3
msrcpsr,r0blcoloured_LED_init//此处两行是对AT91RM9200DK开发板上的LED进行初始化的
blred_LED_on
由此可以看到,start_code处才是u-boot启动代码的真正开始处。
(2)初始化代码修改
start.S中注释掉LED相关代码:
/*blcoloured_LED_init//这两行是AT91RM9200DK开发板的LED初始化,注释掉
blred_LED_on*/
/*注释掉以下两行代码以便在内存中调试
#ifndefCONFIG_SKIP_LOWLEVEL_INIT
blcpu_init_crit
#endif
*/
或者在在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
#defineCONFIG_SKIP_LOWLEVEL_INIT
在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
#defineCONFIG_ARM920T1/*ThisisanARM920TCore*/
/*#defineCONFIG_S3C24101*//*inaSAMSUNGS3C2410SoC*/需要注销此宏
/*#defineCONFIG_SMDK24101*//*onaSAMSUNGSMDK2410Board*/需要注销此宏
#defineCONFIG_S3C24401/*inaSAMSUNGS3C2440SoC*/添加此宏
#defineCONFIG_SYS_CLK_FREQ16934400/*theSMDK2440has16MHzinputclockbybsc*/在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分。
由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,cpu/arm920t/start.S代码如下:
#ifdefCONFIG_S3C24X0
/*turnoffthewatchdog*/
#ifdefined(CONFIG_S3C2400)
#definepWTCON0x15300000
#defineINTMSK0x14400008/*Interupt-Controllerbaseaddresses*/
#defineCLKDIVN0x14800014/*clockdivisorregister*/
#else
#definepWTCON0x53000000
#defineINTMSK0x4A000008/*Interupt-Controllerbaseaddresses*/
#defineINTSUBMSK0x4A00001C
#defineCLKDIVN0x4C000014/*clockdivisorregister*/
#endif
ldrr0,=pWTCON
movr1,#0x0
strr1,[r0]
/*
*maskallIRQsbysettingallbitsintheINTMR-default
*/
movr1,#0xffffffff
ldrr0,=INTMSK
strr1,[r0]
#ifdefined(CONFIG_S3C2410)
ldrr1,=0x3ff
ldrr0,=INTSUBMSK
strr1,[r0]
#endif
#ifdefined(CONFIG_S3C2440)
ldrr1,=0x7fff
ldrr0,=INTSUBMSK
strr1,[r0]
#endif
#ifdefined(CONFIG_S3C2440)//添加s3c2440的时钟部分
#defineMPLLCON0x4C000004//系统主频配置寄存器基地址
#defineUPLLCON0x4C000008//USB时钟频率配置寄存器基地址
#defineCAMDIVN0x4C000018
ldrr0,=CAMDIVN
movr1,#0
strr1,[r0]
ldrr0,=CLKDIVN//设置分频系数FCLK:
HCLK:
PCLK=1:
3:
6
ldrr1,=0x7
strr1,[r0]
ldrr0,=MPLLCON//设置系统主频为405MHz
ldrr1,=0x6e031//这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分
strr1,[r0]
ldrr0,=UPLLCON//设置USB时钟频率为48MHz
ldrr1,=0x3c042//这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分
strr1,[r0]
#else//其他开发板的时钟部分,这里就不用管了,我们现在是做2440的
/*FCLK:
HCLK:
PCLK=1:
2:
4*/
/*defaultFCLKis120MHz!
*/
ldrr0,=CLKDIVN
movr1,#3
strr1,[r0]
#endif/*CONFIG_S3C2440*/
#endif/*CONFIG_S3C24X0*/
S3C2440的时钟部分除了在start.S中添加外,还要在board/samsung/smdk2440/smdk2440.c修改或添加部分代码,如下:
#defineFCLK_SPEED2//设置默认等于2,bybsc2010-2-2220:
49
#ifFCLK_SPEED==0/*Fout=203MHz,Fin=12MHzforAudio*/
#defineM_MDIV0xC3
#defineM_PDIV0x4
#defineM_SDIV0x1
#elifFCLK_SPEED==1/*Fout=202.8MHz*/
#defineM_MDIV0xA1
#defineM_PDIV0x3
#defineM_SDIV0x1
#elifFCLK_SPEED==2/*Fout=405MHz*/
#defineM_MDIV0x6e//这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置
#defineM_PDIV0x3
#defineM_SDIV0x1
#endif
#defineUSB_CLOCK2//设置默认等于2,即下面红色代码部分有效
#ifUSB_CLOCK==0
#defineU_M_MDIV0xA1
#defineU_M_PDIV0x3
#defineU_M_SDIV0x1
#elifUSB_CLOCK==1
#defineU_M_MDIV0x48
#defineU_M_PDIV0x3
#defineU_M_SDIV0x2
#elifUSB_CLOCK==2/*Fout=48MHz*/
#defineU_M_MDIV0x3c//这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置
#defineU_M_PDIV0x4
#defineU_M_SDIV0x2
#endif
修改/*archnumberofSMDK2440-Board*/
gd->bd->bi_arch_number=MACH_TYPE_SMDK2440;
在dram_init(void)函数中添加gd->ram_size初始化(此句比较重要):
gd->ram_size=PHYS_SDRAM_1_SIZE;/*addbybsc2011/2/2120:
14:
46*/
修改board/samsung/smdk2440/config.mk
CONFIG_SYS_TEXT_BASE=0x33000000/*0x3f800000改为0x33000000以便内存中调试*/
修改完毕后我们再重新编译u-boot,然后再下载到RAM中运行测试。
tftp0x33000000u-boot.bin
go0x33000000
结果终端有输出信息并且出现类似Shell的命令行,这说明这一部分移植完成。
如果有其他问题可以在include/configs/smdk2440.h头文件中添加DEBUG宏用于调试。