文档库 最新最全的文档下载
当前位置:文档库 › uBoot命令

uBoot命令

uBoot命令
uBoot命令

u-boot命令行接口

u-boot中所有操作都是通过其命令行通过输入命令完成。本节叙述u-boot的命令行接口,请注意,由于u-boot的可配置性,因此,当前配置并不一定支持所有的命令。用户可以使用help命令查看当前配置支持的所有命令。

u-boot中所有命令的数字都是以十六进制格式输入。有些命令的处理结果依赖于u-boot 的配置以及一些环境变量的设置。

在u-boot中输入命令并不一定需要输入全名,而是可以省略后面的一些字符,如“help”命令等同于“h”、“he”和“hel”。

下面介绍一些常用的u-boot命令:

1) 信息查看命令

▼ bdinfo:打印目标板配置信息

SMDK2410 # bdinfo

arch_number = 0x000000C1

env_t = 0x00000000

boot_params = 0x30000100

DRAM bank = 0x00000000

-> start = 0x30000000

-> size = 0x04000000

ethaddr = 00:00:00:00:00:00

ip_addr = 10.0.0.110

baudrate = 115200 bps

SMDK2410 #

▼ flinfo:获取可用的flash的信息

SMDK2410 # flinfo

Bank # 1: INTEL 28F128J3A

Size: 32 MB in 128 Sectors

Sector Start Addresses:

00000000 (RO) 00040000 (RO) 00080000 000C0000 00100000

00140000 00180000 001C0000 00200000 00240000

00280000 002C0000 00300000 00340000 00380000

003C0000 00400000 00440000 00480000 004C0000

00500000 00540000 00580000 005C0000 00600000

00640000 00680000 006C0000 00700000 00740000

00780000 007C0000 00800000 00840000 00880000

008C0000 00900000 00940000 00980000 009C0000

00A00000 00A40000 00A80000 00AC0000 00B00000

00B40000 00B80000 00BC0000 00C00000 00C40000

00C80000 00CC0000 00D00000 00D40000 00D80000

00DC0000 00E00000 00E40000 00E80000 00EC0000

00F00000 00F40000 00F80000 00FC0000 01000000

01040000 01080000 010C0000 01100000 01140000

01180000 011C0000 01200000 01240000 01280000

012C0000 01300000 01340000 01380000 013C0000

01400000 01440000 01480000 014C0000 01500000

01540000 01580000 015C0000 01600000 01640000

01680000 016C0000 01700000 01740000 01780000

017C0000 01800000 01840000 01880000 018C0000

01900000 01940000 01980000 019C0000 01A00000

01A40000 01A80000 01AC0000 01B00000 01B40000

01B80000 01BC0000 01C00000 01C40000 01C80000

01CC0000 01D00000 01D40000 01D80000 01DC0000

01E00000 01E40000 01E80000 01EC0000 01F00000

01F40000 01F80000 01FC0000

SMDK2410 #其输出包含flash型号(28F128J3A)、大小(32MB)、扇区数(128)、每一扇区的起始地址及其属性,上面的输出中,第一个扇区的起始地址为0x0,第一个扇区的起始地址为0x0,且其属性为只读(标记“RO”)。

▼ help:打印帮助信息

如果不带任何参数将打印当前支持的所有命令,如果将某一命令名字作为其参数,将得到该命令的更加详细的信息。

如:

SMDK2410 #help

SMDK2410 #help flinfo

2) 存储器操作命令

▼ base:打印或设置地址偏移

SMDK2410 # base

Base Address: 0x00000000

SMDK2410 # md 0 c

00000000: feffffff 00000000 7cbd2b78 7cdc3378 ........|.+x|.3x

00000010: 3cfb3b78 3b000000 7c0002e4 39000000 <.;x;...|...9...

00000020: 7d1043a6 3d000400 7918c3a6 3d00c000 }.C.=...y...=...

SMDK2410 # base 40000000

Base Address: 0x40000000

SMDK2410 # md 0 c

40000000: 27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.

40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -

40000020: 2031393a 35353a30 34290000 00000000 19:55:04)......

SMDK2410 #

使用该命令打印或设置存储器操作命令所使用的“基地址”,缺省值是0。当需要反复访问一个地址区域时,可以设置该区域的起始地址为基地址,其余的存储器命令参数都相对于该地址进行操作。如上面所示,设置0x40000000地址为基地址以后,md操作就相对于该基地址进行。

▼ crc32:校验和计算

该命令能够用于计算某一段存储器区域的CRC32校验和。

SMDK2410 # crc 100004 3FC

CRC32 for 00100004 ... 001003ff ==> d433b05b

SMDK2410 #

当使用3个参数时,该命令保存计算的校验和到指定的地址,如:

SMDK2410 # crc 100004 3FC 100000

CRC32 for 00100004 ... 001003ff ==> d433b05b

SMDK2410 # md 100000 4

00100000: d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8'.<.....<.

SMDK2410 #

可以看到,CRC32校验和不仅仅被打印出来,而且被存储在地址0x100000。

▼ cmp:存储区比较

使用cmp命令,用户可以测试两个存储器区域是否相同。该命令或者测试由第三个参数指定的整个区域,或者在第一个存在差异的地方停下来

SMDK2410 # cmp 100000 40000000 400

word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)

Total of 1 word were the same

SMDK2410 # md 100000 C

00100000: 27051956 50ff4342 6f6f7420 312e312e '..VP.CBoot 1.1.

00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -

00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......

SMDK2410 # md 40000000 C

40000000: 27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.

40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -

40000020: 2031393a 35353a30 34290000 00000000 19:55:04)......

SMDK2410 #

cmp命令可以以不同的宽度访问存储器:32位、16位或者8位。如果使用“cmp”或“cmp.l”则使用缺省宽度(32位),如果使用“cmp.w”则使用16位宽度,“cmp.b”使用8位宽度。

