常用的命令笔记1

一.  用户系统相关命令
            Linux 是一个多用户的操作系统,每个用户又可以属于不同的用户组,下面,首先来熟悉一下Linux 中的用户切换和用户管理的相关命令。

 

           1.用户切换(su)
          (1)作用
变更为其它使用者的身份,主要用于将普通用户身份转变为超级用户,而且需输入相应用户密码。
           (2)格式
su [选项] [使用者]
其中的使用者为要变更的对应使用者。
          (3)常见参数
-,-l,–login 为该使用者重新登录,大部分环境变量(如HOME、SHELL和USER等)和录都是以该使用者(USER)为主。若没有指定USER,缺省情况是root
-m,-p  执行su时不改变环境变量
-c,–command  变更账号为USER的使用者,并执行指令(command)后再变回原来使用者

         (4)使用示例
 
[sunq@www sunq]$ su – root
Password: 
[root@www root]#  
 示例通过su命令将普通用户变更为 root用户,并使用选项“-”携带root环境变量。
         (5)使用说明 
          在将普通用户变更为 root用户时建议使用”-”选项,这样可以将root的环境变量和工作目录同时带入,否则在以后的使用中可能会由于环境变量的原因而出错。在转变为root权限后,提示符变为#。
 

          2.用户管理(useradd和passwd)
 
           Linux中常见用户管理命令:

useradd                 添加用户账号                                                            useradd [选项]  用户名
usermod               设置用户账号属性                                                     usermod [选项]  属性值
userdel                  删除对应用户账号                                                     userdel [选项]  用户名
groupadd              添加组账号                                                                 groupadd [选项]  组账号
groupmod            设置组账号属性                                                          groupmod [选项]  属性值
groupdel               删除对应组账号                                                          groupdel [选项]  组账号
passwd                 设置账号密码                                                              passwd [对应账号]
id                            显示用户ID、组 ID和用户所属的组列表                id [用户名]
groups                   显示用户所属的组                                                     groups [组账号]
who                        显示登录到系统的所有用户                                      who

            (1)作用
①  useradd:添加用户账号。
②  passwd:更改对应用户账号密码。
            (2)格式
①  useradd:useradd [选项]  用户名。
②  passwd:passwd [选项] [用户名]。
其中的用户名为修改账号密码的用户, 若不带用户名,缺省为更改当前使用者账号密码。  
           (3)常用参数
-g  指定用户所属的群组
-m  自动建立用户的登入目录
-n  取消建立以用户名称为名的群组

②  passwd:一般很少使用选项参数。
           (4)使用实例
 
[root@www root]# useradd yul
[root@www root]# passwd yul
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully
[root@www root]# su – yul
[yul@www yul]$
[yul@www yul]$ pwd(查看当前目录)
/home/yul
 
实例中先添加了用户名为yul的用户,接着又为该用户设置了账号密码。并从 su的命令可以看出,该用户添加成功,其工作目录为”/home/yul” 。

       (5)使用说明 
        在使用添加用户时,这两个命令是一起使用的,其中,useradd 必须用 root 的权限。而且useradd指令所建立的账号,实际上是保存在“/etc/passwd”文本文件中,文件中每一行包含一个账号信息。  在缺省情况下,useradd所做的初始化操作包括在“/home”目录下为对应账号建立一个名为同名的主目录,并且还为该用户单独建立一个与用户名同名的组。  adduser 只是 useradd的符号链接(关于符号链接的概念在本节后面会有介绍),两者是相同的。 passwd还可用于普通用户修改账号密码, Linux并不采用类似windows的密码回显 (显示为*号) ,所以输入的这些字符用户是看不见的。密码最好包括字母、数字和特殊符号,并且设成6 位以上。

          3.系统管理命令(ps和kill)
          Linux 中常见的系统管理命令如 ps和 kill为例进行讲解。

命 令                        命 令 含 义                                                                                    格     式
ps                            显示当前系统中由该用户运行的进程列表                                   ps [选项]
top                            动态显示系统中运行的程序(一般为每隔5s)                           top
kill                            输出特定的信号给指定PID(进程号)的进程                             kill [选项]  进程号(PID)

