uboot移植日记Word格式文档下载.docx

上传人:b****5 文档编号:8413310 上传时间:2023-05-11 格式:DOCX 页数:11 大小:28.69KB
下载 相关 举报
uboot移植日记Word格式文档下载.docx_第1页
第1页 / 共11页
uboot移植日记Word格式文档下载.docx_第2页
第2页 / 共11页
uboot移植日记Word格式文档下载.docx_第3页
第3页 / 共11页
uboot移植日记Word格式文档下载.docx_第4页
第4页 / 共11页
uboot移植日记Word格式文档下载.docx_第5页
第5页 / 共11页
uboot移植日记Word格式文档下载.docx_第6页
第6页 / 共11页
uboot移植日记Word格式文档下载.docx_第7页
第7页 / 共11页
uboot移植日记Word格式文档下载.docx_第8页
第8页 / 共11页
uboot移植日记Word格式文档下载.docx_第9页
第9页 / 共11页
uboot移植日记Word格式文档下载.docx_第10页
第10页 / 共11页
uboot移植日记Word格式文档下载.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

uboot移植日记Word格式文档下载.docx

《uboot移植日记Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《uboot移植日记Word格式文档下载.docx(11页珍藏版)》请在冰点文库上搜索。

uboot移植日记Word格式文档下载.docx

bmain--->

crt0.S

-->

copydata-->

clearbss-->

bboot

main.c-->

boot-->

/*Getinternelromserviceaddress*/

/*InitofROMservicesstructure*/

pAT91=AT91C_ROM_BOOT_ADDRESS;

/*XmodemInitialization*/

pAT91->

OpenSBuffer

OpenSvcXmodem

/*SystemTimerinitialization*/

--->

AT91F_AIC_ConfigureIt

/*EnableSTinterrupt*/

AT91F_AIC_EnableIt

AT91F_DBGU_Printk("

XMODEM:

DownloadU-BOOT"

);

Jump.S

//JumptoUbootBaseAddrexec

Jump((unsignedint)AT91C_UBOOT_BASE_ADDRESS)

boot.bin执行流程该文件会在从片内启动时被下载到板子上,以后还会被烧写到片外Flash中,以便在片外启动时用它来引导并解压u-boot.bin.gz,并跳转到u-boot来执行。

boot/entry.S

bmain-->

crt0.S-->

boot/misc.s/*unzipuboot.bin.gz*/

---->

decompress_image(SRC,DST,LEN)-->

gunzip

//jumptoubootBaseAddrexec这里跳转到解压u-boot.bin.gz的地址处直接开始执行u-boot

asm("

movpc,%0"

:

"

r"

(DST));

u-boot.bin执行流程

u-boot/cpu/at91rm9200/start.S

start--->

reset

copyex--->

cpu_init_crit

/*setupthestack*/-->

start_armboot

u-boot/lib_arm/board.c

init_fnc_t*init_sequence[]={

cpu_init,/*basiccpudependentsetup*/

board_init,/*basicboarddependentsetup*/

interrupt_init,/*setupexceptions*/

env_init,/*initializeenvironment*/

init_baudrate,/*initialzebaudratesettings*/

serial_init,/*serialcommunicationssetup*/

console_init_f,/*stage1initofconsole*/

display_banner,/*saythatwearehere*/

dram_init,/*configureavailableRAMbanks*/

display_dram_config,

checkboard,

NULL,

};

start_armboot--->

callinit_sequence

flash_init-->

display_flash_config

nand_init--->

AT91F_DataflashInit

dataflash_print_info-->

env_relocate

drv_vfd_init-->

devices_init-->

jumptable_init

console_init_r-->

misc_init_r-->

enable_interrupts

cs8900_get_enetaddr-->

board_post_init-->

u-boot/common/main.c

