U-BOOT使用技巧

一、             说明 u-boot提供了丰富的操作命令,U-boot支持网络功能,支持nandflash功能。并能够显示存储区的内容

二、             命令说明 进入U-BOOT以后,输入HELP,将显示所有的命令

三、             参数设置

简介:u-boot包含了一些配置参数,应根据自己的使用的情况进行正确的设置,在命令提示符下,输入printenv可以显示目前所设置的或默认设置的所有环境变量。我的系统打印的信息如下:

sbc2410=> printenv

bootdelay=3

baudrate=115200

ethaddr=08:00:3e:26:0a:5b

bootfile="zImage"

filesize=169620

fileaddr=31000000

netmask=255.255.255.0

ipaddr=192.168.3.134

serverip=192.168.3.131

bootcmd=nand read 0x30008000 0x30000 0x1d0000;go 0x30008000

bootargs=noinitrd root=/dev/mtdblock3 console=ttySAC0

stdin=serial

stdout=serial

stderr=serial

 

几个重要参数的说明: 1、  bootdelay 启动延迟,以秒为单位

2、  ipaddr网络地址

3、  serveraddr tftp服务器地址,建立tftp服务器之后,就可以将tftp服务器上的文件通过网络传输的方式传输过来,非常方便

4、  bootcmd 系统自动启动命令,本设置表示从nandflash读取数据,然后执行go命令

5、  bootargs 设置u-boot环境参数,noinitrd表示拷贝内核到内存中的地址。Root表示内核在flash中的分区段,console表示终端设备

参数设置方式 setenv   envname   value

四、             linux内核引导

内核引导有几种情况,可以使用bootm和go的方式来进行引导u-boot引导内核时,需要读取内核头部的64字节内核信息,默认的内核编译后是没有这64字节的信息的,用vivi就可以直接引导。但在u-boot中,稍微有些不同。利用u-boot的tools下的mkimage工具可以给内核镜像加上相应的64字节头信息。 1、  内核的装载

利用tftp可以将内核从服务器装载在内存中,tftp的小软件网上有很多。在u-boot的命令模式下输入 tftp 0x30008000 zImage ↙ 执行情况如下 TFTP from server 192.168.3.131; our IP address is 192.168.3.134

Filename 'zImage'.

Load address: 0x30008000

Loading: #################################################################

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

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

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

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

done

Bytes transferred = 1480224 (169620 hex)

sbc2410=>

显示了从server 192.168.3.131在接受数据,接受文件的名字为zImage ,装载的地址为0x30008000处,一共传输了1480224字节的信息。到现在为止,内核镜像已经在内存中的0x30008000的地址中了, 2、利用go命令进行内核的引导: 利用go命令引导内核,内核镜像可以不用加64字节的内核信息,内核运行同样需要一个tag来传递参数,但go命令默认可以建立这样的一个参数:输入go 0x30008000 执行情况如下: sbc2410=> go 0x30008000

## Starting application at 0x30008000 ...

Uncompressing Linux................................................................................................. done, booting the kernel.

Linux version 2.6.22.1 () (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-53)) #3 Fri Oct 12 17:05:11 CST 2007

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177

Machine: SMDK2410

(略) 这个时候内核启动了,这里需要说明的是,内核必须装载在内存中的0x30008000地址中,才能够执行,如果装载在其他地址就无法执行,比如我们用tftp将内核装载在0x31000000,其执行效果就将如下: sbc2410=> tftp 0x31000000 zImage

TFTP from server 192.168.3.131; our IP address is 192.168.3.134

Filename 'zImage'.

Load address: 0x31000000

Loading: #################################################################

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

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

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

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

done

Bytes transferred = 1480224 (169620 hex)

sbc2410=> bootm 0x31000000

## Booting image at 31000000 ...

Bad Magic Number

sbc2410=>

总结:如果利用go指令来引导,内核镜像必须下载到0x30008000才能正常引导。 3、  利用bootm命令进行内核引导

   利用bootm进行内核引导,为保证内核的正确引导,一要正确设置bootargs参数。二要把设置的参数传递进去,因此在进行u-boot的编译的时候需要在include/configs/smdk2410的头文件中定义如下的宏: #define CONFIG_CMDLINE_TAG      1     /* enable passing of ATAGs   */

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG   1

而#define CONFIG_CMDLINE_TAG  1是在传递cmdline时候必须设置的,#define

