S3C2440移植uboot过程全解+移植记录

S3C2440移植uboot过程全解+移植记录
S3C2440移植uboot过程全解+移植记录

一、Uboot移植前的准备

1、修改makefile、配置文件

在配置文件之前,需要修改makeflie相关内容:修改如下:

(1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示:

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linux-

Endif

(2)添加fl2440的配置项,如下所示:

fl2440_config:unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0

注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。

Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。在执行编译make之前,需要进行配置即make fl2440_config。通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为:

./mkconfig fl2440 arm arm920t fl2440 step s3c24x0

执行完这句后,产生如下结果:

(1)开发板名称为fl2440;

(2)将include中的头文件连接到同平台相关的头文件中,这里的连接为:

asm->asm-arm

arch->arch-s3c24x0

proc->proc-armv

(3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下

ARCH = arm

CPU = arm920t

BOARD = fl2440

VENDOR = step

SOC = s3c24x0

(4)创建开发板相关头文件include/config.h,该文件中包含了对开发板的相关配置,如下所示:

#include

从上面可以知道,在将uboot配置为适合自己的平台的时候,需要在路径/include/configs下添加配置头文件fl2440.h。这里我们修改/include/configs/sbc2410x.h的文件名为fl2440.h,并在头文件中加入以下内容:#define CONFIG_FL2440 1/* on a FL2440 Board */

#define CONFIG_S3C2440 1/* specifically a SAMSUNG S3C2440 SoC*/

打开fl2440.h,里面有两类宏,一类前缀应该是CONFIG_,这类宏用于选择CPU、SOC、系统时钟、选择设备驱动等;另一类前缀是CFG_,这类宏用于设置参数,例如malloc大小等。

2、创建board级文件

在Board目录中添加step目录,注意此step目录要和Makefile的fl2440_config 下的step名字保持一致。在step中建立fl2440目录,并将Board目录中的sbc2410x 目录中的所有文件复制到fl2440目录中。修改fl2440目录中sbc2410x.c为fl2440.c.

修改fl2440目录下的Makefile文件,将

COBJS:= sbc2410x.o flash.o

修改为:COBJS:= fl2440.o flash.o

至此,配置过程完成。配置的目的是通过设置相关参数、链接相关头文件,使得uboot适合我们的开发平台。

3、uboot编译、链接过程

Uboot的编译最终生成的u-boot.bin二进制文件,生成u-boot.bin的依赖关系由makefile指定,通过分析makefile可以得到两点:

(1)u-boot第一个执行的文件是start.s;

(2)如何链接各个文件生成的.o文件,由/board/step/fls2240中的U-boot.lds 和config.mk决定。

U-Boot的编译流程为:首先编译cpu/$(CPU)/start.S,对于不同的CPU,还可能编译cpu/$(CPU)下的其他文件。然后,对于平台/开发板相关的每个目录、每

个通用目录都使用它们各自的Makefile生成相应的库。将前面两步生成的.o、.a 文件按照board/$(BOARDDIR)/config.mk文件中指定的代码段起始地址、board/$(BOARDDIR)/U-Boot.lds连接脚本进行连接得到ELF格式的U-Boot,后面Makefile还会将它转换为二进制格式、S-Record格式。这部分具体可以参考《嵌入式linux应用开发完全手册》第十五章内容15.2.3。

到此修改构成一个段落,此处的修改只是构建了fl2440开发板的框架,其核心的东西还是sbc2410x的,下文会进行深层次的修改。不过在这里,要首先,测试配置和编译一下,检测我们的框架是否搭建合理。

# make fl2440_config

Configuring for FL2440 board...

# make

如果没有错误,则执行make distclean 和make clean将编译的文件清空。如果有错误,则查看上面的步骤,是否处理正确

二、Uboot第一阶段分析

1、uboot第一阶段作用

Uboot第一阶段主要完成硬件设备初始化、为加载Bootloader的第二阶段代码准备RAM空间、代码重定向、为调用C语言准备好堆栈空间。

硬件设备初始化依次完成如下设置:将CPU的工作模式设为管理模式(svc),关闭WATCHDOG,设置FCLK、HCLK、PCLK的比例(即设置CLKDIVN寄存器),关闭MMU、CACHE,代码都在cpu/arm920t/start.S中。

所谓准备RAM空间,就是初始化内存芯片,使它可用。对于S3C2410/S3C2440,通过在start.S 中调用lowlevel_init 函数来设置存储控制器,使得外接的SDRAM 可用,代码在board/step/fl2440/lowlevel_init.S中。

代码重定向是将bootloader代码从nand flash中读取出来放到sdram的指定地址中,这里指定的地址为0x33f80000。

准备堆栈空间实际就是设置全局参数空间、malloc空间、指定堆栈指针,清空bss段等内容

2、第一阶段代码分析

.globl _start//声明全局变量_start,就是相当于C语言中的Extern

_start: b reset

_start后面加上一个冒号’:’,表示其是一个标号Label,类似于C语言goto 后面的标号。而同时,_start的值,也就是这个代码的位置了,此处即为代码的最开始,相对的0的位置。而此处最开始的相对的0位置,在程序开始运行的时候,如果是从NorFlash启动,那么其地址是0,_stat=0如果是重新relocate代码之后,就是我们定义的值了,即,在board\step\f24440\config.mk中的:TEXT_BASE = 0x33D00000表示是代码段的基地址,即_start=TEXT_BASE=0x33D00000.而_start 标号后面的:

b reset

就是跳转到对应的标号为reset的位置,即复位后要执行的第一条指令。

ldr pc, _undefined_instruction

ldr pc, _software_interrupt

ldr pc, _prefetch_abort

ldr pc, _data_abort

ldr pc, _not_used

ldr pc, _irq

ldr pc, _fiq

这些都是跳转向量表,和芯片体系结构有关,以第一个_undefined_instruction 为例,就是将地址为_undefined_instruction中的一个word的值,赋值给pc _undefined_instruction: .word undefined_instruction

_software_interrupt: .word software_interrupt

_prefetch_abort: .word prefetch_abort

_data_abort: .word data_abort

_not_used: .word not_used

_irq: .word irq

_fiq: .word fiq

.word .word expr {,expr}… 分配一段字内存单元,并用expr初始化字内存单元(32bit)。所以上面的含义,以_undefined_instruction为例,就是,此处分配了

一个word=32bit=4字节的地址空间,里面存放的值是undefined_instruction。

而此处_undefined_instruction也就是该地址空间的地址了。undefined_instruction也是一个标号,即一个地址值,对应着就是在发生“未定义指令”的时候,系统所要去执行的代码。其他几个对应的“软件中断”,“预取指错误”,“数据错误”,“未定义”,“(普通)中断”,“快速中断”,也是同样的做法,跳转到对应的位置执行对应的代码。所以:

ldr pc, 标号1

......

标号1:.word 标号2

......

标号2:

......(具体要执行的代码)

的意思就是,将地址为标号1中内容载入到pc,而地址为标号1中的内容,正好装的是标号2。

用C语言表达其实很简单:

PC = *(标号1)= 标号2

对PC赋值,即是实现代码跳转,所以整个这段汇编代码的意思就是:

跳转到标号2的位置,执行对应的代码。

.balignl 16,0xdeadbeef

上面的意思是,接下来的代码,都要16字节对齐,不足之处,用0xdeadbeef 填充

_TEXT_BASE:

.word TEXT_BASE

此处和上面的类似,_TEXT_BASE是一个标号地址,此地址中是一个word类型的变量,变量名是TEXT_BASE,此值见名知意,是text的base,即代码的基地址,此处TEXT_BASE为0x33f80000

.globl _armboot_start

_armboot_start:

.word _start

此含义可用C语言表示为:

*(_armboot_start) = _start

.globl _bss_start

_bss_start:

.word __bss_start

.globl _bss_end

_bss_end:

.word _end

_bss_start和_bss_end都只是两个标号,对应着此处的地址。而两个地址里面分别存放的值是__bss_start和_end,这两个的值,根据注释所说,是定义在开发板相关的链接脚本里面的,在链接脚本中可以找到__bss_start和_end的定义:__bss_start = .;

.bss : { *(.bss) }

_end = .;

#ifdef CONFIG_USE_IRQ

/* IRQ stack memory (calculated at run-time) */

.globl IRQ_STACK_START

IRQ_STACK_START:

.word 0x0badc0de

/* IRQ stack memory (calculated at run-time) */

.globl FIQ_STACK_START

FIQ_STACK_START:

.word 0x0badc0de

#endif

代码真正的开始处:

reset:

/*

* set the cpu to SVC32 mode

*/

a、硬件初始化

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3

msr cpsr,r0设置CPU为SVC模式

定义寄存器地址:

#if defined(CONFIG_S3C2400) //S3C2400寄存器地址

# define pWTCON 0x15300000

# define INTMSK 0x14400008 /* Interupt-Controller base addresses */ # define CLKDIVN 0x14800014 /* clock divisor register */

#elif defined(CONFIG_S3C2410) //S3C2410和2440相同的寄存器地址# define pWTCON 0x53000000

# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ # define INTSUBMSK 0x4A00001C

# define CLKDIVN 0x4C000014 /* clock divisor register */

#endif

#if defined(CONFIG_S3C2440)

# define CONFIG_UBOOT_SIZE 0x60000 //UBOOT大小的宏定义

# define MPLLCON 0x4C000004//S3C2440时钟配置

# define UPLLCON 0x4C000008

# define CLKDIV_VAL 5

# define M_MDIV 127

# define M_PDIV 2

# define M_SDIV 1

# define U_MDIV 56

# define U_PDIV 2

# define U_SDIV 2

#endif

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

ldr r0, =pWTCON

mov r1, #0x0

str r1, [r0] //关闭看门狗

mov r1, #0xffffffff

ldr r0, =INTMSK

str r1, [r0] //关闭所有中断

# if defined(CONFIG_S3C2440)

ldr r1, =0x7fff

ldr r0, =INTSUBMSK

str r1, [r0] //关闭所有中断

#endif

#endif

#if defined(CONFIG_S3C2440)

//配置S3C2440的PLL控制器,主要包括CLKDIVN,设置FCLK、HCLK、PCLK 的比值,这里设置为1:4:8

ldr r0,=CLKDIVN

ldr r1,=CLKDIV_VAL

str r1,[r0]

//mrc和mcr是通用寄存器同协处理器寄存器进行数据交换的指令,关于这两个指令的具体使用参考总结文献,此处访问协处理器的目的是设置总线模式为

异步总线模式。

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

orr r0,r0,#0xc0000000

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

//设置UPLLCON寄存器,设置完UPLL后需要一段延迟时间,大约为7个时钟

ldr r0,=UPLLCON

ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)

str r1,[r0]

nop

nop

nop

nop

nop

nop

nop

//设置MPLLCON寄存器,

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)

