u-boot环境变量的设置与使用


   本文转自 http://blogold.chinaunix.net/u3/94312/showart_1923637.html

   个人Notes:

 


  看到这个标题,可能觉得这个并没有什么的,其实不然,编好了 u-boot 了,但是如何来使用确不是那么简单的,想当初我将 uboot 制作出来后以为全部都搞定了,屁颠屁颠的烧到板子上后可系统就是起不来,为什么了,折腾了很久以后才发现是 u-boot 的环境变量设置错误,在后来的工作中,我发现 一些有一定经验 的人在这方面也是模模糊糊的扯不清,所以这里要讨论一下。

 

     u-boot 的环境变量 是使用 u-boot 的关键,它 可以 你自己定义的,但是其中有一些也是大家经常使用,约定熟成的,有一些是 u-boot 自己定义的,更改这些名字会出现错误,下面的表中我们列出了一些常用的环境变量:

 

环境变量

描述

bootdelay

   执行自动启动的等候秒数

baudrate

   串口控制台的波特率

netmask

   以太网接口的掩码

ethaddr

   以太网卡的网卡物理地址

bootfile

   缺省的下载文件

bootargs

   传递给内核的启动参数

bootcmd

   自动启动时执行的命令

serverip

   服务器端的 ip 地址

ipaddr

   本地 ip  地址

stdin

   标准输入设备

stdout

   标准输出设备

stderr

   标准出错设备

 

上面只是一些最基本的环境变量,请注意,板子里原本是没有环境变量的, u-boot 的缺省情况下会有一些基本的环境变量,在你执行了 saveenv 之后,环境变量会第一次保存到 flash 中,之后你对环境变量的修改 , 保存都是基于保存在 flash 中的环境变量的操作。

 

     U-boot 的环境变量值得注意的有 个:   bootcmd  bootargs

u        bootcmd

     前面有说过 bootcmd 是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置 bootcmd 为你经常使用的那种参数。

u        bootargs

     bootargs 是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着 bootargs 来设置的。 bootargs 的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全: http://blog.chinaunix.net/u2/79570/showart_1675071.html bootargs 非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置 bootargs, 而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了 bootargs 使用上的困难。

     下面介绍一下 bootargs 常用参数, bootargs 的种类非常的多,而且随着 kernel 的发展会出现一些新的参数,使得设置会更加灵活多样。

 

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

 

 

上面就是我们经常使用的几种 bootargs 的组合,老实说, bootargs 非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章