当前位置:文档之家› UBOOT超详细命令解析

UBOOT超详细命令解析

UBOOT超详细命令解析
UBOOT超详细命令解析

U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,命令行模式模式下支持“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

bootvx - Boot vxWorks from an ELF image

cmp - memory compare

coninfo - print console devices and information

cp - memory copy

crc32 - checksum calculation

date - get/set/reset date &time

dcache - enable or disable data cache

dhcp - boot image via network using DHCP/TFTP protocol

echo - echo args to console

editenv - edit environment variable

eeprom - EEPROM sub-system

erase - erase FLASH memory

exit-exit script

fatinfo - print information about filesystem

fatload - load binary file from a dos filesystem

fatls -list files in a directory (default/)

flinfo - print FLASH memory information

fsinfo - print information about filesystems

fsload - load binary file from a filesystem image

go - start application at address 'addr'

help - print online help

i2c - I2C sub-system

icache - enable or disable instruction cache

iminfo - print header information for application image imls -list all images found in flash

imxtract- extract a part of a multi-image

itest -return true/false on integer compare

loadb - load binary file over serial line(kermit mode) loads - load S-Record file over serial line

loadx - load binary file over serial line(xmodem mode) loady - load binary file over serial line(ymodem mode) loop - infinite loop on address range

ls -list files in a directory (default/)

md - memory display

mm - memory modify (auto-incrementing address)

mmc - MMC sub-system

mtest - simple RAM read/write test

mw - memory write(fill)

nand - NAND sub-system

nboot - boot from NAND device

nfs - boot image via network using NFS protocol

nm - memory modify (constant address)

ping -send ICMP ECHO_REQUEST to network host

printenv- print environment variables

protect - enable or disable FLASH write protection rarpboot- boot image via network using RARP/TFTP protocol reginfo - print register information

reset- Perform RESET of the CPU

run - run commands in an environment variable

saveenv - save environment variables to persistent storage setenv -set environment variables

showvar - print local hushshell variables

sleep- delay execution for some time

source - run script from memory

test- minimal test like /bin/sh

tftpboot- boot image via network using TFTP protocol

unzip - unzip a memory region

usb - USB sub-system

usbboot - boot from USB device

version - print monitor version

如果你想获取某条命令的更详细的帮助,可以使用:

help <你想要查的指令>

或者?<你想要查的指令>,

甚至 h <你想要查的指令缩写>。

以bmp指令为例:

[u-boot@MINI2440]#help bmp

bmp - manipulate BMP image data

Usage:

bmp info - display image info

bmp display [x y]- display image at x,y

[u-boot@MINI2440]#? bmp

bmp - manipulate BMP image data

Usage:

bmp info - display image info

bmp display [x y]- display image at x,y

[u-boot@MINI2440]# h bm

bmp - manipulate BMP image data

Usage:

bmp info - display image info

bmp display [x y]- display image at x,y

(2)环境变量(environment variables,简称ENV)与相关指令

和shell类似,U-Boot也有环境变量。一些U-boot默认的环境变量如下:

环境变量解释说明

bootdelay执行自动启动(bootcmd中的命令)的等候秒数baudrate串口控制台的波特率

netmask以太网的网络掩码

ethaddr以太网的MAC地址

bootfile默认的下载文件名

bootargs传递给Linux内核的启动参数

bootcmd自动启动时执行命令

serverip TFTP服务器端的IP地址

ipaddr本地的IP地址

stdin标准输入设备,一般是串口

stdout标准输出,一般是串口,也可是LCD(VGA)stderr标准出错,一般是串口,也可是LCD(VGA)

要看到你的板上的ENV值可使用printenv命令,例如我的板子:

[u-boot@MINI2440]# printenv

bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs

ip=192.168.0.2:192.168.0.1::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M

bootcmd=nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm

bootdelay=1

baudrate=115200

ethaddr=08:08:11:18:12:27

ipaddr=192.168.0.2

serverip=192.168.0.1

gatewayip=192.168.0.1

netmask=255.255.255.0

tekkaman=bmp d 70000

stdin=serial

stdout=serial

stderr=serial

ethact=dm9000

Environment size: 470/131068 bytes

你会发现有些有的ENV我没有,还有一个“tekkaman”的ENV。原因是如果你没有设置这个环境

