文档章节

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

zhaowei09
 zhaowei09
发布于 2016/05/30 21:37
字数 1079
阅读 11
收藏 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
231
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) #include include include include include include include include...

长平狐
2012/08/28
363
0

没有更多内容

加载失败,请刷新页面

加载更多

学hadoop需要什么基础

最近一段时间一直在接触关于hadoop方面的内容,从刚接触时的一片空白,到现在也能够说清楚一些问题。这中间到底经历过什么只怕也就是只有经过的人才会体会到吧。前几天看到有个人问“学hadoo...

左手的倒影
17分钟前
1
0
LOADING Redis is loading the dataset in memory

Redis出现错误 LOADING Redis is loading the dataset in memory 原因是: redis中dump.rdb文件到达3G时,所有redis的操作都会抛出此异常。 解决方法: redis.conf中 maxmemory 调大。 另外一...

swingcoder
17分钟前
0
0
闪屏页设置

相信每个app都需要一个闪屏页 就是一个开始页面 对于新手来说 可能就直接一个activity 弄个背景图片 ,细心地同学也许会发现 每次启动 应用程序的时候 一开始显示的不是那个设置的背景图片 ...

王先森oO
22分钟前
1
0
解析Excel

import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import or......

开源中国封号找我
27分钟前
0
0
pandas不能在pycharm中使用plot()方法显示图像的解决方法

最近用了pycharm,感觉还不错,就是pandas中Series、DataFrame的plot()方法不显示图片就给我结束了,但是我在ipython里就能画图 以前的代码是这样的 import matplotlib.pyplot as pltfrom p...

kipeng300
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部