uname                  显示系统的信息(可加选项-a)                                                      uname [选项]
setup                     系统图形化界面配置                                                                         setup
crontab                  循环执行例行性命令                                                                        crontab [选项]
shutdown             关闭或重启Linux系统                                                                       shutdown [选项
uptime                  显示系统已经运行了多长时间                                                         uptime
clear                      清除屏幕上的信息                                                                             clear

            (1)作用
①  ps:显示当前系统中由该用户运行的进程列表。
②  kill:输出特定的信号给指定 PID(进程号)的进程,并根据该信号而完成指定的行为。其中可能的信号有进程挂起、进程等待、进程终止等。
           (2)格式
①  ps:ps [选项]。
②  kill:kill [选项]  进程号(PID)。
        kill 命令中的进程号为信号输出的指定进程的进程号,当选项是缺省时为输出终止信号给该进程。
           (3)常见参数

         选     项                                                                 参 数 含 义
          -ef                            查看所有进程及其PID(进程号)、系统时间、命令详细目录、执行者等
          -aux                         除可显示-ef所有内容外,还可显示CPU及内存占用率、进程状态 
          -w                            显示加宽并且可以显示较多的信息

②  kill主要选项参数

                   选     项                         参 数 含 义
                    -s                        根据指定信号发送给进程
                    -p                        打印出进程号(PID),但并不送出信号
                     -l                        列出所有可用的信号名称

         4.磁盘相关命令(fdisk)
        Linux 中与磁盘相关的命令如表2.7 所示,本书仅以 fdisk为例进行讲解。 
        Linux常见系统管理命令
            选  项                 参 数 含 义                                                      格     式
            free                    查看当前系统内存的使用情况                        free [选项]
            df                        查看文件系统的磁盘空间占用情况               df [选项]
            du                      统计目录(或文件)所占磁盘空间的大小    du [选项]
           fdisk                   查看硬盘分区情况及对硬盘进行分区管理    fdisk [-l]
 
          (1)作用
          fdisk可以查看硬盘分区情况,并可对硬盘进行分区管理,这里主要向读者介绍查看硬盘分区情况,另外,fdisk也是一个非常好的硬盘分区工具,感兴趣的读者可以另外查找资料学习使用fdisk进行硬盘分区。
         (2)格式
fdisk [-l]

         (3)使用说明
         使用fdisk必须拥有root权限。IDE 硬盘对应的设备名称分别为 hda、hdb、hdc和hdd,SCSI硬盘对应的设备名称则为sda、sdb、…此外,hda1代表hda的第一个硬盘分区,hda2代表hda的第二个分区,依此类推。通过查看/var/log/messages文件,可以找到 Linux 系统已辨认出来的设备代号。

                 选                    项  参 数 含 义
                 -a                    依照/etc/fstab的内容装载所有相关的硬盘
                  -l                    列出当前已挂载的设备、文件系统名称和挂载点
                  -t                    类型
         将后面的设备以指定类型的文件格式装载到挂载点上。常见的类型有前面介绍过的几种:vfat、ext3、ext2、iso9660、nfs等
-f   通常用于除错。它会使mount不执行实际挂上的动作,而是模拟整个挂上的过程,通常会和-v一起使用
 
           (4)使用实例
           使用mount命令主要通过以下几个步骤。
① 确认是否为Linux可以识别的文件系统,Linux 可识别的文件系统只要是以下几种。

·   Windows95/98常用的FAT32文件系统:vfat。
·   WinNT/2000的文件系统:ntfs。
·   OS/2 用的文件系统:hpfs。
·   Linux用的文件系统:ext2、ext3、nfs。
·   CD-ROM光盘用的文件系统:iso9660。
② 确定设备的名称,确定设备名称可通过使用命令“fdisk -l”查看。
③ 查找挂接点。 
        必须确定挂载点已经存在, 也就是在 “/mnt” 下的相应子目录已经存在, 一般建议在 “/mnt”下新建几个如 “/mnt/windows” , “/mnt/usb” 的子目录, 现在有些版本的 Linux (如红旗 Linux、中软Linux、MandrakeLinux)都可自动挂载文件系统,Red Hat仅可自动挂载光驱。

④ 挂载文件系统如下所示。
[root@sunq mnt]# mount -t vfat /dev/hda1 /mnt/c

⑤ 在使用完该设备文件后可使用命令 umount将其卸载。 
[root@sunq mnt]# umount /mnt/c

 
小知识
·  在Linux下如何使用U盘呢?
一般U盘为SCSI格式的硬盘,其格式为vfat格式,其设备号可通过“fdisk –l”进行查看,假若设备名为“/dev/sda1” ,则可用如下命令就可将其挂载:
mount -t vfat /dev/sda1 /mnt/u
·  若想设置在开机时自动挂载,可在文件“/etc/fstab”中加入相应的设置行即可。

 
          2.1.2  文件目录相关命令
由于 Linux 中有关文件目录的操作非常重要,也非常常用,因此在本节中,作者将基本所有的文件操作命令都进行了讲解。
         1.cd
         (1)作用
改变工作目录。
         (2)格式

cd [路径]
其中的路径为要改变的工作目录,可为相对路径或绝对路径。

         (3)使用说明
·  该命令将当前目录改变至指定路径的目录。若没有指定路径,则回到用户的主目录。为了改变到指定目录,用户必须拥有对指定目录的执行和读权限。
·  该命令可以使用通配符。
·  可使用“cd –”可以回到前次工作目录。
·  “./”代表当前目录, “../”代表上级目录。

 

          2.ls
         (1)作用
          列出目录的内容。
         (2)格式:ls [选项] [文件]
         其中文件选项为指定查看指定文件的相关内容,若未指定文件,默认查看当前目录下的所有文件。
         (3)常见参数

                         选     项                                                                           参 数 含 义
                         -1,–format=single-column                         一行输出一个文件(单列输出)
                         -a,-all                                                             列出目录中所有文件,包括以“.”开头的文件
                         -d                                                                      将目录名和其他文件一样列出,而不是列出目录的内容
                         -l,–format=long, 
                        –format=verbose                                           除每个文件名外,增加显示文件类型、权限、硬链接数、所有者名、组名、大小(Byte)及时间信息(如未指明是其他时间即指修改时间)
                         -f                                                                      不排序目录内容,按它们在磁盘上存储的顺序列出

         (4)使用说明 
          在ls的常见参数中,-l(长文件名显示格式)的选项是最为常见的。可以详细显示出各种信息。若想显示出所有“.”开头的文件,可以使用-a,这在嵌入式的开发中很常用。 

         3.mkdir
        (1)作用
创建一个目录。
        (2)格式
mkdir [选项]  路径
        (3)常见参数

选     项  参 数 含 义
                       -m                            对新建目录设置存取权限,也可以用chmod命令(在本节后会有详细说明)设置 
                       -p                              可以是一个路径名称。此时若此路径中的某些目录尚不存在,在加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录

         (4)使用实例
[root@www sunq]# mkdir -p ./hello/my
[root@www my]# pwd(查看当前目录命令)
/home/sunq/hello/my
 
该实例使用选项“-p”一次创建了./hello/my多级目录。
 
[root@www my]# mkdir -m 777 ./why
[root@www my]# ls -l
total 4
drwxrwxrwx    2 root     root         4096 Jan 14 09:24 why
 
          该实例使用改选项“-m”创建了相应权限的目录。对于“777”的权限在本节后面会有详细的说明。
        (5)使用说明 
          该命令要求创建目录的用户在创建路径的上级目录中具有写权限,并且路径名不能是当前目录中已有的目录或文件名称。

           4.cat
          (1)作用 连接并显示指定的一个和多个文件的有关信息。
           (2)格式
            cat[选项]文件1文件2… 其中的文件1、文件2为要显示的多个文件。
           (3)常见参数

                 选                     项  参 数 含 义
                -n                      由第一行开始对所有输出的行数编号
                -b                      和-n相似,只不过对于空白行不编号
 
            (4)使用实例
 
[yul@www yul]$ cat -n hello1.c hello2.c
     1  #include <stdio.h>
     2  void main()
     3  {
     4          printf("Hello!This is my home!\n");
     5  }
     6  #include <stdio.h>
     7  void main()
     8  {
     9          printf("Hello!This is your home!\n");
    10  }
 
在该实例中,指定对hello1.c和 hello2.c进行输出,并指定行号。

 

             5.cp、mv 和rm
            (1)作用
①  cp:将给出的文件或目录复制到另一文件或目录中。
②  mv:为文件或目录改名或将文件由一个目录移入另一个目录中。
③  rm:删除一个目录中的一个或多个文件或目录。
           (2)格式
①  cp:cp [选项]  源文件或目录 目标文件或目录。
②  mv:mv [选项]  源文件或目录 目标文件或目录。
③  rm:rm [选项]  文件或目录。
           (3)常见参数

            选                  项  参 数 含 义
            -a                  保留链接、文件属性,并复制其子目录,其作用等于dpr选项的组合

           -d                  拷贝时保留链接
            -f                  删除已经存在的目标文件而不提示
            -i                 在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,而且是交互式拷贝
            -p               此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中
            -r                若给出的源文件是一目录文件,此时 cp 将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名

              
                 -选     项                       参 数 含 义
                 -i                                  若 mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,并要求用户回答 y或n,这样可以避免误覆盖文件 
                 -f                                 禁止交互操作。在 mv 操作要覆盖某已有的目标文件时不给任何指示,在指定此选项后,i选项将不再起作用

               ③  rm主要选项参数

             选     项                                  参 数 含 义
             -i                                            进行交互式删除
             -f                                            忽略不存在的文件,但从不给出提示
             -r                                           指示rm将参数中列出的全部目录和子目录均递归地删除

 

          (4)使用实例
①  cp
 
[root@www hello]# cp -a ./my/why/ ./  
[root@www hello]# ls
my  why
 
该实例使用-a 选项将“/my/why”目录下的所有文件复制到当前目录下。而此时在原先目录下还有原有的文件。
②  mv
 
[root@www hello]# mv -i ./my/why/ ./
[root@www hello]# ls
my  why
 
该实例中把“/my/why”目录下的所有文件移至当前目录,则原目录下文件被自动删除。 
③  rm
 
[root@www hello]# rm –r -i ./why
rm: descend into directory './why'? y
rm: remove './why/my.c'? y

rm: remove directory './why'? y
 
            该实例使用“-r”选项删除“./why”目录下所有内容,系统会进行确认是否删除。
           (5)使用说明
①  cp:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
②  mv:
·          该命令根据命令中第二个参数类型的不同(是目标文件还是目标目录)来判断是重命名还是移动文件,当第二个参数类型是文件时,mv 命令完成文件重命名,此时,它将所给的源文件或目录重命名为给定的目标文件名;  当第二个参数是已存在的目录名称时,mv命令将各参数指定的源文件均移至目标目录中;   在跨文件系统移动文件时,mv先复制,再将原有文件删除,而链至该文件的链接也将丢失。
③  rm:
·  如果没有使用- r 选项,则rm不会删除目录;
·  使用该命令时一旦文件被删除,它是不能被恢复的,所以最好使用-i参数。

 

          6.chown和chgrp
         (1)作用
①  chown:修改文件所有者和组别。
②  chgrp:改变文件的组所有权。
          (2)格式
①  chown:chown [选项]…文件所有者[所有者组名] 文件
其中的文件所有者为修改后的文件所有者。
②  chgrp:chgrp [选项]… 文件所有组 文件
其中的文件所有组为改变后的文件组拥有者。
        (3)常见参数

                     选     项                                                    参 数 含 义
                  -c,-changes                     详尽地描述每个file实际改变了哪些所有权
                   -f,–silent,–quiet            不打印文件所有权就不能修改的报错信息

 

        (4)使用实例
在笔者的系统中一个文件的所有者原先是这样的。
 
[root@www sunq]# ls -l
-rwxr-xr-x   15 apectel  sunq         4096  6月  4  2005 uClinux-dist.tar 
 
         可以看出,这是一个文件,它的文件拥有者是apectel,具有可读写和执行的权限,它所属的用户组是sunq,具有可读和执行的权限,但没有可写的全权,同样,系统其他用户对其也只有可读和执行的权限。

首先使用chown将文件所有者改为 root。
 
[root@www sunq]# chown root uClinux-dist.tar
[root@www sunq]# ls –l
-rwxr-xr-x   15 root     sunq         4096  6月  4  2005 uClinux-dist.tar
 
可以看出,此时,该文件拥有者变为了root,它所属文件用户组不变。 接着使用chgrp将文件用户组变为 root。
 
[root@www sunq]# chgrp root uClinux-dist.tar
[root@www sunq]# ls –l
-rwxr-xr-x   15 root     root         4096  6月  4  2005 uClinux-dist.tar
 
         (5)使用说明
       ·  使用chown和chgrp必须拥有 root权限。

          7.chmod
          (1)作用
           改变文件的访问权限。
          (2)格式 
           chmod 可使用符号标记进行更改和八进制数指定更改两种方式,因此它的格式也有两种不同的形式。
① 符号标记:chmod [选项]…符号权限[符号权限]…文件
 其中的符号权限可以指定为多个,也就是说,可以指定多个用户级别的权限,但它们中
间要用逗号分开表示,若没有显示指出则表示不作更改。
② 八进制数:chmod [选项]  …八进制权限 文件… 其中的八进制权限是指要更改后的文件权限。
       (3)选项参数

                选     项                                 参 数 含 义
                -c                  若该文件权限确实已经更改,才显示其更改动作
                -f                   若该文件权限无法被更改也不要显示错误信息
                -v                  显示权限变更的详细资料
 
      (4)使用实例
            chmod涉及文件的访问权限,在此对相关的概念进行简单的回顾。 在1.3.1节中已经提到,文件的访问权限可表示成:-  rwx  rwx  rwx。在此设有三种不同的访问权限:读(r)、写(w)和运行(x)。三个不同的用户级别:文件拥有(u) 、所属的用户组(g)和系统里的其他用户(o) 。在此,可增加一个用户级别 a(all)来表示所有这
三个不同的用户级别。
① 对于第一种符号连接方式的 chmod命令中,用加号“+”代表增加权限,用减号“−”删除权限,等于号“=”设置权限。 例如原先笔者系统中有文uClinux20031103.tgz,其权限如下所示。
 
[root@www sunq]# ls –l
-rw-r–r–    1 root     root     79708616 Mar 24  2005 uClinux20031103.tgz
[root@www sunq]# chmod a+rx,u+w uClinux20031103.tgz
[root@www sunq]# ls –l
-rwxr-xr-x    1 root     root     79708616 Mar 24  2005 uClinux20031103.tgz
 
         可见,在执行了chmod之后,文件拥有者除拥有所有用户都有的可读和执行的权限外,还有可写的权限。
② 对于第二种八进制数指定的方式,将文件权限字符代表的有效位设为“1” ,即“rw-” 、“rw-”和“r–”的八进制表示为“110” 、 “110” 、 “100” ,把这个 2 进制串转换成对应的 8 进制数就是6、6、4,也就是说该文件的权限为 664(三位八进制数) 。这样对于转化后8 进制数、2进制及对应权限的关系。

 

 

这里是在网上看到一个网友写的命令,挺全,拿来留着:

 

U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,命令行模式模式下支持“Tab”键的命令补全和命令的历史记录功能。而且如果你输入的命令的前几个字符和别的命令不重复,那么你就只需要打这几个字符即可,比如我想看这个U-boot的版本号,命令就是“ version”,但是在所有的命令中没有其他任何一个的命令是由“v”开头的,所以只需要输入“v”即可。

[uboot@MINI2440]# version

UBoot 2009.11 ( 4月 04 2010  12:09:25)
[uboot@MINI2440]# v

UBoot 2009.11 ( 4月 04 2010  12:09:25)
[uboot@MINI2440]# base
Base Address: 0x00000000
[uboot@MINI2440]# ba
Base Address: 0x00000000

    由于U-boot支持的命令实在太多,一个一个细讲不现实,也没有必要。所以下面我挑一些烧写和引导常用命令介绍一下,其他的命令大家就举一反三,或者“help”吧!


(1)获取帮助

命令:help 或 ?

功能:查看当前U-boot版本中支持的所有命令。

[uboot@MINI2440]# help
?  alias for 'help'
askenv  get environment variables from stdin
base  print or set address offset
bdinfo  print Board Info structure
bmp  manipulate BMP image data
boot  boot default, i.e., run 'bootcmd'
bootd  boot default, i.e., run 'bootcmd'
bootelf  Boot from an ELF image in memory
bootm  boot application image from memory
bootp  boot image via network using BOOTP/TFTP protocol
bootvx  Boot vxWorks from an ELF image
cmp  memory compare
coninfo  print console devices and information
cp  memory copy
crc32  checksum calculation
date  get/set/reset date & time
dcache  enable or disable data cache
dhcp  boot image via network using DHCP/TFTP protocol
echo  echo args to console
editenv  edit environment variable
eeprom  EEPROM subsystem
erase  erase FLASH memory
exit  exit script
fatinfo  print information about filesystem
fatload  load binary file from a dos filesystem
fatls  list files in a directory (default /)
flinfo  print FLASH memory information
fsinfo  print information about filesystems
fsload  load binary file from a filesystem image
go  start application at address 'addr'
help  print online help
i2c  I2C subsystem
icache  enable or disable instruction cache
iminfo  print header information for application image
imls  list all images found in flash
imxtract extract a part of a multiimage
itest  return true/false on integer compare
loadb  load binary file over serial line (kermit mode)
loads  load SRecord file over serial line
loadx  load binary file over serial line (xmodem mode)
loady  load binary file over serial line (ymodem mode)
loop  infinite loop on address range
ls  list files in a directory (default /)
md  memory display
mm  memory modify (autoincrementing address)
mmc  MMC subsystem
mtest  simple RAM read/write test
mw  memory write (fill)
nand  NAND subsystem
nboot  boot from NAND device
nfs  boot image via network using NFS protocol
nm  memory modify (constant address)
ping  send ICMP ECHO_REQUEST to network host
printenv print environment variables
protect  enable or disable FLASH write protection
rarpboot boot image via network using RARP/TFTP protocol
reginfo  print register information
reset  Perform RESET of the CPU
run  run commands in an environment variable
saveenv  save environment variables to persistent storage
setenv  set environment variables
showvar  print local hushshell variables
sleep  delay execution for some time
source  run script from memory
test  minimal test like /bin/sh
tftpboot boot image via network using TFTP protocol
unzip  unzip a memory region
usb  USB subsystem
usbboot  boot from USB device
version  print monitor version



如果你想获取某条命令的更详细的帮助,可以使用:

help <你想要查的指令>
或者 ? <你想要查的指令> ,
甚至 h <你想要查的指令缩写>

以bmp指令为例:

[uboot@MINI2440]# help bmp
bmp  manipulate BMP image data

Usage:
bmp info <imageAddr>  display image info
bmp display <imageAddr> [x y]  display image at x,y
[uboot@MINI2440]# ? bmp
bmp  manipulate BMP image data

Usage:
bmp info <imageAddr>  display image info
bmp display <imageAddr> [x y]  display image at x,y
[uboot@MINI2440]# h bm
bmp  manipulate BMP image data

Usage:
bmp info <imageAddr>  display image info
bmp display <imageAddr> [x y]  display image at x,y


(2)环境变量(environment variables,简称ENV)与相关指令
和shell类似,U-Boot也有环境变量。一些U-boot默认的环境变量如下:




   

   

bootdelay 执行自动启动(bootcmd中的命令)的等候秒数
baudrate 串口控制台的波特率
netmask 以太网的网络掩码
ethaddr 以太网的MAC地址
bootfile 默认的下载文件名
bootargs 传递给Linux内核的启动参数
bootcmd 自动启动时执行命令
serverip TFTP服务器端的IP地址
ipaddr 本地的IP地址
stdin 标准输入设备,一般是串口
stdout 标准输出,一般是串口,也可是LCDVGA
stderr 标准出错,一般是串口,也可是LCDVGA




要看到你的板上的ENV值可使用printenv命令,例如我的板子:


  

[uboot@MINI2440]# printenv
bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs ip=192.168.0.2:192.168.0.1::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
bootcmd=nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm
bootdelay=1
baudrate=115200
ethaddr=08:08:11:18:12:27
ipaddr=192.168.0.2
serverip=192.168.0.1
gatewayip=192.168.0.1
netmask=255.255.255.0
tekkaman=bmp d 70000
stdin=serial
stdout=serial
stderr=serial
ethact=dm9000

Environment size: 470/131068 bytes



      你会发现有些有的ENV我没有,还有一个“tekkaman”的ENV。原因是如果你没有设置这个环境变量就不会打印出,你也可以自己定义ENV,并在命令中使用${ENV}来调用它。同时你也可以删除这个ENV。设置ENV的命令是setenv,格式为:

setenv name value

第1个参数是环境变量的名称。

第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量。

例如:我先将”tekkaman”参数删除,再设置,最后在一个命令串中调用。


[uboot@MINI2440]# printenv tekkaman
tekkaman=bmp d 70000
[uboot@MINI2440]# setenv tekkaman
[uboot@MINI2440]# printenv tekkaman
## Error: "tekkaman" not defined
[uboot@MINI2440]# setenv tekkaman echo "I am Tekkaman Ninja!"
[uboot@MINI2440]# printenv tekkaman
tekkaman=echo I am Tekkaman 
[uboot@MINI2440]# echo I Love Linux ;${tekkaman}
I Love Linux
I am Tekkaman 


当你设置了ENV,它只保存在内存中,如果你要它保存在存放ENV的固态存储器中,请使用:saveenv。



[uboot@MINI2440]# saveenv
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x6000000000002  0% complete.
Writing to Nand... done

如果在启动的时候会看到U-boot打印出:“
Warning – bad CRC, using default environment”,说明U-boot没有在存放ENV的固态存储器中找到有效的ENV,只好使用你在编译的时候定义的默认ENV。如果U-boot存放ENV的固态存储器的驱动是OK的,那么只要运行 saveenv就可以把默认ENV写入固态存储器,下次启动就不会有这个警告了。

       ENV可以放在许多固体存储器中,对于mini2440来说Nor Flash、Nand Flash或EEPROM都可以,就看你如何配置了(include/configs下的配置文件)。例如:

  
    Nor Flash


#define CONFIG_ENV_IS_IN_FLASH 1
#define CONFIG_ENV_OFFSET 0X40000
#define CONFIG_ENV_SIZE            0x20000    /* Total Size of Environment Sector */

Nand Flash: 

#define CONFIG_ENV_IS_IN_NAND 1
#define CONFIG_ENV_OFFSET 0X40000
#define CONFIG_ENV_SIZE            0x20000    /* Total Size of Environment Sector */

EEPROM:

#define CONFIG_ENV_IS_IN_EEPROM 1 /* use EEPROM for environment vars */
#define CONFIG_ENV_OFFSET 0x000 /* environment starts at offset 0 */
#define CONFIG_ENV_SIZE     0x400 /* 1KB */

CONFIG_ENV_OFFSET是在整个存储器中的偏移地址;
CONFIG_ENV_SIZE是指其使用的大小。

注意 CONFIG_ENV_OFFSET和 CONFIG_ENV_SIZE 的设置,不要覆盖了其他分区。
四、U-boot的使用(二)

命令:
loadb   – load binary file over serial line (kermit mode)
loadx   – load binary file over serial line (xmodem mode)
loady   – load binary file over serial line (ymodem mode)

 

功能:以不同的协议从串口获取文件.。
格式基本都为:
load? [ off ] [ baud ]
第1个参数是下载到SDRAM的地址,如果不填,就是用默认配置:CONFIG_SYS_LOAD_ADDR
第2个参数是波特率,一般不填,用默认的115200.

 

    在windows下的超级终端可以用这些协议发送文件,但是在ubuntu下基本只能用kermit协议。一下使用C-kermit来发送一个文件到mini2440。

[uboot@MINI2440]# loadb
## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

 

    上面已经启动了U-boot的kermit传输协议,这时按下 Ctrl + \ , 再按 c, 切换到C-kermit的命令行模式,输入命令:send  <文件路径>,回车。

[uboot@MINI2440]# loadb
## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

(Back at MAGILinux)

CKermit 8.0.211, 10 Apr 2004, for Linux
Copyright (C) 1985, 2004,
  Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/tekkaman/桌面/) CKermit>send/home/tekkaman/development/share/zImage.img

