当前位置:文档之家› U-boot移植

U-boot移植

U-boot移植
U-boot移植

移植U-Boot2009-01到阳初S3C2440超值版支持NAND启动,支持YAFFS文件系统

参考了《移植U-Boot-2008.10到友善之臂mini2440》

https://www.doczj.com/doc/b516317333.html,

要知道需要修改那些文件就要分析顶层Makefile【bootloader是什么?分为几个阶段?每阶段分别完成什么任务?】

根据README,先要运行make _config然后再运行make来生成uboot执行文件,根据makefile的语法这个_config必然是makefile中定义的一个target,那么我们就要

①仿照其他的开发板来建立自己开发板的_config,与我的开发板最相近的为smdk2410,所以根据smdk2410_config来写自己的gateway_config并加入到顶层makefile中;从顶层makefile中_config目标的执行命令可以看出调用了mkconfig脚本,正常执行本脚本后应该会在./include中生成两个文件:config.mk和config.h并且会将输入的参数传递到ARCH、CPU、BOARD、VENDOR、SOC几个变量中,且在生成的config.h文件中将包含configs/$1.h文件,所以我们要

②在configs下建立自己开发板的.h头文件,可以通过拷贝相似开发板的头文件;

③修改子目录下的makefile;

④修改源文件中与2440不符的内容。

一个调试方法就是用板子上已能正常跑起来的bootloader将刚改过编译好的uboot下载到内存中运行,具体操作为:定义CONFIG_SKIP_LOWLEVEL_INIT为“1”,或者注释掉start.s中

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit

#endif

这三句中间的那句跳转,然后修改当前开发板目录下的config.mk中的text_base为0x33000000,使用vivi 命令load ram 0x33000000 0x17ea8 x将u-boot.bin装入内存。再用go 0x33000000命令,即可。

· 1、建立开发板目录,因为开发板跟smdk2440的硬件结构类似,而u-boot中最相近的配置为smdk2410,所以先复制smdk2410开发板目录为新的开发板目录:#cp -r /board/smdk2410 /board/hgateway。

·2、将开发板目录中的开发板配置文件更名#mv /board/smdk2410/smdk2410.c /board/smdk2410/hgateway.c。

· 3、修改/board/hgateway下的makefile,将COBJS:=smdk2410.o flash.o改为COBJS:=hgateway.o flash.o ·4、在/include/configs下建立新的开发板配置头文件#cp /include/configs/smdk2410.h /include/configs/hgateway.h。

· 5、修改顶层Makefile文件建立新开发板选项:在smdk2410_config:unconfig下增加:

hgateway_config:unconfig

@$(MCCONFIG)$(@:_config=)arm arm920t gateway NULL s3c24x0

注意还要改一点:__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))

改为:__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS)) 网上说UBOOT1.3.3以后Makefile发生了变化,编译器会将我们添加唉的用于nandboot的子函数放到4k以后。这个可以通过比较查看System.map文件可知。(有时间真要把这个两个编译一下比较看看)

这时执行#make hgateway_config&&make all可以顺利得到u-boot.bin文件了,但是别忘了这是对S3C2410的,并且是针对smdk2410开发板的,如果下到我们自己的开发板上,呵呵因为硬件配置不同,肯定是跑不起来的。下面就要更改源文件,编译出适合我们自己开发板的u-boot了。

· 6、根据芯片Datasheet及板子的硬件配置更改相应的源文件,根据顶层makefile可知,跟移植相关的几个文件夹及文件为:cpu/arm920t/start.S;cpu/arm920t/s3c24x0/;lib_arm/;board/hgateway/。首先是CPU初始化的汇编文件,根据顶层Makefile的可知在/cpu/arm920t下的start.S文件,其次是cpu/soc/下的相关文件,再次是改include/config/.h,然后就是更改跟板密切相关的/board/下的开发板子目录中的文件。(我的开发板的LED状况:LED1-GPF6,LED2-GPF7低电平亮)

·Ⅰ、更改/cpu/arm920t/start.S这是bootloader的stage1负责初始化硬件环境并把uboot从flash加载到RAM中,然后跳转到C语言中去。之所以后缀名为大写是因为start.S中有很多预处理,而GNU as是不能做宏处理和文件包含处理的,要处理这些宏只有交给CPP预处理器来做,查看GCC帮助可以看出要用大写的S才能。【来源于天行者博客vivi源码分析】,注意在这个文件中包含了config.h,而config.h是由mkconfig生成的,其中只有一句话"#include ",所以注意再更改完start.S及相关的启动文件后还要更改configs/$1.h中有关板子的配置。

第一阶段流程:

·异常向量表

