uboot 移植全过程---基于ARM9 2410

 

uboot@localhost ~]#mkdir -p dev_home/uboot

[uboot@localhost ~]#cd dev_home/uboot

从下面地址下载u-boot 的源代码。

http://sourceforge.net/projects/u-boot

[uboot@localhost uboot]#tar -xjvf u-boot-1.1.4.tar.bz2

[uboot@localhost uboot]#cd u-boot-1.1.4

1.3 u-boot 体系结构

1.3.1 u-boot 目录结构

1. 目录树

[uboot@localhost u-boot-1.1.4]#tree -L 1 -d
.
|-- board

|-- common

|-- cpu

|-- disk

|-- doc

|-- drivers

|-- dtt

|-- examples

|-- fs

|-- include

|-- lib_arm

|-- lib_generic

|-- lib_i386

|-- lib_m68k

|-- lib_microblaze

|-- lib_mips

|-- lib_nios

|-- lib_nios2

|-- lib_ppc

|-- net

|-- post

|-- rtc

`-- tools
2. board:和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目录中,比如说:SMDK2410, 子目录中存放与开发板相关的配置文件.
3. common:实现u-boot 命令行下支持的命令,每一条命令都对应一个文件。例如bootm 命令对应就是 cmd_bootm.c 。
4. cpu:与特定CPU 架构相关目录,每一款U-boot 下支持的CPU 在该目录下对应一个子目录,比如有子目录 arm920t 等。
5. disk:对磁盘的支持。
5. doc:文档目录。U-boot 有非常完善的文档,推荐大家参考阅读。
6. drivers:U-boot 支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI 的Flash 、串口和USB 等。
7. fs: 支持的文件系统,U-boot 现在支持cramfs 、fat 、fdos 、jffs2 和registerfs 。
8. include:U-boot 使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下configs  目录有与开发板相关的配置头文件,如smdk2410.h 。该目录下的asm  目录有与CPU 体
系结构相关的头文件,asm 对应的是asm-arm.
9. lib_xxxx: 与体系结构相关的库文件。如与ARM 相关的库放在lib_arm 中。
10. net:与网络协议栈相关的代码,BOOTP 协议、TFTP 协议、RARP 协议和NFS 文件系统的实现。
11. tools:生成U-boot 的工具,如:mkimage, crc 等等。

2 uboot 的启动过程及工作原理

2.1 启动模式介绍 

大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加 载模式与下载工作模式的区别。

    启动加载 (Boot loading)模式:这种模式也称为" 自主"       (Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。 

  下载 (Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手 段从主机 (Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。Boot oader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令  接口。

   U-Boot 这样功能强大的 Boot Loader 同时支持这两种工作模式,而且允许用户在这两种工作模式之间进

切换。

    大多数bootloader 都分为阶段 1(stage1)和阶段2(stage2)两大部分,u-boot 也不例外。依赖于CPU 体系结构 的代码 (如CPU 初始化代码等)通常都放在阶段 1 中且通常用汇编语言实现,而阶段2 则通常用C 语言来实 现,这样可以实现复杂的功能,而且有更好的可读性和移植性。


2.2 阶段1 介绍
u-boot 的stage1 代码通常放在start.s 文件中,它用汇编语言写成,其主要代码部分如下:

2.2.1 定义入口
由于一个可执行的Image 必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0

地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。 
    1. board/crane2410/u-boot.lds:  ENTRY(_start) ==> cpu/arm920t/start.S: .globl _start

     2. uboot 代码区 (TEXT_BASE = 0x33F80000)定义在board/crane2410/config.mk

2.2.2 设置异常向量

_start: b       reset                          @ 0x00000000

        ldr     pc, _undefined_instruction     @ 0x00000004

        ldr     pc, _software_interrupt        @ 0x00000008

        ldr     pc, _prefetch_abort            @ 0x0000000c

        ldr     pc, _data_abort                @ 0x00000010

        ldr     pc, _not_used                  @ 0x00000014

        ldr     pc, _irq                       @ 0x00000018

        ldr     pc, _fiq                       @ 0x0000001c 


      当发生异常时,执   cpu/arm920t/interrupts.c 中定义的中断处理函数。

2.2.3 设置 CPU 的模式为SVC模式 
        mrs     r0,cpsr

        bic     r0,r0,#0x1f

        orr     r0,r0,#0xd3

        msr     cpsr,r0

2.2.4 关闭看门狗

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)

        ldr     r0, =pWTCON

        mov     r1, #0x0     @ 根据三星手册进行调置。

        str     r1, [r0]

2.2.5 禁掉所有中断 
        mov     r1, #0xffffffff

        ldr     r0, =INTMSK

        str     r1, [r0]

# if defined(CONFIG_S3C2410)

        ldr     r1, =0x3ff

        ldr     r0, =INTSUBMSK

        str     r1, [r0]

.2.6 设置以 CPU 的频率 
默认频率为 FCLK:HCLK:PCLK = 1:2:4,默认FCLK的值为120 MHz,该值为S3C2410手册的推荐值。

        ldr     r0, =CLKDIVN

        mov     r1, #3

        str     r1, [r0]

2.2.7 设置 CP15 

设置CP15, 失效指令(I)Cache 和数据(D)Cache 后, 禁止MMU 与Cache 。

cpu_init_crit:

        mov     r0, #0

        mcr     p15, 0, r0, c7, c7, 0   /* 失效I/D cache, 见S3C2410手册附录的2-16 */

        mcr     p15, 0, r0, c8, c7, 0   /* 失效TLB, 见S3C2410手册附录的2-18 */ 

/*

         * 禁止 MMU 和caches, 详见S3C2410手册附录2-11

         */

        mrc     p15, 0, r0, c1, c0, 0

        bic     r0, r0, #0x00002300     /* 清除 bits 13, 9:8 (--V- --RS)

                                 * Bit 8: Disable System Protection

                                 * Bit 7: Disable ROM Protection

                                 * Bit 13: 异常向量表基地址: 0x0000 0000

                                 */

        bic     r0, r0, #0x00000087     /* 清除 bits 7, 2:0 (B--- -CAM)

                                 * Bit 0: MMU disabled

                                 * Bit 1: Alignment Fault checking disabled

                                 * Bit 2: Data cache disabled

                                 * Bit 7: 0 = Little-endian operation 
                                 */

        orr     r0, r0, #0x00000002      /* set bit 2 (A) Align, 1 = Fault checking enabled */

        orr     r0, r0, #0x00001000     /* set bit 12 (I) I-Cache, 1 = Instruction cache enabled  

*/

        mcr     p15, 0, r0, c1, c0, 0

2.2.8 配置内存区控制寄存器 
配置内存区控制寄存器,寄存器的具体值通常由开发板厂商或硬件工程师提供. 如果您对总线周期及外围

芯片非常熟悉, 也可以自己确定, 在U-BOOT 中的设置文件是board/crane2410/lowlevel_init.S, 该文件包含

lowleve_init 程序段. 详细寄存器设置及值的解释见3.2.2 启动AXD 配置开发板一节中的第5 点. 

      mov     ip, lr

        bl      lowlevel_init

        mov     lr, ip

2.2.9 安装 U-BOOT使的栈空间



    下面这段代码只对不是从Nand Flash 启动的代码段有意义,对从Nand Flash 启动的代码,没有意义。因为

从Nand Flash 中把UBOOT 执行代码搬移到RAM,由2.1.9 中代码完成.

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

...

#endif

stack_setup:

       ldr     r0, _TEXT_BASE              /* 代码段的起始地址    */

       sub     r0, r0, #CFG_MALLOC_LEN     /* 分配的动态内存区    */

       sub     r0, r0, #CFG_GBL_DATA_SIZE   /* UBOOT开发板全局数据存放  */

#ifdef CONFIG_USE_IRQ

       /* 分配IRQ和FIQ栈空间 */

       sub     r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

       sub     sp, r0, #12                 /* 留下3个字为Abort    */



2.2.10 BSS段清 0



clear_bss:

       ldr     r0, _bss_start       /* BSS段的起始地址   */

       ldr     r1, _bss_end         /* BSS段的结束地址   */

       mov     r2, #0x00000000             /* BSS段置0                   */

clbss_l:str    r2, [r0]             /* 循环清除BSS段 */

       add     r0, r0, #4

       cmp     r0, r1

       ble     clbss_l



2.2.11 搬移 Nand Flash代码



从Nand Flash 中, 把数据拷贝到RAM, 是由copy_myself 程序段完成, 该程序段详细解释见:第七部分的3.1 节.

#ifdef CONFIG_S3C2410_NAND_BOOT

       bl    copy_myself 
      @ jump to ram

       ldr   r1, =on_the_ram

       add  pc, r1, #0

       nop

       nop 

1:    b     1b          @ infinite loop 
on_the_ram:

#endif



2.2.12 进入 C代码部分



        ldr     pc, _start_armboot

        _start_armboot: .word start_armboot



2.3 阶段2 的C 语言代码部分 



lib_arm/board.c 中的start armboot 是C 语言开始的函数,也是整个启动代码中C 语言的主函数,同时还是整个

u-boot(armboot)的主函数,该函数主要完成如下操作:



2.3.1调用一系列的初始化函数



1. 指定初始函数表:

init_fnc_t *init_sequence[] = {

       cpu_init,             /* cpu的基本设置          */

       board_init,           /* 开发板的基本初始化     */

       interrupt_init,       /* 初始化中断             */

       env_init,             /* 初始化环境变量         */

       init_baudrate,        /* 初始化波特率           */

       serial_init,          /* 串口通讯初始化         */

       console_init_f,       /* 控制台初始化第一阶段   */

       display_banner,       /* 通知代码已经运行到该处 */

       dram_init,            /* 配制可用的内存区       */

       display_dram_config,

#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)

       checkboard,

#endif

       NULL,

};

执行初始化函数的代码如下:

       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

               if ((*init_fnc_ptr)() != 0) {

                      hang ();

               }

       }



2. 配置可用的Flash 区

   flash_init ()    

    

3. 初始化内存分配函数

   mem_malloc_init()   

    

4. nand flash 初始化

 #if (CONFIG_COMMANDS & CFG_CMD_NAND)

          puts ("NAND:");

          nand_init();              /* 初始化 NAND */

见第七部分3.2.3 节中的第3 点nand_init()函数.



5. 初始化环境变量  

  env_relocate ();



6. 外围设备初始化

   devices_init()



7. I2C 总线初始化

  i2c_init();



8. LCD 初始化

  drv_lcd_init();



9. VIDEO 初始化

  drv_video_init();



10. 键盘初始化

  drv_keyboard_init();



11. 系统初始化

  drv_system_init();



2.3.2 初始化网络设备



初始化相关网络设备,填写IP 、MAC 地址等。

1. 设置IP 地址



        /* IP Address */

        gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");



        /* MAC Address */

        {

                int i;

                ulong reg;

                char *s, *e;

                uchar tmp[64];



                i = getenv_r ("ethaddr", tmp, sizeof (tmp));

                s = (i > 0) ? tmp : NULL;



                for (reg = 0; reg < 6; ++reg) {

                        gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;

                        if (s)

                                s = (*e) ? e + 1 : e;

                }

        }



2.3.3 进入主 UBOOT命令



进入命令循环 (即整个boot 的工作循环),接受用户从串口输入的命令,然后进行相应的工作。



        for (;;) {

                main_loop (); /* 在common/main.c */

        }


2.4 代码搬运



为了支持NAND flash 起动,S3C2410 内建了内部的4k 的SRAM 缓存 “Steppingstone” 。当起动时,NAND

flash 最初的4k 字节将被读入”Steppingstone”然后开始执  起动代码。通常起动代码会把NAND flash 中的内容

拷到SDRAM 中以便执行主代码。

使用硬件的ECC, NAND flash 中的数据的有效性将会得到检测。

功能

    1. NAND flash 模式:支持读/删除/编程 NAND Flash

    2.  自动起动模式:在复位时起动代码将被读入”Steppingstone”中,然后开始执  起动代码。

    3. 硬件ECC 检测模块(硬件检测,软件纠正)

    4. “Steppingstone” 4-KB 内部SRAM 在起动后可以另外使用。



3 uboot 的移植过程



3.1 环境 


  1. 工作用户

    uboot

  2. u-boot 版本 1.1.4

    获取u-boot1.1.4请看 1.2



  3. 工具链2.95.3



3.2 步骤



我们为开发板取名叫: crane2410, 并在u-boot 中建立自己的开发板类型



3.2.1 修改 Makefile



[uboot@localhost uboot]#vi Makefile

#为crane2410 建立编译项

crane2410_config : unconfig

   @./mkconfig $(@:_config=) arm arm920t crane2410 NULL s3c24x0

各项的意思如下:

    arm:      CPU 的架构(ARCH)

    arm920t:  CPU 的类型(CPU) ,其对应于cpu/arm920t 子目录。

    crane2410: 开发板的型号(BOARD) ,对应于board/crane2410  目录。

    NULL:     开发者/或经销商(vender) 。

    s3c24x0:  片上系统(SOC) 。



3.2.2 在 board子目录中建立 crane2410



[uboot@localhost uboot]#cp -rf board/smdk2410 board/crane2410

[uboot@localhost uboot]#cd board/crane2410

[uboot@localhost crane2410]#mv smdk2410.c crane2410.c



3.2.3 在 include/ configs/ 中建立配置头文件



[uboot@localhost crane2410]#cd ../..

[uboot@localhost uboot]#cp include/configs/smdk2410.h include/configs/crane2410.h


3.2.4 指定交叉编译工具的路径



[uboot@localhost uboot]#vi ~/.bashrc

export PATH=/usr/local/arm/2.95.3/bin:$PATH



3.2.5 测试编译能否成功



[uboot@localhost uboot]#make crane2410_config

[uboot@localhost uboot]#make CROSS_COMPILE=arm-linux-



3.2.6 修改 lowlevel_init.S 文件



依照开发板的内存区的配置情况, 修改board/crane2410/lowlevel_init.S 文件,我的更改如下:

#include <config.h>

#include <version.h>



#define BWSCON0x48000000



/* BWSCON */

#define DW8                      (0x0)

#define DW16                     (0x1)

#define DW32                     (0x2)

#define WAIT                     (0x1<<2)

#define UBLB                     (0x1<<3)



#define B1_BWSCON                (DW16)

#define B2_BWSCON                (DW16)

#define B3_BWSCON                (DW16 + WAIT + UBLB)

#define B4_BWSCON                (DW16)

#define B5_BWSCON                (DW16)

#define B6_BWSCON                (DW32)

#define B7_BWSCON                (DW32)



/* BANK0CON */

#define B0_Tacs                  0x3     /*  0clk */

#define B0_Tcos                  0x3     /*  0clk */

#define B0_Tacc                  0x7     /* 14clk */

#define B0_Tcoh                  0x3     /*  0clk */

#define B0_Tah                   0x3     /*  0clk */

#define B0_Tacp                  0x3

#define B0_PMC                   0x3     /* normal */



/* BANK1CON */

#define B1_Tacs                  0x3     /*  0clk */

#define B1_Tcos                  0x3     /*  0clk */

#define B1_Tacc                  0x7     /* 14clk */

#define B1_Tcoh                  0x3     /*  0clk */

#define B1_Tah                   0x3     /*  0clk */

#define B1_Tacp                  0x3

#define B1_PMC                   0x0



#define B2_Tacs                  0x0

#define B2_Tcos                  0x0

#define B2_Tacc                  0x7

#define B2_Tcoh                  0x0

#define B2_Tah                   0x0


#define B2_Tacp              0x0

#define B2_PMC               0x0



#define B3_Tacs              0x0     /*  0clk */

#define B3_Tcos              0x3     /*  4clk */

#define B3_Tacc              0x7     /* 14clk */

#define B3_Tcoh              0x1     /*  1clk */

#define B3_Tah               0x0     /*  0clk */

#define B3_Tacp              0x3    /*  6clk */

#define B3_PMC               0x0     /* normal */



#define B4_Tacs              0x0     /*  0clk */

#define B4_Tcos              0x0     /*  0clk */

#define B4_Tacc              0x7     /* 14clk */

#define B4_Tcoh              0x0     /*  0clk */

#define B4_Tah               0x0     /*  0clk */

#define B4_Tacp              0x0

#define B4_PMC               0x0     /* normal */



#define B5_Tacs              0x0     /*  0clk */

#define B5_Tcos              0x0     /*  0clk */

#define B5_Tacc              0x7     /* 14clk */

#define B5_Tcoh              0x0     /*  0clk */

#define B5_Tah               0x0     /*  0clk */

#define B5_Tacp              0x0

#define B5_PMC               0x0     /* normal */



#define B6_MT                0x3     /* SDRAM */

#define B6_Trcd              0x1

#define B6_SCAN              0x1     /* 9bit */



#define B7_MT                0x3     /* SDRAM */

#define B7_Trcd              0x1     /* 3clk */

#define B7_SCAN              0x1     /* 9bit */



/* REFRESH parameter */

#define REFEN                0x1     /* Refresh enable */

#define TREFMD               0x0     /* CBR(CAS before RAS)/Auto refresh */

#define Trp                  0x0     /* 2clk */

#define Trc                  0x3     /* 7clk */

#define Tchr                 0x2     /* 3clk */

#define REFCNT               1113    /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */

/**************************************/



_TEXT_BASE:

        .word  TEXT_BASE



.globl lowlevel_init

lowlevel_init:

       /* memory control configuration */

       /* make r0 relative the current location so that it */

       /* reads SMRDATA out of FLASH rather than memory ! */

       ldr     r0, =SMRDATA

       ldr     r1, _TEXT_BASE

       sub     r0, r0, r1 

        ldr    r1, =BWSCON    /* Bus Width Status Controller */

        add     r2, r0, #13*4

0:

        ldr     r3, [r0], #4

        str     r3, [r1], #4

        cmp     r2, r0

        bne     0b



        /* everything is fine now */

        mov    pc, lr



        .ltorg

/* the literal pools origin */



SMRDATA:

    .word  

(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(

B7_BWSCON<<28))

    .word  

((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))

    .word  

((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))

    .word  

((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))

    .word  

((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))

    .word  

((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))

    .word  

((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))

    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))

    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))

    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

    .word 0x31

    .word 0x30

    .word 0x30

 



3.2.9 UBOOT的Nand Flash移植



UBOOT 的Nand Flash 支持见第七部分的第3 节.



3.2.8重新编译 u-boot



[uboot@localhost uboot1.1.4]make CROSS_COMPILE=arm-linux-



3.2.9 把 u-boot烧入 flash



1. 通过仿真器烧入u-boot

  通过仿真器u-boot 烧写到flash 中就可以从NAND flash 启动了.

2. 通过JTAG 接口,由工具烧入flash

4  U-BOOT 命令的使用



4.1 U-BOOT 命令的介绍



U-BOOT 常用命令

   通常使用help(或者只使用问号?) ,来查看所有的U-BOOT 命令。将会列出在当前配置下所有支持的命令。

但是我们要注意,尽管U-BOOT 提供了很多配置选项,并不是所有选项都支持各种处理器和开发板,有些选项

可能在你的配置中并没有被选上。



4.1.1 获得帮助信息



    通过help 可以获得当前开发板的U-BOOT 中支持的命令.

CRANE2410 # help

 ?       - alias for 'help'

      autoscr - run script 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'

      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

      echo    - echo args to console

      erase   - erase FLASH memory

      flinfo  - print FLASH memory information

      go      - start application at address 'addr'

      help    - print online help

      icache  - enable or disable instruction cache

      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)

      nand    - NAND sub-system

      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

      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



4.2 常用命令使用说明



4.2.1 askenv(F)



    在标准输入 (stdin)获得环境变量。



4.2.2 autoscr



    从内存 (Memory)运      教本。(注意,从下载地址开始,例如我们的开发板是从0x30008000处开始运

  ).



CRANE2410 # autoscr 0x30008000

       ## Executing script at 30008000



4.2.3 base



    打印或者设置当前指令与下载地址的地址偏移。



4.2.4 bdinfo



    打印开发板信息

CRANE2410 # bdinfo

                    -arch_number = 0x000000C1    (CPU体系结构号)

                    -env_t        = 0x00000000   (环境变量)

                    -boot_params = 0x30000100    (启动引导参数)

                    -DRAM bank    = 0x00000000   (内存区)

                    --> start     = 0x30000000   (SDRAM起始地址)

                    --> size      = 0x04000000   (SDRAM大小)

                    -ethaddr      = 01:23:45:67:89:AB    (以太网地址)

                    -ip_addr      = 192.168.1.5   (IP地址) 

                    -baudrate     = 115200 bps    (波特率)



4.2.5 bootp



通过网络使用Bootp或者TFTP协议引导境像文件。

       CRANE2410 # help bootp

       bootp [loadAddress] [bootfilename]



4.2.6 bootelf

默认从0x30008000引导elf格式的文件(vmlinux)

CRANE2410 # help bootelf

bootelf  [address] - load address of ELF image.



4.2.7 bootd(=boot)

    引导的默认命令,即运          U-BOOT中在 “include/configs/smdk2410.h” 中设置的 “bootcmd”中

的命令。如下:

#define CONFIG_BOOTCOMMAND "tftp 0x30008000 uImage; bootm 0x30008000";

    

     在命令下做如下试验:

CRANE2410 # set bootcmd printenv

CRANE2410 # boot

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

CRANE2410 # bootd

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab



4.2.8 tftp(tftpboot)



即将内核镜像文件从PC中下载到SDRAM的指定地址,然后通过bootm来引导内核,前提是所用PC要安装设

置tftp服务。

下载信息:

CRANE2410 # tftp 0x30008000 zImage

TFTP from server 10.0.0.1; our IP address is 10.0.0.110

Filename 'zImage'.

Load address: 0x30008000

Loading: #################################################################

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

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

done

Bytes transferred = 913880 (df1d8 hex)



4.2.9 bootm



     内核的入口地址开始引导内核。

CRANE2410 # bootm 0x30008000

## Booting image at 30008000 ...

Starting kernel ...

Uncompressing

Linux......................................................................

done, .



4.2.10 go



     直接跳转到可执行文件的入口地址,执行可执行文件。

CRANE2410 # go 0x30008000

## Starting application at 0x30008000 ...



4.2.11 cmp



对输入的两段内存地址进            比较。

CRANE2410 # cmp 0x30008000 0x30008040 64

word at 0x30008000 (0xe321f0d3) != word at 0x30008040 (0xc022020c)

Total of 0 words were the same



CRANE2410 # cmp 0x30008000 0x30008000 64

Total of 100 words were the same



4.2.12 coninfo



    打印所有控制设备和信息,例如

    -List of available devices:

    -serial    80000003 SIO stdin stdout stderr



4.2.13 cp



    内存拷贝,cp 源地址 目的地址 拷贝大小(字节)

CRANE2410 # help cp

cp [.b, .w, .l] source target count

ANE2410 # cp 0x30008000 0x3000f000 64


4.2.14 date



    获得/设置/重设日期和时间

CRANE2410 # date

Date: 2006-6-6 (Tuesday)        Time:  06:06:06



4.2.15 erase(F)



擦除FLASH MEMORY, 由于该ARM板没有Nor Flash, 所有不支持该命令.

CRANE2410 # help erase

erase start end

    - erase FLASH from addr 'start' to addr 'end'

erase start +len

    - erase FLASH from addr 'start' to the end of sect w/addr 'start'+'len'-1

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



4.2.16 flinfo(F)



打印Nor Flash信息, 由于该ARM板没有Nor Flash, 所有不支持该命令.



4.2.17 iminfo



打印和校验内核镜像头, 内核的起始地址由CFG_LOAD_ADDR指定:

#define  CFG_LOAD_ADDR  0x30008000  /* default load address  */

该宏在include/configs/crane2410.h中定义.



CRANE2410 # iminfo

## Checking Image at 30008000 ...

   Image Name:     Linux-2.6.14.1

   Created:        2006-06-28     7:43:01 UTC

   Image Type:     ARM Linux Kernel Image (uncompressed)

   Data Size:      1047080 Bytes = 1022.5 kB

   Load Address: 30008000

   Entry Point:  30008040

   Verifying Checksum ... OK



4.2.18 loadb



从串口下载二进制文件

CRANE2410 # loadb

## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

## Total Size         = 0x00000000 = 0 Bytes

## Start Addr         = 0x30008000



4.2.19 md



    显示指定内存地址中的内容

CRANE2410 # md 0

00000000: ea000012 e59ff014 e59ff014 e59ff014            ................

00000010: e59ff014 e59ff014 e59ff014 e59ff014            ................

00000020: 33f80220 33f80280 33f802e0 33f80340             ..3...3...3@..3

00000030: 33f803a0 33f80400 33f80460 deadbeef            ...3...3`..3....

