uboot 环境变量例子

环境变量
描述
bootdelay
  执行自动启动的等候秒数
baudrate
  串口控制台的波特率
netmask
  以太网接口的掩码
ethaddr
  以太网卡的网卡物理地址
bootfile
  缺省的下载文件
bootargs
  传递给内核的启动参数
bootcmd
  自动启动时执行的命令
serverip
  服务器端的ip地址
ipaddr
  本地ip 地址
stdin
  标准输入设备
stdout
  标准输出设备
stderr
  标准出错设备


NOR setup:

 

U-Boot > setenv serverip 10.xx.xx.yy
U-Boot > setenv fec_addr 00:xx:xx:00:xx:xx
U-Boot > setenv ethaddr 00:xx:xx:00:xx:xx
U-Boot > setenv bootfile 10.xx.xx.xx:uImage
if "setenv bootfile uImage", it will get from serverip
U-Boot > dhcp

U-Boot > sf probe 1
JEDEC ID: 0x1f:0x27:0x01
4096 KiB AT45DB321D - 4MB at 0:1 is now current device
U-Boot > sf erase 0x100000 0x280000
Erase is built in program
U-Boot > sf write ${loadaddr} 0x100000 0x280000
Writing SPI NOR flash 0x100000 [0x280000 bytes] <- ram 0x70800000
................................................................................
.......................SUCCESS

U-Boot > setenv bootcmd_nor 'run bootargs_base bootargs_nfs;sf probe 1;sf read ${loadaddr} 0x100000 0x280000;bootm'
U-Boot > setenv nfsroot /data/rootfs_home/rootfs
U-Boot > setenv bootcmd 'dhcp;run bootcmd_nor'
U-Boot > saveenv

=================================================================================================================

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操作系统就开始运行。

================================================================================================================

A. root
用来指定rootfs的位置,  常见的情况有:
    root=/dev/ram rw  
    root=/dev/ram0 rw
  请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。
 
    root=/dev/mtdx rw
    root=/dev/mtdblockx rw
    root=/dev/mtdblock/x rw
    root=31:0x
 
上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
 
    root=/dev/nfs
在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。
 
B. rootfstype
    这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.
 
C. console

console=tty<n> 使用虚拟串口终端设备 <n>.
console=ttyS<n>[,options] 使用特定的串口<n>,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶校验位,n是指的bits。
console=ttySAC<n>[,options] 同上面。

 

 

 

看你当前的环境,有时用ttyS<n>,有时用ttySAC<n>,网上有人说,这是跟内核的版本有关,2.4用ttyS<n>,2.6用ttySAC<n>,但实际情况是官方文档中也是使用ttyS<n>,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。 
 
D. mem
mem=xxM 指定内存的大小,不是必须的
 
E. ramdisk_size
ramdisk=xxxxx            不推荐   
ramdisk_size=xxxxx    推荐
上面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt找到相关的描述,不过ramdisk=xxxxx在新版的内核都已经没有提了,不推荐使用。
 
F. initrd, noinitrd
当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。
 
G. init
init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。
 
H. mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
 
mtdparts的格式如下:
mtdparts=<mtddef>[;<mtddef]
<mtddef> := <mtd-id>:<partdef>[,<partdef>]
 <partdef> := <size>[@offset][<name>][ro]
 <mtd-id> := unique id used in mapping driver/device
<size>     := standard linux memsize OR "-" to denote all remaining space
<name>     := (NAME)
因此你在使用的时候需要按照下面的格式来设置:
mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)
这里面有几个必须要注意的:
a. mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
b. size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。
举例:
假设flash 的mtd-id是sa1100,那么你可以使用下面的方式来设置:
mtdparts=sa1100:-      → 只有一个分区
mtdparts=sa1100:256k(ARMboot)ro,-(root) → 有两个分区
可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。
 
I. ip
指定系统启动之后网卡的ip地址,如果你使用基于nfs的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了。设置ip有两种方法:
 ip = ip addr
 ip=ip addr:server ip addr:gateway:netmask::which netcard:off
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
 
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
 
2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)
 
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
 
4). 假设文件系统是基于nfs的,bootargs的设置应该如下
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’
或者
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5

例子:

#printenv

bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 rootfstype=yaffs2 rw mem=64M

bootcmd=nand read 0x32000000 0x60000 0x300000; bootm 0x32000000
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=192.168.1.110
serverip=192.168.1.100
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
ethact=dm9000



你可能感兴趣的:(linux,image,测试,Flash,360,linux内核)