·置处理器为管理模式

·关闭看门狗(加入对S3C2440的支持:defined(CONFIG_S3C2440))

·关闭所有中断(S3C2440的INTSUBMSK寄存器有15位可用,加入对S3C2440的支持的代码)

·设置LOCKTIME寄存器

·设置摄像头时钟分频寄存器

·设置时钟分频(S3C2440的时钟高达400M,设置分频为1:4:8)

·设置写处理器P15给快时钟一个缓冲

·写UPLLCON寄存器,使USB的PLL时钟生效

·等待USB的PLL时钟生效

·写MPLLCON寄存器,使主PLL生效,产生FCLK时钟

· CPU初始化

关闭CACHE和MMU

底层硬件初始化(这里跟开发板密切相关,需要更改,主要更改lowlevel_init.S文件)

将UBOOT自己拷贝到RAM中(这里加上从NAND启动,因为S3C2440的NAND的前4K为自启动区,所以只要在4K范围内完成前面的工作及其自身的拷贝就可以了。这里加上的代码为对NAND的初始化,以及将UBOOT从NAND搬移到RAM的功能)

跳到C语言中完成第二阶段

分析start.S可知,在uboot中为了做到通用性,将跟特定SOC或开发板有关的初始化都放到板级目录下的lowlevel_init.S中去了。所以uboot的第一阶段初始化其实涉及到两个文件start.S和板级目录下的lowlevel_init.S

·Ⅱ、更改/board/hgateway/lowlever_init.S,此文件主要完成对储存器的初始化.

· 1、因为S3C2410和S3C2440的内存控制寄存器的地址相同,所以寄存器的地址不用更改。

·2、因为内存芯片可能不同,需要修改相应BANKCON的值。自己开发板所用的芯片为:HY57V566120FTP-H,RAS to CAS的延时最小要求20ns,若HCLK(就是提供给SDRAM的时钟)为100MHz的话,时钟周期为10ns,那么至少需要2个时钟周期,保险起见,可以多一点。如果要提升速度应该可以改小一点。这里按默认的2个时钟。

·Ⅲ、因为启动第一阶段的两个文件都引用了/config.h而/config.h中,只是包含了/include/configs/hgateway.h,在这个文件里配置了开发板的基本情况,包括晶振,网卡,网络MAC,IP,

主机IP,分配内存空间,启动延时等。在其中添加上有关2440的配置,并修改。(这里面的uboot启动参数真是难设置啊)

·Ⅳ、在board/hgateway/中加入NAND读取函数(start.S中需要的nand_read_ll),文件nand_read.c ·Ⅴ、修改board/hgateway/Makefile,将nand_read.c编译进uboot:OBJS := mini2440.o nand_read.o flash.o

·Ⅵ、修改board/hgateway/hgateway.c中关于时钟的宏定义、GPIO的设置、开发板类型设置。

·Ⅶ、【在/common/cmd_nand.c中的do_nand函数中增加对nand write.yaffs命令的支持,让uboot支持烧写yaffs映像文件。在include/linux/mtd/mtd.h的mtd_info 结构体定义中加入两个变量,在drivers/mtd/nand/nand_util.c的nand_write_skip_bad函数中加两段程序,一段是为了计算正常数据的长度,一段是为了在写入一段数据后,数据指针能正常跳到下一段数据,在/drivers/mtd/nand/nand_base.c 的nand_write函数中,加入一段把正常数据与oob数据分离的代码,再加入页写时的模式设置为MTD_OOB_RAW,在页写时,不进行ECC的校验,ECC的校验在yaffs的oob数据中已自带了,不能重写。此模式下,写入正常数据后,会把oob的数据写入nand的oob区。『参考移植uboot2008.10到友善之臂mini2440』】

·Ⅷ、修改/cpu/arm920t/s3c24x0/nand.c,因为2440和2410的NAND控制寄存器不同,所以首先要修改寄存器定义的宏,

·Ⅸ、更改speed.c中的时钟计算公式