变量就不会打印出,你也可以自己定义ENV,并在命令中使用${ENV}来调用它。同时你也可以删除

这个ENV。设置ENV的命令是setenv,格式为:

setenv name value

第1个参数是环境变量的名称。

第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量。

例如:我先将”tekkaman”参数删除,再设置,最后在一个命令串中调用。

[u-boot@MINI2440]# printenv tekkaman

tekkaman=bmp d 70000

[u-boot@MINI2440]# setenv tekkaman

[u-boot@MINI2440]# printenv tekkaman

##Error:"tekkaman"not defined

[u-boot@MINI2440]# setenv tekkaman echo "I am Tekkaman Ninja!"

[u-boot@MINI2440]# printenv tekkaman

tekkaman=echo I am Tekkaman

[u-boot@MINI2440]# echo I Love Linux ;${tekkaman}

I Love Linux

I am Tekkaman

当你设置了ENV,它只保存在内存中,如果你要它保存在存放ENV的固态存储器中,请使用:saveenv。

[u-boot@MINI2440]# saveenv

Saving Environment to NAND...

Erasing Nand...

Erasing at 0x6000000000002 -- 0% complete.

Writing to Nand... done

如果在启动的时候会看到U-boot打印出:“Warning - bad CRC, using default environment”,说明

U-boot没有在存放ENV的固态存储器中找到有效的ENV,只好使用你在编译的时候定义的默认ENV。如果U-boot存放ENV的固态存储器的驱动是OK的,那么只要运行 saveenv就可以把默认ENV写入固态存储器,下次启动就不会有这个警告了。

ENV可以放在许多固体存储器中,对于mini2440来说Nor Flash、Nand Flash或EEPROM

都可以,就看你如何配置了(include/configs下的配置文件)。例如:

Nor Flash:

#define CONFIG_ENV_IS_IN_FLASH 1

#define CONFIG_ENV_OFFSET 0X40000

#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */

Nand Flash:

#define CONFIG_ENV_IS_IN_NAND 1

#define CONFIG_ENV_OFFSET 0X40000

#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */

EEPROM:

#define CONFIG_ENV_IS_IN_EEPROM 1 /* use EEPROM for environment vars */

#define CONFIG_ENV_OFFSET 0x000 /* environment starts at offset 0 */

#define CONFIG_ENV_SIZE 0x400 /* 1KB */

CONFIG_ENV_OFFSET是在整个存储器中的偏移地址;

CONFIG_ENV_SIZE是指其使用的大小。

注意 CONFIG_ENV_OFFSET和 CONFIG_ENV_SIZE 的设置,不要覆盖了其他分区。

四、U-boot的使用(二)

命令:

loadb - load binary file over serial line (kermit mode)

loadx - load binary file over serial line (xmodem mode)

loady - load binary file over serial line (ymodem mode)

功能:以不同的协议从串口获取文件.。

格式基本都为:

load?[ off ] [ baud ]

第1个参数是下载到SDRAM的地址,如果不填,就是用默认配置:CONFIG_SYS_LOAD_ADDR 第2个参数是波特率,一般不填,用默认的115200.

在windows下的超级终端可以用这些协议发送文件,但是在ubuntu下基本只能用kermit协议。一下使用C-kermit来发送一个文件到mini2440。

[u-boot@MINI2440]# loadb

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

上面已经启动了U-boot的kermit传输协议,这时按下Ctrl + \ , 再按 c, 切换到C-kermit的命令行模式,输入命令:send <文件路径>,回车。

[u-boot@MINI2440]# loadb

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

(Back at MAGI-Linux)

----------------------------------------------------

C-Kermit 8.0.211, 10 Apr 2004,for Linux

Copyright (C) 1985, 2004,

Trustees of Columbia University in the City of New York.

Type ?or HELP for help.

(/home/tekkaman/桌面/) C-Kermit>send/home/tekkaman/development/share/zImage.img

C-kermit就开始传送,并且显示一个传送界面,并动态显示传送进度。

C-Kermit 8.0.211, 10 Apr 2004, MAGI-Linux

Current Directory:/home/tekkaman/��~L�~]�

Communication Device:/dev/ttyUSB0

Communication Speed: 115200

Parity:none

RTT/Timeout: 01 / 02

