Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4534254
  • 博文数量: 252
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 13838
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 10:13
文章分类
文章存档

2022年(12)

2017年(11)

2016年(7)

2015年(14)

2014年(20)

2012年(9)

2011年(20)

2010年(153)

2009年(6)

分类: 嵌入式

2010-03-26 21:17:50

文件:u-boot.rar
大小:74KB
下载:下载
    要移植U-Boot到开发板上,首先必须要建立交叉编译开发环境,我使用的交叉编译工具的版本是gcc-3.4.5-glibc-2.3.6。
一.移植环境
(1)Vmware6.5---Ubuntu9.10
(2)使用的开发板是友善之臂的Mini2440,配有Nor Flash大小为2MB       NandFlash 128MB。型号是三星的K9F1GU08B。页的大小是2KB.
(3)交叉编译器的版本是gcc-3.4.5-glibc-2.3.6。
(4)移植的U-Boot版本号为U-Boot2009.08。其官方下载地址
   现在的用的这个版本,仍然不支持2440的处理器,我们必须以smdk2410为原型,在此基础上进行U-Boot的移植工作。U-Boot2009.08这个版本的文件的组织结构有不稍微的变化,在移植是要注意,文件的放置更加的合理了。
二.建立自己的开发板目录并测试编译环境
 (1)新建一个开发板的相应目录和文件
    为了不破坏原来的结构目录和代码,在board目录下建立一个目录frank,将samsung/smdk2410目录复制到frank目录下,并将文件夹改名mini2440。
(2)然后,将frank/mini2440/smdk2410.c改名为mini2440.c。
(3)还要在include/configs目录下建立一个配置文件mini2440.h,可以将include/configs/smdk2410.h直接复制为mini2440.h
(4)还要修改两个Makefile文件,首先在顶层的Makefile中添加如下的两行:


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

*说明:arm    :CPU的架构(ARCH)

       arm920t:CPU的类型

       mini2440 :对应在board目录下建立新的开发板项目的目录

       frank:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL

       s3c24x0:CPU型号

*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错,这是Makefile文件的规则.当Make出错的时候就应该查看是不是,这里写错!

(5)还要修改board/frank/mini2440目录下的Makefile文件,因为前面将smdk2410.c文件改名为mini2440.c:

COBJS := smdk2410.o flash.o

改为

COBJS := mini2440.c flash.o

(6)特别注意:在测试之前还要改一个文件,由于Makefile版本与先前的有一定的变化,使得对于24x0处理器从nand启动的遇到问题。也就是网上有人说的:无法运行过lowlevel_init。其实这个问题是由于编译器将我们自己添加的用于nandboot的子函数nand_read_ll放到了4K 之后造成的(到这不理解的话,请仔细看看24x0处理器nandboot原理)。u-boot根本没有完成自我拷贝,你可以看uboot根目录下的 System.map文件就可知道原因。
解决办法其实很简单:
将278行的__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
改为__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
不过这里还有另外一种方法就是就是修改在cpu/arm920t/u-boot.lds中,这个u-boot启动连接脚本文件决定了u-boot运行的入口地址,以及各个段的存储位置,这也是链接定位的作用。添加下面两行代码的主要目的也是防止编译器把我们自己添加的用于nandboot的子函数放到4K之后,否则是无法启动的。如下:

.text :
{
    cpu/arm920t/start.o (.text)
    board/frank/mini2440/lowlevel_init.o (.text)
    board/frank/mini2440/nand_read.o (.text)
    *(.text)
}

(7)进入u-boot-2009.8目录,验证环境
 先 #make distclean,
然后# make mini2440_config
Configuring for mini2440 board...,
#make all 到此,就已经建立了自己的目录,还有测试了编译的环境,如果都正确的话,恭喜你,就可以进行下面真正的移植工作了。
三、修改U-Boot中的文件,以便支持Mini2440

1.首先修改/cpu/arm920t/start.S,修改此文件,使U-BOOT可以从NandFlash启动
 (1)删除掉CONFIG_AT91RM9200DK 使用的指示灯的代码

#include <common.h>
#include <config.h>
#if defined(CONFIG_AT91RM9200DK)
/*这是针对AT91RM9200DK开发板的。在此我们不使用,用条件编译注释掉*/
#include <status_led.h>
#endif