·Ⅹ、把其他文件中含有CONFIG_S3C2410的宏增加对CONFIG_S3C2440的定义(cpu/arm920t/s3c24x0/i2c.c,在相应的文件中把包含了CONFIG_SMDK2410的文件,增加CONFIG_GATEWAY2440

·Ⅺ、为了能将环境变量保存到NAND中,还要修改common/env_nand.c文件

·Ⅻ、修改\board\hgateway\u-boot.lds,在cpu/arm920t/start.o(.text)下增加一行board/hgateway/nand_read.o(.text)

·修改DM9000驱动,注释掉/drivers/net/dm9000x.c中与MII接口相关的语句

·编译、下载:#make distclean&&make hgateway_config&&make all,然后通过JFLASH,JSF或者是开发板原有的bootloader下载到NAND FLASH中,【uboot:首先把二进制文件下到ram中:loadb,然后利用nand write命令:nand write 内存地址nand偏移地址『注意NAND也是从0地址开始的,所以在烧写bootloader的时候要从0地址开始写』写入大小『要是页大小的整数倍』。还要注意写之前一定要先擦除。对于linux内核镜像,若是uImage可以用bootm来启动,若是zImage格式则可以用go来运行,当然也

可以先处理后再用bootm来启动。把阳初的zImage烧到内存0x30008000地址处,然后用go 0x30008000命令来启动内核,结果停在了booting the kernel处。网上查到原因:“是我的mach_type参数在传给内核的时候,参数不匹配才会一直卡在那里”,在内核中mach_type在/arch/arm/tools中的mach_type文件中,在uboot中mach_type有hgateway.c中决定的我定义的为362。那么我们来查找阳初的vivi中开发板的mach_type为多少,在include/platform下有一句:#define MACH_TYPE 193.很明显两个参数不一样,所以修改内核中的参数增加MACH_TYPE_S3C2440 362的定义『/*adress of boot parameters */0x30000100』】

·vivi中传递给内核的启动参数在linux_cmd【】数组中。

·vivi中的很多设置在smdk.c文件中,GPIO寄存器的配置在SMDK2440.h中

·注意:uboot启动内核的命令是bootm,bootm会将一些内核用的到的参数传递到R0,R1,R2中,但是bootm 只能处理由uboot工具mkimage生成的镜像。如果用go来运行ram中的内核可能导致不正常。【mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.17.13 -d zImage uImage2.6.17.13

-A arm --------架构是arm

-O linux --------操作系统是linux

-T kernel --------类型是kernel

-C none --------压缩类型为无压缩

-a 30008000 ----image的载入地址(hex)

-e 30008040 ----内核的入口地址(hex),因为信息头的大小是0x40

-n linux-2.6.17.13 --- image的名字

-d zImage ----无头信息的image文件名

uImage2.6.17.13 ----加了头信息之后的image文件名】【自带vivi:Linux command line: noinitrd init="/linuxrc" console="ttyS0" root="/dev/mtdblock/2" ma

c=00:01:5d:68:7a:0f,mach_type362】

1. 修改顶层Makefile,增加一行

hgateway_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t hgateway NULL s3c24x0

hgateway为我的目标板名字。注意第二行前面有一个TAB,这是Makefile的语法规定的命令前面必须有个TAB。5个参数顺序分别为:CPU架构(ARCH);CPU类型(CPU);开发板型号(BOARD);开发者/经销商(VENDER);片上系统(SOC)。

在《移植U-Boot-2008.10到友善之臂mini2440》中提到对于1.3.3版本以上的U-Boot还要修改__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))为__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))才能保证nand_read_ll放在前4K中,我觉得这里不改,而改链接文件,将nand_read.o放到代码段的前面也是一样的。

2. 修改/cpu/arm920t/start.S

a) 删除关于AR91RM9200的代码

#include

……

bl coloured_LED_init

bl red_LED_on

……

#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK)

/*

* relocate exception table

*/

ldr r0, =_start

ldr r1, =0x0

mov r2, #16

copyex:

subs r2, r2, #1

ldr r3, 【r0】, #4

str r3, 【r1】, #4

bne copyex

#endif

b) 修改为对S3C2440的支持

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

#if defined (CONFIG_S3C2440)

c) 删除关于2400的部分

# if defined(CONFIG_S3C2400)

# define pWTCON 0x15300000

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

#else

d) 增加S3C2440的时钟控制寄存器

# define CAMDIVN 0x4C000018

//CAMDIVN 2440增加了摄像头,CAMDIVN将影响到CLKDIVN

# define MPLLCON 0x4C000004 //MPLLCON register

# define UPLLCON 0x4C000008 //UPLLCON register

e) 去掉宏# if defined(CONFIG_S3C2410)并修改子中断屏蔽控制寄存器的值ldr r1, =0x7ff

ldr r0, =INTSUBMSK

str r1, 【r0】

改为

ldr r1, =0x7fff

ldr r0, =INTSUBMSK

str r1, 【r0】

f) 增加PLL的初始化,对于S3C2440来说,只有当PLL初始化以后CPU才能按照设定的时钟进行工作,即使全部用初始值也必须重新写一次PLL。

//初始化时钟,晶振为12MHz,主频为405MHz

//locktime用来在正常运行时更改时钟的时候保护时钟

ldr r0,=LOCKTIME

