uboot.docx

上传人:b****6 文档编号:12067879 上传时间:2023-06-04 格式:DOCX 页数:22 大小:74.28KB
下载 相关 举报
uboot.docx_第1页
第1页 / 共22页
uboot.docx_第2页
第2页 / 共22页
uboot.docx_第3页
第3页 / 共22页
uboot.docx_第4页
第4页 / 共22页
uboot.docx_第5页
第5页 / 共22页
uboot.docx_第6页
第6页 / 共22页
uboot.docx_第7页
第7页 / 共22页
uboot.docx_第8页
第8页 / 共22页
uboot.docx_第9页
第9页 / 共22页
uboot.docx_第10页
第10页 / 共22页
uboot.docx_第11页
第11页 / 共22页
uboot.docx_第12页
第12页 / 共22页
uboot.docx_第13页
第13页 / 共22页
uboot.docx_第14页
第14页 / 共22页
uboot.docx_第15页
第15页 / 共22页
uboot.docx_第16页
第16页 / 共22页
uboot.docx_第17页
第17页 / 共22页
uboot.docx_第18页
第18页 / 共22页
uboot.docx_第19页
第19页 / 共22页
uboot.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

uboot.docx

《uboot.docx》由会员分享,可在线阅读,更多相关《uboot.docx(22页珍藏版)》请在冰点文库上搜索。

uboot.docx

uboot

移植步骤

1.1,了解u-boot目录结构和启动流程,请参考U-Boot启动过程分析

相关阅读:

U-Boot源代码下载地址 

【1】目录结构

【2】启动流程

 

1.2,建立mini2440开发板文件并编译测试

在项目根目录u-boot-2009.08上单击右键->浏览文件夹

【1】定位到board/samsung,将目录smdk2410复制并粘贴到当前目录下,将其重命名为mini2440。

【2】打开mini2440目录,将smdk2410.c重命名为mini2440.c,

【3】用gedit打开当前目录下的Makefile(在Makefile上单击右键->使用“文本编辑器”打开),定位到28行,修改后代码如下所示(修改部分用灰色背景颜色标出):

include$(TOPDIR)/config.mk

LIB=$(obj)lib$(BOARD).a

COBJS:

= mini2440.o flash.o 

SOBJS:

=lowlevel_init.o

然后保存。

【4】在根目录下定位到include/configs,将smdk2410.h复制并粘贴到当前目录下,将其重命名成mini2440.h。

【5】用gedit打开根目录下的Makefile文件,然后搜索smdk2410,定位到2997行,找到下列语句

smdk2410_config:

unconfig

 @$(MKCONFIG)$(@:

_config=)armarm920tsmdk2410samsungs3c24x0

然后将其复制并粘贴到其下面,并修改成如下语句

mini2440_config:

unconfig

 @$(MKCONFIG)$(@:

_config=)armarm920tmini2440samsungs3c24x0

然后保存。

*说明:

      arm   :

CPU的架构(ARCH)

      arm920t:

CPU的类型

      mini2440:

对应在board目录下建立新的开发板项目的目录

      samsung:

新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL

      s3c24x0:

CPU型号

*注意:

编译选项格式的第二行要用Tab键开始,否则编译会出错。

【6】编译测试

打开终端,进入到u-boot-2009.08根目录下执行

[root@localhostu-boot-2009.08]#makedistclean

[root@localhostu-boot-2009.08]#makemini2440_config

Configuringformini2440board...

[root@localhostu-boot-2009.08]#make

...............

board.c:

127:

error:

inlinefunction'coloured_LED_init'cannotbedeclaredweak

board.c:

129:

error:

inlinefunction'red_LED_on'cannotbedeclaredweak

board.c:

131:

error:

inlinefunction'red_LED_off'cannotbedeclaredweak

board.c:

133:

error:

inlinefunction'green_LED_on'cannotbedeclaredweak

board.c:

135:

error:

inlinefunction'green_LED_off'cannotbedeclaredweak

board.c:

137:

error:

inlinefunction'yellow_LED_on'cannotbedeclaredweak

board.c:

139:

error:

inlinefunction'yellow_LED_off'cannotbedeclaredweak

board.c:

141:

error:

inlinefunction'blue_LED_on'cannotbedeclaredweak

board.c:

143:

error:

inlinefunction'blue_LED_off'cannotbedeclaredweak

make[1]:

***[board.o]错误1

make[1]:

Leavingdirectory`/root/workspace/u-boot-2009.08/lib_arm'

make:

***[lib_arm/libarm.a]错误2

[root@localhostu-boot-2009.08]#

出现错误,内嵌函数不能被声明为weak属性,打开lib_arm/board.c,定位到127行开始,将其注释掉,修改后结果如下:

voidinline__coloured_LED_init(void){}

//voidinlinecoloured_LED_init(void)__attribute__((weak,alias("__coloured_LED_init")));

voidinline__red_LED_on(void){}

//voidinlinered_LED_on(void)__attribute__((weak,alias("__red_LED_on")));

voidinline__red_LED_off(void){}

//voidinlinered_LED_off(void)     __attribute__((weak,alias("__red_LED_off")));

voidinline__green_LED_on(void){}

//voidinlinegreen_LED_on(void)__attribute__((weak,alias("__green_LED_on")));

voidinline__green_LED_off(void){}

//voidinlinegreen_LED_off(void)__attribute__((weak,alias("__green_LED_off")));

voidinline__yellow_LED_on(void){}

//voidinlineyellow_LED_on(void)__attribute__((weak,alias("__yellow_LED_on")));

voidinline__yellow_LED_off(void){}

//voidinlineyellow_LED_off(void)__attribute__((weak,alias("__yellow_LED_off")));

voidinline__blue_LED_on(void){}

//voidinlineblue_LED_on(void)__attribute__((weak,alias("__blue_LED_on")));

voidinline__blue_LED_off(void){}

//voidinlineblue_LED_off(void)__attribute__((weak,alias("__blue_LED_off")));

[root@localhostu-boot-2009.08]#makeclean

[root@localhostu-boot-2009.08]#make

......

cpu/arm920t/start.o:

Infunction`start_code':

/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:

117:

undefinedreferenceto`coloured_LED_init'

/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:

118:

undefinedreferenceto`red_LED_on'

make:

***[u-boot]错误1

出现错误coloured_LED_init'未定义。

打开cpu/arm920t/start.S,搜索“coloured_LED_init”定位到117行,找到如下代码:

 blcoloured_LED_init

 blred_LED_on

将其注释掉

//这两行是AT91RM9200DK开发板的LED初始化,注释掉

//blcoloured_LED_init

 //blred_LED_on

然后执行清除、编译命令

[root@localhostu-boot-2009.08]#makeclean

[root@localhostu-boot-2009.08]#make

......

arm-linux-objcopy-Osrecu-bootu-boot.srec

arm-linux-objcopy--gap-fill=0xff-Obinaryu-bootu-boot.bin

[root@localhostu-boot-2009.08]# 

编译通过。

【7】加入调试选项,启用DEBUG宏,有两种办法办法

<1>参考文章Makefile,如何传递宏定义DEBUG和Debug版和Release版的程序

在编译时,直接在make后面传入参数-d,表示Debug模式,输出有关文件和检测时间的详细信息,如

make-d

可以输出源程序中定义的DEBUG宏定义的调试信息

<2>用gedit打开根目录下的config.mk文件,然后搜索“DDEBUG”,找到如下语句

DBGFLAGS=-g#-DDEBUG

将注释掉的DDEBUG选项打开,修改后下面语句

DBGFLAGS=-g -DDEBUG

但是此种办法需要在调试完成时需要在将其注释掉。

1.3,根据启动流程修改或添加基本的u-boot源码,使其能够在内存中启动

【1】增加对S3C2440一些寄存器的支持,添加中断禁止部分和时钟设置部分

用gedit打开cpu/arm920t/start.S,定位到134行附近,如下代码

#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)

 /*turnoffthewatchdog*/

由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,修改后代码如下:

#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)

 /*turnoffthewatchdog*/

 ......

#ifdefined(CONFIG_S3C2410)

   ldr r1,=0x3ff

   ldr r0,=INTSUBMSK

   str r1,[r0]

#endif

#ifdefined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分

   ldr r1,=0x7fff       //根据2440芯片手册,INTSUBMSK寄存器有15位可用   

   ldr r0,=INTSUBMSK

   str r1,[r0]

#endif

#ifdefined(CONFIG_S3C2440)  //添加s3c2440的时钟部分

#defineMPLLCON  0x4C000004  //系统主频配置寄存器基地址

#defineUPLLCON  0x4C000008  //USB时钟频率配置寄存器基地址 

   ldr r0,=CLKDIVN         //设置分频系数FCLK:

HCLK:

PCLK=1:

4:

8

   mov r1,#5

   str r1,[r0]

   ldr r0,=MPLLCON //设置系统主频为405MHz  

   ldr r1,=0x7F021 //这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分

   str r1,[r0]

   ldr r0,=UPLLCON //设置USB时钟频率为48MHz  

   ldr r1,=0x38022 //这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分

   str r1,[r0]

#else//其他开发板的时钟部分

 /*FCLK:

HCLK:

PCLK=1:

2:

4*/

 /*defaultFCLKis202.8MHz!

*/

  ldrr0,=CLKDIVN

  movr1,#3

  strr1,[r0]

   ldr r0,=MPLLCON //设置系统主频为202.8MHz

  ldr r1,=0xa1031 //这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分

  str r1,[r0]

#endif/*CONFIG_S3C2400||CONFIG_S3C2410 ||CONFIG_S3C2440 */

【2】S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/mini2440/mini2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码。

(1)用gedit打开board/samsung/mini2440/mini2440.c,定位到33行,修改或添加如下内容:

//设置主频和USB时钟频率参数与start.S中的一致

#defineFCLK_SPEED  2      //设置默认等于2