SENDING:/home/tekkaman/development/share/zImage.img => zImage.img

File Type: BINARY

File Size: 2277540

Percent Done: 19 /////////-

...10...20...30...40...50...60...70...80...90..100

Estimated Time Left: 00:03:35

Transfer Rate, CPS: 8536

Window Slots: 1 of 1

Packet Type: D

Packet Count: 557

Packet Length: 1000

Error Count: 0

Last Error:

Last Message:

X to cancel file, Z to cancel group, to resend last packet,

E to send Error packet, ^C to quit immediately, ^L to refresh screen.

传送完毕后,输入c ,回到U-boot的串口界面。

[u-boot@MINI2440]# loadb

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

(Back at MAGI-Linux)

----------------------------------------------------

C-Kermit 8.0.211, 10 Apr 2004,for Linux

Copyright (C) 1985, 2004,

Trustees of Columbia University in the City of New York.

Type ?or HELP for help.

(/home/tekkaman/桌面/) C-Kermit>send/home/tekkaman/development/share/zImage.img

(/home/tekkaman/桌面/) C-Kermit>c

Connecting to /dev/ttyUSB0, speed 115200

Escape character: Ctrl-\(ASCII 28, FS): enabled

Type the escape character followed by C to get back,

or followed by ? to see other options.

----------------------------------------------------

## Total Size = 0x0022c0a4 = 2277540 Bytes

## Start Addr = 0x30008000

(4)网络命令

只要你的网卡驱动没问题,那么你就可以通过网络来传输文件到开发板,这可比串口快多了。你可以直接用交叉网线连接开发板和电脑,也可以用普通直连网线连接路由器,再连到电脑,不过记得

配置好网络,关闭防火墙哦。

先测试网络是否通了,现在开发板使用ping 命令,看看是否可以ping通电脑:

[u-boot@MINI2440]# ping 192.168.1.100

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

host 192.168.1.100 is alive

如果出现:

[u-boot@MINI2440]# ping 192.168.1.100

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

ping failed; host 192.168.1.100 is not alive

这样无法ping通的事,可能是:

1、U-boot网卡驱动有问题

2、U-boot网络协议延时配置有问题

3、网络参数配置问题,比如IP等,Host和Target都有可能有问题。Host最好关闭IPv6。

实在找不到原因,用Wireshark抓包看看。

如果网络畅通,下面就可以使用下面的命令从tftp目录或者nfs目录下载文件到SDRAM了。

命令:

dhcp - boot image via network using DHCP/TFTP protocol

rarpboot- boot image via network using RARP/TFTP protocol

nfs - boot image via network using NFS protocol

tftpboot- boot image via network using TFTP protocol

bootp - boot image via network using BOOTP/TFTP protocol

这几个命令的格式都是:<指令> [目的SDRAM地址] [[主机IP:]文件名]

注意:

要使用dhcp、rarpboot或 bootp 等功能要路由器或Host的支持。

如果没有输入[目的SDRAM地址],系统就是用编译时定义的CONFIG_SYS_LOAD_ADDR作为目的SDRAM地址

如果tftpboot和nfs命令没有定义[主机IP:],则使用ENV中的serverip

其它命令必需定义[主机IP:],否则会使用提供动态IP服务的主机IP作为[主机IP:]。

使用范例:

[u-boot@MINI2440]# nfs 0x30008000192.168.1.100:/home/tekkaman/development/share/u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101 Filename '/home/tekkaman/development/share/u-boot.bin'.

Load address: 0x30008000

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

done

Bytes transferred = 256220 (3e8dc hex)

[u-boot@MINI2440]#tftp u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.101

Filename 'u-boot.bin'.

Load address: 0x30008000

Loading: T ##################

done

Bytes transferred = 256220 (3e8dc hex)

[u-boot@MINI2440]#dhcp 192.168.1.100:u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

BOOTP broadcast 1

BOOTP broadcast 2

DHCP client bound to address 192.168.1.101

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.101

Filename 'u-boot.bin'.

Load address: 0x30008000

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

done

Bytes transferred = 256220 (3e8dc hex)

[u-boot@MINI2440]#bootp 192.168.1.100:u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

BOOTP broadcast 1

BOOTP broadcast 2

DHCP client bound to address 192.168.1.101

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.101

Filename 'u-boot.bin'.

