Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139370
  • 博文数量: 49
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 515
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-08 10:33
文章分类

全部博文(49)

文章存档

2010年(2)

2009年(30)

2008年(17)

我的朋友

分类: LINUX

2009-07-27 16:20:22

一、移植前说明

   虚拟机上安装Ubuntu-8.04,交叉编译器是arm-linux-gcc 3.4.5,目标板是GEC241064M NAND FLASH,2M NOR FLASH,64M SDRAM

   下载U-Boot-1.1.6,并解压 tar jxvf u-boot-1.1.6.tar.bz2

   以下移植是参照网上的一篇基于优龙FS2410开发板U-Boot-1.1.6的移植,这篇文章确实写得很好,佩服。原文地址如下:http://blog.chinaunix.net/u2/74310/showart_1091899.html

二、U-Boot的移植

   1、建立自己的开发板配置

      $cp -r board/smdk2410 board/GEC2410

      $cp include/configs/smdk2410.h include/configs/GEC2410.h

   2、修改顶层的Makefile

      $pwd

      /home/yuaf/u-boot-1.1.6

      $vi Makefile

      找到:
          smdk2410_config    :    unconfig
                    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
      
在其后面添加:
         GEC2410_config    :    unconfig
                    @$(MKCONFIG) $(@:_config=) arm arm920t GEC2410 NULL s3c24x0
 
     
各项的意思如下:
      arm:        CPU
的架构(ARCH)
      arm920t:    CPU
的类型(CPU),其对应于cpu/arm920t子目录。
      GEC2410:   
开发板的型号(BOARD),对应于board/GEC2410目录。
      NULL:      
开发者/或经销商(vender)
      s3c24x0:   
片上系统(SOC)

 

(3).  include/configs/GEC2410.h
        
        
修改:
        # define   CFG_PROMPT     “SMDK2410 #”
        
为:
        # define   CFG_PROMPT     “GEC2410 #”  
    
这是u-boot的命令行提示符。
(4)
修改board/GEC2410/Makefile
   
将:
    OBJS    := smdk2410.o flash.o
   
改为:
    OBJS     := GEC2410.o flash.o
   
当然,GEC2410下的 smdk2410.c要改成GEC2410.c
(5
)依照你自己开发板的内存地址分配情况修改board/GEC2410/lowlevel_init.S文件

 

#include <config.h>
  #include <version.h>


#define BWSCON 0x48000000

/* BWSCON */
#define DW8 (0x0)
#define DW16 (0x1)
#define DW32 (0x2)
#define WAIT (0x1<<2)
#define UBLB (0x1<<3)

#define B1_BWSCON (DW16)
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)
#define B5_BWSCON (DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)

/* BANK0CON */
#define B0_Tacs 0x3 /* 0clk */
#define B0_Tcos 0x3 /* 0clk */
#define B0_Tacc 0x7 /* 14clk */
#define B0_Tcoh 0x3 /* 0clk */
#define B0_Tah 0x3 /* 0clk */
#define B0_Tacp 0x1
#define B0_PMC 0x0 /* normal */

/* BANK1CON */
#define B1_Tacs 0x3 /* 0clk */
#define B1_Tcos 0x3 /* 0clk */
#define B1_Tacc 0x7 /* 14clk */
#define B1_Tcoh 0x3 /* 0clk */
#define B1_Tah 0x3 /* 0clk */
#define B1_Tacp 0x3
#define B1_PMC 0x0

#define B2_Tacs 0x0
#define B2_Tcos 0x0
#define B2_Tacc 0x7
#define B2_Tcoh 0x0
#define B2_Tah 0x0
#define B2_Tacp 0x0
#define B2_PMC 0x0

#define B3_Tacs 0x0 /* 0clk */
#define B3_Tcos 0x3 /* 4clk */
#define B3_Tacc 0x7 /* 14clk */
#define B3_Tcoh 0x1 /* 1clk */
#define B3_Tah 0x0 /* 0clk */
#define B3_Tacp 0x3 /* 6clk */
#define B3_PMC 0x0 /* normal */

#define B4_Tacs 0x1 /* 0clk */
#define B4_Tcos 0x1 /* 0clk */
#define B4_Tacc 0x6 /* 14clk */
#define B4_Tcoh 0x1 /* 0clk */
#define B4_Tah 0x1 /* 0clk */
#define B4_Tacp 0x0
#define B4_PMC 0x0 /* normal */

#define B5_Tacs 0x1 /* 0clk */
#define B5_Tcos 0x1 /* 0clk */
#define B5_Tacc 0x6 /* 14clk */
#define B5_Tcoh 0x1 /* 0clk */
#define B5_Tah 0x1 /* 0clk */
#define B5_Tacp 0x0
#define B5_PMC 0x0 /* normal */

#define B6_MT 0x3 /* SDRAM */
#define B6_Trcd 0x1
#define B6_SCAN 0x1 /* 9bit */

#define B7_MT 0x3 /* SDRAM */
#define B7_Trcd 0x1 /* 3clk */
#define B7_SCAN 0x1 /* 9bit */

/* 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 */
#define REFCNT 0x4f4 /* period=7.8125us, HCLK=100Mhz, (2048+1-7.8125*100) */
/**************************************/

_TEXT_BASE:
    .word TEXT_BASE

.globl lowlevel_init
lowlevel_init:
    /* memory control configuration */
    /* make r0 relative the current location so that it */
    /* reads SMRDATA out of FLASH rather than memory ! */
    ldr r0, =SMRDATA
    ldr r1, _TEXT_BASE
    sub r0, r0, r1
    ldr r1, =BWSCON /* Bus Width Status Controller */
    add r2, r0, #13*4
0:
    ldr r3, [r0], #4
    str r3, [r1], #4
    cmp r2, r0
    bne 0b

    /* everything is fine now */
    mov pc, lr

    .ltorg
/* the literal pools origin */

SMRDATA:
    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x32
    .word 0x30
    .word 0x30

6)测试编译能否成功:
    make GEC2410_config
    make
   
如果没有问题,在u-boot-1.1.6目录下就生成u-boot.bin,因为到这一步只是做了点小改动,并未涉及敏感问题,测试一下可增加点信心。

7)在board/GEC2410加入NAND Flash读函数,建立nand_read.c,加入如下内容

 

#include <config.h>
#include "linux/mtd/mtd.h"
#include "linux/mtd/nand.h"
 
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#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 BUSY 1
inline void wait_idle(void) {
    int i;
    while(!(NFSTAT & BUSY))
      for(i=0; i<10; i++);
}
#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
/* low level nand read function */
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; /* invalid alignment */
    }
    /* chip Enable */
    NFCONF &= ~0x800;
    for(i=0; i<10; i++);
     for(i=start_addr; i < (start_addr + size);) {
      /* READ0 */
      NFCMD = 0;
       /* Write Address */
      NFADDR = i & 0xff;
      NFADDR = (i >> 9) & 0xff;
      NFADDR = (i >> 17) & 0xff;
      NFADDR = (i >> 25) & 0xff;
       wait_idle();
       for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = (NFDATA & 0xff);
buf++;
      }
    }
     /* chip Disable */
    NFCONF |= 0x800; /* chip disable */
    return 0;
}

(10)修改cpu/arm920t/start.S文件
     2410
的启动代码可以在外部的NAND FLASH上执行,启动时,NAND FLASH的前4KB(地址为0x00000000OM[1:0]=0)将被装载到SDRAM中被称为Setppingstone的地址中,然后开始执行这段代码。启动以后,这4KB的空间可以做其他用途,start.S加入搬运代码如下:

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


#ifdef CONFIG_S3C2410_NAND_BOOT /*这个一定要放在堆栈设置之前*/
    bl copy_myself
#endif /*CONFIG_S3C2410_NAND_BOOT*/

#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

    /* Set up the stack */
stack_setup:
..................
    /**************************************************************************
 *
 * copy u-boot to ram 放在start.S靠后的位置
 *
 *************************************************************************
 */
 #ifdef CONFIG_S3C2410_NAND_BOOT
/*
@ copy_myself: copy u-boot to ram
*/
copy_myself:
    mov r10, lr
 
    @ reset NAND
    mov r1, #NAND_CTL_BASE
    ldr r2, =0xf830 @ initial value
    str r2, [r1, #oNFCONF]
    ldr r2, [r1, #oNFCONF]
    bic r2, r2, #0x800 @ enable chip
    str r2, [r1, #oNFCONF]
    mov r2, #0xff @ RESET command
    strb r2, [r1, #oNFCMD]
    mov r3, #0 @ wait
1: add r3, r3, #0x1
    cmp r3, #0xa
    blt 1b
2: ldr r2, [r1, #oNFSTAT] @ wait ready
    tst r2, #0x1
    beq 2b
    ldr r2, [r1, #oNFCONF]
    orr r2, r2, #0x800 @ disable chip
    str r2, [r1, #oNFCONF]
 
    @ get read to call C functions
    ldr sp, DW_STACK_START @ setup stack pointer
    mov fp, #0 @ no previous frame, so fp=0
 
    @ copy UBOOT to RAM
    ldr r0, _TEXT_BASE
    mov r1, #0x0
    mov r2, #0x20000
    bl nand_read_ll
 
    teq r0, #0x0
    beq ok_nand_read
 
bad_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
    subs r2, r2, #4
    beq done_nand_read
    bne go_next
notmatch:
1: b 1b
done_nand_read:
     
    mov pc, r10
 
#endif
    @ CONFIG_S3C2440_NAND_BOOT
 
DW_STACK_START:
    .word STACK_BASE+STACK_SIZE-4

(11)修改include/configs/GEC2410.h文件,添加如下内容:

 *  NAND FLASH BOOT
 */
#define    CONFIG_S3C2410_NAND_BOOT    1
#define    STACK_BASE            0x33f00000
#define    STACK_SIZE                0x8000
#define    UBOOT_RAM_BASE          0x30100000
 
#define    NAND_CTL_BASE            0x4e000000
#define    bINT_CTL(Nb)            _REG(INT_CTL_BASE+(Nb))
 
 
#define    oNFCONF                0x00
#define    oNFCMD                0x04
#define    oNFADDR                0x08
#define    oNFDATA                0x0c
#define    oNFSTAT                0x10
#define    oNFECC                0x14
/*--------------------------------------------------------------------*/
#define NAND_MAX_CHIPS        1

(12)
修改board/GEC2410/Makefile
OBJS := GEC2410.o flash.o nand_read.o
(13
)重新编译u-boot
make  GEC2410_config
make
通过SJF2410.exe 可以烧写到NAND FLASH中,烧写完之后,复位一下,就可以看到启动信息啦......

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