uboot.docx
- 文档编号:25036686
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:22
- 大小:74.28KB
uboot.docx
《uboot.docx》由会员分享,可在线阅读,更多相关《uboot.docx(22页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uboot