start_code:
    /*
     * set the cpu to SVC32 mode
     */

    mrs r0,cpsr
    bic r0,r0,#0x1f
    orr r0,r0,#0xd3
    msr cpsr,r0
#if defined(CONFIG_AT91RM9200DK)
    bl coloured_LED_init
    bl red_LED_on
#endif

(2)修改寄存器的地址

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) //自己添加
    /* turn off the watchdog */

# if defined(CONFIG_S3C2400)
# define pWTCON        0x15300000
# define INTMSK        0x14400008    /* Interupt-Controller base addresses */
# define CLKDIVN    0x14800014    /* clock divisor register */
#else
# define pWTCON        0x53000000
# define INTMSK        0x4A000008    /* Interupt-Controller base addresses */
# define INTSUBMSK    0x4A00001C
# define CLKDIVN    0x4C000014    /* clock divisor register */
# endif
#define CLK_CTL_BASE 0x4C000000
#define MDIV_405 0x7f << 12
#define PSDIV_405 0x21
#define MDIV_200 0xa1 <<12
#define PSDIV_200 0x31

(3)修改中断禁止

/*
     * mask all IRQs by setting all bits in the INTMR - default
     */

    mov    r1, #0xffffffff
    ldr    r0, =INTMSK
    str    r1, [r0]
# if defined(CONFIG_S3C2410)
    ldr    r1, =0x7ff
    ldr    r0, =INTSUBMSK
    str    r1, [r0]
# endif
#if defined(CONFIG_S3C2440)
    ldr r1,=0x7fff
    ldr r0,=INTSUBMSK
    str r1,[r0]
#endif

 (4) 修改时钟设置(2440的主频为405MHz。)

#if defined(CONFIG_S3C2440)
     ldr r0,=CLKDIVN
    mov r1,#5
    str r1,[r0]

    mrc p15,0,r1,c1,c0,0
    orr r1,r1,#0xc0000000
    mcr p15,0,r1,c1,c0,0

    mov r1,#CLK_CTL_BASE
    mov r2,#MDIV_405
    add r2,r2,#PSDIV_405
    str r2,[r1,#0x04]
#else
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]

    mrc p15,0,r1,c1,c0,0
    orr r1,r1,#0xc0000000
    mcr p15,0,r1,c1,c0,0
    
    mov r1,#CLK_CTL_BASE
    mov r2,#MDIV_200
    addr r2,r2,#PSDIV_200
    str r2,[r2,#0x04]
#endif
#endif    /* CONFIG_S3C2400 || CONFIG_S3C2410 */

(5)将原来的从NorFlash启动,转换为从NandFlash 启动
 

#ifndef    CONFIG_AT91RM9200

#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     {r3-r10}        /* copy from source address [r0] */
    stmia     {r3-r10}        /* copy to target address [r1] */
    cmp    r0, r2            /* until source end addreee [r2] */
    ble    copy_loop
#endif    /* CONFIG_SKIP_RELOCATE_UBOOT */
#endif

//下面添加对 Nand Flash的支持,下面的这段代码主要实现的功能就把,4kb以后的程序可以复制的RAM中,调用了用C语言写的函数nand_read_ll(),128MB的NandFlash的读命令和64MB小页的读操作有所不同,必须还要发送一个0x30,的指令,在发送完地址指令后
#define NAND_CTL_BASE 0x4e000000
#ifdef CONFIG_S3C2440_NAND_BOOT
    @reset NAND
    #define oNFCONF 0x00
    #define oNFCONT 0x04
    #define oNFSTAT 0x08
    #define oNFCMD 0x20
    mov r1,#NAND_CTL_BASE
    ldr r2,=( (7<<12)|(7<<8)|(7<<4)|(0<<0))
    str r2,[r1,#oNFCONF]
    ldr r2,[r1,#oNFCONF]

    ldr r2,=((1<<4)|(0<<1)|(1<<0))
    str r2,[r1,#oNFCONT]
    ldr r2,[r1,#oNFCONT]

    ldr r2,=(0x6)
    str r2,[r1,#oNFSTAT]
    ldr r2,[r1,#oNFSTAT]

    mov r2,#0xff
    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
    mov fp,#0
@copy U-Boot to Ram
    ldr r0,=TEXT_BASE
    mov r1,#0x0
    mov r2,#0x60000
    bl nand_read_ll
    tst r0,#0x0
    beq ok_nand_read
bad_nand_read:
loop2:    b loop2
ok_nand_read:
    @verify
    mov r0,#0
    ldr r1,=TEXT_BASE
    mov r2,#0x400
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 @CONFIG_S3C2440_NAND_BOOT
#endif //添加结束

在“ldr    pc, _start_armboot”之前加入:

#if defined(CONFIG_mini2440_LED) //主要作用是点亮LED1灯,如果LED1灯亮了,说明第一阶段的任务已经完成。
    /*@led1 on u-boot stage 1*/
    ldr r0,=0x56000010
    mov r1,#0x00000400
    STR r1,[r0]
    LDR r0,=0x56000014
    MOV r1,#0x1c0
    STR r1,[r0]

#endif

目的就是在U-BOOT完成第一阶段的初始化以后,进入第二阶段之前,LED1灯点亮。
在ldr    pc, _start_armboot
_start_armboot:    .word start_armboot之后添加


_start_armboot:    .word start_armboot
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x10000
.align 2
DW_STACK_START:.word STACK_BASE+STACK_SIZE - 4

2、 在board/frank/mini2440/目录下加入NAND Flash读取函数(start.S中需要的nand_read_ll函数)文件nand_read.c,新建nand_read.c,这里的开发板使用的是128MB ,大页的读写。下面是nand_read.c文件的内容。(注意和小页的NandFlash的不同)

#include <config.h>
#include <linux/mtd/nand.h>

#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGw(x) (*(volatile unsigned short *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#if defined(CONFIG_S3C2410)
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCMD __REGb(NF_BASE + 0x4)
#define NFADDR __REGb(NF_BASE + 0x8)
#define NFDATA __REGb(NF_BASE + 0xc)
#define NFSTAT __REGb(NF_BASE + 0x10)
#define NFSTAT_BUSY 1
#define nand_select() (NFCONF &= ~0x800)
#define nand_deselect() (NFCONF |= 0x800)
#define nand_clear_RnB() do {} while (0)
#elif defined(CONFIG_S3C2440)
#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 NFDATA16 __REGw(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)
#define NFSTAT_BUSY (1 << 2)
#define nand_select() (NFCONT &= ~(1 << 1))
#define nand_deselect() (NFCONT |= (1 << 1))
#define nand_clear_RnB() (NFSTAT |= NFSTAT_BUSY)
#endif
 
static inline void nand_wait(void)
{
  int i;
 
 while (!(NFSTAT & NFSTAT_BUSY))
  for (i=0; i<10; i++);
}
 
#if defined(CONFIG_S3C2410)

#define NAND_PAGE_SIZE 512
#define BAD_BLOCK_OFFSET 517
#define NAND_BLOCK_MASK (NAND_PAGE_SIZE - 1)
#define NAND_BLOCK_SIZE 0x4000
#else

#define NAND_5_ADDR_CYCLE
#define NAND_PAGE_SIZE 2048
#define BAD_BLOCK_OFFSET NAND_PAGE_SIZE
#define NAND_BLOCK_MASK (NAND_PAGE_SIZE - 1)
#define NAND_BLOCK_SIZE (NAND_PAGE_SIZE * 64)
#endif

#if defined(CONFIG_S3C2410) && (NAND_PAGE_SIZE != 512)
#error "S3C2410 does not support nand page size != 512"
#endif
static int is_bad_block(unsigned long i)
{
 unsigned char data;
 unsigned long page_num;
 
 nand_clear_RnB();
#if (NAND_PAGE_SIZE == 512)
 NFCMD = NAND_CMD_READOOB;
 NFADDR = BAD_BLOCK_OFFSET & 0xf;
 NFADDR = (i >> 9) & 0xff;
 NFADDR = (i >> 17) & 0xff;
 NFADDR = (i >> 25) & 0xff;
#elif (NAND_PAGE_SIZE == 2048)
 page_num = i >> 11;
 NFCMD = NAND_CMD_READ0;
 NFADDR = BAD_BLOCK_OFFSET & 0xff;
 NFADDR = (BAD_BLOCK_OFFSET >> 8) & 0xff;
 NFADDR = page_num & 0xff;
 NFADDR = (page_num >> 8) & 0xff;
 NFADDR = (page_num >> 16) & 0xff;
 NFCMD = NAND_CMD_READSTART;
#endif
 nand_wait();
 data = (NFDATA & 0xff);
 if (data != 0xff)
  return 1;
 return 0;
}
static int nand_read_page_ll(unsigned char *buf, unsigned long addr)
{
 unsigned short *ptr16 = (unsigned short *)buf;
 unsigned int i, page_num;
 nand_clear_RnB();
 NFCMD = NAND_CMD_READ0;
#if (NAND_PAGE_SIZE == 512)
 
 NFADDR = addr & 0xff;
 NFADDR = (addr >> 9) & 0xff;
 NFADDR = (addr >> 17) & 0xff;
 NFADDR = (addr >> 25) & 0xff;
#elif (NAND_PAGE_SIZE == 2048)
 page_num = addr >> 11;
 
 NFADDR = 0;
 NFADDR = 0;
 NFADDR = page_num & 0xff;
 NFADDR = (page_num >> 8) & 0xff;
 NFADDR = (page_num >> 16) & 0xff;
 NFCMD = NAND_CMD_READSTART;
#else
#error "unsupported nand page size"
#endif
 nand_wait();
 for (i = 0; i < NAND_PAGE_SIZE; i++)
 {
  *buf = (NFDATA & 0xff);
  buf++;
 }
 return NAND_PAGE_SIZE;
}

 
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
    int i, j;
   
    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
    {
     return -1;
    }
 
 nand_select();
 nand_clear_RnB();
 for (i=0; i<10; i++);
 for (i=start_addr; i < (start_addr + size);)
 {
  j = nand_read_page_ll(buf, i);
  i += j;
  buf += j;
 }
 
 
 nand_deselect();
 
  return 0;
}

在添加完nand_read.c文件后,记得修改board/frank/mini2440/Makefile文件,将nand_read.c编译进u-boot。
OBJS := mini2440.o nand_read.o flash.o

3、修改board/frank/mini2440/lowlevel_init.S文件

/* REFRESH parameter */
#define REFEN            0x1    /* Refresh enable */
#define TREFMD            0x0    /* CBR(CAS before RAS)/Auto refresh */
//#define Trp            0x0    /* 2clk */

#define Trc            0x3    /* 7clk */
#define Tchr            0x2    /* 3clk */
#if defined(CONFIG_S3C2440)
#define Trp             0x2
#define REFCNT         1012
#else
#define REFCNT            1113    /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
#define Trp 0x0
#endif

#if defined(CONFIG_S3C2440)
#define Trp 0x02
#define REFCNT 1012
#else
#define Trp 0x0
#define REFCNT 0x0459
#endif

 
4、修改/board/frank/mini2440/mini2440.c


#include <s3c2410.h>
#include <video_fb.h>

#if defined(CONFIG_CMD_NAND)
#include<linux/mtd/nand.h>
#endif

DECLARE_GLOBAL_DATA_PTR;

#define FCLK_SPEED 1

#if FCLK_SPEED==0        /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV    0xC3
#define M_PDIV    0x4
#define M_SDIV    0x1
#elif FCLK_SPEED==1        /* Fout = 202.8MHz */
#if defined(CONFIG_S3C2440)
#define M_MDIV 0x7f
#define M_PDIV 0x2
#define M_SDIV 0x1
//#define M_MDIV    0xA1

//#define M_PDIV    0x3

//#define M_SDIV    0x1

#endif
#endif

#define USB_CLOCK 1

#if USB_CLOCK==0
#define U_M_MDIV    0xA1
#define U_M_PDIV    0x3
#define U_M_SDIV    0x1
#elif USB_CLOCK==1
#if defined(CONFIG_S3C2440)
#define U_M_MDIV 0x38
#define U_M_PDIV 0x2
#endif
//#define U_M_MDIV    0x48

//#define U_M_PDIV    0x3

#define U_M_SDIV    0x2
#endif

........

int board_init (void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

    /* to reduce PLL lock time, adjust the LOCKTIME register */
    .......

    /* set up the I/O ports */
    gpio->GPACON = 0x007FFFFF;
    #if defined(CONFIG_mini2440_LED)
  
     gpio->GPBCON = (1<<(5*2)) |(1<<(6*2)) | (1<<(7*2)) | (1<<(8*2));

    #else
    gpio->GPBCON = 0x00044556;
    #endif
    gpio->GPBUP = 0x000007FF;
    gpio->GPCCON = 0xAAAAAAAA;
    gpio->GPCUP = 0x0000FFFF;
    gpio->GPDCON = 0xAAAAAAAA;
    gpio->GPDUP = 0x0000FFFF;
    gpio->GPECON = 0xAAAAAAAA;
    gpio->GPEUP = 0x0000FFFF;
    gpio->GPFCON = 0x000055AA;
    gpio->GPFUP = 0x000000FF;
    gpio->GPGCON = 0xFF95FFBA;
    gpio->GPGUP = 0x0000FFFF;
    gpio->GPHCON = 0x002AFAAA;
    gpio->GPHUP = 0x000007FF;
    /* arch number of SMDK2410-Board */
    #if defined(CONFIG_S3C2440)
    gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
    //gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
#endif

    /* adress of boot parameters */
    gd->bd->bi_boot_params = 0x30000100;

    icache_enable();
    dcache_enable();
#if defined(CONFIG_mini2440_LED)
        gpio->GPBDAT &=~(1<<6);//这是LED2灯点亮
     #endif
    return 0;
}

int dram_init (void)
{
    gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
    gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;

    return 0;
}


5、修改其余的各个文件,并添加编译选项使其编译进UBoot,CONFIG_S3C2440

1)修改include/configs/mini2440

#define CONFIG_SYS_PROMPT "[U-Boot@mini2440]#" //提示符
#define CONFIG_ARM920T        1    /* This is an ARM920T Core    */
//#define    CONFIG_S3C2410        1    /* in a SAMSUNG S3C2410 SoC */

#define CONFIG_SMDK2410        1    /* on a SAMSUNG SMDK2410 Board */
#define CONFIG_S3C2440 1
#define CONFIG_mini2440_LED 1  //添加定义
/* input clock of PLL */
#define CONFIG_SYS_CLK_FREQ    12000000/* the SMDK2410 has 12MHz input clock */
#define CONFIG_S3C2440_NAND_BOOT 1

2)在/include/common.h中的,第496行左右的位置添加下面语句 ,defined(CONFIG_S3C2440)

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || \
    defined(CONFIG_LH7A40X) || defined(CONFIG_S3C6400) || defined(CONFIG_S3C2440)
ulong    get_FCLK (void);
ulong    get_HCLK (void);
ulong    get_PCLK (void);
ulong    get_UCLK (void);
#endif

3)在/include/s3c24x0.h中的第85 95 99 110 151 428行的,
#if defined(CONFIG_S3C2410)改为


#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

并且加2440Nand Flash的定义(168行附近)和CAMDIVN定义(大约130行)

typedef struct {
    S3C24X0_REG32    LOCKTIME;
    S3C24X0_REG32    MPLLCON;
    S3C24X0_REG32    UPLLCON;
    S3C24X0_REG32    CLKCON;
    S3C24X0_REG32    CLKSLOW;
    S3C24X0_REG32    CLKDIVN;
#if defined (CONFIG_S3C2440)
    S3C24X0_REG32 CAMDIVN;
#endif
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
......
/* NAND FLASH (see S3C2410 manual chapter 6) */

#if defined (CONFIG_S3C2410)
typedef struct {
    S3C24X0_REG32    NFCONF;
    S3C24X0_REG32    NFCMD;
    S3C24X0_REG32    NFADDR;
    S3C24X0_REG32    NFDATA;
    S3C24X0_REG32    NFSTAT;
    S3C24X0_REG32    NFECC;
} /*__attribute__((__packed__))*/ S3C2410_NAND;
#endif
#if defined (CONFIG_S3C2440)
/* NAND FLASH (see S3C2440 manual chapter 6) */
typedef struct {
    S3C24X0_REG32 NFCONF;
    S3C24X0_REG32 NFCONT;
    S3C24X0_REG32 NFCMD;
    S3C24X0_REG32 NFADDR;
    S3C24X0_REG32 NFDATA;
    S3C24X0_REG32    NFMECCD0;
    S3C24X0_REG32    NFMECCD1;
    S3C24X0_REG32    NFSECCD;
    S3C24X0_REG32    NFSTAT;
    S3C24X0_REG32    NFESTAT0;
    S3C24X0_REG32    NFESTAT1;
    S3C24X0_REG32    NFMECC0;
    S3C24X0_REG32    NFMECC1;
    S3C24X0_REG32    NFSECC;
    S3C24X0_REG32    NFSBLK;
    S3C24X0_REG32    NFEBLK;
} /*__attribute__((__packed__))*/ S3C2440_NAND;
#endif

4)、在/cpu/arm920t/s3c24x0/interrupts.c中,将#elif defined(CONFIG_S3C2410)

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

5)在/cpu/arm920t/s3c24x0/usb.c中,将#elif defined(CONFIG_S3C2410改成

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

6)在/cpu/arm920t/s3c24x0/usb_ohci.c中的,#elif define (CONFIG_S3C2410)改成

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

7)在/cpu/arm920t/s3c24x0/speed.c中的,添加条件编译的定义语句defined(CONFIG_S3C2440)

#include <common.h>
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined(CONFIG_S3C2440)

#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
#elif defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
#include <s3c2410.h>
#endif

并且要改变HCLK

static ulong get_PLLCLK(int pllreg)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    ulong r, m, p, s;

    if (pllreg == MPLL)
    r = clk_power->MPLLCON;
    else if (pllreg == UPLL)
    r = clk_power->UPLLCON;
    else
    hang();

    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;
#if defined(CONFIG_S3C2440)
    if(pllreg == MPLL)
    return ((CONFIG_SYS_CLK_FREQ * m *2)/(p << s));
    else if (pllreg == UPLL)
#endif
    return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}



/* return HCLK frequency */
ulong get_HCLK(void)
{
    //S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    //return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
//原来的上面的两句话,注释掉,改为下面的
 S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
if(clk_power->CLKDIVN & 0x6)
{
    if((clk_power->CLKDIVN & 0x6) == 2) return (get_FCLK() / 2);
0x100     if((clk_power->CLKDIVN & 0x6) == 6) return ((clk_power->CAMDIVN &)?get_FCLK() /6:get_FCLK()/3);
0x200     if((clk_power->CLKDIVN & 0x6)==4) return ((clk_power->CAMDIVN &)?get_FCLK() / 8: get_FCLK()/4);
        return (get_FCLK());
    }
else
    return (get_FCLK());
}

