向Flash中烧写uboot和linux操作系统
================================================================================
from:
一、片内启动
1、用Xmodem协议,发送loader.bin和uboot.bin文件,此时uboot.bin被发送到系统的
SDRAM中,发送完后uboot开始运行,如果这时断电或退出,则一切将从头开始,因为SDRAM内存储的数据会在断电或退出后消失
2、擦除 Flash
在对Flash进行烧写之前,需要将其擦除:
Uboot>protect off all 去掉Flash的扇区写保护
Uboot>erase all 擦除Flash的所有扇区
(注:
如果只是要擦除某块区域的Flash,比如0x10000000到0x10060000之间的区域,则可用命令:
1)protect off 10000000
2)erase 10000000 1006ffff
如果是要对某块区域加上写保护,比如0x10000000到0x10060000之间的区域,则可用命令:
1)protect on 10000000 1006ffff
可用flinfo命令来查看那些区域是受保护的,那些区域不是受保护的。
3、烧写boot.bin到Flash
在Uboot提示符下键入命令:
Uboot>loadb 21000000
(下完之后会显示boot.bin的大小,然后在后面用命令cp.b烧写时将其后4位变成f,假如文件大小为5e33a,则在烧写时将其变为5ffff) 将文件发送到系统的SDRAM中然后在超级终端使用Kermit协议,发送文件boot.bin,发送完毕后,键入以下命令:
Uboot>cp.b 21000000 10000000 5ffff 将发送到SDRAM中的数据写入Flash
Uboot>protect on 10000000 10005ffff 对写入Flash的内容进行写保护
注:
此处还可以用tftp或bootp协议来完成,不过要先设置网络变量,即设置本机和目标机的IP地址,还有目标机的Mac地址。
网络环境变量:
Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000
ramdisk_size=15360
console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
tftp协议:
1)tftp 21000000 lb/boot.bin
2)cp.b 21000000 10000000 5ffff
3)protect on 10000000
bootp协议:
1)bootp 21000000 lb/boot.bin
2)cp.b 21000000 10000000 5ffff
3)protect on 10000000 10005fff
4、烧写 Uboot.gz 到 Flash
在Uboot提示符下键入命令:装入Uboot.gz6
Uboot>loadb 20000000 将文件发送到系统的SDRAM中.
然后在超级终端使用Kermit协议,发送文件Uboot.gz,发送完毕后,键入以下命令:
Uboot>cp.b 20000000 10010000 ffff 将发送到SDRAM中的数据写入Flash
Uboot>protect on 10000000 1001ffff 对写入Flash的内容进行写保护
(注:此处也可以用tftp或bootp协议)
二、片外启动
如何在uboot内运行自己的程序
1、手动运行(只是将程序下载到SDRAM中运行,仅做测试之用,断电或退出后就会消失)
1)loadb 20000000 下载用户程序(*.bin) <注:必须是.bin文件,可用arm-linux-
objcopy命令生成>
2)go 20000000 程序就会运行
2、自动运行(将程序写入Flash,uboot启动之后程序自动运行
1)设置环境变量
Uboot>setenv usr_prg cp.b 10300000 20000000 ffff(程序的大小)
Uboot>setenv run_prg go 20000000
Uboot>setenv bootcmd run usr_prg\;run run_prg
Uboot>saveenv
2)写入程序,即将其烧入Flash
protect off all
erase 10300000 103fffff
loadb 20000000 下载*.bin
cp.b 20000000 10300000 ffff(用户程序的大小)
3)reset之后程序就会自动运行"T1X$m
二、烧写linux程序开
1、下载linux到系统的SDRAM运行(仅做测试之用,断电或退出后就会消失)程
1)运行Uboot,设置环境变量
Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000
ramdisk_size=15360
console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
2)下载linux内核,文件系统
打开tftpserver应用程序,设置根目录路径,将内核、文件系统等拷贝到所设置的根目录下。
Uboot>tftp 21100000 ramdisk.gz 下载文件系统
Uboot>tftp 21000000 uImage 下载 linux 内核
Uboot>bootm 21000000 启动 linux
然后linux操作系统就开始运行。
2、烧写 Linux 到系统的 Flash 运行
1)设置运行Linux的环境变量
Uboot> setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000
ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv image cp.b 10020000 21000000 b0000 拷贝内核到sdram
Uboot>setenv ramdisk cp.b 100d0000 21100000 226000 拷贝文件系统到sdram
Uboot>setenv boot bootm 设置变量
Uboot>setenv bootcmd run ramdisk\;run image\;run boot 设置默认变量bootcmd
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr 目标板 ip 地址 目标板 ip 地址,由你自己决定
Uboot>setenv serverip 主机ip地址 主机ip地址,就是你的PC的ip程序开
Uboot>saveenv 保存环境变量
2)烧写Linux内核到Flash
Uboot>tftp 21100000 ramdisk.gz
Uboot>cp.b 21100000 100d0000 226000
Uboot>tftp 21000000 uImage
Uboot>cp.b 21000000 10020000 b0000
reset之linux操作系统就开始运行。
================================================================================
================================================================================
from:
u-boot命令介绍及烧写程序实例
bootdelay
|
定义执行自动启动的等候秒数
|
baudrate
|
定义串口控制台的波特率
|
netmask
|
定义以太网接口的掩码
|
ethaddr
|
定义以太网接口的MAC地址
|
bootfile
|
定义缺省的下载文件
|
bootargs
|
定义传递给Linux内核的命令行参数
|
bootcmd
|
定义自动启动时执行的几条命令
|
serverip
|
定义tftp服务器端的IP地址
|
ipaddr
|
定义本地的IP地址
|
stdin
|
定义标准输入设备,一般是串口
|
stdout
|
定义标准输出设备,一般是串口
|
stderr
|
定义标准出错信息输出设备,一般是串口
|
u-boot命令介绍及烧写程序实例zz
Printenv 打印环境变量。Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
Environment size: 80/8188 bytes
Setenv 设置新的变量Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes
Saveenv 保存变量命令将当前定义的所有的变量及其值存入flash中。用来存储变量及其值的空间只有8k字节,应不要超过。
Loadb 通过串口Kermit协议下载二进制数据。Tftp 通过网络下载程序,需要先设置好网络配置Uboot> setenv ipaddr 192.168.0.1
Uboot> setenv serverip 192.168.1.115 (tftp服务器的地址)
下载bin文件到地址0x20000000处。
Uboot> tftp 20000000 u-bo.bin (u-boot.bin应位于tftp服务程序的目录)
Uboot> tftp 32000000 vmlinux
把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。
Md 显示内存区的内容。Mm 修改内存,地址自动递增。Nm 修改内存,地址不自动递增。Mw 用模型填充内存mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
Cp 拷贝一块内存到另一块Cmp 比较两块内存区这些内存操作命令后都可加一个后缀表示操作数据的大小,比如cp.b表示按字节拷贝。
Protect 写保护操作protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)
protect off 1:0-3取消写保护
Erase 擦除扇区。erase: 删除FLASH的扇区
erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)
对DataFlash的操作
U-Boot在引导时如果发现NPCS0和NPCS3上连有DataFlash,就会分配虚拟的地址给它,具体为 :
0xC0000000---NPCS0
0xD0000000---NPCS3
run 执行设置好的脚本Uboot> setenv flashit tftp 20000000 mycode.bin\; erase 10020000 1002FFFF\;
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit
bootcmd 保留的环境变量,也是一种脚本如果定义了该变量,在autoboot模式下,将会执行该脚本的内容。
Go 执行内存中的二进制代码,一个简单的跳转到指定地址Bootm 执行内存中的二进制代码要求二进制代码为制定格式的。通常为mkimage处理过的二进制文件。
起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
Bootp 通过网络启动,需要提前设置好硬件地址。 ? 得到所有命令列表
help help usb, 列出USB功能的使用说明ping 注:只能开发板PING别的机器usbusb start: 起动usb 功能
usb info: 列出设备
usb scan: 扫描usb storage(u 盘)设备
kgo 起动没有压缩的linux内核kgo 32000000fatls 列出DOS FAT文件系统fatls usb 0列出第一块U盘中的文件fatload 读入FAT中的一个文件fatload usb 0:
0 32000000 u-boot.bin 把USB中的u-boot.bin 读到物理内存0x32000000处!
flinfo 列出flash的信息nfsnfs 32000000 192.168.0.115:u-boot.bin
把192.168.0.115(LINUX 的NFS文件系统)中的NFS文件系统中的u-boot.bin读入内存0x32000000处。
例:通过串口更新u-boot程序[
[email=u-boot@wpf]
u-boot@wpf[/email]
]# loadb
## Ready for binary (kermit) download to 0x33000000 at 115200 bps...
loadb这个指令以kermit协议从串口下载二进制文件到开发板的内存中,默认下载到0x33000000。当然你可以改在别的地址,例如:loadb 30000000
就是下载到0x30000000。这时候选择超级终端菜单上:传送〉发送文件,文件名选择编译好的U-Boot.bin,协议选择Kermit,点发送。可以看到发
送进度。
发送结束出现提示:
## Total Size = 0x0001d73c = 120636 Bytes
## Start Addr = 0x33000000
这时可以测试新的修改好不好使:
[
[email=u-boot@wpf]
u-boot@wpf[/email]
]# go 33000000
## Starting application at 0x33000000 ...
go指令可以直接执行内存地址上的程序,
然后烧写在NOR Flash中的U-boot。先看看NOR Flash的情况:
[
[email=u-boot@wpf]
u-boot@wpf[/email]
]# flinfo
Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)
Size: 1 MB in 19 Sectors
Sector Start Addresses:
00000000 (RO) 00004000 (RO) 00006000 (RO) 00008000 (RO) 00010000 (RO)
00020000 00030000 00040000 00050000 00060000
00070000 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 (RO)
一共有19个sector,其中前5个总计128kb的sector有U-Boot程序。要烧写首先要去掉写保护:
[
[email=u-boot@wpf]
u-boot@wpf[/email]
]# protect off 0 1ffff
[
[email=u-boot@wpf]
u-boot@wpf[/email]
]# flinfo
Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)
Size: 1 MB in 19 Sectors
Sector Start Addresses:
00000000 00004000 00006000 00008000 00010000
00020000 00030000 00040000 00050000 00060000
00070000 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 (RO)
可以看到写保护已经去掉,然后擦除:
[
[email=u-boot@wpf]
u-boot@wpf[/email]
]# erase 0 1ffff
Erasing sector 0 ... ok.
Erasing sector 1 ... ok.
Erasing sector 2 ... ok.
Erasing sector 3 ... ok.
Erasing sector 4 ... ok.
Erased 5 sectors
烧写:(33000000下载地址 0 Nor起始地址 1d73c 文件长度)
[
[email=u-boot@wpf]
u-boot@wpf[/email]
]# cp.b 33000000 0 1d73c
Copy to Flash... done
重启开发板,U-Boot的烧写就完成了。当然,一个更好的下载方法是利用tftp命令
http://hi.baidu.com/vcmfc_linux/blog/item/9d07dfef11001c36acafd5d0.html
================================================================================
================================================================================
from:
uboot 下载内核和文件系统的步骤
... aa9bdc8d1029ab.html
1)下载linux到系统的SDRAM运行(仅做测试之用,断电或退出后就会消失)
1>运行Uboot,设置环境变量
Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360
console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
2>下载linux内核,文件系统
打开tftpserver应用程序,设置根目录路径,将内核、文件系统等拷贝到所设置的根目录下。
Uboot>tftp 21100000 ramdisk.gz 下载文件系统
Uboot>tftp 21000000 uImage 下载 linux 内核
Uboot>bootm 21000000 启动 linux
然后linux操作系统就开始运行。
2)烧写 Linux 到系统的 Flash 运行
1>设置运行Linux的环境变量
Uboot> setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv image cp.b 10020000 21000000 b0000 拷贝内核到sdram
Uboot>setenv ramdisk cp.b 100d0000 21100000 226000 拷贝文件系统到sdram
Uboot>setenv boot bootm 设置变量boot
Uboot>setenv bootcmd run ramdisk\;run image\;run boot 设置默认变量bootcmd
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr 目标板 ip 地址 目标板 ip 地址,由你自己决定
Uboot>setenv serverip 主机ip地址 主机ip地址,就是你的PC的ip
Uboot>saveenv 保存环境变量
2>烧写Linux内核到Flash
Uboot>tftp 21100000 ramdisk.gz
Uboot>cp.b 21100000 100d0000 226000
Uboot>tftp 21000000 uImage
Uboot>cp.b 21000000 10020000 b0000
reset之linux操作系统就开始运行。
一、片内启动
1、用Xmodem协议,发送loader.bin和uboot.bin文件,此时uboot.bin被发送到系统的SDRAM中,发送完后uboot开始运行,如果这时断电或退出,则一切将从头开始,因为SDRAM内存储的数据会在断电或退出后消失。
2、擦除 Flash
在对Flash进行烧写之前,需要将其擦除:
Uboot>protect off all 去掉Flash的扇区写保护
Uboot>erase all 擦除Flash的所有扇区
(注:
如果只是要擦除某块区域的Flash,比如0x10000000到0x10060000之间的区域,则可用命令:
1)protect off 10000000 1006ffff
2)erase 10000000 1006ffff
如果是要对某块区域加上写保护,比如0x10000000到0x10060000之间的区域,则可用命令:
1)protect on 10000000 1006ffff
可用flinfo命令来查看那些区域是受保护的,那些区域不是受保护的。
)
3、烧写boot.bin到Flash
在Uboot提示符下键入命令:
Uboot>loadb 21000000 (下完之后会显示boot.bin的大小,然后在后面用命令cp.b烧写时将其后4位变成f,假如文件大小为5e33a,则在烧写时将其变为5ffff) 将文件发送到系统的SDRAM中
然后在超级终端使用Kermit协议,发送文件boot.bin,发送完毕后,键入以下命令:
Uboot>cp.b 21000000 10000000 5ffff 将发送到SDRAM中的数据写入Flash
Uboot>protect on 10000000 10005ffff 对写入Flash的内容进行写保护
(注:
此处还可以用tftp或bootp协议来完成,不过要先设置网络变量,即设置本机和目标机的IP地址,还有目标机的Mac地址。
网络环境变量:
Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360
console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
tftp协议:
1)tftp 21000000 lb/boot.bin
2)cp.b 21000000 10000000 5ffff
3)protect on 10000000 10005fff
bootp协议:
1)bootp 21000000 lb/boot.bin
2)cp.b 21000000 10000000 5ffff
3)protect on 10000000 10005fff
)
4、烧写 Uboot.gz 到 Flash
在Uboot提示符下键入命令:装入Uboot.gz
Uboot>loadb 20000000 将文件发送到系统的SDRAM中
然后在超级终端使用Kermit协议,发送文件Uboot.gz,发送完毕后,键入以下命令:
Uboot>cp.b 20000000 10010000 ffff 将发送到SDRAM中的数据写入Flash
Uboot>protect on 10000000 1001ffff 对写入Flash的内容进行写保护
(注:此处也可以用tftp或bootp协议)
二、片外启动
一)如何在uboot内运行自己的程序
1、手动运行(只是将程序下载到SDRAM中运行,仅做测试之用,断电或退出后就会消失)
1)loadb 20000000 下载用户程序(*.bin) <注:必须是.bin文件,可用arm-linux-objcopy命令生成>
2)go 20000000 程序就会运行
2、自动运行(将程序写入Flash,uboot启动之后程序自动运行)
1)设置环境变量
Uboot>setenv usr_prg cp.b 10300000 20000000 ffff(程序的大小)
Uboot>setenv run_prg go 20000000
Uboot>setenv bootcmd run usr_prg\;run run_prg
Uboot>saveenv
2)写入程序,即将其烧入Flash
protect off all
erase 10300000 103fffff
loadb 20000000 下载*.bin
cp.b 20000000 10300000 ffff(用户程序的大小)
3)reset之后程序就会自动运行
二、烧写linux
1、下载linux到系统的SDRAM运行(仅做测试之用,断电或退出后就会消失)
1)运行Uboot,设置环境变量
Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360
console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
2)下载linux内核,文件系统
打开tftpserver应用程序,设置根目录路径,将内核、文件系统等拷贝到所设置的根目录下。
Uboot>tftp 21100000 ramdisk.gz 下载文件系统
Uboot>tftp 21000000 uImage 下载 linux 内核
Uboot>bootm 21000000 启动 linux
然后linux操作系统就开始运行。
2、烧写 Linux 到系统的 Flash 运行
1)设置运行Linux的环境变量
Uboot> setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量
Uboot>setenv image cp.b 10020000 21000000 b0000 拷贝内核到sdram
Uboot>setenv ramdisk cp.b 100d0000 21100000 226000 拷贝文件系统到sdram
Uboot>setenv boot bootm 设置变量boot
Uboot>setenv bootcmd run ramdisk\;run image\;run boot 设置默认变量bootcmd
Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
Uboot>setenv ipaddr 目标板 ip 地址 目标板 ip 地址,由你自己决定
Uboot>setenv serverip 主机ip地址 主机ip地址,就是你的PC的ip
Uboot>saveenv 保存环境变量
2)烧写Linux内核到Flash
Uboot>tftp 21100000 ramdisk.gz
Uboot>cp.b 21100000 100d0000 226000
Uboot>tftp 21000000 uImage
Uboot>cp.b 21000000 10020000 b0000
reset之linux操作系统就开始运行。
================================================================================
================================================================================
from: http://blog.21ic.com/user1/5165/archives/2008/50377.html
u-boot命令解释lanxch 发表于 2008-9-4 13:42:00
U-Boot上电启动后,敲任意键能够退出自动启动状态,进入命令行。
U-Boot 1.1.2 (Apr 26 2005 - 12:27:13)
U-Boot code: 11080000 -> 1109614C BSS: -> 1109A91C
RAM Configuration:
Bank #0:
10000000 32 MB
Micron StrataFlash MT28F128J3 device initialized
Flash: 32 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
U-Boot>
在命令行提示符下,能够输入U-Boot的命令并执行。U-Boot能够支持几十个常用命令,通过这些命令,能够对研发板进行调试,能够引导Linux内核,还能够擦写Flash完成系统部署等功能。掌控这些命令的使用,才能够顺利地进行嵌入式系统的研发。
输入help命令,能够得到当前U-Boot的任何命令列表。每一条命令后面是简单的命令说明。
=> help
? - alias for 'help'
autoscr - run from memory
base - print or set address offset
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dhcp - invoke DHCP client to obtain IP/boot params
echo - echo args to console
erase - erase FLASH memory
flinfo - print FLASH memory information
go - start application at address 'addr'
help - print online help
iminfo - print header information for application image
imls - list all images found in flash
itest - return true/false on integer compare
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
printenv - print environment variables
protect - enable or disable FLASH write protection
rarpboot - boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
sleep - delay execution for some time
tftpboot - boot image via network using TFTP protocol
version - print monitor version
=>
U-Boot还提供了更加周详的命令帮助,通过help命令还能够查看每个命令的参数说明。由于研发过程的需要,有必要先把U-Boot命令的用法弄清楚。接下来,根据每一条命令的帮助信息,解释一下这些命令的功能和参数。
=> help bootm
bootm [addr [arg ...]]
- boot application image stored in memory
passing arguments 'arg ...'; when booting a Linux kernel,
'arg' can be the address of an initrd image
bootm命令能够引导启动存储在内存中的程式映像。这些内存包括RAM和能够永久保存的Flash。
第1个参数addr是程式映像的地址,这个程式映像必须转换成U-Boot的格式。
第2个参数对于引导Linux内核有用,通常作为U-Boot格式的RAMDISK映像存储地址;也能够是传递给Linux内核的参数(缺省情况下传递bootargs环境变量给内核)。
=> help bootp
bootp [loadAddress] [bootfilename]
bootp命令通过bootp请求,需要DHCP服务器分配IP地址,然后通过TFTP协议下载指定的文档到内存。
第1个参数是下载文档存放的内存地址。
第2个参数是要下载的文档名称,这个文档应该在研发主机上准备好。
=> help cmp
cmp [.b, .w, .l] addr1 addr2 count
- compare memory
cmp命令能够比较2块内存中的内容。.b以字节为单位;.w以字为单位;.l以长字为单位。注意:cmp.b中间不能保留空格,需要连续敲入命令。
第1个参数addr1是第一块内存的起始地址。
第2个参数addr2是第二块内存的起始地址。
第3个参数count是要比较的数目,单位按照字节、字或长字。
=> help cp
cp [.b, .w, .l] source target count
- copy memory
cp命令能够在内存中复制数据块,包括对Flash的读写操作。
第1个参数source是要复制的数据块起始地址。
第2个参数target是数据块要复制到的地址。这个地址假如在Flash中,那么会直接调用写Flash的函数操作。所以U-Boot写Flash就使用这个命令,当然需要先把对应Flash区域擦干净。
第3个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。
=> help crc32
crc32 address count [addr]
- compute CRC32 checksum [save at addr]
crc32命令能够计算存储数据的校验和。
第1个参数address是需要校验的数据起始地址。
第2个参数count是要校验的数据字节数。
第3个参数addr用来指定保存结果的地址。
=> help echo
echo [args..]
- echo args to console; \c suppresses newline
echo命令回显参数。
=> help erase
erase start end
- erase FLASH from addr 'start' to addr 'end'
erase N:SF[-SL]
- erase sectors SF-SL in FLASH bank # N
erase bank N
- erase FLASH bank # N
erase all
- erase all FLASH banks
erase命令能够擦Flash。
参数必须指定Flash擦除的范围。
按照起始地址和结束地址,start必须是擦除块的起始地址;end必须是擦除末尾块的结束地址。这种方式最常用。举例说明:擦除0x20000 – 0x3ffff区域命令为erase 20000 3ffff。
按照组和扇区,N表示Flash的组号,SF表示擦除起始扇区号,SL表示擦除结束扇区号。另外,还能够擦除整个组,擦除组号为N的整个Flash组。擦除全部Flash只要给出一个all的参数即可。
=> help flinfo
flinfo
- print information for all FLASH memory banks
flinfo N
- print information for FLASH memory bank # N
flinfo命令打印全部Flash组的信息,也能够只打印其中某个组。一般嵌入式系统的Flash只有一个组。
=> help go
go addr [arg ...]
- start application at address 'addr'
passing 'arg' as arguments
go命令能够执行应用程式。
第1个参数是要执行程式的入口地址。
第2个可选参数是传递给程式的参数,能够不用。
=> help iminfo
iminfo addr [addr ...]
- print header information for application image starting at
address 'addr' in memory; this includes verification of the
image contents (magic number, header and payload checksums)
iminfo能够打印程式映像的开头信息,包含了映像内容的校验(序列号、头和校验和)。
第1个参数指定映像的起始地址。
可选的参数是指定更多的映像地址。
=> help loadb
loadb [ off ] [ baud ]
- load binary file over serial line with offset 'off' and baudrate 'baud'
loadb命令能够通过串口线下载二进制格式文档。
=> help loads
loads [ off ]
- load S-Record file over serial line with offset 'off'
loads命令能够通过串口线下载S-Record格式文档。
=> help mw
mw [.b, .w, .l] address value [count]
- write memory
mw命令能够按照字节、字、长字写内存,.b .w .l的用法和cp命令相同。
第1个参数address是要写的内存地址。
第2个参数value是要写的值。
第3个可选参数count是要写单位值的数目。
=> help nfs
nfs [loadAddress] [host ip addr:bootfilename]
nfs命令能够使用NFS网络协议通过网络启动映像。
=> help nm
nm [.b, .w, .l] address
- memory modify, read and keep address
nm命令能够修改内存,能够按照字节、字、长字操作。
参数address是要读出并且修改的内存地址。
=> help printenv
printenv
- print values of all environment variables
printenv name ...
- print value of environment variable 'name'
printenv命令打印环境变量。
能够打印全部环境变量,也能够只打印参数中列出的环境变量。
=> help protect
protect on start end
- protect Flash from addr 'start' to addr 'end'
protect on N:SF[-SL]
- protect sectors SF-SL in Flash bank # N
protect on bank N
- protect Flash bank # N
protect on all
- protect all Flash banks
protect off start end
- make Flash from addr 'start' to addr 'end' writable
protect off N:SF[-SL]
- make sectors SF-SL writable in Flash bank # N
protect off bank N
- make Flash bank # N writable
protect off all
- make all Flash banks writable
protect命令是对Flash写保护的操作,能够使能和解除写保护。
第1个参数on代表使能写保护;off代表解除写保护。
第2、3参数是指定Flash写保护操作范围,跟擦除的方式相同。
=> help rarpboot
rarpboot [loadAddress] [bootfilename]
rarboot命令能够使用TFTP协议通过网络启动映像。也就是把指定的文档下载到指定地址,然后执行。
第1个参数是映像文档下载到的内存地址。
第2个参数是要下载执行的映像文档。
=> help run
run var [...]
- run the commands in the environment variable(s) 'var'
run命令能够执行环境变量中的命令,后面参数能够跟几个环境变量名。
=> help setenv
setenv name value ...
- set environment variable 'name' to 'value ...'
setenv name
- delete environment variable 'name'
setenv命令能够配置环境变量。
第1个参数是环境变量的名称。
第2个参数是要配置的值,假如没有第2个参数,表示删除这个环境变量。
=> help sleep
sleep N
- delay execution for N seconds (N is _decimal_ !!!)
sleep命令能够延迟N秒钟执行,N为十进制数。
=> help tftpboot
tftpboot [loadAddress] [bootfilename]
tftpboot命令能够使用TFTP协议通过网络下载文档。按照二进制文档格式下载。另外使用这个命令,必须配置好相关的环境变量。例如serverip和ipaddr。
第1个参数loadAddress是下载到的内存地址。
第2个参数是要下载的文档名称,必须放在TFTP服务器相应的目录下。
这
些U-Boot命令为嵌入式系统提供了丰富的研发和调试功能。在Linux内核启动和调试过程中,都能够用到U-Boot的命令。但是一般情况下,无需使
用全部命令。比如已支持以太网接口,能够通过tftpboot命令来下载文档,那么更有必要使用串口下载的loadb吗?反过来,假如研发板需要特别的调
试功能,也能够添加新的命令。
在建立交叉研发环境和调试Linux内核等章节时,在ARM平台上移植了U-Boot,并且提供了具体U-Boot的操作步骤。
================================================================================
================================================================================
from: http://www.linuxexpress.net.cn/news/dev/2008-06-06/1601.html
UBOOT中NAND操作
时间:2008-06-06 10:53:54 来源: 作者:
(1) 从串口下载到SDRAM的0x20000000处
(2) 从1M处开始擦写Nand Flash,擦写2M大小的空间(3) 将SDRAM中的0x20000000处开始的内容,烧写到Nand Flash的0x100000处开始的2M空间内
(4) 将Nand Flash的0x100000处开始的2M空间内容,拷贝到SDRAM中0x20000000处开始的地方
Nand flash芯片工作
------------------------------------
Nand flash芯片型号为Samsung K9F1208U0B,数据容量为64MB,采用块页式存储管理。8个I/O
引脚充当数据、地址、的复用端口。
芯片内部存储布局及存储操作特点:
一片Nand flash为一个设备(device), 其数据存储分层为:
1 (Device) = 4096 (Blocks)
1 (Block)-= 32 (Pages/Rows) 页与行是相同的意思,叫法不一样
1 (Page) = 528 (Bytes) = 数据块大小(512Bytes) + OOB 块大小(16Bytes)
在每一页中,最后16个字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余512个字节又
分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位通过
Nand Flash内置的指针指向各自的首地址。
存储操作特点:
1. 擦除操作的最小单位是块。
2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).
3. OOB部分的第六字节(即517字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。
4. 除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码
------------------------------------
下面对nand flash的初始化代码nand_init()进行分析:
1.
如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)没定义(CFG_NAND_LEGACY)
则start_armboot()调用driver/nand/nand.c中的nand_init(),否则如果定义(CONFIG_COMMANDS
&
CFG_CMD_NAND)并且有定义了CFG_NAND_LEGACY,则调用自己定义的nand_init()。在我当前的情景中是使用
driver/nand/nand.c中的nand_init()。
2.nand_init()调用本文件中的nand_init_chip()对nand进行初始化。
3.nand_init_chip()首先调用board_nand_init()。
4.board_nand_init()是需要自己添加的函数,这个函数的主要功能是对struct nand_chip结构体的函数指针赋值,让它们指向自己为nand驱动编写的一些函数,对未赋值的指针,uboot会在后面为其赋上通用nand驱动函数指针。
5.nand_init_chip()接着调用nand_scan().
6.nand_scan()定义在drivers/nand/nand_base.c文件中。它首先对struct nand_chip结构体中在board_nand_init()函数中未赋值的指针赋上通用nand驱动函数指针。
7.
通用nand驱动函数nand_select_chip()赋值给struct
nand_chip结构体的函数指针用于打开或关闭nand芯片,0为打开,1为关闭。在这个函数中会调用nand_chip结构体中的
hwcontrol函数指针,这个指针指向的函数是需要自己编写的。这个函数指针在board_nand_init()函数中被赋值。主要作用是向
nand flash发送一些nand flash开启与关闭命令。
8.nand_scan()剩余部分初始化nand_chip和mtd_info结构体。
9.nand_scan()最后在返回时调用drivers/nand/nand_bbt.c文件中的nand_default_bbt()。
10.nand_default_bby()选择一个坏块描述表,返回时调用本文件中的nand_scan_bbt()。
11.nand_scan_bbt()寻找建立一个坏块描述表。
12.最后返回到nand_init(),这样nand驱动的初始化完成了。
下面对命令nand read addr ofs size的执行流程进行分析:
1.nand read addr ofs size命令的作用是从nand flash地址的偏移量ofs处读取长度为size字节的数据存储到内存地址addr处。
2.common/main.c文件中的main_loop()主要执行read_line()读取命令行。
3.read_line()读取到命令行后会调用common/main.c文件中的run_command()。
4.run_command()
调用common/command.c文件中的find_cmd()在.u_boot_cmd段中寻找该命令的cmd_tbl_t结构,找到后返回该结
构。该命令的结构是通过定义在include/command.h中的宏定义U_BOOT_CMD登记进.u_boot_cmd段中的。
5.run_command()找到该命令的cmd_tbl_t结构后则执行该命令对应的函数。对于本情景是nand命令对应的函数do_nand()。
6.do_nand()
有两个版本,一个是定义了CFG_NAND_LEGACY。另一个是未定义CFG_NAND_LEGACY。这两个版本都定义在
common/cmd_nand.c文件中。对于本情景使用未定义CFG_NAND_LEGACY的do_nand()函数。要使用do_nand()还
必须定义宏CONFIG_COMMANDS&CFG_CMD_NAND。(若未定义CFG_NAND_LEGACY则在这个情景中的
do_nand()函数调用的函数都定义在drivers/nand_legacy/nand_legacy.c文件中)。
7.对于我们的情景do_nand()会调用定义在include/nand.h文件中的nand_read()。
8.nand_read()则调用本nand芯片对应的nand_info_t结构的read指针。而read指针在nand_scan()中被指向了同文件(drivers/nand/nand_base.c)中的nand_read()函数。
9.nand_read()函数最终会调用nand_chip结构中的cmdfunc指针,通过这个指针指向的函数向nand flash芯片发送命令。最终完成整个命令的执行。
================================================================================
================================================================================
from: http://blog.chinaunix.net/u2/75270/showart_1836713.html
u-boot,linux2.6.27.9 for mini2440移植镜像使用方法
日前,我在网上公布了我为mini2440移植的u-boot2008.10及linux2.6.27.9。有很多朋友向我要镜像文件以方便使用。故在此放出下载地址。 u-boot+linux2.6.27.9 kernel的镜像
配套的根文件系统镜象
注:建议用纳米网盘提供的纳米机器人下载,http方式好象下载不了。
我对nand flash的空间划分如下。其中0x40000~0x50000的空间没有使用。作为保留空间。 uboot : 0x00000000 0x00030000 0 param : 0x00030000 0x000040000 0
kernel : 0x00050000 0x00200000 0 root : 0x00250000 0x03dac000 0
用mini2440的vivi将u-boot.bin烧入上述的uboot空间。方法在mini2440的说明书上有说明。我就不重复了。
烧入镜像后,记住将mini2440的启动开关拔到nand
flash上,这样,才能从我的u-boot上启动。第一次启动时,会报param
crc错误,这是因为参数区内还没有数据所致。当你保存过参数后,此错误不会再报。将bootcmd的参数改变成从nand
flash引导kernel。方法是在u-boot提示符下输入: set bootcmd 'nand read 0x31000000
0x50000 0x00200000;bootm 0x31000000' 再改变bootargs,使得从nand flash启动根文件系统。方法是在u-boot提示符下输入:set bootargs 'noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0' 为了能正常使用tftp下载,应设置serverip为tftp服务器的IP地址。例如,输入set serverip '192.168.1.80',最后输入saveenv保存参数。
打开TFTP服务器。在u-boot下输入tftp 0x30000000
uImage,稍等,即可成功下载uImage到内存中了。再输入nand erase 0x50000
0x200000删除掉kernel空间原有的数据。再输入nand write 0x30000000 0x50000
0x200000,将内存中的kernel烧入nand flash。接下来,输入tftp 30000000
rat_root,将根文件系统镜象下载到内存中,再输入nand erase 0x250000
0x3dac000将root空间内原有数据删除。再输入nand write.yaffs 0x30000000 0x250000
0x101f730,其中0x101f730是root镜象的size,一定不能写错,它可以tftp下载完毕后看到。如写错了,可能会形成假坏块。然
后,就是等待。等烧写完成后,重启开发板就可以正常引导到新版的内核中了。我移植的内核使用mdev来生成设备文件,而原配的文件系统不支持mdev,所
以我的内核只能配合我的root。
|
|
发表于: 2009-02-20,修改于: 2009-02-23 22:25 已浏览995次,有评论0条
推荐
投诉 |
================================================================================