请注意第三个参数表示的是比较数据的长度,其单位为“数据宽度”,视所使用的命令不同而不同,如:采用32位宽度时单位为32位数据,即4个字节。

SMDK2410 # cmp.l 100000 40000000 400

word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)

Total of 1 word were the same

SMDK2410 # cmp.w 100000 40000000 800

halfword at 0x00100004 (0x50ff) != halfword at 0x40000004 (0x5050)

Total of 2 halfwords were the same

SMDK2410 # cmp.b 100000 40000000 1000

byte at 0x00100005 (0xff) != byte at 0x40000005 (0x50)

Total of 5 bytes were the same

SMDK2410 #

▼ cp:存储区拷贝

该命令用于存储区拷贝,和cmp命令一样,该命令支持.l、.w和.b扩展命令。

SMDK2410 # cp 40000000 100000 10000

SMDK2410 #

▼ md:存储区显示

该命令以十六进制和ASCII码方式显示存储区,该命令支持.l、.w和.b扩展命令。

▼ mm:存储区修改

该命令提供一种交互式地修改存储器内容的方式。它将显示地址和当前内容,然后提示用户输入,如果用户输入一个合法的十六进制值,该值将被写到当前地址。然后将提示下

一个地址。如果用户没有输入任何值,而只是输入“ENTER”,当前地址内容将不作改变。该命令直到输入一个非十六进制值(如“.”)结束。该命令支持.l、.w和.b扩展命令。

SMDK2410 # mm 100000

00100000: 27051956 ? 0

00100004: 50504342 ? AABBCCDD

00100008: 6f6f7420 ? 01234567

0010000c: 312e312e ? .

SMDK2410 # md 100000 10

00100000: 00000000 aabbccdd 01234567 312e312e .........#Eg1.1.

00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -

00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......

00100030: 00000000 00000000 00000000 00000000 ................

SMDK2410 #

▼ mtest:简单的存储区测试

该命令提供一个简单的内存测试方法。它测试存储区的写操作是否成功,如果对于ROM 或flash等存储器将测试失败。该命令在测试一些u-boot必须的区域时,可能引起系统崩溃,这些区域包括:异常向量代码、u-boot内部程序代码、栈、堆等。

SMDK2410 # mtest 100000 200000

Testing 00100000 ... 00200000:

Pattern 0000000F Writing... Reading...

SMDK2410 #

▼ mw:内存填充

该命令提供一种存储区初始化的方法。当不使用count参数时,value值被写入指定的地址,当使用count时,整个的存储区将被写入value值。该命令支持.l、.w和.b扩展命令。

SMDK2410 # md 100000 10

00100000: 0000000f 00000010 00000011 00000012 ................

00100010: 00000013 00000014 00000015 00000016 ................

00100020: 00000017 00000018 00000019 0000001a ................

00100030: 0000001b 0000001c 0000001d 0000001e ................

SMDK2410 #

▼ mw:存储区修改

该命令能够被用于交互式地写若干次不同的数据到同一地址,与mm不同的是它的地址总是同一地址,而mm将进行累加。该命令支持.l、.w和.b扩展命令。

SMDK2410 # nm.b 100000

00100000: 00 ? 48

00100000: 48 ? 61

00100000: 61 ? 6c

00100000: 6c ? 6c

00100000: 6c ? 6f

00100000: 6f ? .

SMDK2410 # md 100000 8

00100000: 6f000000 115511ff ffffffff ffff1155 o....U.........U

00100010: 00000000 00000000 00000015 00000016 ................

SMDK2410 #

3) flash存储器操作命令

▼ cp:存储区拷贝

cp命令可以自动识别flash区域并当目标区域再flash中时自动调用flash编程程序。

SMDK2410 # cp 30000000 00000000 10000

Copy to Flash... done

SMDK2410 #

当目标区域没有被擦除或者被写保护时,写到该区域将可能导致失败。

SMDK2410 # cp 30000000 00000000 10000

Copy to Flash... Can't write to protected Flash sectors

SMDK2410 #

请注意第三个参数count的单位为数据宽度,如果你希望使用字节长度。

▼ flinfo:获取可用的flash的信息

该命令在“1) 信息查看命令”中已经说明。

▼ erase:擦除flash存储器

在u-boot中,一个bank就是连接到CPU的同一片选信号的一个或者多个flash芯片组成的flash存储器区域。扇区是一次擦除操作的最小区域,擦除操作都是以扇区为单位的。在u-boot中,bank的编号从1开始,而扇区编号从0开始。

该命令用于擦除一个或多个扇区。它的使用比较复杂,最常用的用法就是传递待擦除区域的开始和结束地址到命令中,而且这两个地址必须是扇区的开始地址和起始地址:SMDK2410 # era 40040000 402FFFFF

Erase Flash from 0x40040000 to 0x402fffff

.............. done

Erased 22 sectors

SMDK2410 #

另外一个方法是选择flash扇区和bank作为参数。

SMDK2410 # era 1:6-8

Erase Flash Sectors 6-8 in Bank # 1

.. done

SMDK2410 #

还有一种方法可以擦除整个bank,如下所示,注意其中有一个警告信息提示有写保护扇区存在并且这些扇区没有被擦除。

SMDK2410 # erase all

Erase Flash Bank # 1 - Warning: 5 protected sectors will not be erased!

................... done

Erase Flash Bank # 2

......................... done

SMDK2410 #

▼ protect:使能或者禁止flash保护功能

该命令也是一个比较复杂的命令。它用于设置flash存储器的特定区域为只读模式,或取消只读属性。flash设置为只读模式后,不能被拷贝(cp命令)或者擦除(erase命令)。

Flash保护的级别依赖于所使用的flash芯片和flash设备驱动的实现方法。在大多数u-boot的实现中仅仅提供简单的软件保护,它可以阻止以外的擦除或者重写重要区域(如:u-boot代码以及u-boot环境变量等),且仅仅对于u-boot有效,任何操作系统并不识别该保护。