mov r1,#0xffffff

str r1,【r0】

//清除摄像头分频寄存器值

ldr r0,=CAMDIVN

mov r1,#0

str r1,【r0】

修改时钟分频为1:4:8

ldr r0, =CLKDIVN

mov r1, #3

str r1, 【r0】

改为

ldr r0, =CLKDIVN

mov r1, #5

str r1, 【r0】

在其后增加对UPLL和MPLL的初始设置

//在2440的手册中写着若HDIVN不为0,则需要下面几句

mrc p15, 0, r1, c1, c0, 0 @ read ctrl register

orr r1, r1, #0xc0000000 @ Asynchronous

mcr p15, 0, r1, c1, c0, 0 @ write ctrl register

//USB时钟48MHz (56<<12)+(2<<4)+(2)

ldr r0, =UPLLCON

ldr r1, =0x00038022

str r1, 【r0】

//arm920t为5级流水线,延迟几个周期,使指令生效

nop

nop

nop

nop

nop

nop

nop

nop

//写MPLL使pll生效,405MHz,(127<<12)+(2<<4)+(1)

ldr r0, =MPLLCON

ldr r1, =0x0007f021

str r1, 【r0】

# endif

g) 将U-Boot中本是Flash到RAM的重定向代码,改为NAND到RAM的重定向代码删除

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

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

adr r0, _start /*r0 <- current position of code */

ldr r1, _TEXT_BASE /*test if we run from flash or RAM */ cmp r0, r1 /*don…t reloc during debug */

beq stack_setup

ldr r2, _armboot_start

ldr r3, _bss_start

sub r2, r3, r2 /*r2 <- size of armboot */

add r2, r0, r2 /*r2 <- source end address */

copy_loop:

ldmia r0!, {r3-r10} /*copy from source address 【r0】*/ stmia r1!, {r3-r10} /*copy to target address 【r1】*/

cmp r0, r2 /*until source end addreee 【r2】*/

ble copy_loop

#endif

新增NAND初始化及重定向代码

//这段代码即VIVI中的copy_myself,但要注意2440和2410的NAND寄存器不同@ reset NAND

mov r1, #NAND_CTL_BASE //0x4E000000

ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )

str r2, 【r1, #oNFCONF】//根据手册设置NAND

ldr r2, 【r1, #oNFCONF】

ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control

str r2, 【r1, #oNFCONT】//允许片选,允许NAND Flash控制寄存器

ldr r2, 【r1, #oNFCONT】

ldr r2, =(0x6) @ RnB Clear

str r2, 【r1, #oNFSTAT】//清除忙标志,Rnb_TransDetect位写“1”即可清楚忙标志ldr r2, 【r1, #oNFSTAT】

mov r2, #0xff @ RESET command //发送复位命令

strb r2, 【r1, #oNFCMD】

mov r3, #0 @ wait

1: add r3, r3, #0x1

blt 1b

2: ldr r2, 【r1, #oNFSTAT】@ wait ready

//等待前一次操作完成,通过判断Rnb_TransDetect位实现

tst r2, #0x4

beq 2b

ldr r2, 【r1, #oNFCONT】

orr r2, r2, #0x2 @ Flash Memory Chip Disable

str r2, 【r1, #oNFCONT】// 关闭片选,到这里只是完成了NAND初始化。

@ get read to call C functions (for nand_read()) //为C准备堆栈

ldr sp, DW_STACK_START @ setup stack pointer

mov fp, #0 @ no previous frame, so fp="0"

@ copy vivi to RAM

//r0,r1,r2为传递给C的参数

ldr r0,=TEXT_BASE //数据存放位置,即要拷贝到哪里

mov r1, #0x0 //拷贝的起始地址

mov r2, #0x30000 //拷贝长度

bl nand_read_ll //跳到C语言中

tst r0, #0x0 //nand_read_ll返回0则读取成功

beq ok_nand_read

1: b 1b @ infinite loop

//为什么读取错误时设一个无限循?这样不是启动不来了么?为什么不重新读取

ok_nand_read:

@ verify

mov r0, #0

ldr r1, =TEXT_BASE

mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes

go_next:

ldr r3, 【r0】, #4

ldr r4, 【r1】, #4

teq r3, r4

bne notmatch //比较前4K的内容是否拷贝正确

subs r2, r2, #4

beq stack_setup

bne go_next

notmatch:

1: b 1b

#endif // CONFIG_S3C2440_NAND_BOOT

3. 在/board子目录中建立自己的目标板hgateway目录

a) 复制/board/smdk2410为/board/hgateway

b) 更改smdk2410.c为gateway.c

