1、U-boot 发展到现在, 他的命令行模式已经非常接近 Linux下的 shell 了, 命令行模式模式下支持“Tab” 键的命令补全和命令的历史记录功能。而且如果你输入的命令的前几个字符和别的命令不重复,那么 你就只需要打这几个字符即可,比如我想看这个 U-boot 的版本号,命令就是“ version”,但是在所有 的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。 u-bootMINI2440# version U-Boot 2009.11 ( 4月 04 2010 - 12:09:25) u-bootMINI2440# v U-Boot 2009.11 ( 4月
2、 04 2010 - 12:09:25) u-bootMINI2440# base Base Address: 0x00000000 u-bootMINI2440# ba Base Address: 0x00000000 由于 U-boot 支持的命令实在太多,一个一个细讲不现实,也没有必要。所以下面我挑一些烧写和 引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧! (1)获取帮助 命令:help 或 ? 功能:查看当前 U-boot 版本中支持的所有命令。 u-bootMINI2440# help ? - alias for help askenv - get enviro
3、nment 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
4、 - 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 bootm bootdelay=1 baudrate=115200 ethaddr=08:08:11:18:12:27 ipaddr=
5、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的
6、命令是 setenv,格式为: setenv name value 第 1 个参数是环境变量的名称。 第 2 个参数是要设置的值,如果没有第 2 个参数,表示删除这个环境变量。 例如:我先将”tekkaman”参数删除,再设置,最后在一个命令串中调用。 u-bootMINI2440# printenv tekkaman tekkaman=bmp d 70000 u-bootMINI2440# setenv tekkaman u-bootMINI2440# printenv tekkaman # Error: “tekkaman“ not defined u-bootMINI2440# sete
7、nv tekkaman echo “I am Tekkaman Ninja!“ u-bootMINI2440# printenv tekkaman tekkaman=echo I am Tekkaman u-bootMINI2440# echo I Love Linux ;$tekkaman I Love Linux I am Tekkaman 当你设置了ENV, 它只保存在内存中, 如果你要它保存在存放ENV的固态存储器中, 请使用: saveenv。 u-bootMINI2440# saveenv Saving Environment to NAND. Erasing Nand. Eras
8、ing 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 来
9、说 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
10、#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_
11、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
12、 第 1 个参数是下载到 SDRAM 的地址,如果不填,就是用默认配置:CONFIG_SYS_LOAD_ADDR 第 2 个参数是波特率,一般不填,用默认的 115200. 在 windows 下的超级终端可以用这些协议发送文件,但是在 ubuntu 下基本只能用 kermit 协议。 一下使用 C-kermit 来发送一个文件到 mini2440。 u-bootMINI2440# loadb # Ready for binary (kermit) download to 0x30008000 at 115200 bps. 上面已经启动了 U-boot 的 kermit 传输协议,这时按下 C
13、trl + , 再按 c, 切换到 C-kermit 的命令 行模式,输入命令:send ,回车。 u-bootMINI2440# 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
14、for help. (/home/tekkaman/桌面/) C-Kermitsend/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 S
15、ENDING: /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.90100 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 Las
16、t 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-bootMINI2440# loadb # Ready for binary (kermit) download to 0x30008000 at 115200 bps. (Back at MAGI-Linux) - C-Kermit
17、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-Kermitsend/home/tekkaman/development/share/zImage.img (/home/tekkaman/桌面/) C-Kermitc Connecting to /dev/ttyUSB0, speed 115200 Escape char
18、acter: 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)网络命令 只要你的网卡驱动没问题,那么你就可以通过网络来传输文件到开发板,这可比串口快多了。你 可以直接用交叉网线连接开发板和电脑,也可以用普通直连网线连接路由器,再连到电脑,不过记得配置好网络,
19、关闭防火墙哦。 先测试网络是否通了,现在开发板使用 ping 命令,看看是否可以 ping 通电脑: u-bootMINI2440# 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-bootMINI2440# ping 192.168.1.1
20、00 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 最
21、好关闭 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 pro
22、tocol 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作为主
23、机 IP:。 使用范例: u-bootMINI2440# 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; ou
24、r 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-bootMINI2440# tftp u-boot.bin dm9000 i/o: 0x20000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 08:08:11:18:12:27 operating a
25、t 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-bootMINI2440# dhcp 192.168.1.100:u-boot.bin dm9000 i/o: 0x20000300, id: 0x90000a46 DM90
26、00: 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 Loadin
27、g: # done Bytes transferred = 256220 (3e8dc hex) u-bootMINI2440# 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.1
28、01 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-bootMINI2440# rarpboot 192.168.1.100:u-boot.bin 我的路由器没有开 rarp 协议,所以 rarpboot 无法使用,要使用 dhcp 或 bootp 也是要路由或 Host
29、 支持的。 (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 偏移地址。 na
30、nd write.yaffs1 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 的
31、 off 偏移地址处的块为坏块 使用范例: u-bootMINI2440# nand info Device 0: NAND 128MiB 3,3V 8-bit, sector size 128 KiB u-bootMINI2440# nand device 0 Device 0: NAND 128MiB 3,3V 8-bit. is now current device u-bootMINI2440# nand read 0x30008000 0x60000 200000 NAND read: device 0 offset 0x60000, size 0x200000 2097152 by
32、tes read: OK u-bootMINI2440# nand bad Device 0 bad blocks: 030a0000 030c0000 030e0000 07ee0000 u-bootMINI2440# nand markbad 0x500000 block 0x00500000 successfully marked as bad u-bootMINI2440# nand bad Device 0 bad blocks: 00500000 030a0000 030c0000 030e0000 07ee0000 u-bootMINI2440# nand scrub NAND
33、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 E
34、rase 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-bootMINI2440# nand bad Device 0 bad blocks: 030a0000
35、 030c0000 030e0000 07ee0000 u-bootMINI2440# 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
36、ff ff ff ff ff ff ff ff ff ff u-bootMINI2440# 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
37、address: 0x30008000 Loading: T # done Bytes transferred = 256220 (3e8dc hex) u-bootMINI2440# nand write 0x30008000 0 40000 NAND write: device 0 offset 0x0, size 0x40000 Writing at 0x2000000020000 - 100% is complete. 262144 bytes written: OK u-bootMINI2440# nand dump 0x8000 Page 00008000 dump: 00 00
38、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 处理过的)的结束,所 以不用给出读取大小。