您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

移植u-boot到mini6410开发板上

发布日期:2011-05-19

以前我移植的u-boot在启动的时候只支持128MB内存,因为最开始友善出的MINI6410只有128MB的DDR内存。但是后面他们升级为256MB的DDR了,我的U-boot一直没有修改,一直在凑合着用。最近几天,由于项目需要,看了一下DDR(1/2/3)的接口和相关的时序,就想到也让U-boot支持一下256MB的DDR,所有就稍微看了看S3C6410的DRAM控制器,调整了两个寄存器就实现了对256MB的支持。

    但是对于两个内存版本的板子,如果要编译出两个u-boot,这肯定比较麻烦。要做就做完美来,自动适应两种RAM大小。友善的superboot支持,这说明技术上是绝对可行的。经过了我一两天业余时间的尝试,昨天晚上搞定了。
识别的原理是利用的在以265MBDDR模式下配置DRAM控制器后读写128MBDDR会出现32MB镜像内存的作用,具体的识别原理介绍如下。
所有的代码已经更新到github,可以到这里下载
 
1、了解DDR SDRAM的原理

首先你必须了解一下DDR SDRAM的原理和外部接口,这些在网上有几篇比较经典的文章这里推荐一下:

专家详解:内存工作原理及发展历程

内存的原理和时序(SDRAM、DDR、DDR-Ⅱ、Rambus DRAM)

----------------------------------------------------------------------------------

2、MINI6410的内存硬件结构与寻址关系

在看过上面的文档之后,相信应该对DDR内存有了一个比较完整的认识和理解,下面我们就来讲讲在MINI6410上的内存硬件结构:

对于MINI6410的设计,用了两块引脚兼容的DDR内存芯片来实现128MB内存和256MB内存可共用一个PCB。

128MB内存使用的是两片K4X51163PG(32Mx16bit),形成一个32M×32bit(128MB)的内存。

256MB内存使用的是两片K4X1G163PE(64Mx16bit),形成一个64M×32bit(256MB)的内存。

这两款芯片在引脚上的差别就是K4X51163PG的F7是NC脚,而K4X1G163PE的F7脚是A13

这个F7引脚在128MB内存版本的MINI6410中这个引脚是不连接的,而256MB版本中是通过一个0欧电阻和S3C6410的Xm1ADDR13相连的

看了这两个内存芯片和S3C6410(DRAM控制器)的数据手册的朋友一定知道,这种连接形成一个这样的寻址关系:

128MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[12:0](行地址):Xm1ADDR[9:0](列地址) 。一共25根地址线刚好可寻址32M空间

256MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[13:0](行地址):Xm1ADDR[9:0](列地址) 。一共26根地址线刚好可寻址64M空间

这两种连接和芯片配置也要通过修改S3C6410的DRAM控制器的两个寄存器的参数来匹配。

----------------------------------------------------------------------------------

3、U-boot中内存自适应代码应处的位置

做好了以上的两个知识准备后,我们看看在u-boot中应该在什么位置来识别和自适应不同的内存大小。

首先我们在识别了内存大小之后可能需要重新配置S3C6410的内存控制器。这么一来,这些代码不能在DDR中运行。因为一旦重新配置内存控制器,必然导致内存暂时无法使用,如果代码在DDR中CPU可能无法得到下一步的代码。所以这些代码要放在u-boot实现自拷贝到内存之前的地方,其实最好的地方就是在u-boot的SPL部分中初始化内存控制器的代码段中。

这些代码就在:arch/arm/cpu/arm1176/s3c64xx/cpu_init.S

这个文件是汇编代码,其中的函数mem_ctrl_asm_init是通过start.S中的“bl    lowlevel_init”------>/board/samsung/mini6410/lowlevel_init.S中的lowlevel_init ”bl    mem_ctrl_asm_init”调用的。mem_ctrl_asm_init函数中的代码对S3C6410的DRAM控制器进行了初始化,并对外部的DDR内存也进行了初始化,所以内存的识别和自适应代码应该放在这些初始化之后。先识别内存的大小,如果内存大小和原先DRAM控制器的配置不相符,就修改DRAM控制器的配置。

----------------------------------------------------------------------------------

 

4、内存大小的识别

针对MINI6410的情况,我们只需要识别内存是128MB还是256MB。由于这两种内存大小关系到DRAM控制器的两个寄存器的参数,所有我们必须先假设我们的内存大小,再通过读写的方式来证明,如果证明我们的假设是错误的,再修改寄存器的参数。