str r1,[r0]

#endif

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit

#endif

cpu_init_crit函数的主要作用是关闭cache、关闭mmu以及调用lowlevel_init 初始化BANK0~7的位宽,速度,刷新频率等重要参数。

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

cpu_init_crit:

mov r0, #0

mcr p15, 0, r0, c7, c7, 0

mcr p15, 0, r0, c8, c7, 0

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

bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)

bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)

orr r0, r0, #0x00000002 @ set bit 2 (A) Align

orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache

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

//关闭cache和mmu,在arm中cache是cpu的内部缓存,MMU实现虚拟地址与物理地址的转换。cache在cpu中用来存放常用的数据和指令,cache开启的情况下,cpu首先在cache中寻找需要的指令或数据,cache中没有再从RAM 获取,uboot启动的时候不管cache是否初始化都不会有cpu需要的数据,uboot 用来实现简单的初始化和引导操作,关闭cache优化uboot性能。C语言不能控制cache的开关,但关键字volatile能够避免优化,所谓避免优化实际上就是编译器告诉cpu在获取这个变量时不要从cache中读取,因为这个变量是随时可变的,cache不能实时的反应这些变量的值,cpu每次读取都直接从变量实际地址读取。同样关闭MMU,在uboot刚启动的时候避免虚拟地址无物理地址的转换。

