加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

常用 U-boot命令详解

发布时间:2020-12-15 17:21:37 所属栏目:百科 来源:网络整理
导读:U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,在 我编译的U-boot-2009.11 中的命令行模式模式下支持 “Tab”键的命令补全和命令的历史记录功能 。而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比
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
? - aliasfor 'help'
askenv - get environment variables from stdin
base - print orset address offset
bdinfo - print Board Info structure
bmp - manipulate BMP image data
boot - boot default, i.e., run'bootcmd'
bootd - boot default, 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 - returntrue/false on integer compare
loadb - load binary file over serial line (kermit mode)
loads - load S-Recordfile 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/writetest
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 FLASHwrite protection
rarpboot- boot image via network using RARP/TFTP protocol
reginfo - print register information
reset - PerformRESET 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 executionfor some time
source - run script from memory
test - minimaltest 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 <imageAddr>- display image info
bmp display <imageAddr>[x y] - display image at x,y
[u-boot@MINI2440]#? bmp
bmp - manipulate BMP image data

Usage:
bmp info <imageAddr>- display image info
bmp display <imageAddr>[x y] - display image at x,y
[u-boot@MINI2440]# h bm
bmp - manipulate BMP image data

Usage:
bmp info <imageAddr>- display image info
bmp display <imageAddr>[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 标准输出,一般是串口,也可是LCDVGA
stderr 标准出错,一般是串口,也可是LCDVGA

要看到你的板上的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 HELPfor help.
(/home/tekkaman/桌面/) C-Kermit>send/home/tekkaman/development/share/zImage.img

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

? ?Current Directory: /home/tekkaman/&#65533;&#65533;~L&#65533;~]&#65533;
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,<CR> 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,
??Trustees of Columbia University in the City of New York.
Type ? or HELPfor 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 isnot 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 0x30008000 192.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]# nandread 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?<y/N>
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
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]# nandwrite 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]# nandwrite 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, 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,.l] address