8)在drivers/serial/serial_s3c24x0.c文件中,将#elif defined(CONFIG_S3C2410改成

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

将serial_init_dev函数中的uart->URCON= 0x07,改为下面的值

static int serial_init_dev(const int dev_index)
{
    S3C24X0_UART * const uart = S3C24X0_GetBase_UART(dev_index);

    /* FIFO enable, Tx/Rx FIFO clear */
    //uart->UFCON = 0x07;

    uart->UFCON = 0x00;
    uart->UMCON = 0x0;

    /* Normal,No parity,1 stop,8 bit */
    uart->ULCON = 0x3;
    /*
     * tx=level,rx=edge,disable timeout int.,enable rx error int.,
     * normal,interrupt or polling
     */

    uart->UCON = 0x245;

9)在drivers/rtc/s3c24x0_rtc.c文件中,将#elif defined(CONFIG_S3C2410改成

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

到这里,最基本的移植工作就完成了,make all一下,把生成的u-boot.bin文件下载的NandFlash中,可以看到u-boot从,NandFlash中启动,在串口中,出现下面的界面






阅读(4910) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

gaojieqq1232012-08-26 16:21:03

非常感谢博主,我在从nand启动上卡了好几天,今天看了您的文章涣然大悟一下就成功!真是非常的感谢您。