mov ip, lr //保存lr的值,以便返回到主函数中

bl lowlevel_init //跳到lowlevel_init中执行

mov lr, ip

mov pc, lr //返回主函数

b、内存初始化

lowlevel_init的作用是通过配置BANK0~7的寄存器,实现对板级外部设备的控制。这里主要配置了SDRAM(BANK6)和以太网控制器DM9000(BANK4)的相关参数

#define BWSCON 0x48000000 //BANK寄存器基地址

//通过宏设置参数

/* BWSCON */

#define DW8 (0x0) //位宽参数

#define DW16 (0x1)

#define DW32 (0x2)

#define WAIT (0x1<<2)

#define UBLB (0x1<<3)

#define B1_BWSCON (DW16) //给每个BANK设置位宽宏值#define B2_BWSCON (DW16)

#define B3_BWSCON (DW16)

#define B4_BWSCON (DW16)

#define B5_BWSCON (DW16)

#define B6_BWSCON (DW32)

#define B7_BWSCON (DW32)

#define B0_Tacs 0x0 //BANKCON0时序参数

#define B0_Tcos 0x1

#define B0_Tacc 0x7

#define B0_Tcoh 0x1

#define B0_Tah 0x0

#define B0_Tacp 0x0

#define B0_PMC 0x0

#define B1_Tacs 0x0 //BANKCON1时序参数

#define B1_Tcos 0x0

#define B1_Tacc 0x7

#define B1_Tcoh 0x0

#define B1_Tah 0x0

#define B1_Tacp 0x0

#define B2_Tacs 0x0 //BANKCON2时序参数#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 0x1 //BANKCON3时序参数#define B3_Tcos 0x1

#define B3_Tacc 0x6

#define B3_Tcoh 0x1

#define B3_Tah 0x1

#define B3_Tacp 0x0

#define B3_PMC 0x0

#define B4_Tacs 0x0 //BANKCON4时序参数#define B4_Tcos 0x1

#define B4_Tacc 0x7

#define B4_Tcoh 0x1

#define B4_Tah 0x0

#define B4_Tacp 0x0

#define B4_PMC 0x0

#define B5_Tacs 0x1 //BANKCON5时序参数#define B5_Tcos 0x1

#define B5_Tacc 0x6

#define B5_Tcoh 0x1

#define B5_Tacp 0x0

#define B5_PMC 0x0

#define B6_MT 0x3 /* SDRAM */ //BANKCON6时序、地址参数#define B6_Trcd 0x0

#define B6_SCAN 0x1 /* 9bit */

#define B7_MT 0x3 /* SDRAM */ //BANKCON7时序、地址参数

#define B7_Trcd 0x0 /* 2clk */

#define B7_SCAN 0x1 /* 9bit */

/* REFRESH parameter */

#define REFEN 0x1 /* Refresh enable *///SDR特有的时序参数

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

#define Trp 0x1 /* 3clk */

#define Trc 0x1 /* 5clk */

#define Tchr 0x2 /* 3clk */

#define REFCNT 0x04f4

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

_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 ! */

//首先变换地址,由于此时SMRDATA一定在SRAM或者NOR FLASH中而

不在SDRAM中,而链接后的SMRDATA>0x33f80000

ldr r0, =SMRDATAr0指向参数表

ldr r1, _TEXT_BASE

sub r0, r0, r1

ldr r1, =BWSCON /* BWSCON地址赋给R1*/

add r2, r0, #13*4 //r2指向最后一个需要配置的BANK寄存器0:

ldr r3, [r0], #4 //将参数从参数标中取出,r0自增4

str r3, [r1], #4 //将参数放入寄存器中,r1自增4

cmp r2, r0 //寄存器是否配置完成

bne 0b //没有的话就跳到0处

/* everything is fine now */

mov pc, lr //返回cpu_init_crit

.ltorg

/* the literal pools origin */

SMRDATA: //BANK参数表

.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 0x32

.word 0x30

.word 0x30

有关SDRAM内部结构及读写操作请查看uboot之SDRAM控制

对SDRAM进行初始化后,就可以将uboot的程序代码从nand flash中读取到SDRAM中了,即代码重定向。

c、代码重定向

relocate: /* relocate U-Boot to RAM */

adr r0, _start

ldr r1, _TEXT_BASE

cmp r0, r1

beq stack_setup

上面的语句实现重定向判断,判断的依据就是代码的起始地址是否为0x33f80000,如果是则说明此时代码已经在SDRAM中,不需要执行代码重定向(这种情况一般出现在在线调试时,代码被直接下载到了SDRAM中)。如果不是,则

需要通过代码重定向将uboot代码搬移到SDRAM中。

上面adr r0, _start作用是将代码的起始地址给r0,其反汇编的语句为:sub r0, pc, #184,即将pc指针的值减去184(当前代码执行的长度),从反汇编可以看出,adr命令是通过pc相对寻址得到程序的实际起始地址。

ldr r1, _TEXT_BASE,这句很明白,就是将程序的链接地址赋给r1。

cmp r0, r1 比较r0和r1的值

beq stack_setup如果相等则跳到stack_setup处初始化堆栈,否则继续向下执行,进行代码重定向。

根据采用nand flash启动还是nor flash启动,代码重定向的语句不同。在《uboot之nand flash》中总结了nand flash代码重定向的过程,这里就介绍nor flash代码重定向。

ldr r2, _armboot_startr2的值是_start,也就是代码的起始地址

ldr r3, _bss_start由链接脚本可知,r3的值是整个代码得结尾.

sub r2, r3, r2 /* r2 = 代码的大小*/

add r2, r0, r2 /*r2 = nor falsh 里面代码的结尾*/

copy_loop:

ldmia r0!, {r3-r10} /* copy from source address [r0] */

stmia r1!, {r3-r10} /* copy to target address [r1] */ ldmia:将r0内的地址指向的内容存放到r3-r10中,每存放一个数据r0加1,sdmia:将r3-r10中的内容存放到r1指向的地址中,每存放一个数据r0加1 cmpr0, r2 /* until source end addreee [r2] */

ble copy_loop

代码重定向完成后,开始进行堆栈初始化,为调用C函数做准备了。

d、堆栈初始化

stack_setup:

ldr r0, _TEXT_BASE //将代码段基地址给r0

sub r0, r0, #CFG_MALLOC_LEN //代码段下面留一段给malloc

sub r0, r0, #CFG_GBL_DATA_SIZE //再留出一段内存给全局参数#ifdef CONFIG_USE_IRQ

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

sub sp, r0, #12//leave 3 words for abort异常,往下的内存就是堆栈了以下实现的bss段

clear_bss:

ldr r0, _bss_start /* find start of bss segment */

ldr r1, _bss_end /* stop here */

mov r2, #0x00000000 /* clear */

clbss_l:str r2, [r0] /* clear loop... */

add r0, r0, #4

cmpr0, r1

ble clbss_l

ldr pc, _start_armboot跳到C语言函数处执行

e、第一阶段修改记录

由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可。

首先,在start.s中添加对2440的中断禁止:

# if defined(CONFIG_S3C2440)

ldrr1, =0x7ff

ldrr0, =INTSUBMSK

strr1, [r0]

# endif

作用是关闭S3C2440所有的中断源。

接着,在start.s中添加对2440的PLL配置

#if defined(CONFIG_S3C2440)

# define MPLLCON 0x4C000004

# define UPLLCON 0x4C000008

# define CLKDIV_VAL 5

# define M_MDIV 127

# define M_PDIV 2

# define M_SDIV 1

# define U_MDIV 56

# define U_PDIV 2

# define U_SDIV 2

ldr r0,=CLKDIVN

ldr r1,=CLKDIV_VAL

str r1,[r0]

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

orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA

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

;Configure UPLL

ldr r0,=UPLLCON

ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)

str r1,[r0]

;Configure MPLL

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=16.9344MHz

str r1,[r0]

#endif

将代码重定向部分由nor flash代码重定向改为nand flash代码重定向。

在lowlevel_init.s中,更改REFCNT寄存器值,配置bank4和bank6的寄存器

B4_BWSCON EQU (DW16)

B6_BWSCON EQU (DW32)

;Bank 4 parameter

B4_Tacs EQU 0x0;0 ;0clk

B4_Tcos EQU 0x1;0 ;0clk

B4_Tacc EQU 0x7;7 ;14clk

B4_Tcoh EQU 0x1;0 ;0clk

B4_Tah EQU 0x0;0 ;0clk

B4_Tacp EQU 0x0

B4_PMC EQU 0x0 ;normal

100Hz

#define B6_MT 0x3 /* SDRAM */

#define B6_Trcd 0x0

#define B6_SCAN 0x1 /* 9bit */

/* REFRESH parameter */

#define REFEN 0x1 /* Refresh enable */

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

#define Trp 0x1 /* 3clk */

#define Trc 0x1 /* 5clk */

#define Tchr 0x2 /* 3clk */

#define REFCNT 0x04f4

3、第二段代码分析

第二段代码的功能是对CPU外设、uboot环境变量、网络参数等进行初始化,加载内核,设置内核启动参数,启动内核,修改命令等操作。

代码清单如下所示:

void start_armboot (void)

DECLARE_GLOBAL_DATA_PTR;

init_fnc_t **init_fnc_ptr;

char *s;

char *xs;

size_t count;

#ifndef CFG_NO_FLASH

ulong size;

#endif

#if defined(CONFIG_VFD) || defined(CONFIG_LCD)

unsigned long addr;

#endif

gd_t数据结构

gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));

//定义gd_t全局变量,gd_t是一个全局数据结构,位于文件include/asm-arm/global_data.h。其成员主要是一些全局的系统初始化参数。当使用gd_t时需用宏定义进行声明:DECLARE_GLOBAL_DATA_PTR,指定占用寄存器R8。其具体定义如下:

ypedef struct global_data {

bd_t *bd; //struct board_info指针,保存板子信息

unsigned long flags; //指示标志,如设备已经初始化标志等

unsigned long baudrate; //串口波特率

unsigned long have_console; //串口初始化标志

unsigned long env_addr; //Address of Environment struct ,环境参数地址

unsigned long env_valid; //环境参数CRC检验有效标志

unsigned long fb_base; //frame buffer的基址

#ifdefCONFIG_VFD

Tiny6410_Uboot移植步骤详解

Uboot_for_Tiny6410_移植步骤详解 一、设计要求 1.目的 1)掌握U-boot剪裁编写 2)掌握交叉编译环境的配置 3)掌握U-boot的移植 2.实现的功能 1)U-boot编译成功 2)移植U-boot,使系统支持从NAND FLASH启动 二、设计方案 1.硬件资源 1)ARM处理器:ARM11芯片(Samsung S3C6410A),基于ARM1176JZF-S核设 计,运行频率533Mhz,最高可达 667Mhz 2)存储器:128M DDR RAM,可升级至 256M;MLC NAND Flash(2GB) 3)其他资源:具有三LCD接口、4线电阻 触摸屏接口、100M标准网络接口、标准DB9 五线串口、Mini USB2.0接口、USB Host 1.1、3.5mm音频输入输出口、标准TV-OUT