md? ?? ? 显示内存值
格式:??md [.b,.l] address [# of objects]


mw? ???用指定的数据填充内存
格式:??mw [.b,.l] address value [count]


cp? ?? ?内存的拷贝(包括内存与Nor Flash间的数据拷贝)
格式:cp [.b,.l] source target count


上面是查看和修改内存值的指令,可以查看和修改SDRAM和寄存器值。
[.b,.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
[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]# 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]# usbreset
(Re)start USB...
USB: scanning bus for devices... 2 USB Device(s) found
? ?? ? scanning bus for storage devices... 1 Storage Device(s) found
[u-boot@MINI2440]#usb tree

Device Tree:
??1 Hub (12 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
? ?? ?? ?? ?Capacity: 3875.0 MB= 3.7 GB (7936000 x 512)
... is now current device
[u-boot@MINI2440]# usb part 0
print_part of 0

Partition Mapfor USB device 0 --Partition Type: DOS

Partition Start Sector Num Sectors Type
? ? 4 63 7935937 c
[u-boot@MINI2440]# usbread 0x30008000 0 200

USB read: device 0 block# 0, count 512 ............................
512 blocks read: OK
[u-boot@MINI2440]#md.b 0x30008000 200

30008000: fa 31 c0 8e d8 8e c0 8e d0 bc 00 7c fb fc 89 e6
.1.........|....

30008010: bf 00 06 b9 00 01 f3 a5 ea dc 06 00 00 10 00 01
................

30008020: 00 00 7c 00 00 00 00 00 00 00 00 00 00 80 3f 00
..|...........?.

30008030: ff 00 ed 01 1e 0e 1f 3a 16 10 00 74 06 1f ea 36
.......:...t...6

30008040: e7 00 f0 3d fb 54 75 05 8c d8 fb eb 1d 80 fc 08
...=.Tu.........

30008050: 75 1b e8 81 00 8a 36 13 00 fe ce 8b 0e 15 00 86
u.....6.........

30008060: cd c0 e1 06 0a 0e 11 00 31 c0 f8 eb 65 80 fc 02
........1...e...

30008070: 72 cb 80 fc 04 77 c6 60 80 cc 40 50 be 00 00 c7
r....w.`..@P....

30008080: 04 10 00 30 e4 89 44 02 89 5c 04 8c 44 06 66 31
...0..D....D.f1

30008090: c0 66 89 44 0c 88 f0 f6 26 11 00 88 cf 88 eb c0
.f.D....&.......

300080a0: ef 06 81 e1 3f 00 01 c8 48 89 c7 a1 13 00 f7 26
....?...H......&

300080b0: 11 00 f7 e3 01 f8 81 d2 00 00 89 44 08 89 54 0a
...........D..T.

300080c0: 58 30 c0 8a 16 10 00 e8 0c 00 88 26 03 00 61 a1
X0.........&..a.

300080d0: 02 00 1f ca 02 00 9c ff 1e 22 00 c3 80 fa 8f 7f
........."......

300080e0: 04 88 16 2d 06 be 87 07 e8 8d 00 be be 07 31 c0
...-..........1.

300080f0: b9 04 00 f6 04 80 74 03 40 89 f5 81 c6 10 00 e2
......t.@.......

30008100: f2 48 74 02 cd 18 bf 05 00 be 1d 06 c7 44 02 01
.Ht..........D..

30008110: 00 66 8b 46 08 66 89 44 08 b8 00 42 8a 16 2d 06
.f.F.f.D...B..-.

30008120: cd 13 73 0d 4f 74 49 30 e4 8a 16 2d 06 cd 13 eb
..s.OtI0...-....

30008130: d8 a1 fe 7d 3d 55 aa 75 37 fa 66 a1 4c 00 66 a3
...}=U.u7.f.L.f.

30008140: 3f 06 be 13 04 8b 04 48 89 04 c1 e0 06 8e c0 31
?......H.......1

30008150: ff be 1d 06 b9 60 00 fc f3 a5 c7 06 4c 00 17 00
.....`......L...

30008160: a3 4e 00 fb 8a 16 2d 06 89 ee fa ea 00 7c 00 00
.N....-......|..

30008170: be aa 07 e8 02 00 eb fe ac 20 c0 74 09 b4 0e bb
......... .t....

30008180: 07 00 cd 10 eb f2 c3 53 74 61 72 74 20 62 6f 6f
.......Start boo

30008190: 74 69 6e 67 20 66 72 6f 6d 20 55 53 42 20 64 65
ting from USB de

300081a0: 76 69 63 65 2e 2e 2e 0d 0a 00 42 6f 6f 74 20 66
vice......Boot f

300081b0: 61 69 6c 65 64 00 00 00 ea eb d4 ca 00 00 00 00
ailed...........

300081c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
................

300081d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
................

300081e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01
................

300081f0: 01 00 0c fe 7f ec 3f 00 00 00 c1 17 79 00 55 aa
......?.....y.U.


(9) SD卡(MMC)指令


SD卡的使用命令比较简单,只有初始化和设备信息的显示,读写是通过文件系统命令实现的。
mmc init [dev] - 初始化MMC子系统
mmc device [dev] - 查看和设置当前设备
使用和USB类似,在所有的命令使用前,必须先插入SD卡,然后使用:mmc init,以初始化MMC 控制器,获取设备信息。
我在mini2440中插入1GB SD卡:

[u-boot@MINI2440]#mmc init
mmc: Probing for SDHC ...
mmc: SD 2.0or later card found
trying to detect SD Card...
Manufacturer: 0x00, OEM"

roduct name: "

",revision 0.0

Serial number:
7864775

Manufacturing date: 11/2006
CRC:
0x4f,b0 = 1

READ_BL_LEN=6,C_SIZE_MULT=7,C_SIZE=4095
size = 0
SD Card detected RCA: 0x2 type: SD
mmc1 is available
[u-boot@MINI2440]# mmc device
mmc1 is current device


(10) FAT文件系统指令

fatinfo:显示文件系统的相关信息
格式:fatinfo <interface> <dev[:part]>
Interface:代表接口,如usb、mmc;
dev:代表设备编号,如0、1……;
part:代表存储设备中的分区,如1、2……。

fatload:从FAT32文件系统中读取二进制文件到SDRAM。
格式:fatload <interface> <dev[:part]>??<addr> <filename> [bytes]
Interface、dev和part同上;
addr:代表写入SDRAM的地址;
filename:代表存储设备中的文件名;
bytes:代表从存储设备中读取的文件大小,可不填;如果填的数据比文件小,就只读取bytes字节,如果填的数据比文件大,也只读取文件的大小。

fatls:列出FAT32文件系统中目录里的文件。
格式:fatls <interface> <dev[:part]> [directory]
Interface、dev和part同上;
directoryr:代表所要查看的目录,可不填,默认为/。

这些指令基本上要和U盘或者SD卡同时使用,主要用于读取这些移动存储器上的FAT32分区。
使用范例:

[u-boot@MINI2440]# usb part 0
print_part of 0

Partition Mapfor USB device 0 --Partition Type: DOS

Partition Start Sector Num Sectors Type
? ? 4 63 7935937 c
[u-boot@MINI2440]#fatinfo usb 0:4
Interface: USB
??Device 0: Vendor: Kingston Rev: PMAP Prod: DT 101 II
? ?? ?? ?? ?Type: Removable Hard Disk
? ?? ?? ?? ?Capacity: 3875.0 MB= 3.7 GB (7936000 x 512)
Partition 4: Filesystem: FAT32"7600_16385_"
[u-boot@MINI2440]# fatls usb 0:4
? ?? ?? ?? ?boot/
? ?? ?? ?? ?efi/
? ?? ?? ?? ?sources/
? ?? ?? ?? ?support/
? ?? ?? ?? ?upgrade/
? ?? ? 43 autorun.inf
? ?383562 bootmgr
? ?111880 setup.exe
? ?256220 u-boot.bin

4 file(s), 5 dir(s)

[u-boot@MINI2440]# fatls usb 0:4/boot/
? ?? ?? ?? ?./
? ?? ?? ?? ?../
? ?? ?? ?? ?fonts/
? ?? ?? ?? ?zh-cn/
? ?262144 bcd
??3170304 boot.sdi
? ???1024 bootfix.bin
? ? 97280 bootsect.exe
? ???4096 etfsboot.com
? ?485440 memtest.exe

6 file(s), 4 dir(s)
[u-boot@MINI2440]# fatload usb 0:4 0x30008000 u-boot.bin
reading u-boot.bin
........................

256220 bytes read
[u-boot@MINI2440]# fatload usb 0:4 0x30008000 u-boot.bin 200
reading u-boot.bin

512 bytes read

(11) 系统引导指令

boot??和bootd??都是运行ENV”bootcmd”中指定的指令。

bootm 指令是专门用于启动在SDRAM中的用U-boot的mkimage工具处理过的内核映像。
格式:bootm [addr [arg ...]]
addr 是内核映像所在的SDRAM中的地址
当启动的是Linux内核时,'arg' 可以使 initrd 的地址。

[u-boot@MINI2440]# setenv bootcmd tftp;bootm
[u-boot@MINI2440]# saveenv
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x6000000000002 -- 0% complete.
Writing to Nand... done
[u-boot@MINI2440]# boot
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)
## 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, VIVT instruction cache
Machine: MINI2440
(略)


U-Boot 2009.11( 4月 04 2010 - 12:09:25)

modified by tekkamanninja (tekkamanninja@163.com)
Love Linux

I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: 128 MiB
Video: 240x320x16 20kHz 62Hz
In: serial
Out: serial
Err: serial
Net: dm9000
U-Boot 2009.11( 4月 04 2010 - 12:09:25)
modified by tekkamanninja
(tekkamanninja@163.com)
Love Linux
Hit any key to stop autoboot: 0
[u-boot@MINI2440]#bootd
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)
## 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 ...
(略)


12)EEPROM 读写指令eeprom??- I2C 接口的EEPROM 读写指令
格式:
eeprom read??addr off cnt
eeprom write addr off cnt
第一个参数addr 是要写入或读出的数据在SDRAM中的存放地址;
第二个参数off 是在EEPROM中的偏移;
第三个参数cnt 是读写的数据字节数。
使用范例:
[u-boot@MINI2440]# md.b 0x30008000 2
30008000: aa aa ..
[u-boot@MINI2440]# eepromread 0x30008000 10 2