for(;

;

{/*shellparser*/

main_loop()-->

u_boot_hush_start-->

readline

abortboot

printf("

Hitanykeytostopautoboot:

%2d"

bootdelay);

}

以上是at91rm9200启动并进入u-boot的执行流分析。

后面u-boot还会将uImage解压到特定的位置并开始启动内核代码。

3修改loaderboot

3.1修改Loader.bin的源码

1.修改include/main.h

#defineAT91C_UBOOT_BASE_ADDRESS0x21f00000

此开发板SDRAM为32M地址空间为0x20000000—0x22000000uboot被解压缩后要被拷贝到RAM的高端地址,防治与其他地址冲突

2.修改init.c中对SDRAM的初始化

AT91C_BASE_SDRC->

SDRC_MR=0x02

根据具体的SDRAM芯片修改:

MR[4]=1(表示16位)

MR[4]=0(表示32位)

3.2修改Boot.bin的源码

1.在main.c中添加两个外部函数的定义

Externintdeampress_image(void*src,void*dst,unsignedintlen);

解压缩函数,用来解压缩UBOOT

ExternvoidJump()跳转函数

2.在main.c中修改宏定义

#defineSRC0x10010000uboot在flash中的基地址

#defineDST0x21f00000解压缩UBOOT后载入到SDRAM中的地址

#defineLEN0x20000uboot的大小(最大大小)

3修改main.c中打印语句

AT91F_DBGU_Pringk()………

……

修改成自己希望的开机文字图样

4动手移植uboot

4.1从网上下载官方的ubot-1.1.1

4.2在/board下建立myboard文件夹,从/board/at91rm9200dk/..下拷贝文件。

At91rm9200dk.cflash.cconfig.mkmakefileu-boot.lds

4.2.1将at91rm9200dk.c改名为myboard.c,修改其部分代码。

由于这个开发板支持nandflash所以需要修改myboard.c下关于nandflash初始化的部分,nand_init().

具体修改如下:

将*AT91C_PIOC_ASR=AT91C_PC0_BFCK|AT91C_PC1_BFRDY_SMOE|

AT91C_PC3_BFBAA_SMWE;

改为*AT91C_PIOC_ASR=AT91C_PC1_BFRDY_SMOE|

//AT91C_PC0_BFCK

将*AT91C_PIOC_PDR=AT91C_PC0_BFCK|AT91C_PC1_BFRDY_SMOE|

AT91C_PC3_BFBAA_SMWE;

改为*AT91C_PIOC_PDR=AT91C_PC1_BFRDY_SMOE|

增加两句

*AT91C_PIOC_PER|=AT91C_PC0_BFCK;

*AT91C_PIOC_OER=AT91C_PC0_BFCK;

注:

AT91C_PC0_BFCK是BrustFlash控制器的时钟信号线。

AT91C_PC1_BFRDY_SMOE是BrustFlash控制器的读信号。

AT91C_PC3_BFBAA_SMWE是BrustFlash控制器的脉冲前沿地址。

AT91C_PIOC_ASR是外设A寄存器。

AT91C_PIOC_PDR是GPIO禁用寄存器。

AT91C_PIOC_PER是GPIO使能寄存器。

AT91C_PIOC_OER是GPIO使能输出寄存器。

上述修改的目的是,使能BFCK信号线的GPIO输出。

在/*ConfigurePC2asinput(signalREADYoftheSmartMedia)*/后增加

*AT91C_PMC_PCER|=(unsignedint)(1<

<

4);

此句。

目的:

开启外设时钟。

4.2.2修改flash.c

根据不同的flash芯片采用不同的flash程序接口,本开发板选用的是atmel的AT49BV322A。

由于芯片不同所以需要根据datasheet对flash.c进行修改。

①修改扇区大小和数目的定义

OrgDefOrgAT49BV16x4A[]=

{

{8,8*1024},/*8*8kBytessectors*/

{31,64*1024}/*31*64kBytessectors*/

改为

OrgDefOrgAT49BV16x4A[]=

{8,8*1024},/*8*64kBytessectors*/

{63,64*1024}/*63*8kBytessectors*/

本芯片为71个扇区。

②根据datasheet修改关于地址和读写命令的宏定义。

#defineFLASH_BANK_SIZE0x200000/*2MB*/

改为#defineFLASH_BANK_SIZE0x400000/*4MB*/

/*AT49BV1614ACodes*/

#defineFLASH_CODE10xAA

#defineFLASH_CODE20x55

#defineID_IN_CODE0x90

#defineID_OUT_CODE0xF0

#defineCMD_READ_ARRAY0x00F0

#defineCMD_UNLOCK10x00AA

#defineCMD_UNLOCK20x0055

#defineCMD_ERASE_SETUP0x0080

#defineCMD_ERASE_CONFIRM0x0030

#defineCMD_PROGRAM0x00A0

#defineCMD_UNLOCK_BYPASS0x0020

#defineMEM_FLASH_ADDR1(*(volatileu16*)(CFG_FLASH_BASE+(0x00005555<

1)))

#defineMEM_FLASH_ADDR2(*(volatileu16*)(CFG_FLASH_BASE+(0x00002AAA<

#defineIDENT_FLASH_ADDR1(*(volatileu16*)(CFG_FLASH_BASE+(0x0000555<

#defineIDENT_FLASH_ADDR2(*(volatileu16*)(CFG_FLASH_BASE+(0x0000AAA<

修改为:

/*MBM29LV320BECodes*/

#defineFLASH_CODE10x00AA00aa

#defineFLASH_CODE20x00550055

