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,?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?<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 |
标准输出,一般是串口,也可是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,格式为:
第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,?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,?<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?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??<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]#?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,?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]#?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 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?Map?for?USB device 0?--?Partition?Type:?DOS
Partition?Start Sector Num Sectors Type ? ? 4 63 7935937 c [u-boot@MINI2440]#?usb?read?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.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 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]#?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) 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]#
|
四、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-boot的mkimage工具处理内核映像zImage? 因为在用bootm命令引导内核的时候,bootm需要读取一个64字节的文件头,来获取这个内核映象所针对的CPU体系结构、OS、加载到内存中的位置、在内存中入口点的位置以及映象名等等信息。这样bootm才能为OS设置好启动环境,并跳入内核映象的入口点。而mkimage就是添加这个文件头的专用工具。具体的实现请看U-boot中bootm的源码和mkimage的源码。
|
mkimage工具的使用:
参数说明: -A?指定CPU的体系结构,可用值有:alpha、arm 、x86、ia64、mips、mips64、ppc?、s390、sh、sparc?、sparc64、m68k等 -O?指定操作系统类型,可用值有:openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos -T?指定映象类型,可用值有:standalone、kernel、ramdisk、multi、firmware、script、filesystem -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 (略)
|