CONFIG_SETUP_MEMORY_TAGS 1 定义后在设置bootargs可以不制定nandflash的大小, 否则还必须指定其大小。 Bootargs参数的设置: setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 115200

mem=64M

saveenv

正常设置以后,bootm还不能正常引导内核编译产生的zImage文件,这就是前面提到的还必须给内核加上一个64字节的信息头,供bootm程序来识别。可以用u-boot 下的tools/mkimage工具对其进行处理, [root@localhost tftpboot]#mkimage -n 'linux-2.6.22' -A arm -O linux -T kernel -C

none -a 0x30008000 -e 0x30008040 -d zImage zImage.img Image Name:   linux-2.6.22 Created:      Fri Jan 12 17:14:50 2007 Image Type:   ARM Linux Kernel Image (uncompressed) Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB Load Address: 0x30008000 Entry Point:  0x30008040

参数的意义:          -A ==> set architecture to 'arch'         -O ==> set operating system to 'os'         -T ==> set image type to 'type'         -C ==> set compression type 'comp'         -a ==> set load address to 'addr' (hex)         -e ==> set entry point to 'ep' (hex)         -n ==> set image name to 'name'         -d ==> use image data from 'datafile'         -x ==> set XIP (execute in place)

设置完成以后,生成一个文件zImage.img文件。将该文件下载到与上述设置的地址上去,引导即可运行,如果设置的放置的地址与上述地址不一致,导致系统内核无法启动,入口地址应该是内核真实的地址,应该略开那64个字节的头信息,否则系统也无法正常引导,详情见下:

内核在存储器中的地址设置的是0x30800000,入口地址为0x30800040,

非正确设置引导:

sbc2410=> tftp 0x30008000 zImage.img

TFTP from server 192.168.3.131; our IP address is 192.168.3.134

Filename 'zImage.img'.

Load address: 0x30008000

Loading: #################################################################

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

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

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

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

done

Bytes transferred = 1480288 (169660 hex)

sbc2410=> bootm 0x30008000

## Booting image at 30008000 ...

   Image Name:   linux-2.6.22

   Created:      2007-10-15   2:40:37 UTC

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1480224 Bytes =  1.4 MB

   Load Address: 30800000

   Entry Point:  30800040

   Verifying Checksum ... OK

OK

boot linux

 

Starting kernel ...

此时引导的地址该成了0x30008000,与30800000地址不匹配,系统不执行了。如果系统入口地址和在ram中存储的地址相同的话执行效果一样,

正常引导:

sbc2410=> tftp 0x30800000 zImage.img

TFTP from server 192.168.3.131; our IP address is 192.168.3.134

Filename 'zImage.img'.

Load address: 0x30800000

Loading: #################################################################

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

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

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

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

done

Bytes transferred = 1480288 (169660 hex)

sbc2410=> bootm 0x30800000

## Booting image at 30800000 ...

   Image Name:   linux-2.6.22

   Created:      2007-10-15   2:40:37 UTC

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1480224 Bytes =  1.4 MB

   Load Address: 30800000

   Entry Point:  30800040

   Verifying Checksum ... OK

   XIP Kernel Image ... OK

boot linux

 

Starting kernel ...

 

Uncompressing Linux................................................................................................. done, booting the kernel.

Linux version 2.6.22.1 () (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-53)) #3 Fri Oct 12 17:05:11 CST 2007

(略)  

4、内核固化 Bootm和go都只能引导内存中的程序,但每次总不可能都用tftp将程序装载在内存中吧,一般采用的方法都是将内核固化在内存中,然后将内核镜像拷贝到内存中去进行引导,利用如下命令来固化程序: sbc2410=> tftp 0x30800000 zImage.img

TFTP from server 192.168.3.131; our IP address is 192.168.3.134

Filename 'zImage.img'.

Load address: 0x30800000

Loading: #################################################################

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

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

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

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

done

Bytes transferred = 1480288 (169660 hex)

sbc2410=> nand erase 0x30000 0x1d0000

 

NAND erase: device 0 offset 196608, size 1900544 ... OK

sbc2410=> nand write 0x30800000 0x30000 0x1d0000

NAND write: device 0 offset 196608, size 1900544 ...  1900544 bytes written: OK

sbc2410=> setenv bootcmd nand read 0x30800000 0x30000 0x1d0000\;bootm 0x30800000

sbc2410=> saveenv

Saving Environment to NAND...

Erasing Nand...Writing to Nand... done

sbc2410=> reset

先利用tftp的方式将内核放在内核中,然后利用nand erase 命令擦除内核,后面的参数表示0x30000 nandflash的起始地址,0x1d0000表示擦除的大小。 Nand write 表示将0x30800000中的内容写入到0x30000起始的nandflash中,写入量为0x1d0000.

然后进行引导命令的设置,bootcmd; 最后保存环境变量,并复位启动,系统就可以正常引导了。利用go命令同样可以。

Go 对应原始zImage 文件。 Bootm 对应 加了头的zImage.img文件。

<!--[if !supportLists]-->

以上是针对NANDFLASH而言,对于NORFLASH,因为可以直接在内运行,setenv bootcmd bootm 0x50000 就行了

拷贝内核代码:cp.b c008000 50000 200000

Hit any key to stop autoboot:  0 ## Booting image at 00050000 ...    Image Name:   uClinux_Vadsys(2.6.9)    Created:      2011-06-14   6:01:38 UTC    Image Type:   ARM Linux Kernel Image (gzip compressed)    Data Size:    1402266 Bytes =  1.3 MB    Load Address: 0c008000    Entry Point:  0c008000    Verifying Checksum ... OK    Uncompressing Kernel Image ... OK

Starting kernel ...

Linux version 2.6.9-hsc0 () (gcc version 2.95.3 200103 15 (release)(ColdFire patches - 20010318 fromhttp://fiddes.net/coldfire/)(uClin ux XIP and shared lib patches fromhttp://www.snapgear.com/)) #680 Tue Jun 14 14 :01:29 CST 2011

五、             命令详细使用(参考)<!--[endif]-->

5.1 askenv(F)

在标准输入(stdin)获得环境变量。 4.2.2 autoscr

从内存(Memory)运行教本。(注意,从下载地址开始,例如我们的开发板是从0x30008000处开始运 行).

CRANE2410 # autoscr 0x30008000

## Executing script at 30008000

5.3 base

打印或者设置当前指令与下载地址的地址偏移。 5.4 bdinfo

打印开发板信息 CRANE2410 # bdinfo

-arch_number = 0x000000C1 (CPU体系结构号) -env_t = 0x00000000 (环境变量) -boot_params = 0x30000100 (启动引导参数) -DRAM bank = 0x00000000 (内存区) --> start = 0x30000000 (SDRAM起始地址) --> size = 0x04000000 (SDRAM大小) -ethaddr = 01:23:45:67:89:AB (以太网地址) -ip_addr = 192.168.1.5 (IP地址) -baudrate = 115200 bps (波特率) 5.5 bootp

通过网络使用Bootp或者TFTP协议引导境像文件。 CRANE2410 # help bootp

bootp [loadAddress] [bootfilename]

5.6 bootelf

默认从0x30008000引导elf格式的文件(vmlinux)

CRANE2410 # help bootelf

bootelf [address] - load address of ELF image.

5.7 bootd(=boot)

引导的默认命令,即运行U-BOOT中在“include/configs/smdk2410.h” 中设置的“bootcmd”中 的命令。如下: #define CONFIG_BOOTCOMMAND "tftp 0x30008000 uImage; bootm 0x30008000";

在命令下做如下试验:

CRANE2410 # set bootcmd printenv

CRANE2410 # boot

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

CRANE2410 # bootd

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

5.8 tftp(tftpboot)

即将内核镜像文件从PC中下载到SDRAM的指定地址,然后通过bootm来引导内核,前提是所用PC要安装设 置tftp服务。 下载信息: CRANE2410 # tftp 0x30008000 zImage

TFTP from server 10.0.0.1; our IP address is 10.0.0.110

Filename 'zImage'.

Load address: 0x30008000

Loading: #################################################################

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

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

done

Bytes transferred = 913880 (df1d8 hex)

5.9 bootm

内核的入口地址开始引导内核。 CRANE2410 # bootm 0x30008000

## Booting image at 30008000 ...

Starting kernel ...

Uncompressing

Linux......................................................................

done, .

5.10 go

直接跳转到可执行文件的入口地址,执行可执行文件。 CRANE2410 # go 0x30008000

## Starting application at 0x30008000 ...

5.11 cmp

对输入的两段内存地址进行比较。 CRANE2410 # cmp 0x30008000 0x30008040 64

word at 0x30008000 (0xe321f0d3) != word at 0x30008040 (0xc022020c)

Total of 0 words were the same

CRANE2410 # cmp 0x30008000 0x30008000 64

Total of 100 words were the same

5.12 coninfo

打印所有控制设备和信息,例如 -List of available devices:

-serial 80000003 SIO stdin stdout stderr

5.13 cp

内存拷贝,cp 源地址 目的地址 拷贝大小(字节) CRANE2410 # help cp

cp [.b, .w, .l] source target count

ANE2410 # cp 0x30008000 0x3000f000 64

5.14 date

获得/设置/重设日期和时间 CRANE2410 # date

Date: 2006-6-6 (Tuesday) Time: 06:06:06

5.15 erase(F)

擦除FLASH MEMORY, 由于该ARM板没有Nor Flash, 所有不支持该命令.

CRANE2410 # help erase

erase start end

- erase FLASH from addr 'start' to addr 'end'

erase start +len

- erase FLASH from addr 'start' to the end of sect w/addr 'start'+'len'-1

erase N:SF[-SL]

- erase sectors SF-SL in FLASH bank # N

erase bank N

- erase FLASH bank # N

erase all

- erase all FLASH banks

5.16 flinfo(F)

打印Nor Flash信息, 由于该ARM板没有Nor Flash, 所有不支持该命令.

5.17 iminfo

打印和校验内核镜像头, 内核的起始地址由CFG_LOAD_ADDR指定:

#define CFG_LOAD_ADDR 0x30008000 /* default load address */

该宏在include/configs/crane2410.h中定义.

CRANE2410 # iminfo

## Checking Image at 30008000 ...

Image Name: Linux-2.6.14.1

Created: 2006-06-28 7:43:01 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 1047080 Bytes = 1022.5 kB

Load Address: 30008000

Entry Point: 30008040

Verifying Checksum ... OK

5.18 loadb

从串口下载二进制文件 CRANE2410 # loadb

## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

## Total Size = 0x00000000 = 0 Bytes

## Start Addr = 0x30008000

5.19 md

显示指定内存地址中的内容 CRANE2410 # md 0

00000000: ea000012 e59ff014 e59ff014 e59ff014 ................

00000010: e59ff014 e59ff014 e59ff014 e59ff014 ................

00000020: 33f80220 33f80280 33f802e0 33f80340

00000030: 33f803a0 33f80400 33f80460 deadbeef ...3...3`..3....

00000040: 33f80000 33f80000 33f9c0b4 33fa019c ...3...3...3...3

00000050: e10f0000 e3c0001f e38000d3 e129f000 ..............).

00000060: e3a00453 e3a01000 e5801000 e3e01000 S...............

00000070: e59f0444 e5801000 e59f1440 e59f0440 D.......@...@...

00000080: e5801000 e59f043c e3a01003 e5801000 ....<...........

00000090: eb000051 e24f009c e51f1060 e1500001 Q.....O.`.....P.

000000a0: 0a000007 e51f2068 e51f3068 e0432002 ....h ..h0... C.

000000b0: e0802002 e8b007f8 e8a107f8 e1500002 . ............P.

000000c0: dafffffb e51f008c e2400803 e2400080 ..........@...@.

000000d0: e240d00c e51f0094 e51f1094 e3a02000 ..@.......... ..

000000e0: e5802000 e2800004 e1500001 dafffffb . ........P.....

000000f0: eb000006 e59f13d0 e281f000 e1a00000 ................

5.20 mm 顺序显示指定地址往后的内存中的内容,可同时修改,地址自动递增。 CRANE2410 # mm 0x30008000

30008000: e1a00000 ? fffff

30008004: e1a00000 ? eeeeee

30008008: e1a00000 ? q

CRANE2410 # md 30008000

30008000: 000fffff 00eeeeee e1a00000 e1a00000 ................

30008010: e1a00000 e1a00000 e1a00000 e1a00000 ................

30008020: ea000002 016f2818 00000000 000df1d8 .....(o.........

30008030: e1a07001 e3a08000 e10f2000 e3120003 .p....... ......

5.21 mtest

简单的RAM检测 CRANE2410 # mtest

Pattern FFFFFFFD Writing... Reading...

5.22 mw

向内存地址写内容 CRANE2410 # md 30008000

30008000: ffffdffd ffffdffc ffffdffb ffffdffa ................

CRANE2410 # mw 30008000 0 4

CRANE2410 # md 30008000

30008000: 00000000 00000000 00000000 00000000 ................

5.23 nm

修改内存地址, 地址不递增 CRANE2410 # nm 30008000

30008000: de4c457f ? 00000000

30008000: 00000000 ? 11111111

30008000: 11111111 ?

5.24 printenv

打印环境变量 CRANE2410 # printenv

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

ipaddr=10.0.0.110

serverip=10.0.0.1

netmask=255.255.255.0

stdin=serial

stdout=serial

stderr=serial

Environment size: 153/65532 bytes

5.25 ping

ping主机 CRANE2410 # ping 10.0.0.1

host 10.0.0.1 is alive

5.26 reset

复位CPU

5.27 run

运行已经定义好的U-BOOT的命令 CRANE2410 # set myenv ping 10.0.0.1

CRANE2410 # run myenv

host 10.0.0.1 is alive

5.28 saveenv(F)

保存设定的环境变量 5.29 setenv

设置环境变量 CRANE2410 # setenv ipaddr 10.0.0.254

CRANE2410 # printenv

ipaddr=10.0.0.254

5.30 sleep

命令延时执行时间 CRANE2410 # sleep 1

5.31 version

打印U-BOOT版本信息 CRANE2410 # version

U-Boot 1.1.4 (Jul 4 2006 - 12:42:27)

5.32 nand info

打印nand flash信息 CRANE2410 # nand info

Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)

5.33 nand device <n>

显示某个nand设备 CRANE2410 # nand device 0

Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)

... is now current device

5.34 nand bad

CRANE2410 # nand bad

Device 0 bad blocks:

5.35 nand read

nand read InAddr FlAddr size

InAddr: 从nand flash中读到内存的起始地址。 FlAddr: nand flash 的起始地址。 size: 从nand flash中读取的数据的大小。 CRANE2410 # nand read 0x30008000 0 0x100000

NAND read: device 0 offset 0, size 1048576 ...

1048576 bytes read: OK

5.36 nand erease

nand erase FlAddr size

FlAddr: nand flash 的起始地址 size: 从nand flash中擦除数据块的大小 CRANE2410 # nand erase 0x100000 0x20000

NAND erase: device 0 offset 1048576, size 131072 ... OK

5.37 nand write

nand write InAddr FlAddr size

InAddr: 写到Nand Flash中的数据在内存的起始地址 FlAddr: Nand Flash的起始地址 size: 数据的大小 CRANE2410 # nand write 0x30f00000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK

5.37 nboot

u-boot-1.1.4代码对于nboot命令的帮助不正确,修改如下:

正确的顺序为: nboot InAddr dev FlAddr

InAddr: 需要装载到的内存的地址。 FlAddr: 在nand flash上uImage存放的地址 dev: 设备号 需要提前设置环境变量,否则nboot不会调用bootm

CRANE2410 #setenv autostart yes

CRANE2410 # nboot 30008000 0 100000

Loading from device 0: <NULL> at 0x4e000000 (offset 0x100000)

Image Name: Linux-2.6.14.3

Created: 2006-07-06 7:31:52 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 897428 Bytes = 876.4 kB

Load Address: 30008000

Entry Point: 30008040

Automatic boot of image at addr 0x30008000 ...

## Booting image at 30008000 ...

Starting kernel ...

4.3 命令简写说明 所以命令都可以简写,只要命令前面的一部分不会跟其它命令相同,就可以不用写全整个命令.

save命令 CRANE2410 # sa

Saving Environment to Flash...

Un-Protected 1 sectors

Erasing Flash...Erasing sector 10 ... Erased 1 sectors

4.4 把文件写入NandFlash

如果把一个传到内存中的文件写入到Nand Flash中, 如:新的uboot.bin, zImage(内核),

rootfs等, 如果做呢?我们可以用Nand Flash命令来完成. 但是Nand Flash写时,必须先要把Nand

Flash的写入区全部擦除后,才能写. 下面以把内存0x30008000起长度为0x20000的内容写到Nand

Flash中的0x100000为例.

CRANE2410 # nand erase 0x100000 20000

NAND erase: device 0 offset 1048576, size 131072 ... OK

CRANE2410 # nand write 0x30008000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK

posted @ 2017-03-03 09:43  倾月轩萱  阅读(758)  评论(0编辑  收藏  举报