#defineID_IN_CODE0x00900090

#defineID_OUT_CODE0x00F000f0

#defineCMD_READ_ARRAY0x00F000F0

#defineCMD_ERASE_CONFIRM0x0030

#defineCMD_PROGRAM0x00A0

#defineCMD_UNLOCK_BYPASS0x00200020

#defineMEM_FLASH_ADDR1(*(volatileu16*)(CFG_FLASH_BASE+(0x0000555<

#defineMEM_FLASH_ADDR2(*(volatileu16*)(CFG_FLASH_BASE+(0x00002AA<

#defineIDENT_FLASH_ADDR1(*(volatileu32*)(CFG_FLASH_BASE+(0x0000555<

2)))

#defineIDENT_FLASH_ADDR2(*(volatileu32*)(CFG_FLASH_BASE+(0x0000AAA<

③去掉芯片自动识别,防治出以外错误。

注视掉if((flash_info[i].flash_id&

FLASH_TYPEMASK)……到else144行-152行。

4.2.3修改config.mk

将TEXT_BASE=0x21f80000修改为TEXT_BASE=0x21f00000

这个地址是要根一级boot中定义保持一致。

Boot中的main.c

#defineDST0x21f00000//UBOOT被解压缩后载入到SDRAM中的位置。

4.2.4修改makefile

将OBJS:

=at91rm920dk.oflash.o

修改为OBJS:

=myboard.oflash.o自己命名的开发板的名字

4.3修改include下面的头文件

⑴在/include/configs/下建立myboard.h,可以复制at91rm9200dk.h改名。

具体注意修改如下:

#defineCONFIG_MYBOARD1//目标板

#defineCONFIG_NR_DRAM_BANKS1//SDRAMbank数

#definePHYS_SDRAM0x20000000//基地址

#definePHYS_SDRAM_SIZE0x2000000//大小32M

#definePHYS_FLASH_10x10000000//基地址

#definePHYS_FLASH_SIZE0x400000//大小4M

#defineCFG_FLASH_BASEPHYS_FLASH_1//别名

#defineCFG_MAX_FLASH_BANKS1//总bank数

#defineCFG_MAX_FLASH_SECT71//扇区总数

根据ubot-1.1.1的/include/configs/at91rm9200dk.h修改的比较少,大部分是修改容量和扇区总数及其基地址。

⑵修改/include/cmd_confdefs.h

修改#defineCFG_CMD_NONSTD(………

…)

这个宏定义是决定ubot支持的功能,如果需要支持就从括号中删除此行。

利于源码支持CFG_CMD_LOADB

CFG_CMD_MEMORY等。

我们这里的修改是删除“CFG_CMD_NAND|\”这行,是uboot支持nandflash。

4.4修改根目录下的MAKEALL和Makefile

⑴修改MAKEALL:

在LIST_ARM9="

\

at91rm9200dkintegratorcpintegratorap\

omap1510innomap1610h2omap1610inn\

smdk2400smdk2410trab\

VCMA9versatilemyboard\"

中加入对目标板的定义。

⑵修改Makefile

修改当前交叉编译器的绝对路径:

ifeq($(ARCH),arm)

CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-

添加目标板配置选项

#########################################################################

##AT91RM9200Systems

at91rm9200dk_config:

unconfig

@./mkconfig$(@:

_config=)armat91rm9200at91rm9200dk

myboard_config:

_config=)armat91rm9200myboard

5编译,调试

至此,uboot的修改基本完成,让我们编译下看看吧。

在纯linux环境下编译(不要在VM里linux和windows的共享目录里编译)

进入uboot的根目录,键入如下命令

makeclean(清除过程文件)

makemyboard_config(生成目标板的配置文件)

makeall(开始编译)

我等,我等,我等等等~!

啊~!

出问题了

从错误中看是提示未定义。

好吧,那就找错误。

这时候就体现出SourceInsight的优势了,全工程搜索,快捷的查找任意的函数或者宏的定义位置。

最后在/include/common.h中添加

#include<

asm/arch-at91rm9200/AT91RM9200.h>

包含与硬件相关的寄存器的定义,这个跟uboot版本有关系,比如uboot-1.0.0的include/common.h里就有这句话。

好了再编译一次吧……

Makeclean

Makeall

VM虚拟机编译还真是不快,不过这次没出问题,成功了。

编译结束后在根目录下会生成u-boot.bin大概104k

然后将其压缩为gz格式的

gzip–cu-boot.bin>

u-boot.gz

因为一级boot中的解压缩函数是解压缩的gz格式然后拷贝到RAM的高端地址中去的。

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

当前位置:首页 > 自然科学 > 物理

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

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