常用 U-boot命令详解
转:http://www.360doc.com/content/10/0827/13/496343_49168699.shtml
获取帮助
环境变量与相关指令
U-boot的使用
网络命令
Nand Flash操作指令
内存/寄存器操作指令
Nor Flash指令
USB 操作指令
SD卡(MMC)指令
FAT文件系统指令
系统引导指令
EEPROM 读写指令
设置和读取RTC指令
脚本运行指令
系统重启指令
下载与烧写
1) 通过SD卡烧入Nand Flash:
2) 通过U盘烧入Nor Flash
3) 通过TFTP服务烧入Nand Flash
4) 通过NFS 服务烧入Nand Flash
内核引导
1) 通过SD卡引导内核
2) 通过TFTP服务引导内核
3) 通过NFS服务引导内核
4) 通过Nand Flash引导内核
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 2009.11 ( 4月 04 2010 - 12:09:25) |
由于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: Usage: Usage: |
(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就开始传送,并且显示一个传送界面,并动态显示传送进度。
C-Kermit 8.0.211, 10 Apr 2004, MAGI-Linux
Current Directory: /home/tekkaman/��~L�~]� ...10...20...30...40...50...60...70...80...90..100 X to cancel file, Z to cancel group, <CR> to resend last packet, |
传送完毕后,输入c ,回到U-boot的串口界面。
[u-boot@MINI2440]# loadb ## Ready for binary (kermit) download to 0x30008000 at 115200 bps... (Back at MAGI-Linux) |
(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 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 NAND read: device 0 offset 0x60000, size 0x200000 Device 0 bad blocks: NAND scrub: device 0 whole chip Really scrub this NAND flash? <y/N> NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5 NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5 |
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 NAND write: device 0 offset 0x100000, size 0x300000 [u-boot@MINI2440]# bootm 30008000 Starting kernel ... Uncompressing Linux... done, booting the kernel. |
四、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) Bank # 1: SST: 1x SST39VF1601 (2MB) Bank # 1: SST: 1x SST39VF1601 (2MB) |
(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 [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 2: Mass Storage, USB Revision 2.0 [u-boot@MINI2440]# usb storage Partition Map for USB device 0 -- Partition Type: DOS Partition Start Sector Num Sectors Type |
(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.0 or 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 Map for USB device 0 -- Partition Type: DOS Partition Start Sector Num Sectors Type 4 file(s), 5 dir(s) [u-boot@MINI2440]# fatls usb 0:4 /boot/ 6 file(s), 4 dir(s) 256220 bytes read 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, booting the kernel. U-Boot 2009.11 ( 4月 04 2010 - 12:09:25) modified by tekkamanninja (tekkamanninja@163.com) I2C: ready 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]# eeprom read 0x30008000 10 2 EEPROM @0x50 read: addr 30008000 off 0010 count 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]# eeprom write 0x30008000 10 2 EEPROM @0x50 write: addr 30008000 off 0010 count 2 ... done [u-boot@MINI2440]# eeprom read 0x30008010 10 2 EEPROM @0x50 read: addr 30008010 off 0010 count 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月 04 2010 - 12:09:25) |
(15)系统重启指令
reset
- 重启CPU
[u-boot@MINI2440]# reset resetting ... U-Boot 2009.11 ( 4月 04 2010 - 12:09:25) modified by tekkamanninja (tekkamanninja@163.com) I2C: ready |
四、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]# is available [u-boot@MINI2440]# fatload mmc 1 0x30008000 u-boot.bin reading u-boot.bin 256220 bytes read NAND erase: device 0 offset 0x0, size 0x40000 NAND write: device 0 offset 0x0, size 0x40000 |
2) 通过U盘烧入Nor Flash:
[u-boot@MINI2440]# print_part of 0 Partition Map for USB device 0 Partition
63 7935937 [u-boot@MINI2440]# fatload usb 0:4 0x30008000 u-boot.bin 256220 bytes read |
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 Erasing at 0x2000000000004 -- 0% complete. OK [u-boot@MINI2440]# nand write 0x30008000 0 0x40000 NAND write: device 0 offset 0x0, size 0x40000 |
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 Erasing at 0x2000000000004 -- 0% complete. OK [u-boot@MINI2440]# nand write 0x30008000 0 0x40000 NAND write: device 0 offset 0x0, size 0x40000 |
内核引导
内核的引导步骤如下:
(1)用U-boot的mkimage工具处理内核映像zImage。
(2)通过网络、串口、U盘、SD卡等方式将处理过的内核映像传输到SDRAM的一定位置(一般使用0x30008000)
(3)然后使用”bootm"等内核引导命令来启动内核。
为什么要用U-boot的mkimage工具处理内核映像zImage? 因为在用bootm命令引导内核的时候,bootm需要读取一个64字节的文件头,来获取这个内核映象所针对的CPU体系结构、OS、加载到内存中的位置、在内存中入口点的位置以及映象名等等信息。这样bootm才能为OS设置好启动环境,并跳入内核映象的入口点。而mkimage就是添加这个文件头的专用工具。具体的实现请看U-boot中bootm的源码和mkimage的源码。 |
mkimage工具的使用:
参数说明: 以下是制作内核映像的命令示例: |
以下是使用范例:
1) 通过SD卡引导内核:
首先SD卡中必须有FAT32文件系统,并在里面存放了处理过的内核映像文件。
[u-boot@MINI2440]# mmc init mmc: Probing for SDHC ... 2277540 bytes read Image Name: Created: Image Type: Data Size: Load Address: 30008000 Entry Point: Verifying Checksum ... OK XIP Kernel Image ... OK Starting kernel ... Uncompressing Linux... done, booting the kernel. |
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 ################################################################# ################################################################# ########################## Image Name: Created: Image Type: Data Size: Load Address: 30008000 Entry Point: Verifying Checksum ... OK XIP Kernel Image ... OK Starting kernel ... Uncompressing Linux... done, booting the kernel. |
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: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ####################################################### Image Name: Created: Image Type: Data Size: Load Address: 30008000 Entry Point: Verifying Checksum ... OK XIP Kernel Image ... OK Starting kernel ... Uncompressing Linux... done, booting the kernel. |
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: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ####################################################### NAND erase: device 0 offset 0x80000, size 0x300000 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 Image Name: Created: Image Type: Data Size: Load Address: 30008000 Entry Point: Verifying Checksum ... OK XIP Kernel Image ... OK Starting kernel ... Uncompressing Linux... done, booting the kernel. |
常用 U-boot命令详解的更多相关文章
- Windows学习总结(10)——Windows系统中常用的CMD命令详解
1.ping命令 ping是电脑网络故障诊断中的常用的命令,它的作用是用来检查网络是否通畅或者网络连接速度.我们来看一下PING命令的具体表述. 日常的诊断过程中我们最常用到的就是诊断连接是否通畅. ...
- Linux常用文件权限命令详解
pwd pwd命令用于获取当前工作目录的绝对路径. 使用示例: pwd 效果如下图: cd cd命令用于切换工作目录. 使用示例: cd 万猫学社/ 效果如下图: 其中在路径表示时, 一个半角句号(. ...
- Linux常用性能诊断命令详解
top top命令动态地监视进程活动与系统负载等信息. 使用示例: top 效果如下图: 以上命令输出视图中分为两个区域,一个统计信息区,一个进程信息区. 统计信息区: 第一行信息依次为:系统时间.运 ...
- Linux常用命令详解(week1_day1_3)--技术流ken
本节内容 pidofpstopipuptimewgetcurltrddtargrepfind 命令详解 1.pidof 获取正在运行程序的PID 实例1: [root@ken ~]# pidof ss ...
- Linux常用命令详解(week1_day1_2)--技术流ken
本节内容 aliasunaliasunamesuhostnamehistorywhichwcwwhowhoamipingkillseqdudffreedate 命令详解 1. alias 设置.’查看 ...
- Linux常用命令详解—基于CentOS7
## Linux 目录- /:根目录,一般只存放目录,不存放文件- /bin -> /usr/bin:可执行二进制文件的目录,也是常用命令目录,如常用的命令 ls.cat.mv 等- /boot ...
- Linux常用命令详解(3)
pidofpstopipuptimewgetcurltrddtargrepfind 命令详解 1.pidof 获取正在运行程序的PID 实例1: [root@ken ~]# pidof sshd 24 ...
- Linux常用命令详解(2)
aliasunaliasunamesuhostnamehistorywhichwcwwhowhoamipingkillseqdudffreedate 命令详解 1. alias 设置.’查看别名 实例 ...
- Git 常用命令详解
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...
- hbase shell基础和常用命令详解(转)
HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...
随机推荐
- 【bzoj1068】【SCOI2007】压缩
一道区间dp f[i][j][0/1]表示[i,j]区间是否加入M,并且之前一位有M的最小长度 可以理解为在第一位之前有一个M 那么就可以转移了. #include<bits/stdc++.h& ...
- 剑指offer中数据结构与算法部分学习
2.3.4 树 遍历:前中后序,宽度优先. 二叉树的特例:二叉搜索树.堆(最大堆和最小堆,用于找最值).红黑树(c++ STL中的很多数据结果就是基于这实现的): 题7-重建二叉树:递归,设置四个位点 ...
- 网站服务器压力Web性能测试(4):服务器压力Web性能测试小结
1.Apache Bench,Webbench,http_load对网站压力Web性能进行测试时,为了得到更加客观和准确的数值,应该从远程访问.局域网访问和本地等多个方面进行全方位的测试.一般用127 ...
- System.getProperty方法中输出路径的方法
package codegenerator;/** *@author Eilen *@date 2017年9月27日---下午3:15:09 *@描述: *@answer */public class ...
- [ python ] 类中的一些特殊方法
item系列 __getitem__(self, item) 对象通过 object[key] 触发 __setitem__(self, key, value) 对象通过 object[key] = ...
- ES6 promise简单实现
基本功能实现: function Promise(fn){ //需要一个成功时的回调 var doneCallback; //一个实例的方法,用来注册异步事件 this.then = function ...
- POJ 2912 Rochambeau(种类并查集+枚举)
题目链接:http://poj.org/problem?id=2912 题目大意:n个人玩,玩石头剪刀布游戏,其中1人是裁判,剩下的n-1个人分为3组, 他们商量好了,相同组的人每次都出相同的手势,不 ...
- yum 安装 jdk
https://www.cnblogs.com/kevingrace/p/5870814.html yum -y list java* 以yum库中java-1.7.0为例注:“*”表示将java-1 ...
- APP线上问题收集信息整理
常话说“软件是不能保证百分百没有bug的”,因此当我们的APP上线之后,市场的使用人员会反馈一些我们测试人员可能在测试时遗漏的问题,包括也不防会有一些需求的反馈,这些问题均由售后人员反馈整理,以一种方 ...
- java和js生成二维码
1. java生成二维码 1.1 依赖jar包配置(使用maven依赖) <dependency> <groupId>com.google.zxing</groupId& ...