c) 增加NAND Flash读取函数,复制VIVI中的nand_read.c到/board/hgateway中

nand_read.c

#include

#define __REGb(x) (*(volatile unsigned c har *)(x))

#define __REGi(x) (*(volatile unsigned int *)(x))

#define NF_BASE 0x4e000000 //定义NAND 控制寄存器

#define NFCONF __REGi(NF_BASE + 0x0)

#define NFCONT __REGi(NF_BASE + 0x4)

#define NFCMD __REGb(NF_BASE + 0x8)

#define NFADDR __REGb(NF_BASE + 0xC)

#define NFDATA __REGb(NF_BASE + 0x10)

#define NFSTAT __REGb(NF_BASE + 0x20)

#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))

//定义允许片选的宏

#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))

//定义禁止片选的宏

#define NAND_CLEAR_RB (NFSTAT |= (1<<2))

//定义清除忙标志的宏

#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}

//定义检测忙标志的宏

#define BUSY 4

inline void wait_idle(void) { //等待NAND操作完成

while(!(NFSTAT & BUSY));

NFSTAT |= BUSY;

}

#define NAND_SECTOR_SIZE 512 / /页大小

#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)

/*low level nand read function */

//底层NAND读取函数

int

nand_read_ll(unsigned ch ar *buf, unsigned long start_addr, int size)

{

int i, j;

//检测是否达到NAND页边缘,若超过边界就返回-1

if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { return -1; /*invalid alignment */

}

NAND_CHIP_ENABLE; //开片选

for(i=start_addr; i < (start_addr + size);) {

/*READ0 */

NAND_CLEAR_RB; //清除忙标志

NFCMD = 0; //发送读取前半页命令

/*Write Address */ //写入读取地址

NFADDR = i & 0xff;

NFADDR = (i >> 9) & 0xff;

NFADDR = (i >> 17) & 0xff;

NFADDR = (i >> 25) & 0xff;

NAND_DETECT_RB; //检测忙标志,等待操作完成

//读取数据

for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {

*buf = (NFDATA & 0xff);

buf++;

}

}

NAND_CHIP_DISABLE; //关片选,读取函数结束

return 0;

}

d) 修改lowlevel_init.S

BANK3接DM9000A,BANK6接RAM,注意BANK6和BANK7要设置成相同的值

修改SDRAM的刷新时间

#define REFCNT 1259 /*period="7".9us, HCLK="100Mhz", (2048+1-7.9*100) */ 7.9us的周期是因为手册上写着68ms/8192clk

e) 修改hgateway.c

根据手册修改时钟

#define FCLK_SPEED 1

//将时钟改为2440的405MHz

#if FCLK_SPEED==0 /*Fout = 532MHz, Fin = 12MHz for Audio */

#define M_MDIV 0x7d

#define M_PDIV 0x1

#define M_SDIV 0x1

#elif FCLK_SPEED==1 /*Fout = 405MHz */

#define M_MDIV 0x7f

#define M_PDIV 0x2

#define M_SDIV 0x1

#endif

#define USB_CLOCK 1

#if USB_CLOCK==0

#define U_M_MDIV 0x38 //96MHz

#define U_M_PDIV 0x2

#define U_M_SDIV 0x1

#elif USB_CLOCK==1 //48MHz

#define U_M_MDIV 0x38

#define U_M_PDIV 0x2

#define U_M_SDIV 0x2

#endif

在board_init()函数中可以加入一些点灯操作。以便调试方便。

f) 修改此目录下的Makefile

COBJS := smdk2410.o flash.o改为:COBJS := hgateway.o nand_read.o flash.o g) 修改链接脚本u-boot.lds

.text :

{

cpu/arm920t/start.o (.text)

*(.text)

}

改为

.text :

{

cpu/arm920t/start.o (.text)

board/hgateway/lowlevel_init.o(.text)

board/hgateway/nand_read.o(.text)

*(.text)

}

确保把lowlevel_init.S和nand_read.c放到代码的前面。

4. 修改/cpu/arm920t/s3c24x0/nand.c

加入S3C2440的NAND控制寄存器地址

#if defined(CONFIG_S3C2440) //增加对2440的NAND FLASH控制寄存器的定义#define NF_BASE 0x4e000000

#define NFCONF __REGi(NF_BASE + 0x0)

#define NFCONT __REGi(NF_BASE + 0x4)

#define NFCMD __REGb(NF_BASE + 0x8)

#define NFADDR __REGb(NF_BASE + 0xC)

#define NFDATA __REGb(NF_BASE + 0x10)

#define NFMECCD0 __REGi(NF_BASE + 0x14)

#define NFMECCD1 __REGi(NF_BASE + 0x18)