Load address: 0x30008000

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

done

Bytes transferred = 256220 (3e8dc hex)

[u-boot@MINI2440]# rarpboot 192.168.1.100:u-boot.bin

我的路由器没有开rarp协议,所以rarpboot 无法使用,要使用dhcp或 bootp 也是要路由或Host 支持的。

(5)Nand Flash操作指令

常用的Nand Flash指令如下:

指令功能

nand info显示可使用的Nand Flash

nand device [dev]显示或设定当前使用的Nand Flash

nand read addr off size Nand Flash读取命令,从Nand的 off 偏移地址处读取size 字节的数据到SDRAM

的 addr地址。

nand write addr off size Nand Flash烧写命令,将SDRAM的 addr 地址处的size 字节的数据烧写到Nand

的 off 偏移地址。

nand write[.yaffs[1]] addr off size 烧写yaffs 映像专用的命令,.yaffs1 for 512+16 NAND

nand erase [clean] [off size]Nand Flash檫除命令,擦除Nand Flash 的 off 偏移地址处的size 字节的数据

nand bad显示Nand Flash的坏块

nand dump[.oob] off显示Nand Flash中的数据(16进制)

nand scrub 彻底擦除整块Nand Flash中的数据,包括OOB。可以擦除软件坏块标志。

nand markbad off标示 Nand的 off 偏移地址处的块为坏块使用范例:

[u-boot@MINI2440]#nand info

Device 0: NAND 128MiB 3,3V 8-bit, sector size 128 KiB

[u-boot@MINI2440]# nand device 0

Device 0: NAND 128MiB 3,3V 8-bit... is now current device

[u-boot@MINI2440]# nand read 0x30008000 0x60000 200000

NAND read: device 0 offset 0x60000, size 0x200000

2097152 bytes read: OK

[u-boot@MINI2440]#nand bad

Device 0 bad blocks:

030a0000

030c0000

030e0000

07ee0000

[u-boot@MINI2440]# nand markbad 0x500000

block 0x00500000 successfully marked as bad

[u-boot@MINI2440]# nand bad

Device 0 bad blocks:

00500000

030a0000

030c0000

030e0000

07ee0000

[u-boot@MINI2440]# nand scrub

NAND scrub: device 0 whole chip

Warning: scrub option will erase all factory set bad There is no reliable way to recover them.

Use this command only for testing purposes if you

are sure of what you are

Really scrub this NAND flash?

Erasing at 0x2f4000008000000 -- 0% complete.

NAND 128MiB 3,3V 8-bit: MTD Erase failure:-5 NAND 128MiB 3,3V 8-bit: MTD Erase failure:-5

NAND 128MiB 3,3V 8-bit: MTD Erase failure:-5 Erasing at 0x7ea000008000000 -- 0% complete.

NAND 128MiB 3,3V 8-bit: MTD Erase failure:-5 Erasing at 0x7fe000008000000 -- 0% complete.

OK

[u-boot@MINI2440]# nand bad

Device 0 bad blocks:

030a0000

030c0000

030e0000

07ee0000

[u-boot@MINI2440]# nand dump 0x8000

Page 00008000 dump:

ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

(略)

OOB:

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

[u-boot@MINI2440]#tftp u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.101

Filename 'u-boot.bin'.

Load address: 0x30008000

Loading: T ##################

done

Bytes transferred = 256220 (3e8dc hex)

[u-boot@MINI2440]# nand write 0x30008000 0 40000

NAND write: device 0 offset 0x0, size 0x40000

Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK

[u-boot@MINI2440]#nand dump 0x8000

Page 00008000 dump:

00 00 53 e1 01 00 00 2a 15 40 e0 e3 19 00 00 ea

(略)

60 30 97 e5 03 00 54 e1 f6 ff ff ba 00 40 a0 e3

OOB:

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff ff ff ff ff ff ff ff

65 a9 6b f3 ff 33 fc 30

f3 33 cf 33 0f f0 ff 00

cc 0f 59 55 57 96 a5 5b

nboot 指令也是一条Nand Flash 读取指令,它是将Nand Flash 的 offset 偏移地址的内核映像读取到SDRAM的loadAddr位置。它会自动读取到内核映像(使用mkimage处理过的)的结束,所以不用给出读取大小。

格式:nboot loadAddr dev offset

使用范例:

[u-boot@MINI2440]#tftp 192.168.1.100:zImage.img

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.101

Filename 'zImage.img'.

Load address: 0x30008000

Loading: T ################################################################# #################################################################

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

done

Bytes transferred = 2277540 (22c0a4 hex)

[u-boot@MINI2440]#nand erase 0x100000 300000

NAND erase: device 0 offset 0x100000, size 0x300000

Erasing at 0x3e000001800000 -- 0% complete.

OK

[u-boot@MINI2440]# nand write 0x30008000 0x100000 300000

NAND write: device 0 offset 0x100000, size 0x300000

Writing at 0x3e000000020000 -- 100% is complete. 3145728 bytes written: OK

[u-boot@MINI2440]# nand device 0

Device 0: NAND 128MiB 3,3V 8-bit... is now current device

[u-boot@MINI2440]#nboot 30008000 0 0x100000

Loading from NAND 128MiB 3,3V 8-bit, offset 0x100000

Image Name: tekkaman

Created: 2010-03-29 12:59:51 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 2277476 Bytes = 2.2 MB

Load Address: 30008000

Entry Point: 30008040

[u-boot@MINI2440]# bootm 30008000

## Booting kernel from Legacy Image at 30008000 ...

Image Name: tekkaman

Created: 2010-03-29 12:59:51 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 2277476 Bytes = 2.2 MB

Load Address: 30008000

Entry Point: 30008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Linux version 2.6.33.1 (tekkaman@MAGI-Linux)(gcc version 4.3.2(crosstool-NG-1.6.1-tekkaman))#5 Mon Mar 29 20:58:50 CST 2010

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

CPU: VIVT data cache, VIVT instruction cache

Machine: MINI2440

(略)

四、U-boot的使用(三)

(6) 内存/寄存器操作指令

nm 修改内存值(指定地址)

格式:nm [.b, .w, .l] address

mm 修改内存值(地址自动加一)

格式: mm [.b, .w, .l] address

md 显示内存值

