免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1086 | 回复: 0
打印 上一主题 下一主题

uboot学习(2)----从nand flash中启动ubboot [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-07 21:46 |只看该作者 |倒序浏览

                                    由于我的板子除了没有nor flash外,其他的配置基本上了smdk2410的一样。所以只需要更改以下几个文件:
1、cpu/arm920t/start.s;
2、include/configs/smdk2410.h;
3、board/smdk2410/memsetup.S
4、增加nand flash c语言读程序board/smdk2410/nand-read.c
5、board/smdk2410/Makefile
以下修改使用http://blog.chinaunix.net/u/19186/showart_241752.html上的移植代码,十分感谢。
(一)start.s修改内容
注释掉以下程序
relocate:                    /* relocate U-Boot to RAM        */
    adr    r0, _start        /* r0 在ldr    pc, _start_armboot_start_armboot:    .word start_armboot之前加入以下程序:
#ifdef CONFIG_S3C2410_NAND_BOOT
  bl    copy_myself

  @ jump to ram
  ldr   r1, =on_the_ram
  add  pc, r1, #0
  nop
  nop
  1:    b     1b          @ infinite loop

on_the_ram:
#endif
在ldr    pc, _start_armboot_start_armboot:    .word start_armboot之后加入以下程序:
#ifdef CONFIG_S3C2410_NAND_BOOT
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 (for nand_read())
  ldr   sp, DW_STACK_START       @ setup stack pointer
  mov fp, #0                    @ no previous frame, so fp=0
@ copy vivi to RAM
  ldr   r0, =UBOOT_RAM_BASE
  mov     r1, #0x0
  mov r2, #0x20000
  bl    nand_read_ll
  tst    r0, #0x0
  beq  ok_nand_read
#ifdef CONFIG_DEBUG_LL
  bad_nand_read:
  ldr   r0, STR_FAIL
  ldr   r1, SerBase
  bl    PrintWord
1:b     1b          @ infinite loop
  #endif
ok_nand_read:
#ifdef CONFIG_DEBUG_LL
  ldr   r0, STR_OK
  ldr   r1, SerBase
  bl    PrintWord
#endif
@ verify
  mov r0, #0
  ldr   r1, =UBOOT_RAM_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:
#ifdef CONFIG_DEBUG_LL
  sub  r0, r0, #4
  ldr   r1, SerBase
  bl    PrintHexWord
  ldr   r0, STR_FAIL
  ldr   r1, SerBase
  bl    PrintWord
#endif
1:b     1b
done_nand_read:
#ifdef CONFIG_DEBUG_LL
  ldr   r0, STR_OK
  ldr   r1, SerBase
  bl    PrintWord
#endif
  mov pc, r10
@ clear memory
@ r0: start address
@ r1: length
  mem_clear:
  mov r2, #0
  mov r3, r2
  mov r4, r2
  mov r5, r2
  mov r6, r2
  mov r7, r2
  mov r8, r2
  mov r9, r2
clear_loop:
  stmia      r0!, {r2-r9}
  subs r1, r1, #(8 * 4)
  bne  clear_loop
  mov pc, lr
#endif @ CONFIG_S3C2410_NAND_BOOT
   .align     2
DW_STACK_START:
.word      STACK_BASE+STACK_SIZE-4
修改的目的是使得系统启动时uboot从nand flash拷贝到sdram中
(二)修改smdk2410.h,加入nand flash特殊寄存器的地址和堆栈地址,注意此时
#define CONFIG_INIT_CRITICAL        /* undef for developing */必须有效!!!!
/*
* Nandflash Boot
*/
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE    0x33f00000
#define STACK_SIZE    0x8000
#define UBOOT_RAM_BASE    0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE            0x4E000000
#define bINT_CTL(Nb)        __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF               0x00
#define oNFCMD                0x04
#define oNFADDR               0x08
#define oNFDATA               0x0c
#define oNFSTAT               0x10
#define oNFECC                0x14
(三)修改memsetup.S,由于nGcs6,7上接了sdram所以只需要更改以下内容
#define B6_MT             0x3    /* SDRAM */
#define B6_Trcd           0x1
#define B6_SCAN           0x0    /* 9bit */
#define B7_MT             0x3    /* SDRAM */
#define B7_Trcd           0x1    /* 3clk */
#define B7_SCAN           0x0    /* 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            1113    /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
(四)在board/smdk2410/下增加读nand flash程序,nand-read.c
#include
#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> 9) & 0xff;
      NFADDR = (i >> 17) & 0xff;
      NFADDR = (i >> 25) & 0xff;
      wait_idle();
      for(j=0; j (五)修改Makefile
在加入nand-read.o
OBJS    := smdk2410.o flash.o nand_read.o
    通过上面的修改编译后,将u-boot.bin烧写到nand flash后 启动显示
U-Boot 1.2.0 (Feb  2 2007 - 00:49:08)
DRAM:  64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
PY2410 #
呵呵,说明uboot从nand flash 启动成功,但没有正确显示nand flash信息,也不能通过uboot烧写nand flash ,这些应该修改uboot的第二阶段来实现。等研究第二阶段代码后再继续移植。到此才对uboot的第一阶段了更深一步的了解。
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/29387/showart_244343.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP