在2410上移植uboot1.3.2

转贴地址:http://blog.chinaunix.net/u2/74524/showart_1105803.html 

 

目前官方网站上最新版本的u-boot 是1.3.3,本来想打算移植1.3.3的,但是这几天的经历让我放弃了1.3.3。原由是这样的,前不久移植了1.2.0,这个版本的移植相对来说比较 容易,因为网上的资料比较多,而这次我就打算直接移植1.3.3,因为前面有了基础了,做事情就不怕。为了让底气更足一点,补了两天的基础,其中看了看汇 编语言,将cpu/arm920t/start.S这个文件也看了几遍。有空再整理一下对start.S这个文件的彻底分析,目前网上的分析并不好,不全 面,讲得不透彻,相信很多朋友对这个文件还是一知半解的,可以也包括我自己。

  我首先移植时和上一次移植1.2.0一样,NAND的启动代码用的是vivi中的那一段,但是就是不。编译一直没有报错,但就是不好使,因为我没有调试 器,不能一条一条来调试,只能从网上看资料与自己看源码。紧接着我将1.3.3的源码中我改过的几个文件与1.2.0中的一一对应了一次,发现确实有点不 同,但是整个代码的流程是一致的,但还是启动不起来,灯都没亮起来。后来向同学yqliu请教,他已把1.3.2移植到博创2410的板子上的,后来他说 start.S其中有个宏,是为AT91RM9200配置用的,它将其中一段重定向代码给弄进来了。其实就是这个宏:
#ifndef CONFIG_AT91RM9200
后来我将个宏去了,再正确地加上原来代码还是没启动起来。
后来把他移植好的1.3.2拿过来与我的1.3.3的改过的文件一一进行比较,然后是一样将启动代码也弄成一样的,烧写到flash中还是不好使。
后来让yqliu来弄,它又弄了将近几个小时也没弄好。
因为没有调试工具,所以比较麻烦来弄清楚start.S中到底是哪个代码了了问题。
后来放弃了,移植一个1.3.2吧。
然后从网上下了一个1.3.2的源码,用了将近20分钟,全部弄好了。呵呵!
因为阳初2410的网卡为CS8900,所以不用改动这一块,这个相对来说是省事了很多。
 
下面来重复一下我的整个移植过程:(整理一下笔记,为以后复习用)
并在XP系统下改名为u-boot-1.3.2.tar.gz
 
2、用SSH服务登陆linux,将源码拷贝到linux下的/home/arm-work/下,这个是我自己习惯的目录与共享文件方式,具体情况,因个人喜好而异。你也可以用其它方式拷贝文件。
 
3、进入linux系统
切换到/home/arm-work/目录下:
cd //home/arm-work/
解压源码:
tar zxvf u-boot-1.3.2.tar.gz
此时解压后得到u-boot目录,下面即为1.3.2的源码,将其改名为u-boot-1.3.2:
mv u-boot u-boot-1.3.2
进入到源码目录:
cd u-boot-1.3.2/

接着上次的工作来:
1、建立自己开发板的目录,我将我的开发板取名为YYS2410,现在大多开发板都是由三星公司的SMDK2410板子改装而来,所以为了尽量地省改文件,将SMDK开发板的相关目录拷贝过来进行修改即可。
建立自己开发板目录:
cp -rf board/smdk2410 board/yys2410
建立自己开发板的配置头文件:
cp include/configs/smdk2410.h include/configs/yys2410.h
为自己的开发板添加配置:
emacs Makefile
在适当位置添中自己的板子
smdk2400_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0
smdk2410_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
yys2410_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t yys2410 NULL s3c24x0
(注意红色部分为我添加或者修改的)
此时再终端中输入:
make yys2410_config
终端将显示:
Configuring for yys2410 board...
再进行一下编译:
make CROSS_COMPILE=arm-linux-
一阵编译的英语飘过……
若编译通过,则将会在目录下生成u-boot.bin,表明建立自己的开发板已经成功,可进到第二步,进行相关的修改,以符合自己的开发板。
 
2、修改cpu/arm920t/start.S文件,让其从nand flash启动
 emacs cpu/arm920t/start.S
在此我将这个文件全部粘贴出来:(我已作修改)
/*
 *  armboot - Startup Code for ARM920 CPU-core
 *
 *  Copyright (c) 2001 Marius Gr鰃er < mag@sysgo.de>
 *  Copyright (c) 2002 Alex Z黳ke < azu@sysgo.de>
 *  Copyright (c) 2002 Gary Jennejohn < gj@denx.de>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <config.h>
#include <version.h>
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#ifdef CONFIG_AT91RM9200
#include <status_led.h>
#endif /* CONFIG_AT91RM9200 */
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*/
/*
 *************************************************************************
 *
 * Jump vector table as in table 3.1 in [1]
 *
 *************************************************************************
 */

.globl _start
_start: b       start_code
 ldr pc, _undefined_instruction
 ldr pc, _software_interrupt
 ldr pc, _prefetch_abort
 ldr pc, _data_abort
 ldr pc, _not_used
 ldr pc, _irq
 ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort:  .word data_abort
_not_used:  .word not_used
_irq:   .word irq
_fiq:   .word fiq
 .balignl 16,0xdeadbeef

/*
 *************************************************************************
 *
 * Startup Code (called from the ARM reset exception vector)
 *
 * do important init only if we don't start from memory!
 * relocate armboot to ram
 * setup stack
 * jump to second stage
 *
 *************************************************************************
 */
_TEXT_BASE:
 .word TEXT_BASE
.globl _armboot_start
_armboot_start:
 .word _start
/*
 * These are defined in the board-specific linker script.
 */
.globl _bss_start
_bss_start:
 .word __bss_start
.globl _bss_end
_bss_end:
 .word _end
#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
 .word 0x0badc0de
/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
 .word 0x0badc0de
#endif

/*
 * the actual start code
 */
start_code:
 /*
  * set the cpu to SVC32 mode
  */
 mrs r0,cpsr
 bic r0,r0,#0x1f
 orr r0,r0,#0xd3
 msr cpsr,r0
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#ifdef CONFIG_AT91RM9200
 bl coloured_LED_init
 bl red_LED_on
#endif /* CONFI_AT91RM9200 */
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)
 /*
  * relocate exception table
  */
 ldr r0, =_start
 ldr r1, =0x0
 mov r2, #16
copyex:
 subs r2, r2, #1
 ldr r3, [r0], #4
 str r3, [r1], #4
 bne copyex
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
 /* 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
 ldr     r0, =pWTCON
 mov     r1, #0x0
 str     r1, [r0]
 /*
  * 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, =0x3ff
 ldr r0, =INTSUBMSK
 str r1, [r0]
# endif
 /* FCLK:HCLK:PCLK = 1:2:4 */
 /* default FCLK is 120 MHz ! */
 ldr r0, =CLKDIVN
 mov r1, #3
 str r1, [r0]
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */
 /*
  * we do sys-critical inits only at reboot,
  * not when booting from ram!
  */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 bl cpu_init_crit
#endif
#ifdef 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 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 */
#endif
 
/* add%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#ifdef CONFIG_S3C2410_NAND_BOOT
 bl copy_myself
#endif /* CONFIG_S3C2410_NAND_BOOT */
/* add%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
 /* Set up the stack          */
stack_setup:
 ldr r0, _TEXT_BASE  /* upper 128 KiB: relocated uboot   */
 sub r0, r0, #CFG_MALLOC_LEN /* malloc area                      */
 sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
#ifdef CONFIG_USE_IRQ
 sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
 sub sp, r0, #12  /* leave 3 words for abort-stack    */
clear_bss:
 ldr r0, _bss_start  /* find start of bss segment        */
 ldr r1, _bss_end  /* stop here                        */
 mov  r2, #0x00000000  /* clear                            */
clbss_l:str r2, [r0]  /* clear loop...                    */
 add r0, r0, #4
 cmp r0, r1
 ble clbss_l
 ldr pc, _start_armboot
_start_armboot: .word start_armboot
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
/*
 *************************************************************************
 *
 * copy u-boot to ram
 *
 *************************************************************************
 */
#ifdef CONFIG_S3C2410_NAND_BOOT
copy_myself:
 mov r10, lr    @save return address to r10
 ldr sp, DW_STACK_START  
 mov fp, #0     
 bl NF_Init    

 ldr r0, =UBOOT_RAM_BASE   
 mov r1, #0x0  
 mov r2, #0x30000  
 bl nand_read_whole  
      
 tst r0, #0x0  
 beq ok_nand_read  
1: b 1b    
ok_nand_read:
 mov r0, #0x00000000
 ldr r1, =UBOOT_RAM_BASE
 mov r2, #0x400 
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   
 
DW_STACK_START:
 .word STACK_BASE+STACK_SIZE-4
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
/*
 *************************************************************************
 *
 * CPU_init_critical registers
 *
 * setup important registers
 * setup memory timing
 *
 *************************************************************************
 */

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
 /*
  * flush v4 I/D caches
  */
 mov r0, #0
 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
 mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
 /*
  * disable MMU stuff and caches
  */
 mrc p15, 0, r0, c1, c0, 0
 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
 orr r0, r0, #0x00000002 @ set bit 2 (A) Align
 orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
 mcr p15, 0, r0, c1, c0, 0
 /*
  * before relocating, we have to setup RAM timing
  * because memory timing is board-dependend, you will
  * find a lowlevel_init.S in your board directory.
  */
 mov ip, lr
#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)
#else
 bl lowlevel_init
#endif
 mov lr, ip
 mov pc, lr
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
/*
 *************************************************************************
 *
 * Interrupt handling
 *
 *************************************************************************
 */