格式: md [.b, .w, .l] address [# of objects]

mw 用指定的数据填充内存

格式: mw [.b, .w, .l] address value [count]

cp 内存的拷贝(包括内存与Nor Flash间的数据拷贝)

格式:cp [.b, .w, .l] source target count

上面是查看和修改内存值的指令,可以查看和修改SDRAM和寄存器值。

[.b, .w, .l]代表了查看和修改形式:bit、word、long

使用范例:

[u-boot@MINI2440]#md.b 0x30008000 20

30008000: cc 33 fe 33 cc b3 4c 33 ac 33 de 33 5c 13 cc 33 .3.3..L3.3.3\..3

30008010: cc 32 cc 31 dc 33 cf 33 cc 33 4e 33 8f 13 cc 33 .2.1.3.3.3N3 (3)

[u-boot@MINI2440]# md.w 0x30008000 20

30008000: 33cc 33fe b3cc 334c 33ac 33de 135c 33cc .3.3..L3.3.3\..3

30008010: 32cc 31cc 33dc 33cf 33cc 334e 138f 33cc .2.1.3.3.3N3 (3)

30008020: 338c 33cd 33cc 7bcc 3bcc 33cc 135e 734c .3.3.3.{.;.3^.Ls

30008030: 7bdc 37cc 31dc 33c4 038c 33e8 77cc 13cc .{.7.1.3...3.w..

[u-boot@MINI2440]# md.l 0x30008000 20

30008000: 33fe33cc 334cb3cc 33de33ac 33cc135c .3.3..L3.3.3\..3

30008010: 31cc32cc 33cf33dc 334e33cc 33cc138f .2.1.3.3.3N3 (3)

30008020: 33cd338c 7bcc33cc 33cc3bcc 734c135e .3.3.3.{.;.3^.Ls

30008030: 37cc7bdc 33c431dc 33e8038c 13cc77cc .{.7.1.3...3.w..

30008040: 234c77ce 33dc339c 33ec3ece f3cc36ec .wL#.3.3.>.3.6..

30008050: 37dc33cc 73cc3f5c 17dd314c 33cc62e8 .3.7\?.sL1...b.3

30008060: b6cc33dc 33c233cc 33cc32cc 33cc3f68 .3...3.3.2.3h?.3

30008070: 73cc31cc b3cc33cc 33cc37c9 33df13cc .1.s.3...7.3 (3)

[u-boot@MINI2440]# nm 0x30008000

30008000: 33fe33cc ? 12345678

30008000: 12345678 ? 34567890

30008000: 34567890 ? q

[u-boot@MINI2440]# nm.b 0x30008000

30008000: 90 ? 11

30008000: 11 ? 12

30008000: 12 ? q

[u-boot@MINI2440]# mm 0x30008000

30008000: 34567812 ? 54321123

30008004: 334cb3cc ? 12345678

30008008: 33de33ac ? 21234543

3000800c: 33cc135c ? q

[u-boot@MINI2440]# md.b 0x30008000 20

30008000: 23 11 32 54 78 56 34 12 43 45 23 21 5c 13 cc 33 #.2TxV4.CE#!\..3

30008010: cc 32 cc 31 dc 33 cf 33 cc 33 4e 33 8f 13 cc 33 .2.1.3.3.3N3 (3)

[u-boot@MINI2440]# mw.b 0x30008000 aa 10

[u-boot@MINI2440]#mw.b 0x30008010 55 10

[u-boot@MINI2440]#md.b 0x30008000 20

30008000: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................

30008010: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU

[u-boot@MINI2440]# cp.b 0x30008000 0x30008010 10

[u-boot@MINI2440]#md.b 0x30008000 20

30008000: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................

30008010: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................

你可以试着修改LED相连的GPIO寄存器的数据寄存器值,可以控制LED的点亮!先熄灭后点亮LED1的范例:(这个实验要结合芯片数据手册和mini2440的原理图来理解)

[u-boot@MINI2440]# md 0x56000014 1

56000014: 00000600 ....

[u-boot@MINI2440]# nm.w 0x56000014

56000014: 0600 ? 620 (熄灭)

56000014: 0620 ? 600 (点亮)

(7) Nor Flash指令

Nor Flash 的命令经常用于烧写数据到Nor Flash 。

flinfo 打印Flash存储器的信息,并列出所有Sector。

flinfo N 单独打Flash存储器N Block的信息。(在有多块Nor Flash时使用)使用范例:

[u-boot@MINI2440]#flinfo

Bank # 1: SST: 1x SST39VF1601 (2MB)

Size: 2 MB in 32 Sectors

Sector Start Addresses:

00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000

00050000 00060000 (RO) 00070000 (RO) 00080000 00090000

000A0000 000B0000 000C0000 000D0000 000E0000

000F0000 00100000 00110000 00120000 00130000

00140000 00150000 00160000 00170000 00180000

00190000 001A0000 001B0000 001C0000 001D0000

001E0000 001F0000

[u-boot@MINI2440]# flinfo 1

Bank # 1: SST: 1x SST39VF1601 (2MB)

Size: 2 MB in 32 Sectors

Sector Start Addresses:

00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000

00050000 00060000 (RO) 00070000 (RO) 00080000 00090000

000A0000 000B0000 000C0000 000D0000 000E0000

000F0000 00100000 00110000 00120000 00130000

00140000 00150000 00160000 00170000 00180000

00190000 001A0000 001B0000 001C0000 001D0000

001E0000 001F0000

[u-boot@MINI2440]# flinfo 2

Only FLASH Banks # 1 ...# 1 supported

后面带有(RO)的说明这个Sector已经写保护了。

因为Nor Flash的读取接口和SDRAM是一样的,所以Nor Flash的读取也是使用md命令。范例如下:

[u-boot@MINI2440]# md.b 0x0 20

00000000: 12 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................

00000010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................

[u-boot@MINI2440]# md 0x0 20

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

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

00000020: 33f80260 33f802c0 33f80320 33f80380 `..3...3 ..3 (3)

00000030: 33f803e0 33f80440 33f804a0 deadbeef ...3@..3...3....

00000040: 33f80000 33f80000 33fbe8dc 3400374c ...3...3...3L7.4

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

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

00000070: e59f0488 e5801000 e59f1484 e59f0484 ................

但由于Nor Flash的烧写时序和SDRAM的写入不同,烧写Nor Flash 不能使用mm等命令,只能使用cp命令从内存拷贝到Nor Flash,而且烧写之前必须解除保护并擦除!命令如下:

protect :对Flash 写保护的操作,可以使能和解除写保护。

格式:

protect on/off start end

protect on/off start +end

protect on/off N:SF[-SL]

protect on/off bank N

protect on/off all

第1 个参数on 代表使能写保护;off 代表解除写保护。

第2 、3 参数是指定Flash 写保护操作范围

start end是照起始地址和结束地址定义范围,start是擦除块的起始地址;end 是擦除末尾块的结束地址。

例如:擦除Sector 2和Sector 3区域命令为erase 20000 3ffff 。

start +end是照起始地址和操作字节数定义范围,这种方式最常用。start是擦除块的起始地址;end 是擦除的字节数。

例如:擦除Sector 2和Sector 3区域命令为erase 20000 +20000

N:SF[-SL]是按照组和扇区,N 表示Flash 的Block号,SF 表示擦除起始Sector号,SL 表示擦除结束Sector号。

例如:擦除Block1 的Sector 2和Sector 3区域命令为erase 1:2-3。

bank N是擦除整个Block,擦除Block号为N 的整个Flash。

all是擦除全部Flash。

注意:Nor Flash擦除的最小单位是Sector,也就是0x10000字节,如果你定义的大小不满1 Sector 或超过Sector的边界,那么被定义到的Sector会被全部擦除。

erase :擦除Flash的命令

格式:

erase start end

erase start +end

erase N:SF[-SL]

erase bank N

erase all

参数是指定Flash 擦除操作范围,跟写保护的方式相同。

以下的范例将mini2440的Nor Flash的Sector 16写保护,再解除保护,擦除数据,最后将起始的20字节拷贝到Sector 16。

[u-boot@MINI2440]# flinfo 1

Bank # 1: SST: 1x SST39VF1601 (2MB)

Size: 2 MB in 32 Sectors

Sector Start Addresses:

00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000

00050000 00060000 (RO) 00070000 (RO) 00080000 00090000

000A0000 000B0000 000C0000 000D0000 000E0000

000F0000 00100000 00110000 00120000 00130000

00140000 00150000 00160000 00170000 00180000

00190000 001A0000 001B0000 001C0000 001D0000

001E0000 001F0000

[u-boot@MINI2440]# protect on 1:16-16

Protect Flash Sectors 16-16 in Bank # 1

[u-boot@MINI2440]# flinfo 1

Bank # 1: SST: 1x SST39VF1601 (2MB)

Size: 2 MB in 32 Sectors

Sector Start Addresses:

00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000

00050000 00060000 (RO) 00070000 (RO) 00080000 00090000

000A0000 000B0000 000C0000 000D0000 000E0000

000F0000 00100000 (RO) 00110000 00120000 00130000

00140000 00150000 00160000 00170000 00180000

00190000 001A0000 001B0000 001C0000 001D0000

001E0000 001F0000

[u-boot@MINI2440]# protect off 0x100000 0x10ffff

Un-Protect Flash Sectors 16-16 in Bank # 1

Bank # 1: SST: 1x SST39VF1601 (2MB)

Size: 2 MB in 32 Sectors

Sector Start Addresses:

00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000

00050000 00060000 (RO) 00070000 (RO) 00080000 00090000

000A0000 000B0000 000C0000 000D0000 000E0000

000F0000 00100000 00110000 00120000 00130000

00140000 00150000 00160000 00170000 00180000

00190000 001A0000 001B0000 001C0000 001D0000

001E0000 001F0000

[u-boot@MINI2440]# erase 0x100000 +20

Erasing sector 16 ... ok.

Erased 1 sectors

[u-boot@MINI2440]# cp.b 0x0 0x100000 0x20

Copy to Flash... done

[u-boot@MINI2440]# md.b 100000 20

00100000: 12 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................

00100010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................

(8) USB 操作指令

指令功能

usb reset初始化USB控制器

usb stop [f]关闭USB控制器

usb tree已连接的USB设备树

usb info [dev]显示USB设备[dev]的信息

usb storage显示已连接的USB存储设备

usb dev [dev]显示和设置当前USB存储设备

usb part [dev]显示USB存储设备[dev]的分区信息

usb read addr blk# cnt读取USB存储设备数据

在所有的命令使用前,必须先插入USB设备,然后使用:usb reset,以初始化USB控制器,获取设备信息。

我将一个4G的kingstonU盘(可引导盘)插入 mini2440,然后读取他的头512 字节(MBR):[u-boot@MINI2440]# usb reset

(Re)start USB...

USB: scanning bus for devices... 2 USB Device(s) found

scanning bus for storage devices... 1 Storage Device(s) found

Device Tree:

1 Hub (1

2 Mb/s, 0mA)

| OHCI Root Hub

|

+-2 Mass Storage (12 Mb/s, 100mA)

Kingston DT 101 II 0019E02CB6EB5B8B1B120051

[u-boot@MINI2440]# usb info

1: Hub, USB Revision 1.10

- OHCI Root Hub

-Class: Hub

- PacketSize: 8 Configurations: 1

- Vendor: 0x0000 Product 0x0000 Version 0.0

Configuration: 1

- Interfaces: 1 Self Powered 0mA

Interface: 0

- Alternate Setting 0, Endpoints: 1

-Class Hub

- Endpoint 1 In Interrupt MaxPacket 2 Interval 255ms

2: Mass Storage, USB Revision 2.0

- Kingston DT 101 II 0019E02CB6EB5B8B1B120051

-Class:(from Interface) Mass Storage

- PacketSize: 64 Configurations: 1

- Vendor: 0x0951 Product 0x1613 Version 1.0

Configuration: 1

- Interfaces: 1 Bus Powered 100mA

Interface: 0

- Alternate Setting 0, Endpoints: 2

-Class Mass Storage, Transp. SCSI, Bulk only

- Endpoint 1 In Bulk MaxPacket 64

- Endpoint 2 Out Bulk MaxPacket 64

[u-boot@MINI2440]#usb storage

Device 0: Vendor: Kingston Rev: PMAP Prod: DT 101 II Type: Removable Hard Disk

Capacity: 3875.0 MB = 3.7 GB (7936000 x 512) [u-boot@MINI2440]# usb dev 0

USB device 0:

Device 0: Vendor: Kingston Rev: PMAP Prod: DT 101 II Type: Removable Hard Disk

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 移植步骤详解 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命令详解

常用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源码分析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版本文件结构

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

iTop4412的uboot第一阶段

2 uboo t 源码分析 2.5.1.star t.S 2.5.1.star t.S 引入引入 2.5.1.1、u-boot.lds中找到start.S入口 (1)在C语言中整个项目的入口就是 main函数(这是 个.c文件的项目,第一个要分析的文件就是包含了C语言规定的),所以譬如说一 个有 main函数的那个文件。 10000 ( 2 方。ENTRY(_start)因此 _start 符号所在的文件就是整个程序的起始文 件, _sta rt 所在处的 代码就是整个程序的起始代码。 2.5.1.2、SourceInsight中如何找到 文件 (1)当前状况:我们知道在uboot中的1000多个文件中有一个符号 叫 _start,但是我们不知道 这个符号在哪个文件中。这种情况下要查找一个符号在所有项目中文件中的引用,要使用SourceInsight的搜索功能。 (2)start.s 在cpu/arm_cortexa9/start.s (3)然后进入start.S文件中,发现 个uboot的入口代码,就是第57 57行中就 是行。_sta rt 标号的定义处,于是乎我们就找到了整 2.5.1.3、SI中找文件技巧 (1)以上,找到了start.S文件,下面我们就从start.S文件开始分析uboot第一阶段。 (2)在SI中,如果我们知道我们要找的文件的名字,但是我们又不知道他在哪个目录下,我 们要怎样找到并打开这个文件?方法是在 SI中先打开右边的工程项目管理栏目,然后点击 最左边那个(这个是以文件为单位来浏览的),然后在上面输入栏中输入要找的文件的名 字。我们在输入的时候,SI在不断帮我们进行匹配,即使你不记得文件的全名只是大概记 得名字,也能帮助你找到你要找的文件。 2.5.2.start.S解析1 2.5.2.1、不简单的头文件包含

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"

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.doczj.com/doc/8917851562.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: ?支持Nand Flash读写 ?支持从Nor/Nand Flash启动 ?支持CS8900或者DM9000网卡 ?支持Yaffs文件系统 ?支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM 处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

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移植 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.doczj.com/doc/8917851562.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]复制 */

相关主题
文本预览
相关文档 最新文档