uboot12移植到2440运行.docx

上传人:b****6 文档编号:5247359 上传时间:2022-12-14 格式:DOCX 页数:8 大小:17.90KB
下载 相关 举报
uboot12移植到2440运行.docx_第1页
第1页 / 共8页
uboot12移植到2440运行.docx_第2页
第2页 / 共8页
uboot12移植到2440运行.docx_第3页
第3页 / 共8页
uboot12移植到2440运行.docx_第4页
第4页 / 共8页
uboot12移植到2440运行.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

uboot12移植到2440运行.docx

《uboot12移植到2440运行.docx》由会员分享,可在线阅读,更多相关《uboot12移植到2440运行.docx(8页珍藏版)》请在冰豆网上搜索。

uboot12移植到2440运行.docx

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宏用于调试。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1