Chinaunix首页 | 论坛 | 博客
  • 博客访问: 891825
  • 博文数量: 132
  • 博客积分: 9976
  • 博客等级: 中将
  • 技术积分: 1781
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-30 20:40
文章分类

全部博文(132)

文章存档

2013年(1)

2011年(1)

2010年(15)

2009年(77)

2008年(36)

2007年(2)

我的朋友

分类: C/C++

2009-05-18 20:23:24

向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别的机器
usb
usb start:   起动usb 功能
usb info:   列出设备
usb scan:   扫描usb storage(u 盘)设备
kgo   起动没有压缩的linux内核
kgo 32000000
fatls 列出DOS FAT文件系统
fatls usb 0列出第一块U盘中的文件
fatload 读入FAT中的一个文件
fatload usb 0:0 32000000 u-boot.bin 把USB中的u-boot.bin 读到物理内存0x32000000处!
flinfo 列出flash的信息
nfs
nfs 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
0
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条 推荐 投诉

================================================================================
阅读(3802) | 评论(0) | 转发(0) |
0

上一篇:u-boot介绍

下一篇:我的u-boot 日志1

给主人留下些什么吧!~~