2.1通过TFTP下载文件
$ setenv ethaddr 00:0c:29:d3:56:9c
$ setenv serverip 192.168.168.5
$ setenv ipaddr 192.168.168.22
$ tftp 32000000 zImage
把 zImage下载内存 3200000处,内存是从“30000000”地址处开始的,这里可以把内核下载到 32000000 处,或 31000000处,这是自已定义的。
2.2通过串口下载文件
$ loads [ off ]
通过串口,下载S-Rec文件到off位置
loads命令可以通过串口线下载S-Record格式文件。
$ loadb
loadb [ off ] [ baud ]
通过串口,以baud速率,下载binary到off位置(即:kermit protocol)
loadb命令可以通过串口线下载二进制格式文件。
$ loady
loady [load address] [baud rate]
支持Ymodem协议
2.3内存操作
2.3.1显示内存内容
md 显示内存区的内容
md 采用十六进制和 ASCII 码两种形式来显示存储单元的内容。这条命令还可以采用长度标识符 .I .W 和.b:
md[.b, .w, .I]address
md.w 100000 以字形式显示内存10000地址处的内容
00100000: 2705 1956 5050 4342 6f6f 7420 312e 312e
00100010: 3520 284d 6172 2032 3120 3230 3032 202d
2.3.2修改内存内容
mm 修改内存,地址自动递增。
mm [.b, .w, .I]address
mm 提供了一种互动修改存储器内容的方法。它会显示地址和当前值,让后提示用户输入。
如果你输入了一个合法的十六进制数,这个新的值将会被写入该地址。让后提示下一个地址。
如果你没有输入任何值,只是按了一下回车,那么该地址的内容保持不变。如果想结束输入,
则输入空格让后回车。
=> mm 100000
00100000: 27051956 ? 0
00100004: 50504342 ? AABBCCDD
?前面为内存中的现有内容,?后面为要修改成的内容。
若接下去不再修改时,就在“?”处“空格+回车”。即退出了 “mm”。
2.4 Flash操作
2.4.1 flinfo 查看 FLASH 盲区信息
Flash 的大小是“2MB”。型号是: SST SST39VF1601.
磁盘的扇区一般都是固定大小为 512 字节,而 flash 的扇区大小可以不相同(有的是固定
大小)。这是硬件决定的而非软件可更改。上面“uniform sector size”表示这块 flash 的扇区是固定大小的。
32 Sectors : 32 个区域。可以数下面的区域为 32 个。下面是每个“sectors”的起始地
址。用相邻区域起始地址相减就是一个扇区的大小 ,可以发现 32 个扇区的大小是一样的。
2.4.2 protect Flash 写保护
protect off all 关闭所有扇区的写保护
protect on all 打开所有的扇区写保护
protect off start end 关闭从start 到end扇区的写保护(start为要关闭的第1个扇区的起始地址, end为要关闭的最后一个扇区的结束地址)
protect on start end 打开从start到end扇区的写保护
2.4.3 erase 擦除 flash 扇区
用法: erase start end
擦除从 start 到 end 扇区, start 为要擦除的第一个扇区的起始地址, end 为要擦除的最后一个扇区的结束地址(在使用 cp 命令向 Nor 型 Flash 写入数据之前必须先使用 erase 命令擦除 Flash,因为 nor flash 按字节写入时,无法写入 1,所以必须通过擦除来写入。
例: erase 30000 1effff
NOR flash 有一个硬件特性,就是无法以位或字节方式往里面写入“1”。在操作内存时,
对某一个字节或某一个位进行“1”的赋值是可以的,但 NOR Flash 不行。
擦除是把一个扇区全部写成“1”。之后就可以去写“0”。所以对 NOR Flash 进行操作赋
值时,就要先擦除再赋值。
2.4.4 cp数据拷贝
cp [.b, .w, .I] saddress daddress len
cp 提供了一种内存与内存,内存与 Flash 之间数据拷贝的方法
cp 可以在“flash”和“flash”之间, "flash”和“内存”等之间进行数据拷贝。
默认是以“.l” 32 位来拷贝的,即“cp.l” .“saddress”是数据原来的地址。“daddress”
是要把数据拷贝到的地址。“len”是要拷贝的数据的长度。
例:
cp.b 31000000 50000 d0000
将内存地址0x31000000处的数据(长度为0xd0000)拷贝到地址0x50000处(Flash中)
50000 计算知道是位于“flash”上的。所以这里是把内存中的数据往 flash 上去拷贝。这
里对 NOR 的操作还要先擦除一下。所以要擦除从 50000 处开始往后 d0000 大小的空间,
看这跨越了几个扇区,要把它们先擦除下。
cp.b 32000000 120000 c0000
将内存地址0x32000000处的数据(长度为0xc0000)拷贝到地址0x120000处(Flash中)
2.4.5 程序执行
go 执行内存中的二进制代码,一个简单的跳转到指定地址
go addr [arg …]
start application at address ‘addr’,padding ‘arg’ as arguments
go+程序所在的地址
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
这里 addr 有[]表示可以不需要。这是说 UBOOT 中有一个 bootm 启动的默认地址。若
是加上“addr”似乎和“go”命令一样,但“bootm”要求二进制代码有固定格式的文件头。
2.5 启动管理
2.5.1 查看board信息
bdinfo :显示开发板信息。
bdinfo 命令(简写为 bdi)将在终端显示诸如内存地址和大小,时钟频率, MAC 地址等信息。
这些信息在传递给 Linux 内核一些参数时可能会用到。
2.5.2设置启动
setenv bootcmd tftp 31000000 uImage ; bootm 31000000
tftp 31000000 uImage 。是指把 uImage 下载到 31000000 处。
bootm 31000000 .是指从 31000000 处启动。
两条命令间用“空格++;+空格”连接,多条命令也是如此。
查看nand flash分区
nand erase bootloader 擦除这个分区
nand write 30000000 bootloader 将内存30000000 这个地址处的内容烧写到后面的 bootloader 分区
tftp 30000000 uImage 将内核下载到这个30000000地址
nand erase kernel 先擦除这个会存放内核的空间
nand write.jffs2 30000000 kernel 再30000000处的内核烧写到内核空间地址处。
write.jffs2后面有jffs2是指nand的特性可能会有位反转的错误,这是烧写时的校验的功能。
tftp 30000000 fs_qtopia.yaffs2
nand erase root
nand write.yaffs 30000000 0x00260000 $(filesize)
或者tftp 30000000 fs_qtopia.jffs2
nand erase root
nand write.jffs2 30000000 0x00260000
(
f
i
l
e
s
i
z
e
)
/
/
这
里
没
有
使
用
r
o
o
t
(
表
示
这
么
大
的
空
间
)
,
是
因
为
可
能
t
f
t
p
30000000
f
s
q
t
o
p
i
a
.
j
f
f
s
2
下
载
的
文
件
很
小
(
当
然
这
个
f
s
q
t
o
p
i
a
.
j
f
f
s
2
很
大
)
,
当
n
a
n
d
w
r
i
t
e
.
j
f
f
s
2
时
,
烧
写
那
么
大
时
,
r
o
o
t
文
件
系
统
就
被
破
坏
了
。
所
以
这
里
可
以
直
接
用
一
个
“
变
量
”
来
表
示
要
烧
写
的
大
小
。
后
面
“
(filesize) //这里没有使用root(表示这么大的空间),是因为可能 tftp 30000000 fs_qtopia.jffs2 下载的文件很小(当然这个 fs_qtopia.jffs2 很大),当 nand write.jffs2 时,烧写那么大时, root 文件系统就被破坏了。所以这里可以直接用一个“变量”来表示要烧写的大小。 后面“
(filesize)//这里没有使用root(表示这么大的空间),是因为可能tftp30000000fsqtopia.jffs2下载的文件很小(当然这个fsqtopia.jffs2很大),当nandwrite.jffs2时,烧写那么大时,root文件系统就被破坏了。所以这里可以直接用一个“变量”来表示要烧写的大小。后面“(filesize)”即是代表着刚才下载过的“fs_qtopia.jffs2”的大小。
nfs启动
用 nfs 下载文件系统到 NAND 上:
开发板上 uboot 中的配置:
set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.19:/work/nfs_root/tmp/fs_mini_mdev
ip=192.168.1.17:192.168.1.19:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
PC 端 nfs 服务配置:
nfsroot=[:][,]
ip=::::::
nfs 30000000 192.168.1.19:/work/nfs_root/tmp/fs.yaffs2 从虚拟机上下载文件系统。
nand erase root 擦除root分区。
nand write.yaffs 30000000 260000
(
f
i
l
e
s
i
z
e
)
将
30000000
处
的
内
容
烧
写
到
0
x
260000
地
址
处
,
大
小
为
“
(filesize) 将 30000000 处的内容烧写到 0x260000 地址处,大小为“
(filesize)将30000000处的内容烧写到0x260000地址处,大小为“(filesize)”
2.6 其他常用uboot命令
1、 bootm
bootm 命令可以引导启动存储在内存中的程序映像。这些内存包括 RAM 和可以永久保存的Flash。
第 1 个参数 addr 是程序映像的地址,这个程序映像必须转换成 U-Boot 的格式。
第 2 个参数对于引导 Linux 内核有用,通常作为 U-Boot 格式的 RAMDISK 映像存储地址;也可以是传递给 Linux 内核的参数(缺省情况下传递 bootargs 环境变量给内核)。
2、 bootp
bootp [loadAddress] [bootfilename]
bootp 命令通过 bootp 请求,要求 DHCP 服务器分配 IP 地址,然后通过 TFTP 协议下载指定的文件到内存。
第 1 个参数是下载文件存放的内存地址。
第 2 个参数是要下载的文件名称,这个文件应该在开发主机上准备好。
3、 cmp
cmp [.b, .w, .l] addr1 addr2 count
- compare memory
cmp 命令可以比较 2 块内存中的内容。 .b 以字节为单位; .w 以字为单位; .l 以长字为单位。注意: cmp.b 中间不能保留空格,需要连续敲入命令。
第 1 个参数 addr1 是第一块内存的起始地址。
第 2 个参数 addr2 是第二块内存的起始地址。
第 3 个参数 count 是要比较的数目,单位按照字节、字或者长字。
4、 crc32
crc32 address count [addr] - compute CRC32 checksum [save at addr]
crc32 命令可以计算存储数据的校验和。
第 1 个参数 address 是需要校验的数据起始地址。
第 2 个参数 count 是要校验的数据字节数。
第 3 个参数 addr 用来指定保存结果的地址。
5、 echo
echo [args…] - echo args to console; c suppresses newline
echo命令回显参数。
6、 minfo
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 个参数指定映像的起始地址。
可选的参数是指定更多的映像地址。
7、 loadb
loadb [ off ] [ baud ] - load binary file over serial line with offset ‘off’ and baudrate ‘baud’
loadb 命令可以通过串口线下载二进制格式文件。
8、 mw
mw [.b, .w, .l] address value [count] - write memory
mw 命令可以按照字节、字、长字写内存, .b .w .l 的用法与 cp 命令相同。
第 1 个参数 address 是要写的内存地址。
第 2 个参数 value 是要写的值。
第 3 个可选参数 count 是要写单位值的数目。
9、 nm
nm [.b, .w, .l] address - memory modify, read and keep address
nm 命令可以修改内存,可以按照字节、字、长字操作。
参数 address 是要读出并且修改的内存地址。
10、 printenv
printenv - print values of all environment variables
printenv name … - print value of environment variable ‘name’
printenv 命令打印环境变量。
可以打印全部环境变量,也可以只打印参数中列出的环境变量。
11、 rarpboot
rarpboot [loadAddress] [bootfilename]
rarboot 命令可以使用 TFTP 协议通过网络启动映像。也就是把指定的文件下载到指定地
址,然后执行。
第 1 个参数是映像文件下载到的内存地址。
第 2 个参数是要下载执行的映像文件。
12、 run
run var […] - run the commands in the environment variable(s) ‘var’
run 命令可以执行环境变量中的命令,后面参数可以跟几个环境变量名。
13、 setenv
setenv name value … - set environment variable ‘name’ to ‘value …’
setenv name - delete environment variable ‘name’
setenv 命令可以设置环境变量。
第 1 个参数是环境变量的名称。
第 2 个参数是要设置的值,如果没有第 2 个参数,表示删除这个环境变量。
14、 sleep
sleep N - delay execution for N seconds (N is decimal !!!)
sleep 命令可以延迟 N 秒钟执行, N 为十进制数。
15、 tftpboot
tftpboot [loadAddress] [bootfilename]
tftpboot 命令可以使用 TFTP 协议通过网络下载文件。按照二进制文件格式下载。另外使用
这个命令,必须配置好相关的环境变量。例如 serverip 和 ipaddr。
第 1 个参数 loadAddress 是下载到的内存地址。
第 2 个参数是要下载的文件名称,必须放在 TFTP 服务器相应的目录下。