我移植的U-boot代码中首先假设内存是256MB,并先配置DRAM控制器为256MB内存的参数。如果这时连接的是128MB内存,那么就会有这样一个有趣的现象:

由于Xm1ADDR[13]没有连接,所以DDR内存的第一个8M×32bit(32MB)和第二个8M×32bit(32MB)是镜像关系,第三个8M×32bit(32MB)和第四个8M×32bit(32MB)是镜像关系,以此类推。一共有四个这样的镜像关系,共256MB。如果连接的就是256MB的内存就不会有这样的现象。所以,只要我们证明了这种现象存在,就证明了我们其实连接的是128MB内存,然后重新配置DRAM控制器为128MB内存的参数就大功告成了。

所以我移植的U-boot代码中首先写一个32bit的测试数据到第一个8M×32bit(32MB)的某个位置(比如0x0地址),然后就去第二个8M×32bit(32MB)相应偏移位置读取,如果数据一致就可以证明镜像关系。但是还不保险,如果就是这么巧(在连接256MB的内存的情况下)第二个8M×32bit(32MB)相应位置本身就是这个数据怎么办?不要紧,我们再去第二个8M×32bit(32MB)同一位置写入另一个测试数据,然后去第一个8M×32bit(32MB)的那个位置(也就是一开始的那个写入位置)读取数据,如果数据一致就完全可以证明镜像关系。通过这样的两次测试,看看是否要重新配置DRAM控制器参数。

但是我们不能假设内存是128MB,并先配置DRAM控制器为128MB内存的参数。如果连接的是256MB的内存,没有任何特殊的现象可以测试到。通过上面的寻址关系,如果连接的是256MB的内存,只是第二、四、六、八(假设Xm1ADDR[13]一直是0)个8M×32bit(32MB)是没法访问的(可以说是内存空洞),这个无法通过读写证明。(通过寻址关系推断,未通过实验证明)

----------------------------------------------------------------------------------

5、关于内存控制器的重配置

如果上面的步骤中测试出了镜像的存在,我们必须重新配置两个寄存器的值,但是如何重新配置,这个三星的数据手册是没有讲的,我通过测试发现可以通过以下的步骤重新配置DRAM控制器:

1、将DRAM控制器设为暂停(Paused)状态;

2、检测P1MEMSTAT,直到确认了暂停(Paused)状态;

3、将DRAM控制器设为配置(Config)状态;

4、检测P1MEMSTAT,直到确认了配置(Config)状态;

5、修改需要重新配置的寄存器

6、将DRAM控制器设为启动(Go)状态;

7、检测P1MEMSTAT,直到确认了就绪(Ready)状态;

----------------------------------------------------------------------------------

 

所有的原理就总结到这里,具体的源码可以到这里下载、分析。

如果您认为我的方法不好,可以在评论中批评、指出。

如果有朋友有更好的办法来解决MINI6410内存的识别问题,也欢迎在评论中共享出来。

---------------------------------------------------------------------------
2011.3.15更新:
    只在u-boot的SPL中初始化DRAM控制器,在u-boot.bin中屏蔽了相关初始化代码。
    在初始化开发板后往环境变量中添加了“ramsize”变量,记录了内存的大小,使得bootargs可以实现向内核传递启动参数的“mem=”的自动配置。比如,在uboot中加入命令:
  1. setenv bootcmd 'setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.1.2:/home/tekkaman/development/share/mini6410_rootfs ip=192.168.1.22:192.168.1.2::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=$ramsize ; tftp 192.168.1.2:uImage ;bootm'
    注意:上面bootcmd后面的是用单引号包括起来的,否则mem=$ramsize会变为mem=256M等,无法在启动是自动配置。  

 

以下介绍的是u-boot-2010.09 针对友善之臂MINI6410移植的最基础版本,只包含了就基本的系统引导,NAND读写,DM9000网卡等等。但是这个足够开发的方便使用。今后会陆续添加原先我为mini2440添加的所有功能。

   但是此次移植并非我的功劳,首先基本的移植是由Alex Ling <kasimling at gmail.com>完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的
PAD_TO    := $(shell expr $$[$(TEXT_BASE) + 4096])
即可。

   DM9000的驱动没有太大的问题(修改了一点可能出现问题的地方,感谢肖工指教),但是原本的u-boot并没有调整所有SROM控制器的配置(其中包括连接DM9000所使用的bank1的总线),我使用了友善带的u-boot的参数配置了一下就好了。


一:http://www.icdev.com.cn/batch.viewlink.php?itemid=1694
ftp://ftp.denx.de/pub/u-boot/

去这2个网站随便下载都可以下载得到最新或者你想要的u-boot。现在我将下载u-boot-2010-09,这个也就是最新的版本啦。

下载后把它解压,然后得到u-boot-2010-09的文件夹,然后进去,并且做下面几件事情:
1:进入arch这个文件夹,把出arm外的前部文件夹删掉
2:进入board这个文件夹,把除samsung外前部文件夹删掉
3:进入include/configs,把除smdk6400.h外的所有文件删除。
4: 把顶层目录下有一个叫onenand_ipl的文件夹删除掉,因为没有用到。
5:进入nand_spl/board,把除samsung外全部文件删除掉。
6:再进入arch/arm/cpu文件夹,把除arm1176外其他文件夹删除掉。
7:再进入arch/arm/include/asm文件夹,把除arch-s3c64xx文件外带arch-XX的文件夹删除
8:再进入board/samsung文价夹下,把除smdk6400外其他文价夹删除掉。
至此已经把没用到或者不想见到它的文件夹跟文件删除掉了。爽吧。

二:
1:在顶层的目录下找到Makefile文件,并且打开,因为vi或者vim没用习惯而是改用gedit。
lwf@lwf-desktop:/home/u-boot-2010.12$  sudo gedit Makefile
在这个Makefile你会找到:
#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config    \
smdk6400_config    :    unconfig
    @mkdir -p $(obj)include $(obj)board/samsung/smdk6400
    @mkdir -p $(obj)nand_spl/board/samsung/smdk6400
    @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
    @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
    @if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then            \
        echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
    else                                        \
        echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
    fi
    @$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
    @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
然后我们可以这样为了适用我们的板子的仿照一下上面的写法于是就有这样:

 

#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config    \
smdk6400_config    :    unconfig
    @mkdir -p $(obj)include $(obj)board/samsung/smdk6400
    @mkdir -p $(obj)nand_spl/board/samsung/smdk6400
    @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
    @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
    @if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then            \
        echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
    else                                        \
        echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
    fi
    @$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
    @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

mini6410_noUSB_config    \
mini6410_config    :    unconfig
    @mkdir -p $(obj)include $(obj)board/samsung/mini6410
    @mkdir -p $(obj)nand_spl/board/samsung/mini6410
    @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
    @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
    @if [ -z "$(findstring mini6410_noUSB_config,$@)" ]; then            \
        echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/mini6410/config.tmp;\
    else                                        \
        echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/mini6410/config.tmp;\
    fi
    @$(MKCONFIG) mini6410 arm arm1176 mini6410 samsung s3c64xx
    @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

上面红色部分则为添加的代码。

四:修改
arch\arm\cpu\arm1176\s3c64xx\cpu_init.S后面添加外设存储的操作
    bne    check_dmc1_ready
    nop

#if defined(CONFIG_MINI6410)

#define SROM_BC1_REG_Tacs     (0x0)   // 0clk         address set-up
#define SROM_BC1_REG_Tcos     (0x4)   // 4clk         chip selection set-up
#define SROM_BC1_REG_Tacc     (0xE)   // 14clk        access cycle
#define SROM_BC1_REG_Tcoh     (0x1)   // 1clk         chip selection hold
#define SROM_BC1_REG_Tah      (0x4)   // 4clk         address holding time
#define SROM_BC1_REG_Tacp     (0x6)   // 6clk         page mode access cycle
#define SROM_BC1_REG_PMC      (0x0)   // normal(1data)page mode configuration

