文档章节

友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(一)

zhaowei09
 zhaowei09
发布于 2016/05/30 21:37
字数 1079
阅读 13
收藏 0

从本文开始,将记录博主在进行u-boot 1.1.6移植过程中遇到的问题。本文将涉及两个问题:

1. u-boot中添加开发板

2. u-boot第一阶段启动代码

1. u-boot中添加开发板

1.1. Makefile更改

1.1.1. 增加反汇编文件输出

Makefile文件中239行,源文件为:

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

更改为:

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(obj)u-boot.dis $(U_BOOT_NAND)

1.1.2. 添加开发板

Makefile文件1879行,按照smdk2410的形式,添加mini2440开发板配置如下:

mini2440_config	:	unconfig
	@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0

1.1.3. 自动清理时删除反汇编文件

Makefile文件2293行,源文件为:

rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)

修改为:

rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(obj)u-boot.dis $(ALL)

1.2. 添加头文件

在include/configs/目录下添加mini2440.h文件。可以直接拷贝一份smdk2410.h文件。

1.3. 添加核心版文件

在board/目录下添加mini2440目录。可直接拷贝smdk2410文件夹即可。

1.4. 小结

自此,mini2440开发板已经添加到u-boot 1.1.6中。可直接执行如下命令生成u-boot.bin文件

make mini2440_config

make

但这个u-boot.bin文件并无法启动,需要修改相关代码进行移植。


2. U-boot第一阶段启动代码移植

mini2440的SOC为S3C2440,它的CPU为一个ARM920t的核,因此u-boot第一阶段启动代码就是cpu/arm920t/start.S文件。

2.1. 关闭看门狗和中断服务

S3C2440的看门狗和S3C2410一样,因此在start.S文件进行如下修改:

124行源代码:

#elif defined(CONFIG_S3C2410)
# define pWTCON		0x53000000
# define INTMSK		0x4A000008	/* Interupt-Controller base addresses */
# define INTSUBMSK	0x4A00001C
# define CLKDIVN        0x4C000014    /* clock divisor register */

更改为:

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
# define pWTCON		0x53000000	/* watchdog register address */
# define INTMSK		0x4A000008	/* interrupt mask register address */
# define INTSUBMSK	0x4A00001C	/* interrupt sub-mask register address */
# define CLKDIVN	0x4C000014	/* clock divisor register */

131行源代码:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
	ldr     r0, =pWTCON
	mov     r1, #0x0
	str     r1, [r0]

更改为:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
    ldr     r0, =pWTCON
    mov     r1, #0x0
    str     r1, [r0]

142行源代码:

# if defined(CONFIG_S3C2410)
	ldr	r1, =0x3ff
	ldr	r0, =INTSUBMSK
	str	r1, [r0]

之后添加部分代码,变为:

# if defined(CONFIG_S3C2410)
	ldr	r1, =0x3ff
	ldr	r0, =INTSUBMSK
	str	r1, [r0]
#elif defined(CONFIG_S3C2440)
	ldr	r1, =0x7FFF
	ldr	r0, =INTSUBMSK
	str	r1, [r0]

2.2. 设置MPLL和UPLL

源代码中,找到:

/* FCLK:HCLK:PCLK = 1:2:4 */
	/* default FCLK is 120 MHz ! */
	ldr	r0, =CLKDIVN
	mov	r1, #3
	str	r1, [r0]

更改为:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
	/* FCLK:HCLK:PCLK = 1:2:4 */
	/* default FCLK is 120 MHz ! */
	ldr	r0, =CLKDIVN
	mov	r1, #3
	str	r1, [r0]
#elif defined(CONFIG_S3C2440)
# define MPLLCON	0x4C000004
# define UPLLCON	0x4C000008
	ldr	r0, =CLKDIVN
	ldr	r1, =0x5		/* FCLK:HCLK:PCLK = 1:4:8 */
	str	r1, [r0]
	ldr	r0, =MPLLCON
	ldr	r1, =0x5C011		/* MPLL=400MHz */
	str	r1, [r0]
	ldr	r0, =UPLLCON
	ldr	r1, =0x38022		/* UPLL=48MHz */
	str	r1, [r0]
	/* configure S3C2440 to asynchronous bus mode */
	mrc	p15, 0, r1, c1, c0, 0
	orr	r1, r1, #0xc0000000
	mcr	p15, 0, r1, c1, c0, 0