EEPROM @0x50 read: addr 30008000 off 0010count 2 ... done
[u-boot@MINI2440]# md.b 0x30008000 2
30008000: ff ff ..
[u-boot@MINI2440]# mm.b 0x30008000
30008000: ff ? aa
30008001: ff ? 55
30008002: aa ? q
[u-boot@MINI2440]# md.b 0x30008000 2
30008000: aa 55 .U
[u-boot@MINI2440]# eepromwrite 0x30008000 10 2

EEPROM @0x50 write: addr 30008000 off 0010count 2 ... done
[u-boot@MINI2440]#eeprom read 0x30008010 10 2

EEPROM @0x50 read: addr 30008010 off 0010count 2 ... done
[u-boot@MINI2440]#md.b 0x30008010 2
30008010: aa 55 .U


(13)设置和读取RTC指令

date? ? - 设置和读取RTC
格式:
date [MMDDhhmm[[CC]YY][.ss]]
MM:月份
DD:日期
hh:小时
mm 分钟
CC:年份的前两个数字
YY:年份的后两个数字
ss:秒数
使用范例:
[u-boot@MINI2440]#date
Date: 1980-00-06(Thursday) Time: 20:30:25
[u-boot@MINI2440]#date 041100582010.20
Date: 2010-04-11(Sunday) Time: 0:58:20