@
@ IRQ stack frame.
@
#define S_FRAME_SIZE 72
#define S_OLD_R0 68
#define S_PSR  64
#define S_PC  60
#define S_LR  56
#define S_SP  52
#define S_IP  48
#define S_FP  44
#define S_R10  40
#define S_R9  36
#define S_R8  32
#define S_R7  28
#define S_R6  24
#define S_R5  20
#define S_R4  16
#define S_R3  12
#define S_R2  8
#define S_R1  4
#define S_R0  0
#define MODE_SVC 0x13
#define I_BIT  0x80
/*
 * use bad_save_user_regs for abort/prefetch/undef/swi ...
 * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
 */
 .macro bad_save_user_regs
 sub sp, sp, #S_FRAME_SIZE
 stmia sp, {r0 - r12}   @ Calling r0-r12
 ldr r2, _armboot_start
 sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
 sub r2, r2, #(CFG_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack
 ldmia r2, {r2 - r3}   @ get pc, cpsr
 add r0, sp, #S_FRAME_SIZE  @ restore sp_SVC
 add r5, sp, #S_SP
 mov r1, lr
 stmia r5, {r0 - r3}   @ save sp_SVC, lr_SVC, pc, cpsr
 mov r0, sp
 .endm
 .macro irq_save_user_regs
 sub sp, sp, #S_FRAME_SIZE
 stmia sp, {r0 - r12}   @ Calling r0-r12
 add     r7, sp, #S_PC
 stmdb   r7, {sp, lr}^                   @ Calling SP, LR
 str     lr, [r7, #0]                    @ Save calling PC
 mrs     r6, spsr
 str     r6, [r7, #4]                    @ Save CPSR
 str     r0, [r7, #8]                    @ Save OLD_R0
 mov r0, sp
 .endm
 .macro irq_restore_user_regs
 ldmia sp, {r0 - lr}^   @ Calling r0 - lr
 mov r0, r0
 ldr lr, [sp, #S_PC]   @ Get PC
 add sp, sp, #S_FRAME_SIZE
 subs pc, lr, #4   @ return & move spsr_svc into cpsr
 .endm
 .macro get_bad_stack
 ldr r13, _armboot_start  @ setup our mode stack
 sub r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
 sub r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack
 str lr, [r13]   @ save caller lr / spsr
 mrs lr, spsr
 str     lr, [r13, #4]
 mov r13, #MODE_SVC   @ prepare SVC-Mode
 @ msr spsr_c, r13
 msr spsr, r13
 mov lr, pc
 movs pc, lr
 .endm
 .macro get_irq_stack   @ setup IRQ stack
 ldr sp, IRQ_STACK_START
 .endm
 .macro get_fiq_stack   @ setup FIQ stack
 ldr sp, FIQ_STACK_START
 .endm
/*
 * exception handlers
 */
 .align  5
undefined_instruction:
 get_bad_stack
 bad_save_user_regs
 bl  do_undefined_instruction
 .align 5
software_interrupt:
 get_bad_stack
 bad_save_user_regs
 bl  do_software_interrupt
 .align 5
prefetch_abort:
 get_bad_stack
 bad_save_user_regs
 bl  do_prefetch_abort
 .align 5
data_abort:
 get_bad_stack
 bad_save_user_regs
 bl  do_data_abort
 .align 5
not_used:
 get_bad_stack
 bad_save_user_regs
 bl  do_not_used
#ifdef CONFIG_USE_IRQ
 .align 5
irq:
 get_irq_stack
 irq_save_user_regs
 bl  do_irq
 irq_restore_user_regs
 .align 5
fiq:
 get_fiq_stack
 /* someone ought to write a more effiction fiq_save_user_regs */
 irq_save_user_regs
 bl  do_fiq
 irq_restore_user_regs
#else
 .align 5
irq:
 get_bad_stack
 bad_save_user_regs
 bl  do_irq
 .align 5
fiq:
 get_bad_stack
 bad_save_user_regs
 bl  do_fiq
#endif
说明:红色部分是我个人添加的,并作了一些相关注释。
关于第一处与第二处,加上宏定义的原因是那两个灯是为在AT91RM9200的开发板上用来指示状态的,所以加上。第三处与第四处是为了让其能从nand flash启动起来。
另外特别值得注意的是那个绿色的宏,我下载的u-boot版本是1.3.3之前的最后一个1.3.2的发行版,这个地方已经改过来了,可能有些1.3.2的版本此处还是 #ifndef CONFIG_AT91RM9200, 那么下面的一段重定向代码将会执行,copy_loop也会执行,所以是启动不起来的。
在我所下载的1.3.3中的源码中就有这个问题,即使我的1.3.3没有移植成功。

1、在板级目录下新建Nand Flash的读函数文件:
emacs nand.c
然后将下面的内容粘贴进去,并且保存退出:
#include <common.h>
#include <s3c2410.h>
#include <config.h>
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
#define U32 unsigned int
extern unsigned long nand_probe(unsigned long physadr);
static void NF_Reset(void)
{
 int i;
 NF_nFCE_L(); /* 片选Nand Flash芯片*/
 NF_CMD(0xFF); /* 复位命令 */
 for(i=0;i<10;i++); /* 等待tWB = 100ns. */
 NF_WAITRB(); /* wait 200~500us; */
 NF_nFCE_H(); /* 取消Nand Flash 选中*/
}
void NF_Init(void)
{
 /* 设置Nand Flash配置寄存器, 每一位的取值见1.3节
  * initial value is 0xf830 */
 rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);
 /* 复位外部Nand Flash芯片 */
 NF_Reset();
}
 
/* 从Nand Flash中把数据读入到RAM中 */
int nand_read_whole(unsigned char *buf, unsigned long start_addr, int size)
{
 int i, j;
 /* 如果起始地址和长度不是512字节(1页)的倍数, 则返回错误代码 */
 if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
  return 1;
 }
 /* 激活Nand Flash */
 NF_nFCE_L();
 for(i=0; i<10; i++);
 i = start_addr;
 while(i < start_addr + size) {
  /* 读A区 */
  rNFCMD = 0;
  /* 写入读取地址 */
  rNFADDR = i & 0xff;
  rNFADDR = (i >> 9) & 0xff;
  rNFADDR = (i >> 17) & 0xff;
  rNFADDR = (i >> 25) & 0xff;
  NF_WAITRB();
  /* 读出一页(512字节) */
  for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
   *buf = (rNFDATA & 0xff);
   buf++;
  }
 }
 /* 停止驱动Nand Flash */
 NF_nFCE_H();
 return 0;
}
这个文件是严重地板级依赖的,取决于你开发板的FLASH芯片,我的是K9F1208U0B,估计很多板子都是用这个FLASH芯片。
 
2、修改yys2410下的Makefile
emacs board/yys2410/Makefile
 
nclude $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
COBJS := smdk2410.o flash.o nand.o
SOBJS := lowlevel_init.o
红色部分为修改的内容。
 
3、修改板级配置头文件
emacs include/configs/yys2410
在些我将我修改后的悠悠然粘贴出来:
 
/*
 * (C) Copyright 2002
 * Sysgo Real-Time Solutions, GmbH < www.elinos.com>
 * Marius Groeger < mgroeger@sysgo.de>
 * Gary Jennejohn < gj@denx.de>
 * David Mueller < d.mueller@elsoft.ch>
 *
 * Configuation settings for the SAMSUNG SMDK2410 board.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */
#ifndef __CONFIG_H
#define __CONFIG_H
/*
 * High Level Configuration Options
 * (easy to change)
 */
#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  */
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
#define UBOOT_RAM_BASE 0x33f80000
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
/* input clock of PLL */
#define CONFIG_SYS_CLK_FREQ 12000000/* the SMDK2410 has 12MHz input clock */

#define USE_920T_MMU  1
#undef CONFIG_USE_IRQ   /* we don't need IRQ/FIQ stuff */
/*
 * Size of malloc() pool
 */
#define CFG_MALLOC_LEN  (CFG_ENV_SIZE + 128*1024)
#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
/*
 * Hardware drivers
 */
#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
#define CS8900_BASE  0x19000300
#define CS8900_BUS16  1 /* the Linux driver does accesses as shorts */
/*
 * select serial console configuration
 */
#define CONFIG_SERIAL1          1 /* we use SERIAL 1 on SMDK2410 */
/************************************************************
 * RTC
 ************************************************************/
#define CONFIG_RTC_S3C24X0 1
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
#define CONFIG_BAUDRATE  115200

/*
 * BOOTP options
 */
#define CONFIG_BOOTP_BOOTFILESIZE
#define CONFIG_BOOTP_BOOTPATH
#define CONFIG_BOOTP_GATEWAY
#define CONFIG_BOOTP_HOSTNAME

/*
 * Command line configuration.
 */
#include <config_cmd_default.h>
#define CONFIG_CMD_CACHE
#define CONFIG_CMD_DATE
#define CONFIG_CMD_ELF
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#define CONFIG_CMD_REGINFO
#define CONFIG_CMD_NAND
#define CONFIG_CMD_PING
#define CONFIG_CMD_DLF
#define CONFIG_CMD_ENV
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#define CONFIG_BOOTDELAY 3
#define CONFIG_BOOTARGS     "root=ramfs devfs=mount console=ttySA0,115200"
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR  202.198.137.105
#define CONFIG_SERVERIP  10.0.0.1202.198.137.107
#define CONFIG_BOOTFILE "uImage"
#define CONFIG_BOOTCOMMAND "tftp; bootm"
#if defined(CONFIG_CMD_KGDB)
#define CONFIG_KGDB_BAUDRATE 115200  /* speed to run kgdb serial port */
/* what's this ? it's not used anywhere */
#define CONFIG_KGDB_SER_INDEX 1  /* which serial port to use */
#endif
/*
 * Miscellaneous configurable options
 */
#define CFG_LONGHELP    /* undef to save memory  */
#define CFG_PROMPT  "YYS2410 # " /* Monitor Command Prompt */
#define CFG_CBSIZE  256  /* Console I/O Buffer Size */
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS  16  /* max number of command args */
#define CFG_BARGSIZE  CFG_CBSIZE /* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x30000000 /* memtest works on */
#define CFG_MEMTEST_END  0x33F00000 /* 63 MB in DRAM */
#undef  CFG_CLKS_IN_HZ  /* everything, incl board info, in Hz */
#define CFG_LOAD_ADDR  0x33000000 /* default load address */
/* the PWM TImer 4 uses a counter of 15625 for 10 ms, so we need */
/* it to wrap 100 times (total 1562500) to get 1 sec. */
#define CFG_HZ   1562500
/* valid baudrates */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
/*-----------------------------------------------------------------------
 * Stack sizes
 *
 * The stack sizes are set up in start.S using the settings below
 */
#define CONFIG_STACKSIZE (128*1024) /* regular stack */
#ifdef CONFIG_USE_IRQ
#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
#endif
/*-----------------------------------------------------------------------
 * Physical Memory Map
 */
#define CONFIG_NR_DRAM_BANKS 1    /* we have 1 bank of DRAM */
#define PHYS_SDRAM_1  0x30000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
#define PHYS_FLASH_1  0x00000000 /* Flash Bank #1 */
#define CFG_FLASH_BASE  PHYS_FLASH_1
/*-----------------------------------------------------------------------
 * FLASH and environment organization
 */
#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
#if 0
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#endif
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE  0x00100000 /* 1MB */
#define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */
#define CFG_ENV_ADDR  (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */
#endif
#ifdef CONFIG_AMD_LV400
#define PHYS_FLASH_SIZE  0x00080000 /* 512KB */
#define CFG_MAX_FLASH_SECT (11) /* max number of sectors on one chip */
#define CFG_ENV_ADDR  (CFG_FLASH_BASE + 0x070000) /* addr of environment */
#endif
/* timeout values are in ticks */
#define CFG_FLASH_ERASE_TOUT (5*CFG_HZ) /* Timeout for Flash Erase */
#define CFG_FLASH_WRITE_TOUT (5*CFG_HZ) /* Timeout for Flash Write */
#define CFG_ENV_IS_IN_NAND 1 /* modify%%%%%%%%%%%%%% */
//#define CFG_ENV_SIZE  0x10000 /* Total Size of Environment Sector */
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#define CFG_ENV_SIZE  0x4000 /* Total Size of Environment Sector */
#define CFG_ENV_OFFSET  (0x80000-0x4000)
#define CONFIG_ARCH_SMDK2410 1
#define CFG_NAND_BASE 0x4E000000  /* Nand Flash控制器在SFR区中起始寄存器地址 */
#define CFG_MAX_NAND_DEVICE 1   /* 支持的最在Nand Flash数据 */
#define SECTORSIZE 512    /* 1页的大小 */
#define NAND_SECTOR_SIZE SECTORSIZE
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1) /* 页掩码 */
#define ADDR_COLUMN 1    /* 一个字节的Column地址 */
#define ADDR_PAGE 2    /* 3字节的页块地址, A9A25*/
#define ADDR_COLUMN_PAGE 3   /* 总共4字节的页块地址 */
#define NAND_ChipID_UNKNOWN 0x00  /* 未知芯片的ID号 */
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
/* Nand Flash命令层底层接口函数 */
#define WRITE_NAND_COMMAND(d, adr) do {rNFCMD = d;} while(0)
#define WRITE_NAND_ADDRESS(d, adr) do {rNFADDR = d;} while(0)
#define WRITE_NAND(d, adr) do {rNFDATA = d;} while(0)
#define READ_NAND(adr) (rNFDATA)
#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}
#define NAND_DISABLE_CE(nand) {rNFCONF |= (1<<11);}
#define NAND_ENABLE_CE(nand) {rNFCONF &= ~(1<<11);}
/* 下面一组操作对Nand Flash无效 */
#define NAND_CTL_CLRALE(nandptr)
#define NAND_CTL_SETALE(nandptr)
#define NAND_CTL_CLRCLE(nandptr)
#define NAND_CTL_SETCLE(nandptr)

/* 允许Nand Flash写校验 */
#define CONFIG_MTD_NAND_VERIFY_WRITE 1

#ifdef CONFIG_S3C2410_NAND_BOOT
#define rNFCONF (*(volatile unsigned int *)0x4e000000)
#define rNFCMD (*(volatile unsigned char *)0x4e000004)
#define rNFADDR (*(volatile unsigned char *)0x4e000008)
#define rNFDATA (*(volatile unsigned char *)0x4e00000c)
#define rNFSTAT (*(volatile unsigned int *)0x4e000010)
#define rNFECC (*(volatile unsigned int *)0x4e000014)
#define rNFECC0 (*(volatile unsigned char *)0x4e000014)
#define rNFECC1 (*(volatile unsigned char *)0x4e000015)
#define rNFECC2 (*(volatile unsigned char *)0x4e000016)
/* 操作的函数实现
 * 1. 发送命令 */
#define NF_CMD(cmd) {rNFCMD=cmd;}
/* 2. 写入地址 */
#define NF_ADDR(addr) {rNFADDR=addr;}
/* 3. Nand Flash芯片选中 */
#define NF_nFCE_L() {rNFCONF&=~(1<<11);}
/* 4. Nand Flash芯片不选中 */
#define NF_nFCE_H() {rNFCONF|=(1<<11);}
/* 5. 初始化ECC */
#define NF_RSTECC() {rNFCONF|=(1<<12);}
/* 6. 读数据 */
#define NF_RDDATA() (rNFDATA)
/* 7. 写数据 */
#define NF_WRDATA(data) {rNFDATA=data;}
/* 8. 获取Nand Flash芯片状态 */
#define NF_WAITRB() {while(!(rNFSTAT&(1<<0)));}
/* 0/假: 表示Nand Flash芯片忙状态
 * 1/真:表示Nand Flash已经准备好
 */
#endif
/* add %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
#endif /* __CONFIG_H */
其中第二处红色部分,是用来配置u-boot命令的,这个与1.2.0上有很大不同,1.3.2为它专门弄了一个头文件,这样变得方便多了。
其中有一部分是关于网络配置的,你可以自己更改。
这里还有一个值得注意的地方:
u-boot运行至第二阶段进入start_armboot()函数。其中nand_init()函数是对nand flash的最初初始化函数。Nand_init()函数在两个文件中实现。其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调 用 drivers/mtd/nand/nand.c中的nand_init();否则调用自己在drivers/mtd/nand_legacy /nand_legacy中的nand_init()函数。这里我选择第二种方式。
这样会更省事。
如果你选择第一种方式,更改的文件比较多。
 
整个移植过程就此完毕了,如果你的网卡不是CS8900,那么你还得修改一些驱动来适合这个网卡。
然后
进行make yys2410_config
再进行:make CROSS_COMPILE=arm-linux-
编译后得到u-boot.bin,烧写到flash中,打开 minicom,得到信息如下:
U-Boot 1.3.2 (Aug  4 2008 - 14:12:27)                                          
                                                                               
DRAM:  64 MB                                                                   
Flash: 512 kB                                                                  
NAND:  64 MiB                                                                  
In:    serial                                                                  
Out:   serial                                                                  
Err:   serial                                                                  
Hit any key to stop autoboot:  0                                               
YYS2410 #
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值