C-kermit就开始传送,并且显示一个传送界面,并动态显示传送进度。

CKermit 8.0.211, 10 Apr 2004, MAGILinux

   Current Directory: /home/tekkaman/&#65533;&#65533;~L&#65533;~]&#65533;
Communication Device: /dev/ttyUSB0
Communication Speed: 115200
              Parity: none
         RTT/Timeout: 01 / 02
             SENDING: /home/tekkaman/development/share/zImage.img => zImage.img
           File Type: BINARY
           File Size: 2277540
        Percent Done: 19 /-

                          ...10...20...30...40...50...60...70...80...90..100
Estimated Time Left: 00:03:35
  Transfer Rate, CPS: 8536
        Window Slots: 1 of 1
         Packet Type: D
        Packet Count: 557
       Packet Length: 1000
         Error Count: 0
          Last Error:
        Last Message:

X to cancel file, Z to cancel group, <CR> to resend last packet,
E to send Error packet, ^C to quit immediately, ^L to refresh screen.

传送完毕后,输入c ,回到U-boot的串口界面。

[uboot@MINI2440]# loadb
## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

(Back at MAGILinux)

CKermit 8.0.211, 10 Apr 2004, for Linux
Copyright (C) 1985, 2004,
  Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/tekkaman/桌面/) CKermit>send/home/tekkaman/development/share/zImage.img