4) 执行控制命令

▼ bootm:从存储器启动应用程序映像

SMDK2410 # help bootm

bootm [addr [arg ...]]

? boot application image stored in memory

passing arguments 'arg ...'; when booting a Linux kernel,

'arg' can be the address of an initrd image

SMDK2410 #

该命令用于启动操作系统映像。从映像头获取操作系统类型,所使用文件压缩方法,加载和入口点地址等信息。该命令将加载映像到指定的存储器地址,如果需要将解压缩。该命令也可以传递要求的启动参数并在其入口点启动操作系统。

bootm的第一个参数是待加载映像的存储地址(RAM、ROM或者flash存储器等),在它之后可以添加操作系统所需要的参数。

对于Linux操作系统,可以传递一个可选参数。该参数作为initrd ramdisk映像的起始地址(在RAM、ROM或者flash存储器等)。在这种情况下,bootm命令由三个步骤组成:首先Linux内核映像被解压缩并拷贝到RAM,然后ramdisk映像被加载到RAM,最后,控制权交给Linux内核,并传递ramdisk映像的位置和大小信息。

为了启动一个initrd ramdisk映像的Linux内核,可以使用下面的命令:

SMDK2410 # bootm $(kernel_addr)

如果使用ramdisk,可以使用如下命令:

SMDK2410 # bootm $(kernel_addr) $(ramdisk_addr)

请注意,当待加载的映像已经被加载到RAM(如私用TFTP下载)时,必须避免压缩映像的位置与需要加载解压缩后内核的位置重叠。例如,如果加载一个ramdisk映像在一个低端内存,它可能被加载的Linux内核所覆盖,这将导致未定义的系统崩溃。

▼ go:开始某地址处的应用程序

SMDK2410 # help go

go addr [arg ...]

? start application at address 'addr'

passing 'arg' as arguments

SMDK2410 #

u-boot支持独立的应用程序。这些程序不要求操作系统运行时的复杂的运行环境,而只需要它们能够被加载并且被u-boot调用执行。该命令用于启动这些独立的应用程序。可选的参数被毫无须改地传递到应用程序。

5) 下载命令

▼ loadb:经由串口线加载二进制文件(kermit模式)

SMDK2410 # help loadb

loadb [ off ] [ baud ]

? load binary file over serial line with offset 'off' and baudrate 'baud'

SMDK2410 #

用户使用kermit程序下载二进制数据。此处我们以下载uImage为例说明loadb的用法。请参考附录正确设置kermit程序。

SMDK2410 # loadb 100000

## Ready for binary (kermit) download ...

Ctrl.\c

(Back at denx.denx.de)

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

C.Kermit 7.0.197, 8 Feb 2000, for Linux

Copyright (C) 1985, 2000,

Trustees of Columbia University in the City of New York.

Type ? or HELP for help.

Kermit> send /bin /tftpboot/pImage

...

Kermit> connect

Connecting to /dev/ttyS0, speed 115200.

The escape character is Ctrl.\ (ASCII 28, FS)

Type the escape character followed by C to get back,

or followed by ? to see other options.

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

= 550260 Bytes

## Start Addr = 0x00100000

SMDK2410 # iminfo 100000

## Checking Image at 00100000 ...

Image Name: Linux.2.4.4

Created: 2002.07.02 22:10:11 UTC

Image Type: PowerPC Linux Kernel Image (gzip compressed)

Data Size: 550196 Bytes = 537 kB = 0 MB

Load Address: 00000000

Entry Point: 00000000

Verifying Checksum ... OK

▼ tftpboot:使用TFTP协议经由网络加载映像文件

SMDK2410 # help tftp

tftpboot [loadAddress] [bootfilename]

SMDK2410 #

6) 环境变量操作命令

▼ printenv:打印环境变量

SMDK2410 # help printenv

printenv

? print values of all environment variables

printenv name ...

? print value of environment variable 'name'

SMDK2410 #

该命令打印一个、几个或者所有的u-boot环境变量。下面的命令将打印三个环境变量:ipaddr、hostname和netmask。

SMDK2410 # printenv ipaddr hostname netmask

ipaddr=10.0.0.99

hostname=tqm

netmask=255.0.0.0

SMDK2410 #

如下命令将打印所有的环境变量和它们的值,再加上一些统计数据,如:存储环境变量的大小。

SMDK2410 #printenv

▼ saveenv:保存环境变量到非易失性存储介质

SMDK2410 # help saveenv

saveenv ? No help available.

SMDK2410 #

对于u-boot的改变仅仅再RAM中有效,一旦系统重新启动,这些改变将丢失。如果想这些改变永久保存,用户必须使用saveenv命令将环境变量的设置保存到非易失性介质中,u-boot在启动时将自动从非易失性介质中加载。

SMDK2410 # saveenv

Saving Enviroment to Flash...

Un?Prot ected 1 sectors

Erasing Flash...

. done

Erased 1 sectors

Writing to Flash... done

Protected 1 sectors

SMDK2410 #

▼ setenv:设置环境变量

SMDK2410 # help setenv

setenv name value ...

? set environment variable 'name' to 'value ...'

setenv name

? delete environment variable 'name'

SMDK2410 #

为了修改u-boot环境变量,用户必须使用setenv命令。当只使用一个参数时,将输出名字为该参数的u-boot环境变量。如下所示:

SMDK2410 # printenv foo

foo=This is an example value.

SMDK2410 # setenv foo

SMDK2410 # printenv foo

## Error: "foo" not defined

SMDK2410 #

当使用多个参数调用时,第一个参数表示环境变量的名称,所有的后面的参数组成该环境变量的值。改变量将自动创建新的环境并将覆盖已经存在的同名环境变量。

SMDK2410 # printenv bar

## Error: "bar" not defined

SMDK2410 # setenv bar This is a new example.

SMDK2410 # printenv bar

bar=This is a new example.