接口、SD卡座、红外接收等常用接口;另外 还引出4路TTL串口,另1路TV-OUT、 SDIO2接口(可接SD WiFi)接口等;在板的 还有蜂鸣器、I2C-EEPROM、备份电池、A D 可调电阻、8个中断式按键等。 2.软件资源 1)arm-linux-gcc-4.5.1(交叉编译) 2)u-boot-2010.09.tar.gz arm-linux-gcc-4.5.1-v6-vfp-20101103.t gz 三、移植过程 1.环境搭建 1)建立交叉编译环境 2)去这2个网站随便下载都可以下载得到最 新或者你想要的u-boot。( https://www.360docs.net/doc/8d4245667.html,/batch.viewl ink.php?itemid=1694 ftp://ftp.denx.de/pub/u-boot/ )

UBoot移植详解

u-boot 移植步骤详解 1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。 选择U-Boot的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本)

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本) ?开发平台:i.MX 6UL ?最新系统: u-boot2015.04 + Linux4.1.15_1.2.0 ?交叉编译工具:dchip-linaro-toolchain.tar.bz2 源码下载地址: U-Boot: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.360docs.net/doc/8d4245667.html,/git/cgit.cgi/imx/uboot-imx.git/ Kernel: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.360docs.net/doc/8d4245667.html,/git/cgit.cgi/imx/linux-2.6-imx.git/ 源码移植过程: 1、将linux内核及uBoot源码拷贝到Ubuntu12.04系统中的dchip_imx6ul目录下; 2、使用tar命令分别将uboot和kernel解压到dchip_imx6ul目录下; 3、解压后进入uboot目录下,新建文件make_dchip_imx6ul_uboot201504.sh,且文件内容如下: ################################################################### # Build U-Boot.2015.04 For D518--i.MX6UL By FRESXC # ################################################################### #!/bin/bash export ARCH=arm export CROSS_COMPILE=/dchip-linaro-toolchain/bin/arm-none-linux-gnueabi - make mrproper # means CLEAN make mx6ul_14x14_evk_defconfig make2>&1|tee built_dchip_imx6ul_uboot201504.out 4进入kernel目录下,新建文件make_dchip_imx6ul_linux4115120.sh,且文件内容如下: ###################################################################

uboot移植步骤介绍

uboot移植过程 1.修改Makefile 首先给要建立的S3C2410开发板取名为TE2410, 移植uboot时以smdk2410为模板, 修改Makefile #tar xvjf u-boot-1.1.3.tar.bz2 #cd u-boot-1.1.3 #vi Makefile scb9328_config : unconfig @./mkconfig $(@:_config=) arm arm920t scb9328 NULL imx smdk2400_config : unconfig @./mkconfig $(@:_config=) arm arm920t smdk2400 NULL s3c24x0 smdk2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 SX1_config : unconfig @./mkconfig $(@:_config=) arm arm925t sx1 te2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0 蓝色字体是添加的内容。其中,te2410_config : unconfig意思是为TE2410建立一个编译项,@./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0中的arm表示CPU的架构是基于ARM体系结构的;arm920t表示CPU类型是arm920t;te2410是开发板的型号;NULL表示开发商或经销商的名称为空;s3c24x0表示是基于s3c24x0的片上系统。 2.在uboot的board目录下建立te2410开发板子目录 #cp –fr board/smdk2410 /board/te2410 #cd board/te2410 #mv smdk2410.c te2410.c 还要修改board/te2410/Makefile文件, OBJS := smdk2410.o flash.o -------- OBJS := te2410.o flash.o 3.在include/configs目录下建立te2410.h头文件 #cd include/configs #cp –fr smdk2410.h te2410.h 4.指定交叉编译器的路径 选择支持softfloatpoint的交叉编译器,在etc/bashrc文件中添加一行 export PATH=/home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linu x-gnu/bin:$PATH 其中, /home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu /bin是交叉编译器路径

uboot移植实验

一、移植环境 ?主机:UBUNTU ?开发板:飞凌2440 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.03.tar.bz2

3)修改u-boot根目录下的Makefile文件。查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立mini2440_config的编译选项,另外还要指定交叉编译器 4)测试编译新建的mini2440开发板项目

到此为止,u-boot对自己的mini2440开发板还没有任何用处,以上的移植只是搭建了一个mini2440开发板u-boot的框架,要使其功能实现,还要根据mini2440开发板的具体资源情况来对u-boot源码进行修改。 3. 根据u-boot启动流程图的步骤来分析或者修改添加u-boot源码,使之适合mini2440开发板(注:修改或添加的地方都用红色表示)。 1)mini2440开发板u-boot的stage1入口点分析。 一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。那么我们的my2440开发板u-boot的这个链接文件就是cpu/arm920t/u-boot.lds,打开该文件部分代码如下:

知道了程序的入口点是_start,那么我们就打开mini2440开发板u-boot第一个要运行的程序cpu/arm920t/start.S(即u-boot的stage1部分),查找到_start的位置如下: 从这个汇编代码可以看到程序又跳转到start_code处开始执行,那么再查找到start_code 处的代码如下:

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.360docs.net/doc/8d4245667.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: ?支持Nand Flash读写 ?支持从Nor/Nand Flash启动 ?支持CS8900或者DM9000网卡 ?支持Yaffs文件系统 ?支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM 处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

uboot移植笔记

u-boot-2015-01移植笔记 一、修改编译器路径 修改顶层Makefile文件,查找CROSS_COMPILE =,注释掉if判断,增加一行CROSS_CMPILE = arm-linux- (根据编译器不同这个自行添加,在这里感谢胡茂晓同学)。 二、复制平台相近board 1、进入board子目录下的samsung子目录,复制trats2文件夹为自己平台名字的文件夹(这里笔者使用iTop4412)。 2、进入iTop4412子目录,修改为。 3、修改Makefile,将trats2改为iTop4412。 三、修改板子相应配置 1、从源码根目录下进入include/configs目录,复制为。 2、从源码根目录下进入configs目录,复制trats2_defconfig为iTop4412_defconfig。 3、修改iTop4412_defconfig,将CONFIG_DEFAULT_DEVICE_TREE="exynos4412-trats2"改为CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。

四、增加自己的Device Tree Source 1、从源码根目录下进入arch/arm/Dts目录,复制 exynos4412- 。 2、修改当前目录下的Makefile文件,将 dtb-$(CONFIG_EXYNOS4) += \ \ \ \ \ 修改成 dtb-$(CONFIG_EXYNOS4) += \ \ \ \ \ \

