加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:37:13 所属栏目:百科 来源:网络整理
导读:? 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-b
?

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,#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,c7,0?? /* 失效I/D cache,见S3C2410手册附录的2-16 */

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

/*

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

???????? */

??????? mrc???? p15,c1,c0,0

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

???????????????????????????????? * Bit 8: Disable System Protection

???????????????????????????????? * Bit 7: Disable ROM Protection

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

???????????????????????????????? */

??????? bic???? 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,#0x00000002????? /* set bit 2 (A) Align,1 = Fault checking enabled */

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

*/

??????? mcr???? p15,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,#CFG_MALLOC_LEN???? /* 分配的动态内存区??? */

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

#ifdef CONFIG_USE_IRQ

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

?????? sub???? r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

?????? sub???? sp,#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,#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,r1?

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

??????? add???? r2,#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,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信息,所有不支持该命令. 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 ? 22222111 30008000: 22222111 ? 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读