SMDK2410 #

请注意当一个变量包含对命令行解析器有特殊意义的字符(如:“$”字符用于变量替换或者分割命令的分号)时,使用反斜线符号(“\”)以避开这些特殊字符,如:

SMDK2410 # setenv cons_opts console=tty0 console=ttyS0,\$(baudrate)

SMDK2410 # printenv cons_opts

cons_opts=console=tty0 console=ttyS0,$(baudrate)

SMDK2410 #

除非命令行解析器强加(如反斜线符号用于引用,空格和tab字符用于分割参数,分号或者换行用于分割命令等),否则环境变量名字没有任何限制。“=?/|()+=”也似一个合法的变量名。

▼ run:运行一个环境变量中的命令

SMDK2410 # help run

run var [...]

? run the commands in the environment variable(s) 'var'

SMDK2410 #

用户可以使用u-boot环境变量存储命令甚至命令序列。为了执行一个命令,使用run 命令:

SMDK2410 # setenv test echo This is a test\;printenv ipaddr\;echo Done.

SMDK2410 # printenv test

test=echo This is a test;printenv ipaddr;echo Done.

SMDK2410 # run test

This is a test

ipaddr=10.0.0.99

Done.

SMDK2410 #

可以使用多个参数调用run命令,在这种情况下,将依次执行命令序列:

SMDK2410 # setenv test2 echo This is another Test\;printenv serial#\;echo Done.

SMDK2410 # printenv test test2

test=echo This is a test;printenv ipaddr;echo Done.

test2=echo This is another Test;printenv serial#;echo Done.

SMDK2410 # run test test2

This is a test

ipaddr=10.0.0.99

Done.

This is another Test

serial#=TQM860LDDBA3?P50.203 10226122 4

Done.

SMDK2410 #

u-boot启动分析

背景: Board →ar7240(ap93) Cpu →mips 1、首先弄清楚什么是u-boot Uboot是德国DENX小组的开发,它用于多种嵌入式CPU的bootloader程序, uboot不仅支持嵌入式linux系统的引导,当前,它还支持其他的很多嵌入式操作系统。 除了PowerPC系列,还支持MIPS,x86,ARM,NIOS,XScale。 2、下载完uboot后解压,在根目录下,有如下重要的信息(目录或者文件): 以下为为每个目录的说明: Board:和一些已有开发板有关的文件。每一个开发板都以一个子目录出现在当前目录中,子目录存放和开发板相关的配置文件。它的每个子文件夹里都有如下文件(以ar7240/ap93为例): Makefile Config.mk Ap93.c 和板子相关的代码 Flash.c Flash操作代码 u-boot.lds 对应的链接文件 common:实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令对应就是cmd_bootm.c cpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录mips等。它的每个子文件夹里都有入下文件: Makefile Config.mk Cpu.c 和处理器相关的代码s Interrupts.c 中断处理代码 Serial.c 串口初始化代码 Start.s 全局开始启动代码 Disk:对磁盘的支持

Doc:文档目录。Uboot有非常完善的文档。 Drivers:Uboot支持的设备驱动程序都放在该目录,比如网卡,支持CFI的Flash,串口和USB等。 Fs:支持的文件系统,Uboot现在支持cramfs、fat、fdos、jffs2和registerfs。 Include:Uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目下configs目录有与开发板相关的配置文件,如 ar7240_soc.h。该目录下的asm目录有与CPU体系结构相关的头文件,比如说mips 对应的有asm-mips。 Lib_xxx:与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。 Net:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。 Tools:生成Uboot的工具,如:mkimage等等。 3、mips架构u-boot启动流程 u-boot的启动过程大致做如下工作: 1、cpu初始化 2、时钟、串口、内存(ddr ram)初始化 3、内存划分、分配栈、数据、配置参数、以及u-boot代码在内存中的位置。 4、对u-boot代码作relocate 5、初始化malloc、flash、pci以及外设(比如,网口) 6、进入命令行或者直接启动Linux kernel 刚一开始由于参考网上代码,我一个劲的对基于smdk2410的板子,arm926ejs的cpu看了N 久,启动过程和这个大致相同。 整个启动中要涉及到四个文件: Start.S →cpu/mips/start.S Cache.S →cpu/mips/cache.S Lowlevel_init.S →board/ar7240/common/lowlevel_init.S Board.c →lib_mips/board.c 整个启动过程分为两个阶段来看: Stage1:系统上电后通过汇编执行代码 Stage2:通过一些列设置搭建了C环境,通过汇编指令跳转到C语言执行. Stage1: 程序从Start.S的_start开始执行.(至于为什么,参考u-boot.lds分析.doc) 先查看start.S文件吧!~ 从_start标记开始会看到一长串莫名奇妙的代码:

UBOOT命令详解

常用U-boot命令详解(z) 2010-09-30 15:05:52| 分类:学习心得体会|字号订阅 U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,在我编译的 U-boot-2009.11中的命令行模式模式下支持“Tab”键的命令补全和命令的历史记录功能。而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比如我想看这个U-boot的版本号,命令就是“ version”,但是在所有的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。 [u-boot@MINI2440]# version U-Boot 2009.11 ( 4月04 2010 - 12:09:25) [u-boot@MINI2440]# v U-Boot 2009.11 ( 4月04 2010 - 12:09:25) [u-boot@MINI2440]# base Base Address: 0x00000000 [u-boot@MINI2440]# ba Base Address: 0x00000000 由于U-boot支持的命令实在太多,一个一个细讲不现实,也没有必要。所以下面我挑一些烧写和引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧! (1)获取帮助 命令:help 或? 功能:查看当前U-boot版本中支持的所有命令。 [u-boot@MINI2440]#help ?- alias for'help' askenv - get environment variables from stdin base - print or set address offset bdinfo - print Board Info structure bmp - manipulate BMP image data boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BOOTP/TFTP protocol

AM335x uboot spl分析