#define SROM_BW_REG_DATA    ((1<<7) | (1<<6) | (1<<4))
#define SROM_BW_REG_BC1        (0xf << 4)
#define SROM_BC1_REG_DATA    ((SROM_BC1_REG_Tacs << 28) | (SROM_BC1_REG_Tcos << 24) | \
                (SROM_BC1_REG_Tacc << 16) | (SROM_BC1_REG_Tcoh << 12) | \
                (SROM_BC1_REG_Tah << 8) | (SROM_BC1_REG_Tacp << 4) | \
                (SROM_BC1_REG_PMC))

    ldr    r0, =ELFIN_SROM_BASE

    ldr    r1, [r0, #SROM_BW_REG_DATA]
    mov    r2, #(~SROM_BW_REG_BC1)
    and    r1, r1, r2
    mov    r2, #SROM_BW_REG_DATA
    orr    r1, r1, r2   
    str    r1, [r0, #INDEX_SROM_BW_REG]

    ldr    r1, =SROM_BC1_REG_DATA
    str    r1, [r0, #INDEX_SROM_BC1_REG]
#endif

    mov    pc, lr

五:arch\arm\cpu\arm1176\s3c64xx\Makefile
修改:
include $(TOPDIR)/config.mk

LIB    = $(obj)lib$(SOC).a

SOBJS    = reset.o

COBJS-$(CONFIG_S3C6400)    += cpu_init.o speed.o
COBJS-$(CONFIG_S3C6410)    += cpu_init.o speed.o
COBJS-y    += timer.o

 


六:arch\arm\include\asm\arch-s3c64xx\s3c64x0.h


#ifndef __S3C64XX_H__
#define __S3C64XX_H__

#if defined(CONFIG_SYNC_MODE) && (defined(CONFIG_S3C6400) || defined(CONFIG_S3C6410))
#error CONFIG_SYNC_MODE unavailable on S3C6400, please, fix your configuration!
#endif

#include <asm/types.h>

七:arch\arm\include\asm\arch-s3c64xx\s3c6400.h
define ELFIN_SROM_BASE        0x70000000

#define SROM_BW_REG    __REG(ELFIN_SROM_BASE + 0x0)
#define SROM_BC0_REG    __REG(ELFIN_SROM_BASE + 0x4)
#define SROM_BC1_REG    __REG(ELFIN_SROM_BASE + 0x8)
#define SROM_BC2_REG    __REG(ELFIN_SROM_BASE + 0xC)
#define SROM_BC3_REG    __REG(ELFIN_SROM_BASE + 0x10)
#define SROM_BC4_REG    __REG(ELFIN_SROM_BASE + 0x14)
#define SROM_BC5_REG    __REG(ELFIN_SROM_BASE + 0x18)

#define INDEX_SROM_BW_REG    0x0
#define INDEX_SROM_BC0_REG    0x4
#define INDEX_SROM_BC1_REG    0x8
#define INDEX_SROM_BC2_REG    0xC
#define INDEX_SROM_BC3_REG    0x10
#define INDEX_SROM_BC4_REG    0x14
#define INDEX_SROM_BC5_REG    0x18

八:在board\samsung建立Mini6410的文件夹,并且把smdk6400文件里面的所有文件复制过去
board\samsung\mini6410\lowlevel_init.S

_TEXT_BASE:
    .word    TEXT_BASE

    .globl lowlevel_init
lowlevel_init:
    mov    r12, lr


   
    ldr    r0, =ELFIN_GPIO_BASE
    ldr    r1, =0x55540000
    str    r1, [r0, #GPNCON_OFFSET]

    ldr    r1, =0x55555555
    str    r1, [r0, #GPNPUD_OFFSET]

    ldr    r1, =0xf000
    str    r1, [r0, #GPNDAT_OFFSET]

把这个上面的LED屏蔽掉

在这个添加
wakeup_reset:

   
    ldr    r0, =(ELFIN_CLOCK_POWER_BASE + WAKEUP_STAT_OFFSET)
    ldr    r1, [r0]
    str    r1, [r0]

   
    ldr    r0, =ELFIN_GPIO_BASE
    ldr    r1, =0x3000
    str    r1, [r0, #GPNDAT_OFFSET]

把上面这个红色的屏蔽掉


#if !defined(CONFIG_S3C6400) && !defined(CONFIG_S3C6410)
    ldr    r1, [r0, #OTHERS_OFFSET]
    bic    r1, r1, #0xC0
    orr    r1, r1, #0x40
    str    r1, [r0, #OTHERS_OFFSET]

添加多一个标志定义!defined(CONFIG_S3C6410)

同样下面的也是添加
if defined(CONFIG_SYNC_MODE)
    ldr    r1, [r0, #OTHERS_OFFSET]
    orr    r1, r1, #0x20
    str    r1, [r0, #OTHERS_OFFSET]
#elif !defined(CONFIG_S3C6400) && !defined(CONFIG_S3C6410)
   
    ldr    r1, [r0, #OTHERS_OFFSET]
    bic    r1, r1, #0x20
    str    r1, [r0, #OTHERS_OFFSET]
#endif
    mov    pc, lr


board\samsung\mini6410\Makefile中
include $(TOPDIR)/config.mk

LIB    = $(obj)lib$(BOARD).a

COBJS-y    := mini6410.o
SOBJS    := lowlevel_init.o

board\samsung\mini6410\mini6410.c中把
头文件#include <netdev.h>屏蔽掉
并且屏蔽掉:
#define CS8900_Tacs    0x0   
#define CS8900_Tcos    0x4   
#define CS8900_Tacc    0xE   
#define CS8900_Tcoh    0x1   
#define CS8900_Tah    0x4   
#define CS8900_Tacp    0x6   
#define CS8900_PMC    0x0   

static void cs8900_pre_init(void)
{
    SROM_BW_REG &= ~(0xf << 4);
    SROM_BW_REG |= (1 << 7) | (1 << 6) | (1 << 4);
    SROM_BC1_REG = ((CS8900_Tacs << 28) + (CS8900_Tcos << 24) +
            (CS8900_Tacc << 16) + (CS8900_Tcoh << 12) +
            (CS8900_Tah << 8) + (CS8900_Tacp << 4) + CS8900_PMC);
}
    cs8900_pre_init();

   
    SROM_BW_REG |= 4 | 8 | 1;


int checkboard(void)
{
    printf("Board:   SMDK6400\n");
    return 0;
}
把SMDK6400改成MINI6410

下面红色标记的也是要改成virt_to_phy_mini6410
#ifdef CONFIG_ENABLE_MMU
ulong virt_to_phy_smdk6400(ulong addr)
{
    if ((0xc0000000 <= addr) && (addr < 0xc8000000))
        return addr - 0xc0000000 + 0x50000000;
    else
        printf("do not support this address : lx\n", addr);

    return addr;
}
#endif

屏蔽下面这段:
ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t *info)
{
    if (banknum == 0) {   
        info->portwidth = FLASH_CFI_16BIT;
        info->chipwidth = FLASH_CFI_BY16;
        info->interface = FLASH_CFI_X16;
        return 1;
    } else
        return 0;
}


把下面这个
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
    int rc = 0;
#ifdef CONFIG_CS8900
    rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
    return rc;
}
#endif
改成:
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bi)
{
    int rc = 0;

#if defined(CONFIG_DRIVER_DM9000)
    rc = dm9000_initialize(bi);
#endif
    return rc;
}
#endif


九:drivers\net\dm9000x.c
        DM9000_ior(DM9000_MRCMDX);   

       
        rxbyte = DM9000_inb(DM9000_DATA) & 0x03;

        //MR. xiao
        #if 1
         u8 temp;
         temp=DM9000_ior(DM9000_MRRH);
         temp=DM9000_ior(DM9000_MRRL);
        #endif   
        //MR. xiao

增加红色的部分

十:drivers\usb\host\ohci-hcd.c 添加下面红色的部分
#if defined(CONFIG_ARM920T) || \
    defined(CONFIG_S3C24X0) || \
    defined(CONFIG_S3C6400) || \
    defined(CONFIG_S3C6410) || \
    defined(CONFIG_440EP) || \
    defined(CONFIG_PCI_OHCI) || \
    defined(CONFIG_MPC5200) || \
    defined(CONFIG_SYS_OHCI_USE_NPS)
# define OHCI_USE_NPS       
#endif

十一:include\configs\mini6410.h
这个mini6410.h,自己建设一个,内容复制copy的就可以了。
然后打开mini6410.h修改如下:

//#define CONFIG_S3C6400        1   
#define CONFIG_S3C6410        1   
#define CONFIG_S3C64XX        1   
#define CONFIG_MINI6410        1   
   
*
* Architecture magic and machine type
*/
#define MACH_TYPE        2520   
这个机械ID 我不知道为什么要改成2520 错了 内核是驱动不了的。

把CS89的网卡干掉 换成这样:

#define CONFIG_NET_MULTI               1
#define CONFIG_DRIVER_DM9000        1
#define CONFIG_DM9000_NO_SROM        1
#define CONFIG_DM9000_USE_16BIT        1
#define CONFIG_DM9000_BASE        0x18000300
#define DM9000_IO            CONFIG_DM9000_BASE
#define DM9000_DATA            (CONFIG_DM9000_BASE+4)


#define CONFIG_ETHADDR            08:08:10:12:10:27
#define CONFIG_NETMASK            255.255.255.0
#define CONFIG_IPADDR            192.168.1.253
#define CONFIG_SERVERIP            192.168.1.159
#define CONFIG_GATEWAYIP        192.168.1.1

添加下面的宏(红色部分)
#define CONFIG_CMD_PING
#define CONFIG_CMD_ELF
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2

#undef CONFIG_CMD_IMLS

#define CONFIG_BOOTDELAY    3


#define CONFIG_SYS_LONGHELP               
#define CONFIG_SYS_PROMPT        "MINI6410 # "   
改成你自己喜欢的提示字符 这里是"MINI6410 # "

**********************************
Support Clock Settings
**********************************
Setting    SYNC    ASYNC
----------------------------------
667_133_66     X      O
533_133_66     O      O
400_133_66     X      O
400_100_50     O      O
**********************************/

#define CONFIG_CLK_667_133_66

提高主频


把下面的全部删除掉
把#define CONFIG_SYS_FLASH_CFI        1   
换成#define CONFIG_SYS_NO_FLASH
*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#define CONFIG_SYS_MAX_FLASH_BANKS    1   

#define CONFIG_SYS_MAX_FLASH_SECT    40

#define CONFIG_AMD_LV800
#define CONFIG_SYS_FLASH_CFI        1   

#define CONFIG_FLASH_CFI_DRIVER    1
#define CONFIG_SYS_FLASH_CFI_WIDTH    FLASH_CFI_16BIT
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16


#define CONFIG_SYS_FLASH_ERASE_TOUT    (5 * CONFIG_SYS_HZ)
#define CONFIG_SYS_FLASH_WRITE_TOUT    (5 * CONFIG_SYS_HZ)


#define CONFIG_IDENT_STRING    " for SMDK6400" 改成
#define CONFIG_IDENT_STRING    " for MINI6410"

十二:include\common.h
添加如下:
#ifdef CONFIG_4xx
ulong    get_OPB_freq (void);
ulong    get_PCI_freq (void);
#endif
#if defined(CONFIG_S3C24X0) || \
    defined(CONFIG_LH7A40X) || \
    defined(CONFIG_S3C6400) || \
    defined(CONFIG_S3C6410) || \
    defined(CONFIG_EP93XX)
ulong    get_FCLK (void);
ulong    get_HCLK (void);
ulong    get_PCLK (void);
ulong    get_UCLK (void);
#endif

十三:顶层的MAKEALL
#########################################################################
## ARM11 Systems
#########################################################################
LIST_ARM11="            \
    cp1136            \
    omap2420h4        \
    apollon            \
    imx31_litekit        \
    imx31_phycore        \
    imx31_phycore_eet    \
    mx31ads            \
    mx31pdk            \
    mx31pdk_nand        \
    qong            \
    smdk6400        \
    tnetv107x_evm        \
    mini6410        \
"

十四:顶层的MAINTAINERS
Alex Züpke <azu@sysgo.de>

    lart        SA1100
    dnp1110        SA1110

Alex Ling <kasimling at gmail.com>

    MINI6410    ARM1176JZF-S (S3C6410)

十五:
nand_spl\board\samsung\mini6410\config.mk
修改为:
# FriendlyARM MINI6410 development board, based on
# Samsung S3C64xx Reference Platform (smdk6400) board

# TEXT_BASE for SPL:
#
# On S3C64xx platforms the SPL is located in SRAM at 0.
#
# TEXT_BASE = 0

include $(TOPDIR)/board/$(BOARDDIR)/config.mk

# PAD_TO used to generate a 4kByte binary needed for the combined image
# -> PAD_TO = TEXT_BASE + 4096
PAD_TO    := $(shell expr $(TEXT_BASE) + 4096)

ifeq ($(debug),1)
PLATFORM_CPPFLAGS += -DDEBUG
endif

在nand_spl\board\samsung\mini6410这个mini6410是仿照里面的SMDK6400做的内容一样复制然后如下面的修改就可以
nand_spl\board\samsung\mini6410\Makefile中:
# from board directory
$(obj)lowlevel_init.S:
    @rm -f $@
    @ln -s $(TOPDIR)/board/samsung/smdk6400/lowlevel_init.S $@

改为:
# from board directory
$(obj)lowlevel_init.S:
    @rm -f $@
    @ln -s $(TOPDIR)/board/samsung/mini6410/lowlevel_init.S $@