#define NFSECCD __REGi(NF_BASE + 0x1C)

#define NFSTAT __REGb(NF_BASE + 0x20)

#define NFSTAT0 __REGb(NF_BASE + 0x24)

#define NFSTAT1 __REGb(NF_BASE + 0x28)

#define NFMECC0 __REGb(NF_BASE + 0x2C)

#define NFMECC1 __REGb(NF_BASE + 0x30)

#define NFSECC __REGb(NF_BASE + 0x34)

#define NFSBLK __REGb(NF_BASE + 0x38)

#define NFEBLK __REGb(NF_BASE + 0x3C)

#define S3C2440_NFCONT_nCE (1<<1)

#define S3C2440_ADDR_NALE 0x0c

#define S3C2440_ADDR_NCLE 0x08

#endif

以下参考《移植U-Boot-2008.10到友善之臂mini2440》

u-boot.2008.10自带的S3C2410的s3c2410_hwcontrol函数有错。在此函数中,把chip->IO_ADDR_W 值改写了,导致在写数据时出现错误。解决方法是使用一全局变量代替chip->IO_ADDR_W。在s3c2410_hwcontrol 函数上一行定义这个全局变量,然后修改s3c2410_hwcontrol 函数,让它支持S3C2440,修改后如下:

#define S3C2410_ADDR_NCLE 8

ulong IO_ADDR_W = NF_BASE;

static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)