(/home/tekkaman/桌面/) CKermit>c
Connecting to /dev/ttyUSB0, speed 115200
Escape character: Ctrl\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.

## Total Size = 0x0022c0a4 = 2277540 Bytes
## Start Addr = 0x30008000

(4)网络命令

 

    只要你的网卡驱动没问题,那么你就可以通过网络来传输文件到开发板,这可比串口快多了。你可以直接用交叉网线连接开发板和电脑,也可以用普通直连网线连接路由器,再连到电脑,不过记得配置好网络,关闭防火墙哦。
   先测试网络是否通了,现在开发板使用ping 命令,看看是否可以ping通电脑:

[uboot@MINI2440]# ping 192.168.1.100 
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
host 192.168.1.100 is alive

如果出现:

[uboot@MINI2440]# ping 192.168.1.100
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
ping failed; host 192.168.1.100 is not alive

这样无法ping通的事,可能是:

1、U-boot网卡驱动有问题

2、U-boot网络协议延时配置有问题

3、网络参数配置问题,比如IP等,Host和Target都有可能有问题。Host最好关闭IPv6。

实在找不到原因,用Wireshark抓包看看。

如果网络畅通,下面就可以使用下面的命令从tftp目录或者nfs目录下载文件到SDRAM了。

命令:

dhcp    – boot image via network using DHCP/TFTP protocol

rarpboot- boot image via network using RARP/TFTP protocol

nfs     – boot image via network using NFS protocol

tftpboot- boot image via network using TFTP protocol

bootp   – boot image via network using BOOTP/TFTP protocol

这几个命令的格式都是:<指令> [目的SDRAM地址] [[主机IP:]文件名]

注意:

要使用dhcp、rarpboot或 bootp 等功能要路由器或Host的支持。

如果没有输入[目的SDRAM地址],系统就是用编译时定义的CONFIG_SYS_LOAD_ADDR作为目的SDRAM地址

如果tftpboot和nfs命令没有定义[主机IP:],则使用ENV中的serverip

其它命令必需定义[主机IP:],否则会使用提供动态IP服务的主机IP作为[主机IP:]。

使用范例:

[uboot@MINI2440]# nfs 0x30008000192.168.1.100:/home/tekkaman/development/share/uboot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101
Filename '/home/tekkaman/development/share/u-boot.bin'.
Load address: 0x30008000
Loading: ###################################################
done
Bytes transferred = 256220 (3e8dc hex)
[uboot@MINI2440]# tftp uboot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'u-boot.bin'.
Load address: 0x30008000
Loading: T ##################
done
Bytes transferred = 256220 (3e8dc hex)
[uboot@MINI2440]# dhcp 192.168.1.100:uboot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
BOOTP broadcast 1
BOOTP broadcast 2
DHCP client bound to address 192.168.1.101
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'u-boot.bin'.
Load address: 0x30008000
Loading: ##################
done
Bytes transferred = 256220 (3e8dc hex)
[uboot@MINI2440]# bootp 192.168.1.100:uboot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
BOOTP broadcast 1
BOOTP broadcast 2
DHCP client bound to address 192.168.1.101
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'u-boot.bin'.
Load address: 0x30008000
Loading: ##################
done
Bytes transferred = 256220 (3e8dc hex)
[uboot@MINI2440]# rarpboot 192.168.1.100:uboot.bin

我的路由器没有开rarp协议,所以rarpboot 无法使用,要使用dhcp或 bootp 也是要路由或Host支持的。 

(5)Nand Flash操作指令

常用的Nand Flash指令如下:

指令

功能

nand info 显示可使用的Nand Flash
nand device [dev] 显示或设定当前使用的Nand Flash
nand read
addr off
size
Nand Flash读取命令,从Nand off 偏移地址处读取size 字节的数据到SDRAM addr地址。
nand write
addr off
size
Nand Flash烧写命令,将SDRAM addr地址处的size 字节的数据烧写到Nand off 偏移地址。
nand write[.yaffs[1]]
addr off size
烧写yaffs 映像专用的命令,.yaffs1 for 512+16 NAND
nand erase [clean] [off size] Nand Flash檫除命令,擦除Nand Flash off 偏移地址处的size 字节的数据
nand bad 显示Nand Flash的坏块
nand dump[.oob] off 显示Nand Flash中的数据(16进制)
nand scrub 彻底擦除整块Nand Flash中的数据,包括OOB。可以擦除软件坏块标志。
nand markbad off 标示 Nand off 偏移地址处的块为坏块


使用范例:

  

[uboot@MINI2440]# nand info

Device 0: NAND 128MiB 3,3V 8bit, sector size 128 KiB
[uboot@MINI2440]# nand device 0
Device 0: NAND 128MiB 3,3V 8bit... is now current device
[uboot@MINI2440]# nand read 0x30008000 0x60000 200000

NAND read: device 0 offset 0x60000, size 0x200000
2097152 bytes read: OK
[uboot@MINI2440]# nand bad

Device 0 bad blocks:
  030a0000
  030c0000
  030e0000
  07ee0000
[uboot@MINI2440]# nand markbad 0x500000
block 0x00500000 successfully marked as bad
[uboot@MINI2440]# nand bad 

Device 0 bad blocks:
  00500000
  030a0000
  030c0000
  030e0000
  07ee0000
[uboot@MINI2440]# nand scrub

NAND scrub: device 0 whole chip
Warning: scrub option will erase all factory set bad 
         There is no reliable way to recover them.
         Use this command only for testing purposes if you
         are sure of what you are 

Really scrub this NAND flash? <y/N>
Erasing at 0x2f4000008000000  0% complete.
NAND 128MiB 3,3V 8bit: MTD Erase failure: 5

NAND 128MiB 3,3V 8bit: MTD Erase failure: 5

NAND 128MiB 3,3V 8bit: MTD Erase failure: 5
Erasing at 0x7ea000008000000  0% complete.
NAND 128MiB 3,3V 8bit: MTD Erase failure: 5
Erasing at 0x7fe000008000000  0% complete.
OK
[uboot@MINI2440]# nand bad

Device 0 bad blocks:
  030a0000
  030c0000
  030e0000
  07ee0000
[uboot@MINI2440]# nand dump 0x8000
Page 00008000 dump:
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
         ()
OOB:
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
[uboot@MINI2440]# tftp uboot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'u-boot.bin'.
Load address: 0x30008000
Loading: T ##################
done
Bytes transferred = 256220 (3e8dc hex)
[uboot@MINI2440]# nand write 0x30008000 0 40000

NAND write: device 0 offset 0x0, size 0x40000
Writing at 0x2000000020000  100% is complete. 262144 bytes written: OK
[uboot@MINI2440]# nand dump 0x8000
Page 00008000 dump:
    00 00 53 e1 01 00 00 2a 15 40 e0 e3 19 00 00 ea
         ()
    60 30 97 e5 03 00 54 e1 f6 ff ff ba 00 40 a0 e3
OOB:
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff
    65 a9 6b f3 ff 33 fc 30
    f3 33 cf 33 0f f0 ff 00
    cc 0f 59 55 57 96 a5 5b

    nboot 指令也是一条Nand Flash 读取指令,它是将Nand Flash 的 offset 偏移地址的内核映像读取到SDRAM的loadAddr位置。它会自动读取到内核映像(使用mkimage处理过的)的结束,所以不用给出读取大小。

格式:nboot  loadAddr  dev  offset

使用范例:

[uboot@MINI2440]# tftp 192.168.1.100:zImage.img
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'zImage.img'.
Load address: 0x30008000
Loading: T #################################################################
     #################################################################
     ##########################
done
Bytes transferred = 2277540 (22c0a4 hex)
[uboot@MINI2440]# nand erase 0x100000 300000