五、制作顶层.config文件 1、在源码根目录下使用命令make menuconfig(貌似刚支持图形界面配置)。 2、先配置基本的,Architecture select 选项选择ARM architecture,architecture选项的子选项Target select选择Samsun EXYNOS;EXYNOS board select选项选择Exynos4412 Trat2 board。 3、在Device Tree Control选项下,y(yes)Run-time configuration via Device Tree,选择Provider of DTB for control 为Embedded DTB for DT control,在Default Device Tree for DT control选项下输入exynos4412-iTop4412,退出。 4、保存退出,在源码根目录下会生成.config文件,需要用命令ls –a 查看。 5、在源码根目录下使用命令vim .config,修改.config文件。将CONFIG_SYS_BOARD="trats2" 修改成CONFIG_SYS_BOARD="iTop4412";将CONFIG_SYS_CONFIG_NAME="trats2"修改成CONFIG_SYS_CONFIG_NAME="iTop4412";将CONFIG_DEFAULT_DEVICE_TREE=""修改成CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。(注意:每次使用make menuconfig后都要修改本条)

UBOOT分析移植

ARM 平台下的U-boot 移植 u-boot 移植 嵌入式BootLoader 的引导过程 图 1-1给出了嵌入式系统中的一般的引导过程,一般来说,引导程序都是保存在非易失的存储介质(如Flash 等)中,因为引导程序运行的时候需要对数据进行读写操作,所以引导程序的RW 段必须放到RAM 中,所以一般的引导程序初始化的第一件事情就是要在初始化完内存控制器后将其RW 段拷贝到RAM 中,同时开辟一段内存用于其ZI 段。如果引导过程是放置在不可原位执行的存储介质,如NAND Flash 上的时候,引导程序还必须将其自身也拷贝到RAM 中。 一般来说大概的步骤可以分为两个步骤: Stage1 ? 硬件设备初始化(内存控制器的设置); ? 为加载BootLoader 的stage2部分的代码准备RAM 空间; ? 拷贝BootLoader 的stage2部分的代码到RAM 空间中,并跳转执行; ? 设置好堆栈,Heap 等; ? 跳转到 stage2 的 C 入口点; Stage2 ? 初始化本阶段要使用到的硬件设备(net ,flash 等); ? 将OS 映像从 flash 上读到 RAM 空间中; ? 为OS 设置启动参数; ? 跳转到OS 内核image 的入口点。 图1-1 嵌入式系统引导

u-boot简介 U-Boot是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch 的Loader合称U-Boot。2002年12月17日第一个版本U-Boot-0.2.0发布,同时PPCBoot 和ARMboot停止维护。 U-Boot支持的处理器构架包括PowerPC(MPC5xx, MPC8xx, MPC82xx, MPC7xx,MPC74xx, 4xx), ARM(ARM7,ARM9,StrongARM,Xscale),MIPS (4Kc,5Kc),x86等等,U-Boot (Universal Bootloader)是在GPL下资源代码最完整的一个通用Boot Loader。 U-Boot提供两种操作模式:启动加载(Boot loading)模式和下载(Downloading)模式,并具有大型Boot Loader的全部功能。主要特性为: ●SCC/FEC以太网支持 ●BOOTP/TFTP引导 ●IP,MAC预置功能 ●在线读写FLASH,DOC, IDE,IIC,EEROM,RTC ●支持串行口kermit,S-record下载代码 ●识别二进制、ELF32、pImage格式的Image,对Linux引导有特别的支持 ●监控(minitor)命令集:读写I/O,内存,寄存器、内存、外设测试功能等 ●脚本语言支持(类似BASH脚本) ●支持WatchDog,LCD logo,状态指示功能等 U-Boot的功能是如此之强大,涵盖了绝大部分处理器构架,提供大量外设驱动,支持多个文件系统,附带调试、脚本、引导等工具,特别支持Linux,为板级移植做了大量的工作。U-Boot的完整功能性和后续不断的支持,使系统的升级维护变得十分方便。 u-boot的目录树结构 1.1.1 Borad目录 包括大量的Board dependent files的代码文件,每一个开发板都以一个子目录出现在当前目录中,每个board目录下至少包括这样几个文件 1.config.mk:其中至少包括TEXT_BASE这个一个Makefile的变量,这个变量指出了被编译的可执行uboot image应该放在RAM中的位置,也就是该image的执行位置;2.flash.c:这里主要还是对NorFlash的操作,flash的基本操作; 3.lowlevel_init.S:提供lowlevel_init函数供u-boot在第一阶段调用,一般是针对SDRAM 控制器的初始化,如设置SDRAM的刷新率,等待时钟等,一般来说,如果需要将第二阶段代码和数据拷贝到SDRAM中,这个操作是必须的; 4.Makefile:编译board目录下的代码所使用的makefile; 5.board.c:和板级相关的初始化函数,如设置GPIO,设置时钟,设置总线时序等;6.u-boot.lds:针对开发板的情况编写的连接脚本,通过连接脚本,一般应该将u-boot的stage1的代码放在image的开始的地方; 1.1.2Common目录 该目录下实现uboot支持的命令和公用函数,每一条命令都对应一个文件。例如bootm 命令对应就是cmd_bootm.c。

Uboot_for_mini6410_移植步骤详解