AM335x uboot spl分析 芯片到uboot启动流程 ROM → SPL→ uboot.img 简介 在335x 中ROM code是第一级的bootlader。mpu上电后将会自动执行这里的代码,完成部分初始化和引导第二级的bootlader,第二级的bootlader引导第三级bootader,在 ti官方上对于第二级和第三级的bootlader由uboot提供。 SPL To unify all existing implementations for a secondary program loader (SPL) and to allow simply adding of new implementations this generic SPL framework has been created. With this framework almost all source files for a board can be reused. No code duplication or symlinking is necessary anymore. 1> Basic ARM initialization 2> UART console initialization 3> Clocks and DPLL locking (minimal) 4> SDRAM initialization 5> Mux (minimal) 6> BootDevice initialization(based on where we are booting from.MMC1/MMC2/Nand/Onenand) 7> Bootloading real u-boot from the BootDevice and passing control to it. uboot spl源代码分析 一、makefile分析 打开spl文件夹只有一个makefile 可见spl都是复用uboot原先的代码。 主要涉及的代码文件为u-boot-2011.09-psp04.06.00.03/arch/arm/cpu/armv7 u-boot-2011.09-psp04.06.00.03/arch/arm/lib u-boot-2011.09-psp04.06.00.03/drivers LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-spl.lds 这个为链接脚本 __image_copy_end _end 三、代码解析 __start 为程序开始(arch/arm/cpu/armv7/start.S) .globl _start 这是在定义u-boot的启动定义入口点,汇编程序的缺省入口是 start 标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。

UBoot移植详解

u-boot 移植步骤详解 1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。 选择U-Boot的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

uboot版本文件结构

uboot版本文件结构的更新改变 分类:ARM2011-09-22 12:57 339人阅读评论(0) 收藏举报本来是开始分析uboot代码的,但是无论是教材还是网上资料都对于我最新下的uboot原码结构不同,对于还是小白的我不容易找到相应的文件,下面是uboot版本中文件组织结构的改变,,,,, u-boot版本情况 网站:http://ftp.denx.de/pub/u-boot/ 1、版本号变化: 2008年8月及以前 按版本号命名:u-boot-1.3.4.tar.bz2(2008年8月更新) 2008年8月以后均按日期命名。 目前最新版本:u-boot-2011.06.tar.bz2(2011年6月更新) 2、目录结构变化: u-boot目录结构主要经历过2次变化,u-boot版本第一次从u-boot-1.3.2开始发生变化,主要增加了api的内容;变化最大的是第二次,从2010.6版本开始。 u-boot-2010.03及以前版本 ├── api存放uboot提供的接口函数 ├── board根据不同开发板定制的代码,代码也不少 ├── common通用的代码,涵盖各个方面,已命令行处理为主 ├── cpu与体系结构相关的代码,uboot的重头戏 ├── disk磁盘分区相关代码 ├── doc文档,一堆README开头的文件 ├── drivers驱动,很丰富,每种类型的设备驱动占用一个子目录 ├── examples示例程序 ├── fs文件系统,支持嵌入式开发板常见的文件系统 ├── include头文件,已通用的头文件为主 ├── lib_【arch】与体系结构相关的通用库文件 ├── nand_spl NAND存储器相关代码 ├── net网络相关代码,小型的协议栈 ├── onenand_ipl

uboot下载内核和文件系统的步骤

uboot 下载内核和文件系统的步骤 1)下载linux到系统的SDRAM运行(仅做测试之用,断电或退出后就会消失) 1>运行Uboot,设置环境变量 Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量 Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址 Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址 Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址 2>下载linux内核,文件系统 打开tftpserver应用程序,设置根目录路径,将内核、文件系统等拷贝到所设置的根目录下。 Uboot>tftp 21100000 ramdisk.gz 下载文件系统 Uboot>tftp 21000000 uImage 下载 linux 内核 Uboot>bootm 21000000 启动 linux 然后linux操作系统就开始运行。 2)烧写 Linux 到系统的 Flash 运行 1>设置运行Linux的环境变量 Uboot> setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量Uboot>setenv image cp.b 10020000 21000000 b0000 拷贝内核到sdram Uboot>setenv ramdisk cp.b 100d0000 21100000 226000 拷贝文件系统到sdram Uboot>setenv boot bootm 设置变量boot Uboot>setenv bootcmd run ramdisk\;run image\;run boot 设置默认变量bootcmd Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址 Uboot>setenv ipaddr 目标板 ip 地址目标板 ip 地址,由你自己决定Uboot>setenv serverip 主机ip地址主机ip地址,就是你的PC的ip Uboot>saveenv 保存环境变量 2>烧写Linux内核到Flash Uboot>tftp 21100000 ramdisk.gz Uboot>cp.b 21100000 100d0000 226000

uboot环境变量总结