00000040: 33f80000 33f80000 33f9c0b4 33fa019c            ...3...3...3...3

00000050: e10f0000 e3c0001f e38000d3 e129f000            ..............).

00000060: e3a00453 e3a01000 e5801000 e3e01000              S...............

00000070: e59f0444 e5801000 e59f1440 e59f0440              D.......@...@...

00000080: e5801000 e59f043c e3a01003 e5801000              ....<...........

00000090: eb000051 e24f009c e51f1060 e1500001              Q.....O.`.....P.

000000a0: 0a000007 e51f2068 e51f3068 e0432002              ....h ..h0... C.

000000b0: e0802002 e8b007f8 e8a107f8 e1500002              . ............P.

000000c0: dafffffb e51f008c e2400803 e2400080              ..........@...@.

000000d0: e240d00c e51f0094 e51f1094 e3a02000              ..@.......... ..

000000e0: e5802000 e2800004 e1500001 dafffffb              . ........P.....

000000f0: eb000006 e59f13d0 e281f000 e1a00000                 ................



4.2.20 mm



    顺序显示指定地址          后的内存中的内容,可同时修改,地址自动递增。

CRANE2410 # mm 0x30008000

30008000: e1a00000 ? fffff

30008004: e1a00000 ? eeeeee

30008008: e1a00000 ? q



CRANE2410 # md 30008000

30008000: 000fffff 00eeeeee e1a00000 e1a00000                 ................

30008010: e1a00000 e1a00000 e1a00000 e1a00000                 ................

30008020: ea000002 016f2818 00000000 000df1d8              .....(o.........

30008030: e1a07001 e3a08000 e10f2000 e3120003              .p....... ......



4.2.21 mtest



    简单的RAM检测

CRANE2410 # mtest

Pattern FFFFFFFD  Writing...  Reading...



4.2.22 mw



    向内存地址写内容

CRANE2410 # md 30008000

30008000: ffffdffd ffffdffc ffffdffb ffffdffa                 ................



CRANE2410 # mw 30008000 0 4

CRANE2410 # md 30008000

30008000: 00000000 00000000 00000000 00000000                 ................



4.2.23 nm



修改内存地址, 地址不递增

CRANE2410 # nm 30008000

30008000: de4c457f ? 00000000

30008000: 00000000 ? 11111111

30008000: 11111111 ?



4.2.24 printenv



    打印环境变量

CRANE2410 # printenv

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

ipaddr=10.0.0.110

serverip=10.0.0.1

netmask=255.255.255.0

stdin=serial

stdout=serial

stderr=serial



Environment size: 153/65532 bytes



4.2.25 ping



ping主机

CRANE2410 # ping 10.0.0.1

host 10.0.0.1 is alive



4.2.26 reset



复位CPU



4.2.27 run



     运   已经定义好的U-BOOT的命令

CRANE2410 # set myenv ping 10.0.0.1

CRANE2410 # run myenv

host 10.0.0.1 is alive



4.2.28 saveenv(F)



保存设定的环境变量



4.2.29 setenv



设置环境变量

CRANE2410 # setenv ipaddr 10.0.0.254

CRANE2410 # printenv

ipaddr=10.0.0.254



4.2.30 sleep



命令延时执行时间

CRANE2410 # sleep 1



4.2.31 version



     打印U-BOOT版本信息

CRANE2410 # version



U-Boot 1.1.4 (Jul  4 2006 - 12:42:27)



4.2.32 nand info



    打印nand flash信息

CRANE2410 # nand info

Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)



4.2.33 nand device <n>



     显示某个nand设备

CRANE2410 # nand device 0



Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)

... is now current device



4.2.34 nand bad



CRANE2410 # nand bad

Device 0 bad blocks:


4.2.35 nand read



nand read InAddr FlAddr size

      InAddr: 从nand flash中读到内存的起始地址。

      FlAddr: nand flash 的起始地址。

      size: 从nand flash中读取的数据的大小。



CRANE2410 # nand read 0x30008000 0 0x100000

NAND read: device 0 offset 0, size 1048576 ...

1048576 bytes read: OK



4.2.36 nand erease



nand erase FlAddr size

      FlAddr: nand flash 的起始地址

      size: 从nand flash中擦除数据块的大小



CRANE2410 # nand erase 0x100000 0x20000

NAND erase: device 0 offset 1048576, size 131072 ... OK



4.2.37 nand write



nand write InAddr FlAddr size

      InAddr: 写到Nand Flash中的数据在内存的起始地址

      FlAddr: Nand Flash的起始地址

      size: 数据的大小



CRANE2410 # nand write 0x30f00000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK



4.2.37 nboot

u-boot-1.1.4代码对于nboot命令的帮助不正确,修改如下:

正确的顺序为:

nboot InAddr dev FlAddr

InAddr: 需要装载到的内存的地址。

FlAddr: 在nand flash上uImage存放的地址

dev: 设备号



需要提前设置环境变量,否则nboot不会调用bootm

CRANE2410 #setenv autostart yes

CRANE2410 # nboot 30008000 0 100000

Loading from device 0: <NULL> at 0x4e000000 (offset 0x100000)

   Image Name:    Linux-2.6.14.3

   Created:       2006-07-06    7:31:52 UTC

   Image Type:    ARM Linux Kernel Image (uncompressed)

   Data Size:     897428 Bytes = 876.4 kB

   Load Address: 30008000

   Entry Point:  30008040

Automatic boot of image at addr 0x30008000 ...

## Booting image at 30008000 ...

Starting kernel ...



4.3 命令简写说明



     所以命令都可以简写,只要命令前面的一部分不会跟其它命令相同,就可以不用写全整个命令.

save命令

CRANE2410 # sa

Saving Environment to Flash...

Un-Protected 1 sectors

Erasing Flash...Erasing sector 10 ... Erased 1 sectors



4.4 把文件写入 NandFlash



    如果把一个传到内存中的文件写入到Nand Flash中, 如:新的uboot.bin, zImage(内核),

rootfs等, 如果做呢?我们可以用Nand Flash命令来完成. 但是Nand Flash写时,必须先要把Nand

Flash的写入区全部擦除后,才能写. 下面以把内存0x30008000起长度为0x20000的内容写到Nand

Flash中的0x100000为例.

CRANE2410 # nand erase 0x100000 20000

NAND erase: device 0 offset 1048576, size 131072 ... OK



CRANE2410 # nand write 0x30008000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值