NAND erase: device 0 offset 0x100000, size 0x300000
Erasing at 0x3e000001800000  0% complete.
OK
[uboot@MINI2440]# nand write 0x30008000 0x100000 300000

NAND write: device 0 offset 0x100000, size 0x300000
Writing at 0x3e000000020000  100% is complete. 3145728 bytes written: OK
[uboot@MINI2440]# nand device 0
Device 0: NAND 128MiB 3,3V 8bit... is now current device
[uboot@MINI2440]# nboot 30008000 0 0x100000

Loading from NAND 128MiB 3,3V 8bit, offset 0x100000
   Image Name: tekkaman
   Created: 20100329 12:59:51 UTC
   Image Type: ARM Linux Kernel Image (uncompressed)
   Data Size: 2277476 Bytes = 2.2 MB
   Load Address: 30008000
   Entry Point: 30008040

[uboot@MINI2440]# bootm 30008000
## Booting kernel from Legacy Image at 30008000 ...
   Image Name: tekkaman
   Created: 20100329 12:59:51 UTC
   Image Type: ARM Linux Kernel Image (uncompressed)
   Data Size: 2277476 Bytes = 2.2 MB
   Load Address: 30008000
   Entry Point: 30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
Linux version 2.6.33.(tekkaman@MAGILinux) (gcc version 4.3.2(crosstoolNG1.6.1tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440
(略)

四、U-boot的使用(三)

(6) 内存/寄存器操作指令

nm      修改内存值 (指定地址)    
格式: nm [.b, .w, .l] address


mm     修改内存值(地址自动加一)
格式:  mm [.b, .w, .l] address


md       显示内存值
格式:  md [.b, .w, .l] address [# of objects]


mw     用指定的数据填充内存
格式:  mw [.b, .w, .l] address value [count]


cp      内存的拷贝(包括内存与Nor Flash间的数据拷贝)
格式:cp [.b, .w, .l] source target count

上面是查看和修改内存值的指令,可以查看和修改SDRAM和寄存器值。
[.b, .w, .l]代表了查看和修改形式:bit、word、long
使用范例:

[uboot@MINI2440]# md.b 0x30008000 20
30008000: cc 33 fe 33 cc b3 4c 33 ac 33 de 33 5c 13 cc 33 .3.3..L3.3.3\..3
30008010: cc 32 cc 31 dc 33 cf 33 cc 33 4e 33 8f 13 cc 33 .2.1.3.3.3N3...3
[uboot@MINI2440]# md.w 0x30008000 20
30008000: 33cc 33fe b3cc 334c 33ac 33de 135c 33cc .3.3..L3.3.3\..3
30008010: 32cc 31cc 33dc 33cf 33cc 334e 138f 33cc .2.1.3.3.3N3...3
30008020: 338c 33cd 33cc 7bcc 3bcc 33cc 135e 734c .3.3.3.{.;.3^.Ls
30008030: 7bdc 37cc 31dc 33c4 038c 33e8 77cc 13cc .{.7.1.3...3.w..
[uboot@MINI2440]# md.l 0x30008000 20
30008000: 33fe33cc 334cb3cc 33de33ac 33cc135c .3.3..L3.3.3\..3
30008010: 31cc32cc 33cf33dc 334e33cc 33cc138f .2.1.3.3.3N3...3
30008020: 33cd338c 7bcc33cc 33cc3bcc 734c135e .3.3.3.{.;.3^.Ls
30008030: 37cc7bdc 33c431dc 33e8038c 13cc77cc .{.7.1.3...3.w..
30008040: 234c77ce 33dc339c 33ec3ece f3cc36ec .wL#.3.3.>.3.6..
30008050: 37dc33cc 73cc3f5c 17dd314c 33cc62e8 .3.7\?.sL1...b.3
30008060: b6cc33dc 33c233cc 33cc32cc 33cc3f68 .3...3.3.2.3h?.3
30008070: 73cc31cc b3cc33cc 33cc37c9 33df13cc .1.s.3...7.3...3
[uboot@MINI2440]# nm 0x30008000
30008000: 33fe33cc ? 12345678
30008000: 12345678 ? 34567890
30008000: 34567890 ? q
[uboot@MINI2440]# nm.b 0x30008000
30008000: 90 ? 11
30008000: 11 ? 12
30008000: 12 ? q
[uboot@MINI2440]# mm 0x30008000
30008000: 34567812 ? 54321123
30008004: 334cb3cc ? 12345678
30008008: 33de33ac ? 21234543
3000800c: 33cc135c ? q
[uboot@MINI2440]# md.b 0x30008000 20
30008000: 23 11 32 54 78 56 34 12 43 45 23 21 5c 13 cc 33 #.2TxV4.CE#!\..3
30008010: cc 32 cc 31 dc 33 cf 33 cc 33 4e 33 8f 13 cc 33 .2.1.3.3.3N3...3
[uboot@MINI2440]# mw.b 0x30008000 aa 10
[uboot@MINI2440]# mw.b 0x30008010 55 10
[uboot@MINI2440]# md.b 0x30008000 20
30008000: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................
30008010: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 UUUUUUUUUUUUUUUU
[uboot@MINI2440]# cp.b 0x30008000 0x30008010 10
[uboot@MINI2440]# md.b 0x30008000 20
30008000: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................
30008010: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................

你可以试着修改LED相连的GPIO寄存器的数据寄存器值,可以控制LED的点亮!
先熄灭后点亮LED1的范例:(这个实验要结合芯片数据手册和mini2440的原理图来理解)

[uboot@MINI2440]# md 0x56000014 1
56000014: 00000600 ....
[uboot@MINI2440]# nm.w 0x56000014 
56000014: 0600 ? 620 (熄灭)
56000014: 0620 ? 600 (点亮)

(7) Nor Flash指令

Nor Flash 的命令经常用于烧写数据到Nor Flash 。

flinfo  打印Flash存储器的信息,并列出所有Sector。
flinfo  N 单独打Flash存储器N Block的信息。(在有多块Nor Flash时使用)

使用范例:

[uboot@MINI2440]# flinfo

Bank # 1: SST: 1x SST39VF1601 (2MB)
  Size: 2 MB in 32 Sectors
  Sector Start Addresses:
    00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
    00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
    000A0000 000B0000 000C0000 000D0000 000E0000
    000F0000 00100000 00110000 00120000 00130000
    00140000 00150000 00160000 00170000 00180000
    00190000 001A0000 001B0000 001C0000 001D0000
001E0000 001F0000
[uboot@MINI2440]# flinfo 1

Bank # 1: SST: 1x SST39VF1601 (2MB)
  Size: 2 MB in 32 Sectors
  Sector Start Addresses:
    00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
    00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
    000A0000 000B0000 000C0000 000D0000 000E0000
    000F0000 00100000 00110000 00120000 00130000
    00140000 00150000 00160000 00170000 00180000
    00190000 001A0000 001B0000 001C0000 001D0000
    001E0000 001F0000
[uboot@MINI2440]# flinfo 2
Only FLASH Banks # 1 ... # 1 supported

后面带有(RO)的说明这个Sector已经写保护了。

因为Nor Flash的读取接口和SDRAM是一样的,所以Nor Flash的读取也是使用md命令。范例如下:

[uboot@MINI2440]# md.b 0x0 20
00000000: 12 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................
00000010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................
[uboot@MINI2440]# md 0x0 20
00000000: ea000012 e59ff014 e59ff014 e59ff014 ................
00000010: e59ff014 e59ff014 e59ff014 e59ff014 ................
00000020: 33f80260 33f802c0 33f80320 33f80380 `..3.....3...3
00000030: 33f803e0 33f80440 33f804a0 deadbeef ...3@..3...3....
00000040: 33f80000 33f80000 33fbe8dc 3400374c ...3...3...3L7.4
00000050: e10f0000 e3c0001f e38000d3 e129f000 ..............).
00000060: e3a00453 e3a01000 e5801000 e3e01000 S...............
00000070: e59f0488 e5801000 e59f1484 e59f0484 ................

    但由于Nor Flash的烧写时序和SDRAM的写入不同,烧写Nor  Flash 不能使用mm等命令,只能使用cp命令从内存拷贝到Nor Flash,而且
烧写之前必须解除保护并擦除!命令如下:

protect :对Flash 写保护的操作,可以使能和解除写保护。
格式:
protect on/off start end 
protect on/off start +end 
protect on/off N:SF[-SL] 
protect on/off bank N 
protect on/off all 

第1 个参数on 代表使能写保护;off 代表解除写保护。
第2 、3 参数是指定Flash 写保护操作范围

start end是照起始地址和结束地址定义范围,start是擦除块的起始地址;end 是擦除末尾块的结束地址。

例如:擦除Sector 2和Sector 3区域命令为erase 20000 3ffff 。 

start +end是照起始地址和操作字节数定义范围,这种方式最常用。start是擦除块的起始地址;end 是擦除的字节数。

例如:擦除Sector 2和Sector 3区域命令为erase 20000  +20000

N:SF[-SL]是按照组和扇区,N 表示Flash 的Block号,SF 表示擦除起始Sector号,SL 表示擦除结束Sector号。

例如:擦除Block1 的Sector 2和Sector 3区域命令为erase 1:2-3。

bank N是擦除整个Block,擦除Block号为N 的整个Flash。

all是擦除全部Flash。

注意:Nor Flash擦除的最小单位是Sector,也就是0x10000字节,如果你定义的大小不满1 Sector或超过Sector的边界,那么被定义到的Sector会被全部擦除。


erase  :擦除Flash的命令
格式:
erase start end 
erase start +end 
erase N:SF[-SL] 
erase bank N 
erase all 
参数是指定Flash 擦除操作范围,跟写保护的方式相同。

以下的范例将mini2440的Nor Flash的Sector 16写保护,再解除保护,擦除数据,最后将起始的20字节拷贝到Sector 16。

[uboot@MINI2440]# flinfo 1

Bank # 1: SST: 1x SST39VF1601 (2MB)
  Size: 2 MB in 32 Sectors
  Sector Start Addresses:
    00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
    00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
    000A0000 000B0000 000C0000 000D0000 000E0000
    000F0000 00100000 00110000 00120000 00130000
    00140000 00150000 00160000 00170000 00180000
    00190000 001A0000 001B0000 001C0000 001D0000
001E0000 001F0000
[uboot@MINI2440]# protect on 1:1616
Protect Flash Sectors 1616 in Bank # 1
[uboot@MINI2440]# flinfo 1

Bank # 1: SST: 1x SST39VF1601 (2MB)
  Size: 2 MB in 32 Sectors
  Sector Start Addresses:
    00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
    00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
    000A0000 000B0000 000C0000 000D0000 000E0000
    000F0000 00100000 (RO) 00110000 00120000 00130000
    00140000 00150000 00160000 00170000 00180000
    00190000 001A0000 001B0000 001C0000 001D0000
    001E0000 001F0000
[uboot@MINI2440]# protect off 0x100000 0x10ffff
UnProtect Flash Sectors 1616 in Bank # 1
[uboot@MINI2440]# flinfo 1

Bank # 1: SST: 1x SST39VF1601 (2MB)
  Size: 2 MB in 32 Sectors
  Sector Start Addresses:
    00000000 (RO) 00010000 (RO) 00020000 (RO) 00030000 (RO) 00040000
    00050000 00060000 (RO) 00070000 (RO) 00080000 00090000
    000A0000 000B0000 000C0000 000D0000 000E0000
    000F0000 00100000 00110000 00120000 00130000
    00140000 00150000 00160000 00170000 00180000
    00190000 001A0000 001B0000 001C0000 001D0000
    001E0000 001F0000
[uboot@MINI2440]# erase 0x100000 +20
Erasing sector 16 ... ok.
Erased 1 sectors
[uboot@MINI2440]# cp.b 0x0 0x100000 0x20
Copy to Flash... done
[uboot@MINI2440]# md.b 100000 20
00100000: 12 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................
00100010: 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 ................

(8) USB 操作指令

指令

功能

usb reset 初始化USB控制器
usb stop [f] 关闭USB控制器
usb tree 已连接的USB设备树
usb info [dev] 显示USB设备[dev]的信息
usb storage 显示已连接的USB存储设备
usb dev [dev] 显示和设置当前USB存储设备
usb part [dev] 显示USB存储设备[dev]的分区信息
usb read addr blk# cnt 读取USB存储设备数据

在所有的命令使用前,必须先插入USB设备,然后使用:usb reset,以初始化USB控制器,获取设备信息。

我将一个4G的kingstonU盘(可引导盘)插入 mini2440,然后读取他的头512 字节(MBR): 

[uboot@MINI2440]# usb reset
(Re)start USB...
USB: scanning bus for devices... 2 USB Device(s) found
       scanning bus for storage devices... 1 Storage Device(s) found
[uboot@MINI2440]# usb tree

Device Tree:
  1 Hub (12 Mb/s, 0mA)
  | OHCI Root Hub
  |
  +2 Mass Storage (12 Mb/s, 100mA)
       Kingston DT 101 II 0019E02CB6EB5B8B1B120051

[uboot@MINI2440]# usb info
1: Hub, USB Revision 1.10
 OHCI Root Hub
 Class: Hub
 PacketSize: 8 Configurations: 1
 Vendor: 0x0000 Product 0x0000 Version 0.0
   Configuration: 1
    Interfaces: 1 Self Powered 0mA
     Interface: 0
      Alternate Setting 0, Endpoints: 1
      Class Hub
      Endpoint 1 In Interrupt MaxPacket 2 Interval 255ms

2: Mass Storage, USB Revision 2.0
 Kingston DT 101 II 0019E02CB6EB5B8B1B120051
 Class: (from Interface) Mass Storage
 PacketSize: 64 Configurations: 1
 Vendor: 0x0951 Product 0x1613 Version 1.0
   Configuration: 1
    Interfaces: 1 Bus Powered 100mA
     Interface: 0
      Alternate Setting 0, Endpoints: 2
      Class Mass Storage, Transp. SCSI, Bulk only
      Endpoint 1 In Bulk MaxPacket 64
      Endpoint 2 Out Bulk MaxPacket 64

[uboot@MINI2440]# usb storage
  Device 0: Vendor: Kingston Rev: PMAP Prod: DT 101 II
            Type: Removable Hard Disk
            Capacity: 3875.0 MB = 3.7 GB (7936000 x 512)
[uboot@MINI2440]# usb dev 0

USB device 0:
    Device 0: Vendor: Kingston Rev: PMAP Prod: DT 101 II
            Type: Removable Hard Disk
            Capacity: 3875.0 MB = 3.7 GB (7936000 x 512)
... is now current device
[uboot@MINI2440]# usb part 0
print_part of 0

Partition Map for USB device 0  Partition Type: DOS

Partition Start Sector Num Sectors Type
    4 63 7935937 c
[uboot@MINI2440]# usb read 0x30008000 0 200

USB read: device 0 block # 0, count 512 ... .........................
512 blocks read: OK
[uboot@MINI2440]# md.b 0x30008000 200

30008000: fa 31 c0 8e d8 8e c0 8e d0 bc 00 7c fb fc 89 e6
.1………|….

30008010: bf 00 06 b9 00 01 f3 a5 ea dc 06 00 00 10 00 01
…………….

30008020: 00 00 7c 00 00 00 00 00 00 00 00 00 00 80 3f 00
..|………..?.

30008030: ff 00 ed 01 1e 0e 1f 3a 16 10 00 74 06 1f ea 36
…….:…t…6

30008040: e7 00 f0 3d fb 54 75 05 8c d8 fb eb 1d 80 fc 08
…=.Tu………

30008050: 75 1b e8 81 00 8a 36 13 00 fe ce 8b 0e 15 00 86
u…..6………

30008060: cd c0 e1 06 0a 0e 11 00 31 c0 f8 eb 65 80 fc 02
……..1…e…

30008070: 72 cb 80 fc 04 77 c6 60 80 cc 40 50 be 00 00 c7
r….w.`..@P….

30008080: 04 10 00 30 e4 89 44 02 89 5c 04 8c 44 06 66 31
…0..D..\..D.f1

30008090: c0 66 89 44 0c 88 f0 f6 26 11 00 88 cf 88 eb c0
.f.D….&…….

300080a0: ef 06 81 e1 3f 00 01 c8 48 89 c7 a1 13 00 f7 26
….?…H……&

300080b0: 11 00 f7 e3 01 f8 81 d2 00 00 89 44 08 89 54 0a
………..D..T.

300080c0: 58 30 c0 8a 16 10 00 e8 0c 00 88 26 03 00 61 a1
X0………&..a.

300080d0: 02 00 1f ca 02 00 9c ff 1e 22 00 c3 80 fa 8f 7f
………"……

300080e0: 04 88 16 2d 06 be 87 07 e8 8d 00 be be 07 31 c0
…-……….1.

300080f0: b9 04 00 f6 04 80 74 03 40 89 f5 81 c6 10 00 e2
……t.@…….

30008100: f2 48 74 02 cd 18 bf 05 00 be 1d 06 c7 44 02 01
.Ht……….D..

30008110: 00 66 8b 46 08 66 89 44 08 b8 00 42 8a 16 2d 06
.f.F.f.D…B..-.

30008120: cd 13 73 0d 4f 74 49 30 e4 8a 16 2d 06 cd 13 eb
..s.OtI0…-….

30008130: d8 a1 fe 7d 3d 55 aa 75 37 fa 66 a1 4c 00 66 a3
…}=U.u7.f.L.f.

30008140: 3f 06 be 13 04 8b 04 48 89 04 c1 e0 06 8e c0 31
?……H…….1

30008150: ff be 1d 06 b9 60 00 fc f3 a5 c7 06 4c 00 17 00
…..`……L…

30008160: a3 4e 00 fb 8a 16 2d 06 89 ee fa ea 00 7c 00 00
.N….-……|..

30008170: be aa 07 e8 02 00 eb fe ac 20 c0 74 09 b4 0e bb
……… .t….

30008180: 07 00 cd 10 eb f2 c3 53 74 61 72 74 20 62 6f 6f
…….Start boo

30008190: 74 69 6e 67 20 66 72 6f 6d 20 55 53 42 20 64 65
ting from USB de

300081a0: 76 69 63 65 2e 2e 2e 0d 0a 00 42 6f 6f 74 20 66
vice……Boot f

300081b0: 61 69 6c 65 64 00 00 00 ea eb d4 ca 00 00 00 00
ailed………..

300081c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
…………….

300081d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
…………….

300081e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01
…………….

300081f0: 01 00 0c fe 7f ec 3f 00 00 00 c1 17 79 00 55 aa
……?…..y.U.

(9) SD卡(MMC)指令

SD卡的使用命令比较简单,只有初始化和设备信息的显示,读写是通过文件系统命令实现的。
mmc init [dev] – 初始化MMC子系统
mmc device [dev] – 查看和设置当前设备
使用和USB类似,在所有的命令使用前,必须先插入SD卡,然后使用:mmc init,以初始化MMC 控制器,获取设备信息。
我在mini2440中插入1GB SD卡:

[uboot@MINI2440]# mmc init
mmc: Probing for SDHC ...
mmc: SD 2.or later card found
trying to detect SD Card...
Manufacturer: 0x00, OEM "roduct name: "
", revision 0.0

Serial number:
7864775

Manufacturing date: 11/2006
CRC:
0x4f, b0 = 1

READ_BL_LEN=6, C_SIZE_MULT=7, C_SIZE=4095
size = 0
SD Card detected RCA: 0x2 type: SD
mmc1 is available
[u-boot@MINI2440]# mmc device
mmc1 is current device

(10) FAT文件系统指令

fatinfo:显示文件系统的相关信息
格式:fatinfo <interface> <dev[:part]>
Interface:代表接口,如usb、mmc;
dev:代表设备编号,如0、1……;
part:代表存储设备中的分区,如1、2……。

fatload:从FAT32文件系统中读取二进制文件到SDRAM。
格式:fatload <interface> <dev[:part]>  <addr> <filename> [bytes]
Interface、dev和part同上;
addr:代表写入SDRAM的地址;
filename:代表存储设备中的文件名;
bytes:代表从存储设备中读取的文件大小,可不填;如果填的数据比文件小,就只读取bytes字节,如果填的数据比文件大,也只读取文件的大小。

fatls:列出FAT32文件系统中目录里的文件。
格式:fatls <interface> <dev[:part]> [directory]
Interface、dev和part同上;
directoryr:代表所要查看的目录,可不填,默认为/。

这些指令基本上要和U盘或者SD卡同时使用,主要用于读取这些移动存储器上的FAT32分区。
使用范例:

[uboot@MINI2440]# usb part 0
print_part of 0

Partition Map for USB device 0  Partition Type: DOS

Partition Start Sector Num Sectors Type
    4 63 7935937 c
[uboot@MINI2440]# fatinfo usb 0:4
Interface: USB
  Device 0: Vendor: Kingston Rev: PMAP Prod: DT 101 II
            Type: Removable Hard Disk
            Capacity: 3875.0 MB = 3.7 GB (7936000 x 512)
Partition 4: Filesystem: FAT32 "7600_16385_"
[uboot@MINI2440]# fatls usb 0:4
            boot/
            efi/
            sources/
            support/
            upgrade/
       43 autorun.inf
   383562 bootmgr
   111880 setup.exe
   256220 uboot.bin

file(s), 5 dir(s)

[uboot@MINI2440]# fatls usb 0:/boot/
            ./
            ../
            fonts/
            zhcn/
   262144 bcd
  3170304 boot.sdi
     1024 bootfix.bin
    97280 bootsect.exe
     4096 etfsboot.com
   485440 memtest.exe

file(s), 4 dir(s)
[uboot@MINI2440]# fatload usb 0:4 0x30008000 uboot.bin
reading uboot.bin
........................

256220 bytes read
[uboot@MINI2440]# fatload usb 0:4 0x30008000 uboot.bin 200
reading uboot.bin

512 bytes read

(11) 系统引导指令

boot  和bootd  都是运行ENV”bootcmd”中指定的指令。

bootm 指令是专门用于启动在SDRAM中的用U-boot的mkimage工具处理过的内核映像。
格式:bootm [addr [arg …]]
addr 是内核映像所在的SDRAM中的地址
当启动的是Linux内核时,'arg' 可以使 initrd 的地址。

[uboot@MINI2440]# setenv bootcmd tftp\;bootm
[uboot@MINI2440]# saveenv
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x6000000000002  0% complete.
Writing to Nand... done
[uboot@MINI2440]# boot
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'zImage.img'.
Load address: 0x30008000
Loading: T #################################################################
     #################################################################
     ##########################
done
Bytes transferred = 2277540 (22c0a4 hex)
## Booting kernel from Legacy Image at 30008000 ...
   Image Name: tekkaman
   Created: 20100329 12:59:51 UTC
   Image Type: ARM Linux Kernel Image (uncompressed)
   Data Size: 2277476 Bytes = 2.2 MB
   Load Address: 30008000
   Entry Point: 30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
Linux version 2.6.33.(tekkaman@MAGILinux) (gcc version 4.3.2(crosstoolNG1.6.1tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440
(略)

UBoot 2009.11 ( 4月 04 2010  12:09:25)

modified by tekkamanninja (tekkamanninja@163.com)
Love Linux 

I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: 128 MiB
Video: 240x320x16 20kHz 62Hz
In: serial
Out: serial
Err: serial
Net: dm9000
UBoot 2009.11 ( 4月 04 2010  12:09:25)
modified by tekkamanninja
(tekkamanninja@163.com)
Love Linux 
Hit any key to stop autoboot: 0
[uboot@MINI2440]# bootd
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'zImage.img'.
Load address: 0x30008000
Loading: T #################################################################
     #################################################################
     ##########################
done
Bytes transferred = 2277540 (22c0a4 hex)
## Booting kernel from Legacy Image at 30008000 ...
   Image Name: tekkaman
   Created: 20100329 12:59:51 UTC
   Image Type: ARM Linux Kernel Image (uncompressed)
   Data Size: 2277476 Bytes = 2.2 MB
   Load Address: 30008000
   Entry Point: 30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK

Starting kernel ...
(略)


12)EEPROM 读写指令eeprom  – I2C 接口的EEPROM 读写指令

格式:

eeprom read  addr off cnt

eeprom write addr off cnt

第一个参数addr 是要写入或读出的数据在SDRAM中的存放地址;

第二个参数off 是在EEPROM中的偏移;

第三个参数cnt 是读写的数据字节数。

使用范例:

[uboot@MINI2440]# md.b 0x30008000 2
30008000: aa aa ..
[uboot@MINI2440]# eeprom read 0x30008000 10 2

EEPROM @0x50 read: addr 30008000 off 0010 count 2 ... done
[uboot@MINI2440]# md.b 0x30008000 2
30008000: ff ff ..
[uboot@MINI2440]# mm.b 0x30008000
30008000: ff ? aa
30008001: ff ? 55
30008002: aa ? q
[uboot@MINI2440]# md.b 0x30008000 2
30008000: aa 55 .U
[uboot@MINI2440]# eeprom write 0x30008000 10 2

EEPROM @0x50 write: addr 30008000 off 0010 count 2 ... done
[uboot@MINI2440]# eeprom read 0x30008010 10 2

EEPROM @0x50 read: addr 30008010 off 0010 count 2 ... done
[uboot@MINI2440]# md.b 0x30008010 2
30008010: aa 55 .U

(13)设置和读取RTC指令

date    – 设置和读取RTC
格式:
date [MMDDhhmm[[CC]YY][.ss]]
MM:月份
DD:日期
hh:小时
mm 分钟
CC:年份的前两个数字
YY:年份的后两个数字
ss:秒数
使用范例:

[uboot@MINI2440]# date
Date: 19800006 (Thursday) Time: 20:30:25
[uboot@MINI2440]# date 041100582010.20
Date: 20100411 (Sunday) Time: 0:58:20

(14)脚本运行指令

run var […]
var :ENV中的脚本名 
使用范例:

[uboot@MINI2440]# setenv a_run_test echo $bootfile \; version
[uboot@MINI2440]# run a_run_test
zImage.img

UBoot 2009.11 ( 4&aelig;&#339;&#710; 04 2010  12:09:25)

(15)系统重启指令

reset
– 
重启CPU

[uboot@MINI2440]# reset
resetting ...

UBoot 2009.11 ( 4&aelig;&#339;&#710; 04 2010  12:09:25)

modified by tekkamanninja (tekkamanninja@163.com)
Love Linux 

I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: 128 MiB
Video: 240x320x16 20kHz 62Hz
In: serial
Out: serial
Err: serial
Net: dm9000
UBoot 2009.11 ( 4&aelig;&#339;&#710; 04 2010  12:09:25)
modified by tekkamanninja
(tekkamanninja@163.com)
Love Linux 
Hit any key to stop autoboot: 0
[uboot@MINI2440]#

四、U-boot的使用(四)

下载与烧写

使用U-boot将映像文件烧写到板上的Flash,一般步骤是:
(1)通过网络、串口、U盘、SD卡等方式将文件传输到SDRAM;
(2)使用Nand Flash或Nor Flash相关的读写命令将SDRAM中的数据烧入Flash。

下面是烧写范例:
如果使用 SD卡和U盘形式更新U-boot,那么首先SD卡和U盘中必须有FAT32文件系统,并在里面存放了u-boot.bin 文件。
1) 通过SD卡烧入Nand Flash:

[u-boot@MINI2440]# mmc init
mmc: Probing for SDHC …
mmc: SD 2.0 or later card found
trying to detect SD Card…
Manufacturer:
0x00, OEM "roduct name:
"
", revision 0.0

Serial number:
7864775

Manufacturing date: 11/2006
CRC:
0x4f, b0 = 1

READ_BL_LEN=6, C_SIZE_MULT=7, C_SIZE=4095
size = 0
SD Card detected RCA: 0x2 type: SD
mmc1 is available
[u-boot@MINI2440]# fatload mmc 1 0x30008000 u-boot.bin
reading u-boot.bin

256220 bytes read
[u-boot@MINI2440]# nand erase 0 0x40000

NAND erase: device 0 offset 0x0, size 0x40000
Erasing at 0x2000000000004 —
0% complete.

OK
[u-boot@MINI2440]# nand write 0x30008000 0 0x40000

NAND write: device 0 offset 0x0, size 0x40000
Writing at 0x2000000020000 — 100% is complete. 262144 bytes written: OK


2) 通过U盘烧入Nor Flash:


[u-boot@MINI2440]# usb start
(Re)start USB…
USB:
scanning bus for devices… 2 USB Device(s) found


scanning bus for storage devices… 1 Storage Device(s) found

[u-boot@MINI2440]# usb storage

Device 0
: Vendor: Kingston Rev: PMAP Prod: DT 101 II


Type: Removable Hard Disk


Capacity: 3875.0 MB = 3.7 GB (7936000 x 512)

[u-boot@MINI2440]# usb part 0
print_part of 0

Partition Map for USB device 0

Partition Type: DOS


Partition
Start Sector
Num Sectors
Type



4

63

7935937
c

[u-boot@MINI2440]# fatload usb 0:4 0x30008000 u-boot.bin

reading u-boot.bin
……………………

256220 bytes read
[u-boot@MINI2440]# protect off all
Un-Protect Flash Bank # 1
[u-boot@MINI2440]# erase 0x0 0x3ffff
Erasing sector
0 … ok.

Erasing sector
1 … ok.

Erasing sector
2 … ok.

Erasing sector
3 … ok.

Erased 4 sectors
[u-boot@MINI2440]# cp.b 0x30008000 0x0
0x3ffff

Copy to Flash… done

3) 通过TFTP服务烧入Nand Flash:

[u-boot@MINI2440]# tftpboot 30008000 192.168.1.100:u-boot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'u-boot.bin'.
Load address: 0x30008000
Loading: T ##################
done
Bytes transferred = 256220 (3e8dc hex)
[u-boot@MINI2440]# nand erase 0 0x40000
NAND erase: device 0 offset 0x0, size 0x40000
Erasing at 0x2000000000004 —
0% complete.

OK
[u-boot@MINI2440]# nand write 0x30008000 0 0x40000

NAND write: device 0 offset 0x0, size 0x40000
Writing at 0x2000000020000 — 100% is complete. 262144 bytes written: OK

4) 通过NFS 服务烧入Nand Flash:

[u-boot@MINI2440]# nfs 30008000 192.168.1.100:/home/tekkaman/development/share/u-boot.bin
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101
Filename '/home/tekkaman/development/share/u-boot.bin'.
Load address: 0x30008000
Loading: ###################################################
done
Bytes transferred = 256220 (3e8dc hex)
[u-boot@MINI2440]# nand erase 0 0x40000
NAND erase: device 0 offset 0x0, size 0x40000
Erasing at 0x2000000000004 —
0% complete.

OK
[u-boot@MINI2440]# nand write 0x30008000 0 0x40000

NAND write: device 0 offset 0x0, size 0x40000
Writing at 0x2000000020000 — 100% is complete. 262144 bytes written: OK

内核引导

内核的引导步骤如下:
(1)用U-boot的mkimage工具处理内核映像zImage。
(2)通过网络、串口、U盘、SD卡等方式将处理过的内核映像传输到SDRAM的一定位置(一般使用0x30008000)
(3)然后使用”bootm"等内核引导命令来启动内核。

为什么要U-bootmkimage工具处理内核映像zImage
因为在用bootm命令引导内核的时候,bootm需要读取一个64字节的文件头,来获取这个内核映象所针对的CPU体系结构、OS、加载到内存中的位置、在内存中入口点的位置以及映象名等等信息。这样bootm才能为OS设置好启动环境,并跳入内核映象的入口点。而mkimage就是添加这个文件头的专用工具。具体的实现请看U-bootbootm的源码和mkimage的源码
mkimage工具的使用:

参数说明:
-A 指定CPU的体系结构,可用值有:alphaarm
x86ia64mipsmips64ppc s390shsparc sparc64m68k

-O 指定操作系统类型,可用值有:openbsdnetbsdfreebsd4_4bsdlinuxsvr4esixsolarisirixscodellncrlynxosvxworkspsosqnxu-bootrtemsartos
-T 指定映象类型,可用值有:standalonekernelramdiskmultifirmwarescriptfilesystem
-C 指定映象压缩方式,可用值有:
none
不压缩(一般使用这个,因为zImage是已经被bzip2压缩过的自解压内核

gzip gzip的压缩方式
bzip2 bzip2的压缩方式
-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e
指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n
指定映象名
-d 指定制作映象的源文件

以下是制作内核映像的命令示例:
mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img





以下是使用范例:
1) 通过SD卡引导内核:
首先SD卡中必须有FAT32文件系统,并在里面存放了处理过的内核映像文件。



[u-boot@MINI2440]# mmc init


mmc: Probing for SDHC …
mmc: SD 2.0 or later card found
trying to detect SD Card…
Manufacturer:
0x00, OEM "roduct name:
"
", revision 0.0

Serial number:
7864775

Manufacturing date: 11/2006
CRC:
0x4f, b0 = 1

READ_BL_LEN=6, C_SIZE_MULT=7, C_SIZE=4095
size = 0
SD Card detected RCA: 0x2 type: SD
mmc1 is available
[u-boot@MINI2440]# fatload mmc 1 30008000 zImage.img
reading zImage.img

2277540 bytes read
[u-boot@MINI2440]# bootm 30008000
## Booting kernel from Legacy Image at 30008000 …

Image Name:
tekkaman


Created:
2010-03-29
12:59:51 UTC


Image Type:
ARM Linux Kernel Image (uncompressed)


Data Size:
2277476 Bytes =
2.2 MB


Load Address: 30008000


Entry Point:
30008040


Verifying Checksum … OK


XIP Kernel Image … OK

OK

Starting kernel …

Uncompressing Linux… done, booting the kernel.
Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440
(略)

2) 通过TFTP服务引导内核:

[u-boot@MINI2440]# tftpboot 0x30008000 192.168.1.100:zImage.img 
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.101
Filename 'zImage.img'.
Load address: 0x30008000
Loading: T #################################################################

#################################################################

##########################
done
Bytes transferred = 2277540 (22c0a4 hex)
[u-boot@MINI2440]# bootm 30008000
## Booting kernel from Legacy Image at 30008000 …

Image Name:
tekkaman


Created:
2010-03-29
12:59:51 UTC


Image Type:
ARM Linux Kernel Image (uncompressed)


Data Size:
2277476 Bytes =
2.2 MB


Load Address: 30008000


Entry Point:
30008040


Verifying Checksum … OK


XIP Kernel Image … OK

OK

Starting kernel …

Uncompressing Linux… done, booting the kernel.
Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440
(略)

3) 通过NFS服务引导内核:

[u-boot@MINI2440]# nfs 30008000 192.168.1.100:/home/tekkaman/development/share/zImage.img
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101
Filename '/home/tekkaman/development/share/zImage.img'.
Load address: 0x30008000
Loading: #################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#######################################################
done
Bytes transferred = 2277540 (22c0a4 hex)
[u-boot@MINI2440]# bootm 30008000
## Booting kernel from Legacy Image at 30008000 …

Image Name:
tekkaman


Created:
2010-03-29
12:59:51 UTC


Image Type:
ARM Linux Kernel Image (uncompressed)


Data Size:
2277476 Bytes =
2.2 MB


Load Address: 30008000


Entry Point:
30008040


Verifying Checksum … OK


XIP Kernel Image … OK

OK

Starting kernel …

Uncompressing Linux… done, booting the kernel.
Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440
(略)


4) 通过Nand Flash引导内核:
   首先要将处理过的内核映像文件烧入Nand Flash的一定位置(由内核分区表决定)。以后每次启动时用Nand Flash的读取命令先将这个内核映像文件读到内存的一定位置(由制作内核映像时的-a参数决定),再使用bootm命令引导内核。

内核映像文件的烧入:

[u-boot@MINI2440]# nfs 30008000 192.168.1.100:/home/tekkaman/development/share/zImage.img
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101
Filename '/home/tekkaman/development/share/zImage.img'.
Load address: 0x30008000
Loading: #################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#######################################################
done
Bytes transferred = 2277540 (22c0a4 hex)
[u-boot@MINI2440]# nand erase 0x80000 0x300000

NAND erase: device 0 offset 0x80000, size 0x300000
Erasing at 0x36000001800000 —
0% complete.

OK
[u-boot@MINI2440]# 
nand write 30008000 0x80000 300000 


NAND write: device 0 offset 0x80000, size 0x300000

Writing at 0x36000000020000 — 100% is complete. 3145728 bytes written: OK



内核引导: 

[u-boot@MINI2440]# 
nand read 30008000 0x80000 300000


NAND read: device 0 offset 0x80000, size 0x300000

3145728 bytes read: OK

[u-boot@MINI2440]# bootm 30008000
## Booting kernel from Legacy Image at 30008000 …

Image Name:
tekkaman


Created:
2010-03-29
12:59:51 UTC


Image Type:
ARM Linux Kernel Image (uncompressed)


Data Size:
2277476 Bytes =
2.2 MB


Load Address: 30008000


Entry Point:
30008040


Verifying Checksum … OK


XIP Kernel Image … OK

OK

Starting kernel …

Uncompressing Linux… done, booting the kernel.
Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: MINI2440

 

Published by

风君子

独自遨游何稽首 揭天掀地慰生平