这是u-boot-2010.09 针对友善之臂MINI6410移植的最基础版本,只包含了就基本的系统引导,NAND读写,DM9000网卡等等。但是这个足够开发的方便使用。今后会陆续添加原先我为mini2440添加的所有功能。 但是此次移植并非我的功劳,首先基本的移植是由Alex Ling 完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的 PAD_TO := $(shell expr $$[$(TEXT_BASE) + 4096]) 即可。 DM9000的驱动没有太大的问题(修改了一点可能出现问题的地方,感谢肖工指教),但是原本的u-boot并没有调整所有SROM控制器的配置(其中包括连接DM9000所使用的bank1的总线),我使用了友善带的u-boot的参数配置了一下就好了。 一:https://www.360docs.net/doc/8d4245667.html,/batch.viewlink.php?itemid=1694 ftp://ftp.denx.de/pub/u-boot/ 去这2个网站随便下载都可以下载得到最新或者你想要的u-boot。现在我将下载u-boot-2010-09,这个也就是最新的版本啦。 下载后把它解压,然后得到u-boot-2010-09的文件夹,然后进去,并且做下面几件事情:1:进入arch这个文件夹,把出arm外的前部文件夹删掉 2:进入board这个文件夹,把除samsung外前部文件夹删掉 3:进入include/configs,把除smdk6400.h外的所有文件删除。 4: 把顶层目录下有一个叫onenand_ipl的文件夹删除掉,因为没有用到。 5:进入nand_spl/board,把除samsung外全部文件删除掉。 6:再进入arch/arm/cpu文件夹,把除arm1176外其他文件夹删除掉。 7:再进入arch/arm/include/asm文件夹,把除arch-s3c64xx文件外带arch-XX的文件夹删除8:再进入board/samsung文价夹下,把除smdk6400外其他文价夹删除掉。 至此已经把没用到或者不想见到它的文件夹跟文件删除掉了。爽吧。 二: 1:在顶层的目录下找到Makefile文件,并且打开,因为vi或者vim没用习惯而是改用gedit。lwf@lwf-desktop:/home/u-boot-2010.12$ sudo gedit Makefile 在这个Makefile你会找到: ######################################################################### ## ARM1176 Systems ######################################################################### smdk6400_noUSB_config \ smdk6400_config : unconfig @mkdir -p $(obj)include $(obj)board/samsung/smdk6400 @mkdir -p $(obj)nand_spl/board/samsung/smdk6400

黄刚--uboot在mini2440上的移植

u-boot-2009.08在2440上的移植详解(黄刚) u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载: 一、移植环境 主机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, 编译器: u-boot: 二、移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1. 了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成; u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。 各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 #tar -jxvf u-boot-2009.08.tar.bz2 //解压源码

最新Uboot移植步骤 5:NorFlash

最新Uboot移植步骤5:NorFlash 显示Flash:***failed***,说明norflash未识别,我们搜索“Flash:” 进入第一个查看 找到这个判断条件,如果flash_size>0则输出flash大小,否则输出 *** failed *** ### ERROR ### Please RESET the board ###

其中hang函数导致程序无法继续向下执行,我们只实现了nand启动肯定在这会卡住,所以我们不用这个hang 函数,直接输出flash未识别的信息就好了,改动如下: 现在来找norflash未识别的原因,进入flash_init函数 看见这样一段代码 可知,有2个函数可以检测flash的大小如果flash_detect_legacy函数不行再使用flash_get_size函数,先进入flash_detect_legacy函数看下,其结构如下: 该函数有2个,使用哪一个由宏CONFIG_FLASH_CFI_LEGACY决定,搜索该宏:

很明显,前面我们都是使用该函数进行大小检测的,而该函数无法识别flash,那我们使用新方法进行检测,进入新方法查看: 发现有很多可用调试信息,我们看看如何起用这些调试信息: 发现只要定义了_DEBUG即可启用调试信息,我们定义该宏: 在文件开始发现注释: 我们直接定义DEBUG即可,

配置,编译,下载到板子norflash: 重新上电从norflash启动,输出如下: 我们查看JEDEC PROBE:从哪来

查看norflash手册,看读取的设备ID是否正确 可以看到输出的厂家设备ID是正确的, 说明下面这个函数读取正确 那就是 函数出现错误,我们进入该函数查看:

uboot-1.1.4DM9000移植过程(成功)

作者:lgj 时间:2010年5月9日 实验内容:把移植到mini2440的uboot-1.1.4的网卡驱动由CS8900改为DM9000 Uboot原来就有DM9000的驱动代码,只要把头文件定义为选择DM9000,修改初始化函数就行了。 步骤: 1.DM9000的片选是nCS4,所以它接到SDRAM的Blank4。之前看了网上一些资料,说要修改board/utu2440/lowlevel_init.S文件,其实不用修改保持原来那样就行了。 #define B1_BWSCON (DW32) #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) #define REFCNT 1113 2.修改/include/configs/xx2440.h文件,这里定义了使用哪个网卡 /* * Hardware drivers屏蔽CS8900 */ #if 0 #define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */ #define CS8900_BASE 0x19000300 #define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */ #endif 定义DM9000 #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x20000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4) #define CONFIG_DM9000_USE_16BIT 网上很多资料说要改成0x20000300但是我的板是0x20000000 3.修改dm9000x.c

Uboot启动流程分析和移植介绍

