微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(三)

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(三)

时间:11-20 来源:互联网 点击:
一、移植环境

  • 机:VMWare--Fedora 9
  • 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4
  • 编译器:arm123.com.cn/linux/arm-linux-gcc-4.3.2.tgz" target="_blank">arm-linux-gcc-4.3.2.tgz
  • u-boot:u-boot-2009.08.tar.bz2" target="_blank">u-boot-2009.08.tar.bz2

二、移植步骤

5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持)。
目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了。

首先,在include/configs/my2440.h头文件中定义Nand要用到的宏和寄存器,如下:

#gedit include/configs/my2440.h//在文件末尾加入以下Nand Flash相关定义

/*
*Nand flash registerandenvionment variables
*/
#define CONFIG_S3C2440_NAND_BOOT 1

#define NAND_CTL_BASE0x4E000000//Nand Flash配置寄存器基地址,查2440手册可得知

#define STACK_BASE0x33F00000//定义堆栈的地址
#define STACK_SIZE0x8000//堆栈的长度大小

#define oNFCONF0x00//相对Nand配置寄存器基地址的偏移量,还是配置寄存器的基地址
#define oNFCONT0x04//相对Nand配置寄存器基地址的偏移量,可得到控制寄存器的基地址(0x4E000004)

#define oNFADDR0x0c//相对Nand配置寄存器基地址的偏移量,可得到地址寄存器的基地址(0x4E00000c)
#define oNFDATA0x10//相对Nand配置寄存器基地址的偏移量,可得到数据寄存器的基地址(0x4E000010)
#define oNFCMD0x08//相对Nand配置寄存器基地址的偏移量,可得到指令寄存器的基地址(0x4E000008)
#define oNFSTAT0x20//相对Nand配置寄存器基地址的偏移量,可得到状态寄存器的基地址(0x4E000020)

#define oNFECC 0x2c//相对Nand配置寄存器基地址的偏移量,可得到ECC寄存器的基地址(0x4E00002c)

其次,修改cpu/arm920t/start.S这个文件,使u-boot从Nand Flash启动,在上一节中提过,u-boot默认是从Nor Flash启动的。修改部分如下:

#geditcpu/arm920t/start.S

//注意:在上一篇Nor Flash启动中,我们为了把u-boot用supervivi下载到内存中运行而屏蔽掉这段有关CPU初始化的代码。而现在我们要把u-boot下载到Nand Flash中,从Nand Flash启动,所以现在要恢复这段代码。

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
blcpu_init_crit
#endif

#if 0//屏蔽掉u-boot中的从Nor Flash启动部分
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:
adrr0, _start
ldrr1, _TEXT_BASE
cmpr0, r1
beqstack_setup

ldrr2, _armboot_start
ldrr3, _bss_start
subr2, r3, r2
addr2, r0, r2

copy_loop:
ldmiar0!, {r3-r10}
stmiar1!, {r3-r10}
cmpr0, r2
blecopy_loop
#endif
#endif

//下面添加2440中u-boot从Nand Flash启动

#ifdef CONFIG_S3C2440_NAND_BOOT
mov r1, #NAND_CTL_BASE//复位Nand Flash
ldr r2, =( (7<12)|(7<8)|(7<4)|(0<0) )
str r2, [r1, #oNFCONF]//设置配置寄存器的初始值,参考s3c2440手册
ldr r2, [r1, #oNFCONF]

ldr r2, =( (1<4)|(0<1)|(1<0) )
str r2, [r1, #oNFCONT]//设置控制寄存器
ldr r2, [r1, #oNFCONT]

ldr r2, =(0x6)//RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT]
mov r2, #0xff//复位command
strb r2, [r1, #oNFCMD]

mov r3, #0//等待
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1

nand2:
ldr r2, [r1, #oNFSTAT]//等待就绪
tst r2, #0x4
beq nand2

ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2//取消片选
str r2, [r1, #oNFCONT]

//get read to call C functions (for nand_read())
ldr sp, DW_STACK_START//为C代码准备堆栈,DW_STACK_START定义在下面
mov fp, #0

//copy U-Boot to RAM
ldr r0, =TEXT_BASE//传递给C代码的第一个参数:u-boot在RAM中的起始地址
mov r1, #0x0//传递给C代码的第二个参数:Nand Flash的起始地址
mov r2, #0x30000//传递给C代码的第三个参数:u-boot的长度大小(128k)
bl nand_read_ll//此处调用C代码中读Nand的函数,现在还没有要自己编写实现
tst r0, #0x0
beq ok_nand_read

bad_nand_read:
loop2: b loop2//infinite loop

ok_nand_read:
//检查搬移后的数据,如果前4k完全相同,表示搬移成功
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
subs r2, r2, #4
beq stack_setup
bne go_next

notmatch:
loop3: b loop3//infinite loop

#endif//CONFIG_S3C2440_NAND_BOOT

_start_armboot:.word start_armboot//在这一句的下面加上DW_STACK_START的定义

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top