{

struct nand_chip *chip = mtd->priv;

DEBUGN("hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl);

#if defined(CONFIG_S3C2410)

if (ctrl & NAND_CTRL_CHANGE) {

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.doczj.com/doc/b516317333.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.doczj.com/doc/b516317333.html,/git/cgit.cgi/imx/uboot-imx.git/ Kernel: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.doczj.com/doc/b516317333.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是交叉编译器路径

【免费下载】am335x uboot移植

AM335x uboot 移植 2013-06-11 22:36:39| 分类:am335x-艾默生 | 标签:uboot am335x 移植|举报|字号订阅 uBOOT的编译命令 直接一次性编译 make O=am335x CROSS_COMPILE=arm-arago-linux-gnueabi ARCH=arm am335x_evm 配置 make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- am335x_evm_config 编译 make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi-清理 make clean ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi-make distclean ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi-编译器环境变量的设置 这个环境变量是TI的SDK包里面带的编译器,不是之前的arm-gcc-export PATH=$PATH:/mnt/disk1/ti-sdk-am335x-evm-05.05.00.00/linux-devkit/bin/ UBOOT里面的MLO(u-boot-spl) 如果使用NAND启动,那么这个文件就是相当于NBOOT,进行第一次的引导 这个MLO实际上就是u-boot-spl.bin生成的, 在编译完uboot后,SPL的目录里面会产生了许多的.o文件,这里文件就是uboot的文件, 可以打开Makefile,有一些对应的宏定义,可以取消,减少MLO文件的大小 UBOOT的链接脚本lds UBOOT\arch\arm\cpu\armv7\u-boot.lds 正常运行UBOOT的lds UBOOT\arch\arm\cpu\armv7\omap-common\u-boot.lds 这个是nboot,加载uboot用 有2个lds,不同的作用,注意要区别开 增加新的单板支持 在boards.cfg文件中,找到加入,例如 单板名字 arm armv7 对应board的目录 ti ti81xx 以后就可以执行make 单板名字来生成uboot,这里被ti改写了,所以不是原版的uboot 生成方法 一些代码的定位 u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7 这个目录下的几个文件,start.s这个是程序的入口执行文件 u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7/omap-common u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7/ti81xx 这2个目录是和平台板子相关,AM335X是ti81xx的版本 以上都是和CPU有关 u-boot-2011.09-psp04.06.00.08/arch/lib ARM平台的公用代码 u-boot-2011.09-psp04.06.00.08/lib 通用的库代码,无论什么平台都编译 board/ti/xxx 这个目录就是单板的配置

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.doczj.com/doc/b516317333.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项目的代码作为模板,以后再修改

u_boot移植(五)之分析uboot源码中nand flash操作

u_boot移植(五)之分析uboot源码中nand flash操作 一、OneNand 和Nand Flash 我们已经能从Nand Flash启动了,启动之后,大家会看到如下效果: 可以看出,我们的uboot默认使用的是OneNand。需要注意的是我们的FSC100上面是没有OneNand的,有的是K9F2G08U0B 型号的NAND FLASH。 前面我们了解过Nor Flash 和Nand Flash,那OneNand Flash又是什么呢?

二、uboot 源码中Nand Flash部分代码分析 我们从Nand Flash初始化看起,打开lib_arm/board.c文件,为了紧抓主 线,以下代码只列举出了主线代码。

可以看出,我们可以通过CONFIG_CMD_NAND和 CONFIG_CMD_ONENAND两个宏来选择NAND FLASH初始化还是 ONENAND FLASH初始化。 uboot 中默认定义了宏CONFIG_CMD_ONENAND,所以选择的是ONENAND FLASH初始化。我们的FSC100上面使用的是 NAND FLASH,所以我们要定义CONFIG_CMD_NAND宏,取消CONFIG_CMD_ONENAND宏的定义。 嗯!先做个记录: 修改include/configs/fsc100.h,定义宏CONFIG_CMD_NAND,取消宏CONFIG_CMD_ONENAND。 好了,接下我们看看nand_init()函数时如何实现的。

看以看出,这段代码调用根据CONFIG_SYS_MAX_NAND_DEVICE宏[默认没有定义]的值来决定系统中Nand Flash设备的个数。接着调 用nand_init_chip()函数完成Nand Flash初始化,然后计算出每块Nand Flash的大小。最终会输出Nand Flash总的容量。 嗯!做个记录: 修改include/configs/fsc100.h,定义 宏CONFIG_SYS_MAX_NAND_DEVICE,值为1 没有看明白的地方是给nand_init_chip()函数传递的参数,接下来我们来看看他们是如何定义的。 哈哈,终于到了让人头疼的地方了。先来看看struct nand_chip和struct mtd_info两个结构体,这两个结构体的成员有很多很多,很多初学者一看到就晕头转向了,为了让大家不被吓到,我对这两个结构体的成员做了精简,只保留我们关心的成员,其它的都去掉了。 (1)struct nand_chip

iTop4412的uboot第一阶段

2 uboo t 源码分析 2.5.1.star t.S 2.5.1.star t.S 引入引入 2.5.1.1、u-boot.lds中找到start.S入口 (1)在C语言中整个项目的入口就是 main函数(这是 个.c文件的项目,第一个要分析的文件就是包含了C语言规定的),所以譬如说一 个有 main函数的那个文件。 10000 ( 2 方。ENTRY(_start)因此 _start 符号所在的文件就是整个程序的起始文 件, _sta rt 所在处的 代码就是整个程序的起始代码。 2.5.1.2、SourceInsight中如何找到 文件 (1)当前状况:我们知道在uboot中的1000多个文件中有一个符号 叫 _start,但是我们不知道 这个符号在哪个文件中。这种情况下要查找一个符号在所有项目中文件中的引用,要使用SourceInsight的搜索功能。 (2)start.s 在cpu/arm_cortexa9/start.s (3)然后进入start.S文件中,发现 个uboot的入口代码,就是第57 57行中就 是行。_sta rt 标号的定义处,于是乎我们就找到了整 2.5.1.3、SI中找文件技巧 (1)以上,找到了start.S文件,下面我们就从start.S文件开始分析uboot第一阶段。 (2)在SI中,如果我们知道我们要找的文件的名字,但是我们又不知道他在哪个目录下,我 们要怎样找到并打开这个文件?方法是在 SI中先打开右边的工程项目管理栏目,然后点击 最左边那个(这个是以文件为单位来浏览的),然后在上面输入栏中输入要找的文件的名 字。我们在输入的时候,SI在不断帮我们进行匹配,即使你不记得文件的全名只是大概记 得名字,也能帮助你找到你要找的文件。 2.5.2.start.S解析1 2.5.2.1、不简单的头文件包含

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_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.doczj.com/doc/b516317333.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

ZLG IMX280A - 五步曲之三:uboot2017.09移植(下篇)

csv M X28_DDR2_regis…1.xlsx 101.25KB 16100: 1*16 32200: 2*32 16400: 4*16 16800: 8*16 32400: 4*32 16160: 16*16

表格信息: *上面需要准确填写的是行列地址总线宽度,bank数,CS数,数据总线宽度,时钟频率。

*tFAW不小于tRRD4倍,所以设置40ns。 *tRPA:如果数据手册不能找到tRPA,那么这么位置填入tRP。 *CASLAT:设置CAS LATCH周期,这个周期在ddr初始化时由ddr控制器对ddr设置。 *根据信号线计算ram大小,如下2 ^ (1cs + 3bank + 15row + 12col + 1datapath width) = 4GB: 2、下载源码与建立baseline: 2.1 源码下载略。 2.2 选择一个相近的平台,编写试编译通过: ./setenv.sh make mx28evk_defconfig

make u-boot.sb *这里的sb文件是加密文件,而elftosb工具生成的可以通过-z参数选择是否加密。*如果编译器是32位,但是系统是64位,那么安装32位兼容库即可: sudo apt install libc6-dev-i386 lib32z1 2.3 复制文件与修改配置: cp configs/mx28evk_defconfig configs/imx280a_defconfig cp configs/mx28evk_defconfig configs/imx280a_mmc_defconfig mkdir board/zlg/ && cp -rf board/freescale/mx28evk/ board/zlg/imx280a/ mv board/zlg/imx280a/mx28evk.c board/zlg/imx280a/imx280a.c vim board/zlg/imx280a/Kconfig vim board/zlg/imx280a/Makefile cp include/configs/mx28evk.h include/configs/imx280a.h vim include/configs/imx280a.h *vim ./arch/arm/include/asm/mach-types.h *从mx28手册可以得到内存起始物理地址:

韦东山u-boot移植笔记

一:准备移植 1、从下面的官网下载最新的U-boot。用google英文版搜索最新的u-boot源码 ftp://ftp.denx.de/pub/u-boot/ 2、建立sourceinsight工程 a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SI b、添加文件到SI工程 1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lower sub-directories”点击“OK” 2、选中“Board”目录,点击“Remove Tree”,去掉总个目录 进入“Board\Samsung\Smdk2410\”,点击"Add All" 3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录 进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。 进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All" 进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree" 进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All" 进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件 进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree" 进入“Arch\Arm\Lib\”,点击"Add All" 4、选中“Include”目录,点击“Remove Tree”,去掉总个目录 进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件 进入“Include\”,单击选中"Andestech",点击"Add Tree" 进入“Include\”,单击选中"Asm-generic",点击"Add Tree" 进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。"Configs"目录先不加,下面再议 进入“Include\Configs\”,双击选中“Smdk2410.h” 5、同步文件,完成 3、编译 尝试编译 解压:book@book-desktop:/work/system$ tar xjf u-boot-2012.04.01.tar.bz2 book@book-desktop:/work/system$ cd u-boot-2012.04.01/ 配置:book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config 编译:book@book-desktop:/work/system/u-boot-2012.04.01$ make

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移植步骤 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是正确的, 说明下面这个函数读取正确 那就是 函数出现错误,我们进入该函数查看:

jz2440-uboot移植

第一部分,移植uboot2015支持JZ2440串口 前言 本人入手JZ2440半个月,以前未接触过linux,但在校接触过许多不跑linux系统的CPU,具有LPC1114,LPC1343,STM32,blackfin等处理器的编程经验,对微处理器的原理以及运行方式具有一定的了解。靠着这点小经验,以及新学习的知识,自己动手移植了最新的uboot,绝对原创,得益于韦老师的书籍以及开发板,能让我们这个小白可以踏进linux的世界,但本人毕竟在linux方面只是个类似小白的学生,许多不对之处,希望大家不吝指教! 说明:阅读本文需要一点的ARM以及S3C2440的基础知识,建议先阅读《嵌入式Linux 应用开发完全手册》,此书对对ARM以及JZ2440有很好的介绍和说明,在阅读中有不懂的也可以再去翻看此书,查漏补缺。 JZ2440移植最新u-boot-2015.04-rc4.tar 1,配置uboot 去官网下载最新uboot源代码u-boot-2015.04-rc4.tar,开发环境采用JZ2440光盘上的vmware虚拟机ubuntu9.10。 本次采用smdk2410的默认配置来配置uboot,然后启动类似linux一样的menuconfig菜单进行配置,然后make,并烧写进JZ2440看效果,然后根据现象一步步修改。 我们移植uboot的基本原则是:因为我们刚上手,可能什么都不知道,更加不知需要更改什么,这个时候我们就先尽量什么都不改,直接烧写进去看现象,然后根据现象或者提示信息一步步更改,从而移植完成。 配置命令如下: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ tar jxvf u-boot-2015.04-rc4.tar.bz2 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ cd u-boot-2015.04-rc4/ book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make smdk2410_defconfig book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make menuconfig 3,在uboot根目录执行 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make 报错: cc1: error: bad value (armv4) for -march= switch cc1: error: bad value (armv4) for -mtune= switch make[2]: *** [include/autoconf.mk] Error 1 make[1]: *** [silentoldconfig] Error 1 make: *** No rule to make target `include/config/auto.conf', needed by `include/config/ubo ot.release'. Stop. 错误并不可怕,学会看错误提示,根据提示进行下一步工作。错误提示意思好像是说机器平台不对,那么我们就来指定,打开顶层Makefile,指定交叉编译器和架构平台: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim Makefile

相关主题
文本预览
相关文档 最新文档