打印

U-BOOT中从nand flash复制128k数据到内存中的一段汇编代码的问题

[复制链接]
2041|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenwen112|  楼主 | 2011-7-6 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
开发板是FL2440,nand flash型号为:HY27UF082G2B,2048大页面的nandflash。bootloader是自己移植的u-boot,已实现nandflash烧写、擦除功能。移植从nand flash启动功能时,自己写了一段汇编程序,如下。 这段代码调试了很久也没通过,串口终端没有任何反映。调试方法很简陋,只是用板上的四个LED灯。实在是没办法了,才向坛子里的高手请教,看看到底哪里出了问题。绝对没有不劳而获的想法。小弟是新手,还在玩bootloader!望各位高手不吝赐教!


#define CFG_NAND_REG_BASE 0x4E000000 //s3c2440 nandflash控制器寄存器组起始地址
#define CFG_MONITOR_SIZE 0x00020000 //从nandflash复制到内存中的u-boot的大小
#define CFG_MONITOR_RAM_BASE 0x33F80000 //复制到内存中的地址
#define CFG_MONITOR_NAND_BASE 0x00000000 //u-boot在nandflash中的起始地址
#define CONFIG_NAND_BOOT 1 //从nandflash启动

/*s3c2440 nandflash控制器各寄存器地址偏移量*/
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFADDR 0x0C
#define oNFDATA 0x10
#define oNFSTAT 0x20

#ifdef CONFIG_NAND_BOOT
  ldr r0, =CFG_NAND_REG_BASE

  ldr r1, =((1<<12)|(4<<8)|(1<<4)|(0<<0)) //TACLS=1,TWRPH0=4, TWRPH1=1
  str r1, [r0, #oNFCONF]

  ldr r1, =((1<<6)|(1<<5)|(1<<4)|(0<<1)|(1<<0)) //使能NAND控制器,片选芯片,初始化ECC
  str r1, [r0, #oNFCONT]
   
  mov r1, #0x6 //RnB 清除
  strb r1, [r0, #oNFSTAT]

  mov r1, #0xff //复位command
  strb r1, [r0, #oNFCMD]

rst_wait: //复位等待就绪
  ldr r1, [r0, #oNFSTAT]   
  tst r1, #0x1
  beq rst_wait

  ldr r2, =CFG_MONITOR_RAM_BASE //内存复制地址
  ldr r3, =CFG_MONITOR_NAND_BASE //nandflash复制起始地址

copy_monitor:
  mov r1, #0x00 //写读页第一命令序列命令字
  strb r1, [r0, #oNFCMD]

  and r4, r3, #0xff //写第一地址序列
  strb r4, [r0, #oNFADDR]   

  mov r4, r3, lsr #8
  and r4, r4, #0x0f //写第二地址序列
  strb r4, [r0, #oNFADDR]  

  mov r4, r3, lsr #12
  and r4, r4, #0xff //写第三地址序列
  strb r4, [r0, #oNFADDR]  

  mov r4, r3, lsr #20
  and r4, r4, #0xff //写第四地址序列
  strb r4, [r0, #oNFADDR]  

  mov r4, r3, lsr #28
  and r4, r4, #0x01 //写第五地址序列
  strb r4, [r0, #oNFADDR]  

  mov r1, #0x30 //写读页第二命令序列命令字
  strb r1, [r0, #oNFCMD]  

  mov r1, #0x70 //写读状态寄存器命令
  strb r1, [r0, #oNFCMD]
wait_ready:
  ldrb r1, [r0, #oNFDATA] //等待就绪
  and r1, r1, #0x40
  teq r1, #0x40
  bne wait_ready
   
  mov r5, #0   
copy_page: //复制一页数据到内存中
  ldr r1, [r0, #oNFDATA]
  str r1, [r2], #4
  add r5, r5, #4
  cmp r5, #2048
  blt copy_page

  /*复制64页,128K*/
  add r3, r3, #0x1000 //新一页的起始地址
  ldr r5, =CFG_MONITOR_SIZE  
  cmp r3, r5, lsl #1
  blt copy_monitor
   
  ldr r1, [r0, #oNFCONT] //禁止芯片
  orr r1, r1, #0x02
  str r1, [r0, #oNFCONT]

/*检查搬移后的数据,如果steppingston到内存中的前1k与从nandflash复制到CFG_MONITOR_RAM_BASE处的数据完全相同,表示搬移成功*/
  mov r0, #0   
  ldr r1, =CFG_MONITOR_RAM_BASE
  mov r2, #0x400  

copy_complete:
  ldr r3, [r0], #4  
  ldr r4, [r1], #4
  teq r3, r4
  bne err
  subs r2, r2, #4
  beq stack_setup
  bne copy_complete

err:
  loop: b loop   
#endif

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