(14)脚本运行指令

run var [...]
var :ENV中的脚本名
使用范例:
[u-boot@MINI2440]#setenv a_run_test echo $bootfile ; version
[u-boot@MINI2440]#run a_run_test
zImage.img

U-Boot 2009.11( 4&aelig;&#339;&#710; 04 2010 - 12:09:25)

(15)系统重启指令

reset
-
重启CPU

[u-boot@MINI2440]#reset
resetting ...


U-Boot 2009.11( 4&aelig;&#339;&#710; 04 2010 - 12:09:25)

modified by tekkamanninja (tekkamanninja@163.com)
Love Linux

I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: 128 MiB
Video: 240x320x16 20kHz 62Hz
In: serial
Out: serial
Err: serial
Net: dm9000
U-Boot 2009.11( 4&aelig;&#339;&#710; 04 2010 - 12:09:25)
modified by tekkamanninja
(tekkamanninja@163.com)
Love Linux
Hit any key to stop autoboot: 0
[u-boot@MINI2440]#



四、U-boot的使用(四)

下载与烧写

使用U-boot将映像文件烧写到板上的Flash,一般步骤是:
(1)通过网络、串口、U盘、SD卡等方式将文件传输到SDRAM;
(2)使用Nand Flash或Nor Flash相关的读写命令将SDRAM中的数据烧入Flash。

下面是烧写范例:
如果使用 SD卡和U盘形式更新U-boot,那么首先SD卡和U盘中必须有FAT32文件系统,并在里面存放了u-boot.bin 文件。
1) 通过SD卡烧入Nand Flash:
[u-boot@MINI2440]#mmc init
mmc: Probing for SDHC ...
mmc: SD 2.0 or later card found
trying to detect SD Card...
Manufacturer:
0x00,OEM "

roduct name:
"
",C_SIZE=4095

size = 0
SD Card detected RCA: 0x2 type: SD
mmc1 is available
[u-boot@MINI2440]#fatload mmc 1 0x30008000 u-boot.bin
reading u-boot.bin

256220 bytes read
[u-boot@MINI2440]# nand erase 0 0x40000

NAND erase: device 0 offset 0x0,size 0x40000
Erasing at 0x2000000000004 --
0% complete.

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

NAND write: device 0 offset 0x0,size 0x40000
Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK

2) 通过U盘烧入Nor Flash:
[u-boot@MINI2440]#usb start
(Re)start USB...
USB:
scanning bus for devices... 2 USB Device(s) found


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

[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 part 0
print_part of 0

Partition Map for USB device 0
--
Partition Type: DOS


Partition
Start Sector
Num Sectors
Type



4


63

7935937
c


[u-boot@MINI2440]# fatload usb 0:4 0x30008000 u-boot.bin

reading u-boot.bin
........................

256220 bytes read
[u-boot@MINI2440]# protect off all
Un-Protect Flash Bank # 1
[u-boot@MINI2440]# erase 0x0 0x3ffff
Erasing sector
0 ... ok.

Erasing sector
1 ... ok.

Erasing sector
2 ... ok.

Erasing sector
3 ... ok.

Erased 4 sectors
[u-boot@MINI2440]# cp.b 0x30008000 0x0
0x3ffff

Copy to Flash... done

3) 通过TFTP服务烧入Nand Flash:
[u-boot@MINI2440]#tftpboot 30008000 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
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 erase 0 0x40000
NAND erase: device 0 offset 0x0,size 0x40000
Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK

4) 通过NFS 服务烧入Nand Flash:

