10051|31

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

优龙bootloader的一些奇怪得问题 [复制链接]

mov        r5, #NFCONF                        ;DsNandFlash
        ldr        r0, [r5, #4]
        bic r0, r0, #1
        str        r0, [r5, #4]
        ldr        pc, =copy_proc_beg这个地方pc没有跳到下面拷贝代码段部分(我通过点灯测试了这句是执行了得下面没执行(上电测试))
;===========================================================
copy_proc_beg
        adr        r0, ResetEntry
        ldr        r2, BaseOfROM
        cmp        r0, r2
        ldreq        r0, TopOfROM
        beq        InitRam       
        ldr r3, TopOfROM
0       
        ldmia        r0!, {r4-r7}
        stmia        r2!, {r4-r7}
        cmp        r2, r3
        bcc        %B0
       
        sub        r2, r2, r3
        sub        r0, r0, r2                               
       
InitRam       
        ldr        r2, BaseOfBSS




bootloader还有个怪现象,我把bootloader烧到flash后接着按下debug(ads1.2)跳出axd窗口又关掉,这个时候只要不拔下jatag线,板子上电或复位bootloader都可以运行,但是当我把jatag去掉过后就不可以了,后面试了几次都是这样(先要按下debug)。我想出现这个现象是不是jatag为cpu或者是为内存什么得保存了个状态,上电和复位就直接在那个状态下了,这个方面我不是很懂,望大侠指教

最新回复

学习了,俺最近想把优龙的bootloader改成适合友善之臂mini2440的bootloader,可是不知道要改哪些方面,自己不能完全想到,求教各位大侠.  详情 回复 发表于 2009-11-20 20:06
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这种只有自己多DEBUG了!
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不跳很正常,你得先看看你下面的代码是不是被编进去了:)JATAG去掉就不行?那肯定是代码的问题,是不是JATAG线连着什么地方造成中断引发的现象呢?信息不够纯属是猜。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 BEYONDMA 的回复:
不跳很正常,你得先看看你下面的代码是不是被编进去了:)JATAG去掉就不行?那肯定是代码的问题,是不是JATAG线连着什么地方造成中断引发的现象呢?信息不够纯属是猜。

看代码是不是被编进去了?还有代码没被编进去的情况?那怎么查呢。jatag的情况我问了下老师,老师说jatag起的作用是调用h-jatag把寄存器重新初始化了一遍,有可能是我的点灯程序冲了寄存器,我再研究一下。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
我觉得你老师说得没错,用h-jatag调试的时候,我们并不需要烧进flash吧?
你两个动作一起做,估计问题就出在这里了。

用 h-jatag 把bootloader加载到sdram当中去,然后再调,而你是烧进flash
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼主啊

你的JTAG很落后的,有些功能不能用,不能拿来这样调试的——经常点几下就不能点了。哈哈。
你用JLINK就可以了。以前我也像你这样,为什么程序死掉了呢?
后来经理给我个jlink,真是无所不能。

优龙这部分绝对没有问题。
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 Gdatasheet 的回复:
我觉得你老师说得没错,用h-jatag调试的时候,我们并不需要烧进flash吧?
你两个动作一起做,估计问题就出在这里了。

用 h-jatag 把bootloader加载到sdram当中去,然后再调,而你是烧进flash

用h-jatag把bootloader加载到sdram中调试我做过很多了,完全没有问题,能正常运行。我才烧写进去,但是烧进去的就不会自动运行。昨天我烧了程序后想仿真下,点了debug后又关了,就发现上面说的现象了。
gooogleman大侠说是jatag的问题我觉得有点说不过去,如果是jatag问题的话我用jatag烧写程序的时候应该要出错,但是我程序在jatag不取下的情况下上电或复位能运行,说明我烧到flash里的程序是对的,而且上电程序自动加载到内存运行也能实现。我从头看了一遍冲击CPU寄存器的情况没发现我程序哪里冲击了寄存器。用优龙原版的bootloader下到优龙班子里就能行,估计还是init.s里flash驱动问题。哎。。。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
啊?
那这样真是不知道你改了什么地方了。

楼主,程序有部分是自动检测有没有JTAG的啊,你看看下面这部分代码,
  1. ;===========================================================

  2.         ldr        r0, =BWSCON
  3.         ldr        r0, [r0]
  4.         ands        r0, r0, #6                ;OM[1:0] != 0, NOR FLash boot
  5.         bne        copy_proc_beg                ;don't read nand flash
  6.         adr        r0, ResetEntry                ;OM[1:0] == 0, NAND FLash boot
  7.         cmp        r0, #0                                ;if use Multi-ice,
  8.         bne        copy_proc_beg                ;don't read nand flash for boot
  9.         ;nop
  10. ;===========================================================
复制代码

是不是你做了什么修改,这部分是代码往哪里运行的。

你仔细想想。

哎,再不行把代码发上来。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
你那里我没有改,我看过你得帖子后知道那是做什么得了没有动得:我改过得我贴出来吧,真是郁闷了
nand_boot_beg
        mov        r5, #NFCONF
        ;set timing value
        ldr        r0,        =(7<<12)|(7<<8)|(7<<4)
        str        r0,        [r5]
        ;enable control
        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, #0x1f
        ;bne                %F3
        ands        r0, r8, #0x3f  ;这里修改了页内偏移变了
        bne                %F3      ;
        mov                r0, r8
        bl                CheckBadBlk
        cmp                r0, #0
        ;addne        r8, r8, #32
        addne        r8, r8, #64      ;这里修改了页数变了
        bne                %F4
3       
        ;mov        r0, r8
        ;mov        r1, r9
        ;bl        ReadNandPage
        ;add        r9, r9, #512
        ;add        r8, r8, #1
        mov        r0,        r8                ;这一段修改了页大小变了
        mov        r1,        r9
        bl        ReadNandPage
        add        r9,        r9,        #2048
        add        r8,        r8,        #1
4       
        ;cmp        r8, #256
        cmp        r8, #64             ;这里修改了读64页
        bcc        %B2
       
        mov        r5, #NFCONF                        ;DsNandFlash
        ldr        r0, [r5, #4]
        bic r0, r0, #1
        str        r0, [r5, #4]
        ldr        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                                                        ;while(!(RdNFDat()&0x40));       
        ldrb     r0,[r1,#0x10]
        tst      r0,#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,#0x1f        ;addr &= ~0x1f;
        bic        r0, r0, #0x3f        ;t页内偏移改了
        ldr      r1,[r5,#4]                ;NFChipEn()
        bic      r1,r1,#2
        str      r1,[r5,#4]

        ;mov      r1,#0x50                ;WrNFCmd(READCMD2)
        ;strb     r1,[r5,#8]
        ;mov      r1, #5;6                ;6->5
        ;strb     r1,[r5,#0xc]       
;WrNFAddr(5);(6) 6->5;这里写个5到地址寄存器好像什么用,注释了
        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()
        ;don't use WaitNandBusy, after WaitNandBusy will read part A!
        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)0-7
        strb          r1,[r5,#0xc]        ;this code suit k9k8g08 added by 8--11
        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]
       
        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,#0x200
        cmp          r0,#0x800                ; 这里改了
        bcc      %B1
       
        ldr      r0,[r5,#4]                ;NFChipDs()
        orr      r0,r0,#2
        str      r0,[r5,#4]
               
        mov                 pc,r7
就只改动了这些与flash有关得,其他得没有改
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
大侠们,耽搁点时间帮我解决一下吧,我基础比较薄弱很多问题没法解决啊,这个太底层得东西一个小问题就弄死人哎
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
BOOTLOADER是用ADS编译的吗?
在内存中运行没有问题,烧写到FLASH中就不正常?

会不会是RO BASE设置问题。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
ReadNandID这个子函数没有改动
?哎,大页flash发送的命令周期是不同的。你要好好看数据手册。

——我觉得你根本没有正确读写flash
读写周期改动一下。

仔细看数据手册。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
啊。那个啊我去看看,今天跑去加班点灯没有加mov pc,lr程序跑到下面得powerdown去了,h-jatag认不到cpu了,sjf也认不到flash了,郁闷死,那我其他函数改对了没啊?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
90h->00h->ECh->76h->A5h->C0h这个是1208得read id时序

90h->00h->ECh->d3h->51h->95h->58h这个是8g08得read id时序

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

15
 
gooogleman大侠,我那个read nand id不改没有影响,read nand id主要做的就是读出芯片的marker id和device id调用函数根据返回的id值确定芯片的类型(这里主要是确定芯片的命令周期)
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 wdw1600 的回复:
gooogleman大侠,我那个read nand id不改没有影响,read nand id主要做的就是读出芯片的marker id和device id调用函数根据返回的id值确定芯片的类型(这里主要是确定芯片的命令周期)


ID没有影响,但是读写flash数据就有影响了
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

17
 
哦,谢谢gooogleman大侠的指点,我去照手册上改一下试试,大侠能不能提示下怎么改,我对比着1208的手册看了下那里还是不大清楚怎么改,另外说下我上面那个不拔掉JATAG能运行其实是板子内存中的仿真程序在运行,我的flash启动后向内存的拷贝是失败的。
fightting:争取这周结贴!!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

18
 
这明显是flash读写不对造成的。

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

你什么都没有错,错就错在少发了一个周期的指令——在读数据之前。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

19
 
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                  ;没有正确跳转


gooogleman大侠我上面这几个问题是今天我点灯一步一步跟踪得,这些问题是不是和你说得:读数据之前少发了一个指令周期有关,你所指得我少发了一个指令周期是在readid还是在checkbadblk里啊,具体是什么啊,谢谢指明下嘛,芯片手册有些我翻译出来自己都不懂
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

20
 
首先谢谢gooogleman大侠对我得热情帮助
The device contains a product identification mode, initiated by writing 90h to the command register, followed by an address input of 00h. Five read cycles sequentially output the manufacturer code(ECh), and the device code and 3rd, 4th, 5th cycle ID respectively.The command register remains in Read ID mode until further commands are issued to it.
  90h     ->00h     ->ECh   ->d3h    ->51h->95h->58h
command   address   marker   device   至于后面得始终用不上啊?如果像前面那样读出来就这么写不知道是不是这样  XX = RdNFDat()<<8
XXX = RdNFDat()<<16   XXX = RdNFDat()<<24这些读出来对后面有什么作用呢,你说得我少发了一个指令在读数据前,而且你说这里我应该改,那少发得指令应该就是这些,手册上面没有其他地方有多得
另外按手册上面看这里read status在readpage前只检测了芯片ready/busy没有write protect明天我去加上看看,我想应该问题不是在这里,整个bootloader执行期间都没有涉及写flash这个写保护我觉得没什么必要
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
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
快速回复 返回顶部 返回列表