#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_MDIV   0x7F    //这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置

#defineM_PDIV   0x2

#defineM_SDIV   0x1

#endif

#defineUSB_CLOCK 2       //设置默认等于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_MDIV   0x38  //这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置

#defineU_M_PDIV   0x2

#defineU_M_SDIV   0x2

#endif

(2)用gedit打开cpu/arm920t/s3c24x0/speed.c,定位到69行加入如下代码

   m=((r&0xFF000)>>12)+8;

   p=((r&0x003F0)>>4)+2;

   s=r&0x3;

//根据设置的分频系数FCLK:

HCLK:

PCLK=1:

4:

8修改获取时钟频率的函数

#ifdefined(CONFIG_S3C2440)

   if(pllreg==MPLL)//参考S3C2440芯片手册上的公式:

PLL=(2*m*Fin)/(p*2s)

       return((CONFIG_SYS_CLK_FREQ*m*2)/(p<

   //elseif(pllreg==UPLL)//warning:

controlreachesendofnon-voidfunction

#endif

   return((CONFIG_SYS_CLK_FREQ*m)/(p<

为什么要再返回时加一个判断呢?

因为在2440中MPLL的时钟为UPLL时钟的2倍,在s3c2440的数据手册里的227页这样写到MPLL和UPLL的计算方法

MPLLControlRegister

Mpll=(2*m*Fin)/(p*2s)

m=(MDIV+8),p=(PDIV+2),s=SDIV

UPLLControlRegister

Upll=(m*Fin)/(p*2s)

m=(MDIV+8),p=(PDIV+2),s=SDIV

这个就是修改此函数的缘由。

由于S3C2410和S3C2440的设置方法也不一样,所以get_HCLK函数也需要修改:

/*returnHCLKfrequency*/

ulongget_HCLK(void)

{

   S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

#ifdefined(CONFIG_S3C2440)

 if(clk_power->CLKDIVN&0x6) 

    {

    if((clk_power->CLKDIVN&0x6)==2)return(get_FCLK()/2);

    if((clk_power->CLKDIVN&0x6)==6)return((clk_power->CAMDIVN&0x100)?

get_FCLK()/6:

get_FCLK()/3);

    if((clk_power->CLKDIVN&0x6)==4)return((clk_power->CAMDIVN&0x200)?

get_FCLK()/8:

get_FCLK()/4);

    return(get_FCLK());

    }

 else return(get_FCLK());

#else

   return((clk_power->CLKDIVN&0x2)?

get_FCLK()/2:

get_FCLK());

#endif

 }

这里用到了将在include/s3c24x0.h文件里所添加的CAMDIVN项,因为这一项的值决定了我们的时钟配置。

这样修改的原因是在s3c2440的数据手册的231页有这样一段话:

CLOCKDIVIDERCONTROL(CLKDIVN)REGISTER

RegisterAddressR/WDescriptionResetValue

CLKDIVN0x4C000014R/WClockdividercontrolregister0x00000000

CLKDIVN              Bit           Description

DIVN_UPLL          [3]           UCLKselectregister(UCLKmustbe48MHzforUSB)

0:

UCLK=UPLLclock

1:

UCLK=UPLLclock/2

Setto0,whenUPLLclockissetas48Mhz

Setto1.whenUPLLclockissetas96Mhz.

HDIVN                 [2:

1]      00:

HCLK=FCLK/1.

01:

HCLK=FCLK/2.

10:

HCLK=FCLK/4whenCAMDIVN[9]=0.

HCLK=FCLK/8whenCAMDIVN[9]=1.

11:

HCLK=FCLK/3whenCAMDIVN[8]=0.

HCLK=FCLK/6whenCAMDIVN[8]=1.

PDIVN[0]                             0:

PCLKhastheclocksameastheHCLK/1.

1:

PCLKhastheclocksameastheHCLK/2.

我们到底应该返回FCLK的几分之一在这里就有秒数,其中必须根据HDIVN的值与CAMDIVN的值来判断。

【3】加入LED进度指示,增加控制台显示信息

作用是显示代码进度,对Debug有帮助。

(1)代码在跳转到第二阶段代码start_armboot函数前会亮起一个LED灯,打开cpu/arm920t/start.S,定位到240行附近,修改如下:

clbss_l:

strr2,[r0] /*clearloop...                   */

      addr0,r0,#4

      cmpr0,r1

      bleclbss_l

#ifdefined(CONFIG_MINI2440_LED)

//根据mini2440原理图可知LED分别由S3C2440的PB5、6、7、8口来控制,

//以下是PB端口寄存器基地址(查2440的DataSheet得知)

#defineGPBCON0x56000010

#defineGPBDAT0x56000014

#defineGPBUP 0x56000018 

   //以下对寄存器的操作参照S3C2440的DataSheet进行操作

   ldrr0,=GPBUP

   ldrr1,=0x7FF   //即:

二进制11111111111,关闭PB口上拉

   strr1,[r0]

   ldrr0,=GPBCON  //配置PB

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2