Common目录下面与环境变量有关的文件有以下几个:env_common.c,env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c,env_nowhere.c,env_nvram.c,environment.c。 env_common.c中包含的是default_environment[]的定义; env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c, env_nvram.c 中包含的是相应存储器与环境变量有关的函数:env_init(void),saveenv(void),env_relocate_spec (void),env_relocate_spec (void),use_default()。至于env_nowhere.c,因为我们没有定义CFG_ENV_IS_NOWHERE,所以这个文件实际上没有用。 environment.c这个文件时是我真正理解环境变量的一个关键。在这个文件里定义了一个完整的环境变量的结构体,即包含了这两个ENV_CRC(用于CRC校验),Flags(标志有没有环境变量的备份,根据CFG_REDUNDAND_ENVIRONMENT这个宏定义判断)。定义这个环境变量结构体的时候还有一个非常重要的关键字: __PPCENV__,而__PPCENV__在该.c文件中好像说是gnu c编译器的属性,如下: # define __PPCENV__ __attribute__ ((section(".text"))) 意思是把这个环境变量表作为代码段,所以在编译完UBOOT后,UBOOT的代码段就会有环境变量表。当然,这要在我们定义了ENV_IS_EMBEDDED之后才行,具体而言,环境变量表会在以下几个地方出现(以nand flash为例): 1、UBOOT中的代码段(定义了ENV_IS_EMBEDDED), 2、UBOOT中的默认环 境变量, 3、紧接UBOOT(0x0 ~ 0x1ffff)后面:0x20000 ~ 0x3ffff 之间,包括备份的环境变量,我们读取,保存也是对这个区域(即参数区)进行的。3、SDRAM中的UBOOT中,包括代码段部分和默认部分,4、SDRAM中的melloc分配的内存空间中。 Environment.c代码如下: env_t environment __PPCENV__ = { ENV_CRC, /* CRC Sum */ #ifdef CFG_REDUNDAND_ENVIRONMENT 1, /* Flags: valid */ #endif { #if defined(CONFIG_BOOTARGS) "bootargs=" CONFIG_BOOTARGS "\0" #endif #if defined(CONFIG_BOOTCOMMAND) "bootcmd=" CONFIG_BOOTCOMMAND "\0" #endif #if defined(CONFIG_RAMBOOTCOMMAND) "ramboot=" CONFIG_RAMBOOTCOMMAND "\0"

U_Boot第一启动阶段Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)

Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解) Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解) 1 u-boot.lds 首先了解uboot的链接脚本board/my2410/u-boot.lds,它定义了目标程序各部分的链接顺序。OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出可执行文件为ELF格式,32为,ARM小端*/ OUTPUT_ARCH(arm) /*指定输出可执行文件为ARM平台*/ ENTRY(_start) /*起始代码段为_start*/ SECTIONS { /* 指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置*、. = 0x00000000;从0x0位置开始 . = ALIGN(4); 4字节对齐 .text : {

cpu/arm920t/start.o (.text) board/my2440/lowlevel_init.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data) } /* 只读数据段,所有的只读数据段都放在这个位置*/ . = ALIGN(4); .got : { *(.got) } /*指定got段, got段式是uboot自定义的一个段, 非标准段*/ . = .; __u_boot_cmd_start = .; /*把__u_boot_cmd_start赋值为当前位置, 即起始位置*/ .u_boot_cmd : { *(.u_boot_cmd) } /* u_boot_cmd段,所有的u-boot命令相关的定义都放在这个位置,因为每个命令定义等长,所以只要以__u_boot_cmd_start为起始地址进行查找就可以很快查找到某一个命令的定义,并依据定义的命令指针调用相应的函数进行处理用户的任务*/ __u_boot_cmd_end = .; /* u_boot_cmd段结束位置,由此可以看出,这段空间的长度并没有严格限制,用户可以添加一些u-boot的命令,最终都会在连接是存放在这个位置。*/

UBoot源码分析1

?UBoot源码解析(一)

主要内容 ?分析UBoot是如何引导Linux内核 ?UBoot源码的一阶段解析

BootLoader概念?Boot Loader 就是在操作系统内核运行之前运行 的一段小程序。通过这段小程序,我们可以初始 化硬件设备、建立内存空间的映射图,从而将系 统的软硬件环境带到一个合适的状态,以便为最 终调用操作系统内核准备好正确的环境 ?通常,Boot Loader 是严重地依赖于硬件而实现 的,特别是在嵌入式世界。因此,在嵌入式世界 里建立一个通用的Boot Loader 几乎是不可能的。 尽管如此,我们仍然可以对Boot Loader 归纳出 一些通用的概念来,以指导用户特定的Boot Loader 设计与实现。

UBoot来源?U-Boot 是 Das U-Boot 的简称,其含义是 Universal Boot Loader,是遵循 GPL 条款的开放源码项目。最早德国 DENX 软件工程中心的 Wolfgang Denk 基于 8xxROM 和 FADSROM 的源码创建了 PPCBoot 工程项目,此后不断 添加处理器的支持。而后,Sysgo Gmbh 把 PPCBoot 移 植到 ARM 平台上,创建了 ARMBoot 工程项目。最终, 以 PPCBoot 工程和 ARMBoot 工程为基础,创建了 U- Boot 工程。 ?而今,U-Boot 作为一个主流、通用的 BootLoader,成功地被移植到包括 PowerPC、ARM、X86 、MIPS、NIOS、XScale 等主流体系结构上的百种开发板,成为功能最多、 灵活性最强,并且开发最积极的开源 BootLoader。目前。 U-Boot 仍然由 DENX 的 Wolfgang Denk 维护

关于uboot移植 CAMDIVN与时钟

关于uboot移植 CAMDIVN与时钟 2010-03-09 19:57 在该文件的122行附近有这样一个结构体 typedef struct { S3C24X0_REG32 LOCKTIME; S3C24X0_REG32 MPLLCON; S3C24X0_REG32 UPLLCON; S3C24X0_REG32 CLKCON; S3C24X0_REG32 CLKSLOW; S3C24X0_REG32 CLKDIVN; } /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER; 是用来封装时钟寄存器的,我们要在其中增加一项S3C24X0_REG32 CAMDIVN,为什么加这么一个呢?因为这个寄存器是2410所没有的,而2440在配置时钟的时候又必须用到,看名字我们就知道是用来配置CAMERA时钟的,也就是配置摄像头的时钟的。 貌似和配置uboot启动的时钟没有关系?其实不然,我们在修改下一个文件的时候就可以看到其用途了, 此结构体修改后的结果为 typedef struct { S3C24X0_REG32 LOCKTIME; S3C24X0_REG32 MPLLCON; S3C24X0_REG32 UPLLCON; S3C24X0_REG32 CLKCON; S3C24X0_REG32 CLKSLOW; S3C24X0_REG32 CLKDIVN; S3C24X0_REG32 CAMDIVN; } /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER; 第二个文件..\cpu\arm920t\s3c24x0\speed.c 在这个文件中需要修改两个函数 第一个函数在54行附近:static ulong get_PLLCLK(int pllreg) 由于S3C2410和S3C2440的MPLL、UPLL计算公式不一样,所以get_PLLCLK 函数也需要修改:

UBoot实验2、uboot使用实验

Uboot的使用 一、 实验目的 在实验平台上使用uboot常用命令及使用Tftp工具传输文件。 二、 实验资源 硬件资源 CPU Samsung S3C2440A Nand flash Samsung K9D1208V0M 64M RAM64M 软件资源 bootloader uboot Tftp server tftpd32.exe 三、 实验前的准备 1、一台PC机。 2、实验平台。 3、串口线、网络线。 4、tftpd32.exe软件。 四、 实验步骤 1、实验前的准备 a)将串口线、网络线连接到实验平台与PC机上。 b)在PC机上运行超级终端串口软件。

