66

帖子

0

TA的资源

一粒金砂(初级)

21
 
我把写保护弄上去还是不行,还是像上面那样根本不会跳到readpage那里去,还是出现这些问题
mov r6, #1
1
    bl ReadNandStatus

    mov r8, #0
    ldr r9, =ResetEntry
2
    ands r0, r8, #0x3f  ;
    bne %F3      ;【这个地方没哟跳到f3一直没有跳也就根本没有执行readpage(这个有点想不通)】
    mov r0, r8
    bl CheckBadBlk
    cmp r0, #0
    addne r8, r8, #64   
    bne %F4;【没跳到F3每次从这里跳到F4去了】
3
    mov r0, r8 ;
    mov r1, r9
    bl ReadNandPage
    add r9, r9, #2048
    add r8, r8, #1
4
    cmp r8, #64            ;
    bcc %B2

    mov r5, #NFCONF ;DsNandFlash
    ldr r0, [r5, #4]
    bic r0, r0, #1
    str r0, [r5, #4]              【上面我强制执行readpage后下面得pc还是没有正确跳转】
    ldr pc, =copy_proc_beg                  ;没有正确跳转


回复

80

帖子

0

TA的资源

一粒金砂(初级)

22
 
引用 17 楼 gooogleman 的回复:
这明显是flash读写不对造成的。

仿真是直接从电脑下载到内存的,根本没有执行flash拷贝这段。

你什么都没有错,错就错在少发了一个周期的指令——在读数据之前
gooogleman大侠,给我说了到底是少发了个什么周期指令嘛,我找数据手册上没找到,
今天下午我把不能跳转到readpage这个问题解决了,是我checkbadblk函数里面WrNFCmd(READCMD2) 值没写对,并且跟踪了下确定读了64页得数据到以resetentry为起始地址得地方,但在这个读取到得数据应该有错误,导致了下面ldr pc, =copy_proc_beg 还是没有正确跳转。
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

23
 
我把ldr pc, =copy_proc_beg 中的ldr改变成了ADR就能跳转了,但是还是不能启动bootloader
大侠帮我下嘛!200分赠送!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

24
 
  1. ;这是我的512M的,你自己比对一下。
  2. ReadNandPage
  3.         mov                 r7,lr
  4.         mov      r4,r1
  5.         mov      r5,#NFCONF

  6.         ldr      r1,[r5,#4]                ;NFChipEn()
  7.         bic      r1,r1,#2
  8.         str      r1,[r5,#4]       

  9.         mov      r1,#0                        ;WrNFCmd(READCMD0)
  10.         strb     r1,[r5,#8]       
  11.         strb     r1,[r5,#0xc]        ;WrNFAddr(0)
  12.         strb     r1,[r5,#0xc]        ;WrNFAddr(0)
  13.         strb     r0,[r5,#0xc]        ;WrNFAddr(addr)
  14.         mov      r1,r0,lsr #8        ;WrNFAddr(addr>>8)
  15.         strb     r1,[r5,#0xc]                       
  16.         mov      r0,r0,lsr #16        ;WrNFAddr(addr>>16)
  17.         strb     r0,[r5,#0xc]
  18.        
  19.         mov      r1,#0x30                        ;WrNFCmd(0x30)  
  20.         strb     r1,[r5,#8]       
  21.        
  22.         ldr      r0,[r5,#4]                ;InitEcc()
  23.         orr      r0,r0,#0x10
  24.         str      r0,[r5,#4]
  25.        
  26.         bl       WaitNandBusy        ;WaitNFBusy()
  27.        
  28.         mov      r0,#0                        ;for(i=0; i<512; i++)
  29. 1
  30.         ldrb     r1,[r5,#0x10]        ;buf[i] = RdNFDat()
  31.         strb     r1,[r4,r0]
  32.         add      r0,r0,#1
  33.         bic      r0,r0,#0x10000
  34.         cmp      r0,#0x800
  35.         bcc      %B1
  36.        
  37.         ldr      r0,[r5,#4]                ;NFChipDs()
  38.         orr      r0,r0,#2
  39.         str      r0,[r5,#4]
  40.                
  41.         mov                 pc,r7
复制代码
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

25
 
    mov      r1,#0x30                        ;WrNFCmd(0x30)  
    strb     r1,[r5,#8]

程序就是上面这个不同,这个我很早就改了,我最上面贴的是我保存在家里电脑上的程序不够新,今天我回去把我最新的贴出来(公司不好弄)程序和你的一样的。其他的和上面不一样的就是我把checkbadblk里mov      r1,#0x50 ;WrNFCmd(READCMD2)添上了,把0x50改成了0x30不添的话程序不会条到readpage去
但是烧进flash我跟踪了下在bl main前点灯都亮,也就是说bl main没有成功,这段汇编我只修改了nand有关的部分,其他的都没有动。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

26
 
好热的贴,我就是不懂,O(∩_∩)O哈哈~
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

27
 
读写Flash有没有问题,做个Checksum比较一下不就很清楚了吗?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

28
 
nand_boot_beg
        mov        r5, #NFCONF
        ldr        r0,        =(7<<12)|(7<<8)|(7<<4)
        str        r0,        [r5]
        ldr        r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
        str        r0, [r5, #4]
       
        bl        ReadNandID
        mov        r6, #0
        ldr        r0, =0xec73
        cmp        r5,        r0
        beq        %F1
        ldr        r0, =0xec75
        cmp        r5, r0
        beq        %F1
        ldr        r0, =0xecd3
        cmp        r5, r0
        bne        %F1
        mov        r6, #1
1       
        bl        ReadNandStatus
       
        mov        r8, #0
        ldr        r9, =ResetEntry
2       
        ands        r0, r8, #0x3f
        bne                %F3      
        mov                r0, r8
        bl                CheckBadBlk
        cmp                r0, #0
        addne        r8, r8, #64      
        bne                %F4
3       
        mov        r0,        r8               
        mov        r1,        r9
        bl Led_Testd
        bl        ReadNandPage
        add        r9,        r9,        #2048
        add        r8,        r8,        #1
4       
        cmp        r8, #128                  这个地方说明一下,如果我写64上面2里不会跳到3,改一下就可以了,不明白中

        bcc        %B2
       
        mov        r5, #NFCONF                       
        ldr        r0, [r5, #4]
        bic r0, r0, #1
        str        r0, [r5, #4]
        adr        pc, copy_proc_beg        这个地方说明一下,用长跳转伪指令不会正确跳转,短跳转就可以,一样迷惑
=========================================================================================================================
================================================================================================================
ReadNandID
        mov      r7,#NFCONF
        ldr      r0,[r7,#4]                ;NFChipEn();
        bic      r0,r0,#2
        str      r0,[r7,#4]
        mov      r0,#0x90                ;WrNFCmd(RdIDCMD);
        strb     r0,[r7,#8]
        mov      r4,#0                        ;WrNFAddr(0);
        strb     r4,[r7,#0xc]
1                                        ;while(NFIsBusy());
        ldr      r0,[r7,#0x20]
        tst      r0,#1
        beq      %B1
        ldrb     r0,[r7,#0x10]                 ;id  = RdNFDat()<<8;
        mov      r0,r0,lsl #8
        ldrb     r1,[r7,#0x10]                 ;id |= RdNFDat();
        orr      r5,r1,r0
        ldr      r0,[r7,#4]                ;NFChipDs();
        orr      r0,r0,#2
        str      r0,[r7,#4]
        mov      pc,lr       
       
ReadNandStatus
        mov         r7,#NFCONF
        ldr      r0,[r7,#4]                ;NFChipEn();
        bic      r0,r0,#2
        str      r0,[r7,#4]
        mov      r0,#0x70                ;WrNFCmd(QUERYCMD);
        strb     r0,[r7,#8]       
        ldrb     r1,[r7,#0x10]                ;r1 = RdNFDat();
        ldr      r0,[r7,#4]                ;NFChipDs();
        orr      r0,r0,#2
        str      r0,[r7,#4]               
        mov                 pc,lr

WaitNandBusy
        mov      r0,#0x70                ;WrNFCmd(QUERYCMD);
        mov      r1,#NFCONF
        strb     r0,[r1,#8]
1                                       
        ldrb     r0,[r1,#0x10]
        tst      r0,#0x40                ;while(!(RdNFDat()&0x40));       
        beq         %B1
        mov      r0,#0                        ;WrNFCmd(READCMD0);
        strb     r0,[r1,#8]
        mov      pc,lr

CheckBadBlk
        mov                r7, lr
        mov                r5, #NFCONF
       
        bic        r0, r0, #0x3f   
  
        ldr      r1,[r5,#4]                ;NFChipEn()
        bic      r1,r1,#2
        str      r1,[r5,#4]

        mov      r1,#0x30                ;WrNFCmd(READCMD2)这句我明天再验证下需不需要,8G08就一个read指令,只是一周期和二周                                                   期不一样
        strb     r1,[r5,#8]
        strb     r0,[r5,#0xc]        ;WrNFAddr(addr)
        mov      r1,r0,lsr #8        ;WrNFAddr(addr>>8)
        strb     r1,[r5,#0xc]
        cmp      r6,#0                        ;if(NandAddr)               
        movne    r0,r0,lsr #16        ;WrNFAddr(addr>>16)
        strneb   r0,[r5,#0xc]
       
;        bl        WaitNandBusy        ;WaitNFBusy()
        mov        r0, #100
1
        subs        r0, r0, #1
        bne        %B1
2
        ldr        r0, [r5, #0x20]
        tst        r0, #1
        beq        %B2       

        ldrb        r0, [r5,#0x10]        ;RdNFDat()
        sub        r0, r0, #0xff
       
        mov      r1,#0                        ;WrNFCmd(READCMD0)
        strb     r1,[r5,#8]

       
        ldr      r1,[r5,#4]                ;NFChipDs()
        orr      r1,r1,#2
        str      r1,[r5,#4]
       
        mov        pc, r7
       
ReadNandPage
        mov         r7,lr
        mov      r4,r1
        mov      r5,#NFCONF

        ldr      r1,[r5,#4]                ;NFChipEn()
        bic      r1,r1,#2
        str      r1,[r5,#4]       
       
        mov      r1,#0                        ;WrNFCmd(READCMD0)
        strb     r1,[r5,#8]       
        strb     r1,[r5,#0xc]        ;WrNFAddr(0)
        strb         r1,[r5,#0xc]         
        strb     r0,[r5,#0xc]        ;WrNFAddr(addr)
        mov      r1,r0,lsr #8        ;WrNFAddr(addr>>8)
        strb     r1,[r5,#0xc]       
        cmp      r6,#0                ;if(NandAddr)               
        movne    r0,r0,lsr #16        ;WrNFAddr(addr>>16)

        strneb   r0,[r5,#0xc]
        mov        r1,#0x30
        strb         r1,[r5,#8]

       
        ldr      r0,[r5,#4]                ;InitEcc()
        orr      r0,r0,#0x10
        str      r0,[r5,#4]
        bl       WaitNandBusy                ;WaitNFBusy()
       
        mov      r0,#0                        ;for(i=0; i<512; i++)
1
        ldrb     r1,[r5,#0x10]                ;buf = RdNFDat()
        strb     r1,[r4,r0]
        add      r0,r0,#1
        bic      r0,r0,#0x20000
        cmp          r0,#0x800       
       
        bcc      %B1
       
        ldr      r0,[r5,#4]                ;NFChipDs()
        orr      r0,r0,#2
        str      r0,[r5,#4]
               
        mov                 pc,r7

大侠抽空帮我看下,我对照手册也弄了,你得我也比较了,我改也只改了这里面得东西烧到板子上就是不行,哎
我得点灯程序:
Led_Testd
        stmfd        sp!,{r0-r4}
        ldr        r0,=GPFCON
        str r0,[r3]
        ldr        r1,=0x5555
        str        r1,[r0]
        ldr        r0,=GPFDAT
        str r0,[r4]
        ldr        r1,=0xdf
        str        r1,[r0]
        ldr        r1,=0xfff
0
        subs r1,r1,#1
        bne        %B0
        ldr r0,=GPFCON
        str r3,[r0]
        ldr r0,=GPFDAT
        str r4,[r0]
        ldmfd        sp!,{r0-r4}
        mov        pc,lr
这样点灯也不会影响寄存器。期望大侠再帮帮忙^-^
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

29
 
谢谢gooogleman大侠的相助,bootloader启动已经正常,问题出现在我同时修改多个地方导致错误分步出现。今天我实在没办法了就把以前改的长跳转伪指令改回去结果就好了。其实从上周2就可以做好的,我周一发现#0x30写成#30了。哎。
不过启动后出现一个问题,就是我把wince写进去过后boot wince的时候打印一串skip badblock 0x...我想可能是nand.c里面的markbadblk函数把我的flash标记成坏块了。这个函数我是引用网上一个大侠帖子的:
static void MarkBadBlk(U32 addr)
{
        addr &= ~0x3f;
        
        NFChipEn();
        
       //WrNFCmd(READCMD2);        //point to area c        
        WrNFCmd(PROGCMD0);
        //WrNFAddr(4);                //mark offset 4,5,6,7
        WrNFAddr(2048+0);//偏移量为(2048+0)
        WrNFAddr((2048+0)>>8);//偏移量为(2048+0)
        WrNFAddr(addr);
        WrNFAddr(addr>>8);
        if(NandAddr)
                WrNFAddr(addr>>16);
        WrNFDat(0);                        //mark with 0
        //WrNFDat(0);
        //WrNFDat(0);                        //mark with 0
        //WrNFDat(0);
        WrNFCmd(PROGCMD1);
        WaitNFBusy();                //needn't check return status
        
       //WrNFCmd(READCMD0);        //point to area a
               
        NFChipDs();
}
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

30
 
REC start 0x8d936890, length 0x54
    ROMHDR 0x8d936890, 0x8d936890
    dllfirst  0x01d401e0, dlllast  0x02000000
    physfirst 0x8c3d0000, physlast 0x8d938f00
REC start 0x8d9368e4, length 0x261c
real entry is 0x8c3d1000, physical address is 0x303d1000
.Save boot params success.
Now write nand flash page 0x2000 from ram address 0x303d0000, filesize = 22449920
.................................................................................
.................................................................................
..........Program nand flash partition success

+------------------------------------------------------------+
|                     Select Menu                            |
+------------------------------------------------------------+
| [0] Download & Run                                         |
| [1] Download to flash                                      |
| [2] Download From UART                                     |
| [3] Boot My Application                                    |
| [4] Boot Linux                                             |
| [5] Boot Wince                                             |
| [6] Erase Flash Partition                                  |
| [7] Config parameters                                      |
+------------------------------------------------------------+
Memory Test(30200000h-33ff0000h):O.K.
Load Kernel...
Skipped bad block at 0x2000
Skipped bad block at 0x2040
Skipped bad block at 0x2080
Skipped bad block at 0x20c0
Skipped bad block at 0x2100
Skipped bad block at 0x2140
Skipped bad block at 0x2180
Skipped bad block at 0x21c0

这个是下载和boot   wince的时候串口打印的消息,这个是通过usb先下载到内存然后从内存写到flash,这两个过程没有问题。但是后面boot wince的时候就出问题了。在原来的k9f1208的班子上就没问题。只是上面标记的0x2000在k9f1208板子上是0x1000地址配置是一样的,打印出来就不一样这个怪,难道地址配置也要改?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

31
 
当然要做适当修改,我觉得你还是好好想想,block ,page之类的东西。
胡乱尝试也不是办法。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

32
 
学习了,俺最近想把优龙的bootloader改成适合友善之臂mini2440的bootloader,可是不知道要改哪些方面,自己不能完全想到,求教各位大侠.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
TI 处理器AM62L深度讲解,报名直播赢【双肩包、充电器、胶囊伞】
【直播要点】• 如何实现安全节能设计;• 开箱体验和demo;• 软件和硬件
【直播时间】3月21日(周五)上午10:00

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表