基于MPC83xx 的U-boot 启动流程分析和移植 董 闯 北京邮电大学信息与通信工程学院,北京(100876) E-mail :donix.dong@https://www.360docs.net/doc/8d4245667.html, 摘 要:本文首先引入Bootloader 的概念,接着介绍U-boot 这种引导程序,并以Freescale 32位微处理器MPC83xx 为例,结合代码详细分析了U-boot 的启动的各个阶段及最终引导Linux 内核的过程,最后,建立交叉编译环境,针对TC8313E 目标板,给出U-boot 移植与编译的基本步骤。 关键词:U-boot;MPC83xx;交叉编译;移植;嵌入式系统 中图分类号:TP393.05 1.引言 引导程序(Bootloader)是系统加电后运行的第一段软件代码,类似于PC 机中的引导加载程序BIOS 。虽然引导程序仅在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的组成部分。通过这段小程序,初始化必要的硬件设备,创建内核需要的一些信息并将这些信息传递给内核,从而将系统的软、硬件环境配置到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。 2. U-boot 介绍 目前,嵌入式领域里出现了很多种类的Bootloader ,如Armboot 、Blob 、Redboot 、vivi 和U-boot 等,其中U-boot 是使用最广泛,功能最完善的。 U-boot (Universal Boot Loader)是从PPCBOOT 发展演化而来[1] ,其源码目录、编译形式与Linux 内核很相似,事实上,不少U-boot 源码就是相应的Linux 内核源程序的简化,尤其是一些设备的驱动程序,这从U-boot 源码的注释中就能体现。U-boot 中Universal 有两层含义,一是U-boot 除了支持PowerPC 系列的处理器外,还能支持MIPS 、x86、ARM 、NIOS 、XScale 等诸多常用系列的处理器;另外一层含义则是U-boot 不仅仅支持嵌入式Linux 操作系统的引导,还支持OpenBSD, NetBSD, FreeBSD, SVR4, Solaris, VxWorks, LynxOS, pSOS, lrix, RTEMS, QNX, ARTOS 等操作系统的引导。这两个特点正是U-boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-boot 对PowerPC 系列处理器支持最为丰富,对Linux 的支持最完善。 3. U-boot 启动流程分析 大多数Bootloader 都分为阶段1(stage1)和阶段2(stage2)两大部分,U-boot 也不例外。依赖于CPU 体系结构的代码(如CPU 初始化代码等)通常都放在阶段1 中,这些代码一般由汇编语言实现,有些CPU 还会在这个阶段调用部分的C 函数,例如MPC83xx ;U-boot 的阶段2则用于实现复杂的功能,这部分功能通常用C 语言来实现,具有更好的可读性和移植性。下面结合MPC83xx 的启动流程进行分析: 3.1 U-boot 的stage1 https://www.360docs.net/doc/8d4245667.html, 中国科技论文在线

uboot移植整理

1.Make 编译uboot出错: …… …… board.c:138: error: inline function 'coloured_LED_init' cannot be declared weak board.c:140: error: inline function 'red_LED_on' cannot be declared weak board.c:142: error: inline function 'red_LED_off' cannot be declared weak board.c:144: error: inline function 'green_LED_on' cannot be declared weak board.c:146: error: inline function 'green_LED_off' cannot be declared weak board.c:148: error: inline function 'yellow_LED_on' cannot be declared weak board.c:150: error: inline function 'yellow_LED_off' cannot be declared weak make[1]: *** [board.o] 错误1 make[1]:正在离开目录`/opt/u-boot-1.3.4/lib_arm' make: *** [lib_arm/libarm.a] 错误2 开始编译的时候会出现上面的错误,继续移植操作这个错误将消失。或者注释掉出错行。 ****挂载文件系统时候的错误:************ …… …… TCP cubic registered NET: Registered protocol family 17 drivers/rtc/hctosys.c: unable to open rtc device (rtc0) VFS: Unable to mount root fs via NFS, trying floppy. VFS: Cannot open root device "nfs" or unknown-block(2,0) Please append a correct "root=" boot option; here are the available partitions: 1f00 16 mtdblock0 (driver?) 1f01 2048 mtdblock1 (driver?) 1f02 4096 mtdblock2 (driver?) 1f03 2048 mtdblock3 (driver?) 1f04 4096 mtdblock4 (driver?) 1f05 10240 mtdblock5 (driver?) 1f06 24576 mtdblock6 (driver?) 1f07 16384 mtdblock7 (driver?) Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0) [] (unwind_backtrace+0x0/0xf0) from [] (panic+0x54/0x17c) 解决方法:保证传入的命令行参数正确无误,保证NFS配置成功,rootfs正确,可以重启机器试试。 错误:error: common/libcommon.a(main.o) uses FPA instructions, whereas u-boot does not /opt/opt/FriendlyARM/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-ld: failed to merge target specific data of file common/libcommon.a(main.o)

的linuuboot移植

嵌入式Linux之我行——在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载: 一、移植环境 主机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, 编译器: u-boot:二、移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/文件中,他用汇编语言写成; u-boot的stage2代码通常放在lib_xxxx/文件中,他用C语言写成。各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 #tar -jxvf /../../

根据u-boot启动流程图的步骤来分析或者修改添加u-boot源码,使之适合my2440开发板(注:修改或添加的地方都用红色表示)。 1)my2440开发板u-boot的stage1入口点分析。 一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。那么我们的my2440开发板u-boot的这个链接文件就是cpu/arm920t/,打开该文件部分代码如下:

UBOOT移植验

U-BOOT移植实验 u-boot简介 u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, u-boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。u-boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。 u-boot源码目录介绍 u-boot的启动过程 1 启动流程 我们一般把bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。 1 阶段1,汇编代码,对于s3c2410是cpu/arm920t/start.s文件。 主要流程如下:

关闭看门狗 禁掉所有中断 设置以CPU的频率 把自己拷贝到RAM 配置内存区控制寄存器 配置的栈空间 进入C代码部分 2 阶段2是C语言代码,在lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数。这个函数调用一系列的初始化函数,然后进入主UBOOT命令行,进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。 当用户输入启动linux的命令的时候,u-boot会将kernel 映像(zImage)和从nand flash 上读到RAM 空间中,为内核设置启动参数,调用内核,从而启动linux。 u-boot移植要点: 我们可以总结出bootloader的两大功能: 1 是下载功能,既通过网口、串口或者USB口下载文件到RAM中。 2 是对flash芯片的读写功能。 u-boot对S3C2410已经有了很好的支持,我们在移植过程中主要是完善u-boot对nand flash的读写功能。 u-boot移植前的准备工作: 1 下载源码,建立工作目录 Uboot的源码可以从以下网址下载: https://www.360docs.net/doc/8d4245667.html,/u-boot/u-boot-1.1.4.tar.bz2?modtime=1134752480&big_m irror=0 我们这里下载的是u-boot-1.1.4.tar.bz2 建立工作目录: mkdir /root/build_uboot cd /root/build_uboot 把下载的源码拷贝到该目录,解压; tar jxvf u-boot-1.1.4.tar.bz2 mv u-boot-1.1.4 u-boot

相关文档
最新文档