2、进入Uboot命令输出状态 实验平台上电,在超级终端串口软件中按空格键进入Uboot命令输出状态。 3、查看Uboot命令 运行help命令显示uboot提供的所有命令。

4、学习U-Boot的几个常用的命令 根据每一条命令的帮助信息,说明这些命令的功能、参数和用法。 z bootm => help bootm bootm [addr [arg ...]] - boot application image stored in memory passing arguments 'arg ...'; when booting a Linux kernel, 'arg' can be the address of an initrd image bootm 命令可以引导启动存储在内存中的程序映像。这些内存包括RAM 和可以永久保存的Flash。 第1 个参数addr 是程序映像的地址,这个程序映像必须转换成U-Boot 的格式。 第2 个参数对于引导Linux 内核有用,通常作为U-Boot 格式的RAMDISK 映像存储地址;也可以是传递给Linux内核的参数(缺省情况下传递bootargs环境变量给内核)。 例如: ——从内存地址0x300000启动 0x300000 bootm z cp => help cp cp [.b, .w, .l] source target count - copy memory cp命令可以在内存中复制数据块,包括对Flash的读写操作。 第1 个参数source是要复制的数据块起始地址。 第2 个参数target是数据块要复制到的地址。这个地址如果在Flash中,那么会直接调用写Flash的函数操作。所以U-Boot 写Flash就使用这个命令,当然需要先把对应Flash区域擦干净。 第3 个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。 例如: cp.b 0x300000 0xFE040000 0x180000将1.5M数据从内存拷到flash 0xFE040000位

经典=Uboot-2-命令详解(bootm)

bootm命令中地址参数,内核加载地址以及内核入口地址 分类:u-boot2010-11-04 10:472962人阅读评论(0)收藏举报downloadlinuxbytecmdheaderimage bootm命令只能用来引导经过mkimage构建了镜像头的内核镜像文件以及根文件镜像,对于没有用mkimage对内核进行处理的话,那直接把内核下载到连接脚本中指定的加载地址0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。 通过mkimage可以给内核镜像或根文件系统镜像加入一个用来记录镜像的各种信息的头。同样通过mkimage也可以将内核镜像进行一次压缩(指定-C none/gzip/bzip2),所以这里也就引申出了两个阶段的解压缩过程:第一个阶段是u-boot里面的解压缩,也就是将由mkimage压缩的镜像解压缩得到原始的没加镜像头的内核镜像。第二个阶段是内核镜像的自解压,u-boot 里面的解压实际上是bootm 实现的,把mkimage -C bzip2或者gzip 生成的uImage进行解压;而kernel的自解压是对zImage进行解压,发生在bootm解压之后。 下面通过cmd_bootm.c文件中对bootm命令进行解析以及执行的过程来分析,这三种不同地址的区别: ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ...... if (argc < 2) { addr = load_addr;//当bootm命令后面不带地址参数时,将默认的加载地址赋值给addr } else { addr = simple_strtoul(argv[1], NULL, 16); //如果bootm命令后面带了加载地址,则将该地址赋值给addr,所以最终有用的地址还是bootm命令后附带的地址 } ...... //

uboot环境变量设置(大地小神之个人收藏)

u-boot的环境变量 u-boot的环境变量是使用u-boot的关键,它可以由你自己定义的,但是其中有一些也是大家经常使用,约定熟成的,有一些是u-boot 自己定义的,更改这些名字会出现错误,下面的表中我们列出了一些常用的环境变量: 上面只是一些最基本的环境变量,请注意,板子里原本是没有环境变量的,u-boot的缺省情况下会有一些基本的环境变量,在你执行了saveenv之后,环境变量会第一次保存到flash中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。

U-boot的环境变量值得注意的有两个:bootcmd 和bootargs ◆b o o t c m d 前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。 ◆b o o t a r g s bootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全:https://www.wendangku.net/doc/7216848754.html,/u2/79570/showart_1675071.html。bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。 下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。 A.r o o t 用来指定r o o t f s的位置,常见的情况有: root=/dev/ram rw root=/dev/ram0 rw 请注意上面的这两种设置情况是通用的,我做过测试甚至

uboot调试指南

Uboot调试参考指南 一、调试目的 Uboot的调试旨在通过观察uboot运行时状态来测试硬件问题。 二、调试步骤 1.修改代码 在uboot代码路径下,编辑uboot代码,需要做以下修改; a.修改config.mk文件,添加以下两行内容: AFLAGS += -Wa,-gdwarf2 CFLAGS += -g2 -gdwarf-2 b.修改. /arch/powerpc/lib/board.c文件 debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr); printf("Now running in RAM - U-Boot at: %08lx\n", dest_addr); 将debug改为printf,如上所示。 2.编译uboot 执行make BSC9131RDB_SYSCLK100_NAND,编译uboot 3.将编译好的u-boot-nand.bin(uboot image格式)及u-boot(elf格式文件)文件拷 贝出来 4.烧录uboot 将步骤3中保存的u-boot-nand.bin烧录到目标板中,烧录过程略。 5.建立工程 a.在cw界面,点击file->import, 选择code warrior -> Power architecture ELF executable,如图1所示: 图1 建立elf工程 b.选择步骤3中保存的u-boot(elf格式文件),toolchain选择bareboard application, target OS选择none,工程名字请根据需要设置,比如我的机器上设置为example, 点击next,如图2所示:

UBOOT详细解读

大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。 1、Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下:(1)定义入口。由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。 (2)设置异常向量(Exception Vector)。 (3)设置CPU的速度、时钟频率及终端控制寄存器。 (4)初始化内存控制器。 (5)将ROM中的程序复制到RAM中。 (6)初始化堆栈。 (7)转到RAM中执行,该工作可使用指令ldr pc来完成。 2、Stage2 C语言代码部分 lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作: (1)调用一系列的初始化函数。 (2)初始化Flash设备。 (3)初始化系统内存分配函数。 (4)如果目标系统拥有NAND设备,则初始化NAND设备。 (5)如果目标系统有显示设备,则初始化该类设备。 (6)初始化相关网络设备,填写IP、MAC地址等。 (7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。 3、U-Boot的启动顺序(示例,其他u-boot版本类似) cpu/arm920t/start.S @文件包含处理 #include @由顶层的mkconfig生成,其中只包含了一个文件:configs/<顶层makefile中6个参数的第1个参数>.h #include #include

Uboot启动代码解析

U-Boot启动过程 开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot 启动函数。看一下board/smdk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于这个程序中。下面分两阶段介绍启动流程: 第一阶段 1.cpu/arm920t/start.S 这个汇编程序是U-Boot的入口程序,开头就是复位向量的代码。_start: b reset //复位向量 ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq //中断向量 ldr pc, _fiq //中断向量 … /* the actual reset code */ reset: //复位启动子程序

/* 设置CPU为SVC32模式 */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 /* 关闭看门狗 */ ………… relocate: /* 把U-Boot重新定位到RAM */ adr r0, _start /* r0是代码的当前位置 */ ldr r1, _TEXT_BASE /*_TEXT_BASE是RAM中的地址 */ cmp r0, r1 /* 比较r0和r1,判断当前是从Flash启动,还是RAM */ beq stack_setup /* 如果r0等于r1,跳过重定位代码 */ /* 准备重新定位代码 */ ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2 /* r2 得到armboot的大小 */ add r2, r0, r2 /* r2 得到要复制代码的末尾地址 */ copy_loop: /* 重新定位代码 */ ldmia r0!, {r3-r10} /*从源地址[r0]复制 */

Ubuntu下配置并使用LXR查看Uboot代码(原创)

Ubuntu下配置并使用LXR查看Uboot代码(原创) 之前买了个mini6410觉得查看uboot的源代码太麻烦,上网查到,利用lxr查看源代码比较方便,使用到的有:apache2,glimpse-4.18.6,lxr,u-boot-mini6410(查看的目标文件夹),我使用的Ubuntu9.10,在ylmf3下面也验证成功。 下面就正式开始搭建我们自己的lxr. 建议下面的所有的操作都使用root权限操作: sudo su 输入当前用户的使用密码即可就变成“root@XXXXXXX:” 一、安装apach2: sudo apt-get install apache2 二、安装glimpse: 先去网站下载最新的源代码glimpse-4.18.6.tar.gz,然后解压到当前目录下 tar -xvgf glimpse-4.18.6.tar.gz 再接着进入解压后的目录下,比如我的是: cd glimpse-4.18.6/ 在编译之前,首先看看你的机器上是否已经安装了flex,因为编译glimpse的时候需要这个软件。如果没有的话,那么进行安装: sudo apt-get install flex 接着进行编译: ./configure make sudo make install 执行完上面的步骤后,将生成的glimpse glimpseindex 拷贝到/bin目录下: cd /bin sudo cp glimpse glimpseindex /bin 三、安装lxr sudo apt-get install lxr 新建/usr/share/lxr/http/.htaccess文件 在里面增加如下内容: SetHandler cgi-script 四、复制U-boot源代码

uboot移植心得

最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。 参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。 U-BOOT的两个阶段启动过程:(2010.06经典版来说) 第一阶段:start.S的路径位于arch\arm\cpu\arm920t\这段汇编代码一般被称作第一阶段初始化代码。主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到内存中执行第二段初始化代码 1、关闭开门狗,屏蔽所有中断 2、设置分频比 3、bl cpu_init_crit() 关MMU,初始化内存 bl lowlevel_init() 配置内存,修改内存刷新率参数等 4、relocate判断当前代码是在NORFLASH还是RAM copy_loop循环将FLASH代码复制至RAM中 5、stack_setup栈设置 clear_bss_bss_start到_bss_end之间的数据清0 6、ldr pc , start_armboot 跳转到第二阶段 //===================================================================== 第二阶段:board.c的路径位于arch/arm/lib/board.c,这段代码为U-BOOT的第二阶段初始化代码。主要作用是初始化两个重要数据结构,对SDRAM的内存分配设置,对各种需要用到的外设进行初始化,最后循环跳入main_loop()函数 二阶段start_armboot分为board_init_f 和 board_init_r两部分 先执行的board_init_f部分: 1、为gd数据结构分配地址,并清零 2、执行init_fnc_ptr函数指针数组中的各个初始化函数,如下 board_early_init_f ,timer_init ,env_init init_baudrate serial_init console_init_f display_banner dram_init 3、A、分配SDRAM高64KB为TLB,用于U-BOOT B、分配SDRAM下一单元为U-BOOT代码段,数据段,BSS段 (这里插一句,原来BSS段是用来存放未初始化的全局变量与静态变量) C、接着开辟malloc空间,存bd , gd , 3个字大小的异常堆空间 4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S) 后执行的board_init_r部分: 1、对gd , bd 数据结构赋值初始化 2、各种外设初始化: 初始化NORFLASH, NANDFLASH,初始化ONENAND FLASH

相关文档