[u-boot@MINI2440]# nfs 30008000 192.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]# nand erase 0 0x40000
NAND erase: device 0 offset 0x0,size 0x40000
Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK


内核引导

内核的引导步骤如下:
(1)用U-boot的mkimage工具处理内核映像zImage。
(2)通过网络、串口、U盘、SD卡等方式将处理过的内核映像传输到SDRAM的一定位置(一般使用0x30008000)
(3)然后使用”bootm"等内核引导命令来启动内核。


为什么要U-bootmkimage工具处理内核映像zImage
因为在用bootm命令引导内核的时候,bootm需要读取一个64字节的文件头,来获取这个内核映象所针对的CPU体系结构、OS、加载到内存中的位置、在内存中入口点的位置以及映象名等等信息。这样bootm才能为OS设置好启动环境,并跳入内核映象的入口点。而mkimage就是添加这个文件头的专用工具。具体的实现请看U-bootbootm的源码和mkimage的源码
mkimage工具的使用:

参数说明:
-A指定CPU的体系结构,可用值有:alphaarm
x86ia64mipsmips64ppcs390shsparcsparc64m68k

-O指定操作系统类型,可用值有:openbsdnetbsdfreebsd4_4bsdlinuxsvr4esixsolarisirixscodellncrlynxosvxworkspsosqnxu-bootrtemsartos
-T指定映象类型,可用值有:standalonekernelramdiskmultifirmwarescriptfilesystem
-C指定映象压缩方式,可用值有:
none
不压缩(一般使用这个,因为zImage是已经被bzip2压缩过的自解压内核)

gzip gzip的压缩方式
bzip2 bzip2的压缩方式
-a指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e
指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n
指定映象名
-d指定制作映象的源文件

以下是制作内核映像的命令示例:
mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img


以下是使用范例:
1) 通过SD卡引导内核:
首先SD卡中必须有FAT32文件系统,并在里面存放了处理过的内核映像文件。

[u-boot@MINI2440]#mmc init


mmc: Probing for SDHC ...
mmc: SD 2.0 or later card found
trying to detect SD Card...
Manufacturer:
0x00,C_SIZE=4095

size = 0
SD Card detected RCA: 0x2 type: SD
mmc1 is available
[u-boot@MINI2440]#fatload mmc 1 30008000 zImage.img
reading zImage.img

2277540 bytes read
[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
(略)


2) 通过TFTP服务引导内核:
[u-boot@MINI2440]# tftpboot 0x30008000 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]# 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,VIVT instruction cache
Machine: MINI2440
(略)


3) 通过NFS服务引导内核:
[u-boot@MINI2440]#nfs 30008000 192.168.1.100:/home/tekkaman/development/share/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
File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101
Filename '/home/tekkaman/development/share/zImage.img'.
Load address: 0x30008000
Loading: #################################################################


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



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



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



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



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



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

done
Bytes transferred = 2277540 (22c0a4 hex)
[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,VIVT instruction cache
Machine: MINI2440
(略)

4) 通过Nand Flash引导内核:
? ?首先要将处理过的内核映像文件烧入Nand Flash的一定位置(由内核分区表决定)。以后每次启动时用Nand Flash的读取命令先将这个内核映像文件读到内存的一定位置(由制作内核映像时的-a参数决定),再使用bootm命令引导内核。

内核映像文件的烧入:

[u-boot@MINI2440]# nfs 30008000 192.168.1.100:/home/tekkaman/development/share/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
File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101
Filename '/home/tekkaman/development/share/zImage.img'.
Load address: 0x30008000
Loading: #################################################################


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



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



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



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



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



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

done
Bytes transferred = 2277540 (22c0a4 hex)
[u-boot@MINI2440]# nand erase 0x80000 0x300000

NAND erase: device 0 offset 0x80000,size 0x300000
Erasing at 0x36000001800000 --
0% complete.

OK
[u-boot@MINI2440]#
nand write 30008000 0x80000 300000


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

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


内核引导:

[u-boot@MINI2440]#
nand read 30008000 0x80000 300000


NAND read: device 0 offset 0x80000,size 0x300000

3145728 bytes read: OK

[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,VIVT instruction cache
Machine: MINI2440

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读