#endif

2.3. 添加NAND启动代码

u-boot的smdk2410代码中默认为NOR启动,这里需要自行添加NAND启动代码。

找到源文件中NOR启动部分代码:

#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	/* CONFIG_SKIP_RELOCATE_UBOOT */

更改为:

#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
#if defined(CONFIG_NOR_BOOT)
	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
#elif defined(CONFIG_NAND_BOOT)
	ldr	sp, =0x1000		/* setup stack to 4k temporarily to call the c function nand_read_ll*/
	bl	nand_init_ll		/* initialize nand flash */
	ldr	r0, _TEXT_BASE		/* destination for u-boot relocation */
	ldr	r1, =0x0		/* source address in NAND */
	ldr	r2, =0x40000		/* length to read from NAND to SDRAM, 256K */
	bl	nand_read_ll		/* call nand_read_ll to relocate u-boot */
#endif
#endif	/* CONFIG_SKIP_RELOCATE_UBOOT */

2.4. 小结

到此为止,start.S的所有代码均已修改完毕。

3. 说明

最后一部分涉及到nand_init_ll和nand_read_ll两个函数,网上关于NAND启动中使用的这两个C代码有很多,但博主下载之后均报错。最后横下一条心,根据韦东山大神的NAND裸机程序修改了一版,效果不错。

下一篇博文将对这两个函数及相关设置进行充分说明。



© 著作权归作者所有

共有 人打赏支持
zhaowei09
粉丝 0
博文 7
码字总数 45754
作品 0
长沙
程序员
私信 提问
自己编译的QT4.6.3可以用,为什么QT4.7.1会出现段错误?

我使用的是友善之臂mini2440的开发板,移植qte时自己编译的QT4.6.3移植到开发板可以运行(友善之臂给的文件系统里就是QT4.6.3),但是又自己编译了QT4.7.1,移植到开发板上时却出现segmentatio...

tom_riddle
2014/02/16
242
0
Mini2440上的第一个程序——点亮Led

手头的Mini2440搁置了两年半之后,我再次决定拿出它,重新尝试嵌入式Linux的学习。 我使用的是友善之臂的Mini2440开发板、韦东山的《嵌入式Linux应用开发完成手册》及其视频教程。所以,本篇...

icuic
07/15
0
0
mini2440基于uboot的TFTP下载教程

由于mini2440在WIN7上下载,USB驱动无法兼容,总是出现蓝屏重启的现象,导致不得不想其他方式来下载,首先就考虑了使用U-Boot来下载,因为它支持多种下载方式: 1. 使用串口下载,它支持ker...

FGQ
2013/01/12
0
0
嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)

嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载:http:...

nothingfinal
2012/06/19
0
0
对mini2440LED灯驱动开发

一直在学习友善之臂的MINI2440开发板,今天完成了,led的实验在此总结一下 1.编写驱动程序(led1.c) 2.驱动程序makefile文件 3.测试程序 4.测试程序的Makefile 编译驱动程序和测试程序,把得...

长平狐
2012/08/28
371
0

没有更多内容

加载失败,请刷新页面

加载更多

Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
37分钟前
1
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
49分钟前
2
0
I2C EEPROM驱动实例分析

上篇分析了Linux Kernel中的I2C驱动框架,本篇举一个具体的I2C设备驱动(eeprom)来对I2C设备驱动有个实际的认识。 s3c24xx系列集成了一个基于I2C的eeprom设备at24cxx系列。at24cxx系列芯片包...

yepanl
51分钟前
3
0
设计模式之工厂模式

本篇博文主要翻译这篇文章: https://www.journaldev.com/1392/factory-design-pattern-in-java 由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。...

firepation
今天
8
0

中国龙-扬科
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部