新手求助:nand flash 1G08换成8G08 uboot起不来!

时间:2022-10-28 04:52:59
     才接触wince,很多东西都不懂,老师让我将板子的k9f1208换成k9f1g08和k9g8g08,看系统能不能起来。由于我是采用uboot更新内核,google网上的资料,从JTAG的烧写代码改起,实现了用JTAG能成功烧写1g08和8g08,uboot版本使用的是1.1.6,在不更改uboot内容的情况下,1g08能顺利的跑起来,而8g08在打印了“OK”之后什么反应都没有了。
     很奇怪,是不是1g08和8g08存在什么区别,都是大页nand,读写时序都差不多,一直疑惑一个是slc,一个是mlc,不过uboot代码里面好像就没mlc和slc之分?高手看看啊!

19 个解决方案

#1


我记得是你需要在Uboot里面改FLASH大小的,不然Uboot不知道你的Flash有多大,所以又可能你就根本没用到8G,但是你系统启动不起来 我就不太明白了。

#2


     我的boot选择项是从nand启动,在start.s中将nand中的内容拷贝到ram中时的代码:
       #ifdef CONFIG_BOOT_NAND
mov r0, #0x1000
bl copy_from_nand
。。。。
.globl copy_from_nand
copy_from_nand:
mov r10, lr /* save return address */

mov r9, r0
/* get ready to call C functions */
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, #12
mov fp, #0 /* no previous frame, so fp=0 */
mov r9, #0x1000

bl copy_uboot_to_ram

3: tst  r0, #0x0
bne copy_failed

ldr r0, =0x0c000000
ldr r1, _TEXT_PHY_BASE
1: ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne compare_failed /* not matched */
subs r9, r9, #4
bne 1b

4: mov lr, r10 /* all is OK */
mov pc, lr


在这一句bl copy_uboot_to_ram的后面加打印信息,没反应,它是调用外部定义的copy_uboot_to_ram c函数,没跳回来??

#3



引用 1 楼 luocan1986 的回复:
我记得是你需要在Uboot里面改FLASH大小的,不然Uboot不知道你的Flash有多大,所以又可能你就根本没用到8G,但是你系统启动不起来 我就不太明白了。

   谢谢··
uboot里面改flash大小?可能我还没到那一步,这是我的1208nand起来时的打印信息
OK

U-Boot 1.1.6 (Aug 17 2009 - 15:12:10) for SMDK6410


CPU:     S3C6410@532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:   SMDK6410
DRAM:    128 MB
Flash:   0 kB
NAND:    64 MB 
In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot:  2 
    你说的问题应该是在打印 NAND:    64 MB 的时候初始化的时候,我现在郁闷的是换成8g08后为什么只打印“OK”后就什么反应都没有了?

#4


你的flash 没有识别出来啊。

#5


flash.h 在这个文件中 看一下Flash id 。。然后你自己的Flash Id是多少。。  强制修改貌似可以。。。

#6


引用 5 楼 luocan1986 的回复:
flash.h 在这个文件中 看一下Flash id 。。然后你自己的Flash Id是多少。。  强制修改貌似可以。。。

哦,我的没有NOR flash , 我的直接是从nand flash起来的。上面的那个1208的64M的nand flash是能直接跑起来的,换成128M的1g08 nand flash 也是能跑的,但换成1G的8g08之后连Uboot都跑不起来了,不知有何高见呢?

#7


引用 6 楼 zhaojuncq 的回复:
引用 5 楼 luocan1986 的回复:
flash.h 在这个文件中 看一下Flash id 。。然后你自己的Flash Id是多少。。  强制修改貌似可以。。。

哦,我的没有NOR flash , 我的直接是从nand flash起来的。上面的那个1208的64M的nand flash是能直接跑起来的,换成128M的1g08 nand flash 也是能跑的,但换成1G的8g08之后连Uboot都跑不起来了,不知有何高见呢?


晕菜了。。。没遇到过。。 

#8


SLC和MLC区别非常大,两种的驱动差别非常大;不知道你用的是哪款处理器,你先读读处理器的Datasheet,看看支持不支持MLC,看NAND Flash控制器那章节就可以,MLC需要硬件ECC支持的。如果硬件处理器可以支持,然后检查uboot是否有MLC的驱动,有的话要检查这个驱动是否和你的硬件设备匹配。

#9


不懂uboot

#10


引用 8 楼 ccyu 的回复:
SLC和MLC区别非常大,两种的驱动差别非常大;不知道你用的是哪款处理器,你先读读处理器的Datasheet,看看支持不支持MLC,看NAND Flash控制器那章节就可以,MLC需要硬件ECC支持的。如果硬件处理器可以支持,然后检查uboot是否有MLC的驱动,有的话要检查这个驱动是否和你的硬件设备匹配。

    谢谢,我用的是samsung的6410,手册上说是支持mlc的,uboot里面有mlc的驱动,不过是在nand初始化的时候,即打印“NAND  : xx M”的时候调用的,我的似乎还没跑到那里去哦。
    网上说uboot首先是从start.s开始的,里面有打印“OK”的代码(即我的问题:打印OK后什么反应都没有了),在start.s里面有很简单的nand初始化代码,
nand_asm_init:
ldr r0, =ELFIN_NAND_BASE
ldr r1, [r0, #NFCONF_OFFSET]
orr r1, r1, #0x70
orr r1, r1, #0x7700
str     r1, [r0, #NFCONF_OFFSET]

ldr r1, [r0, #NFCONT_OFFSET]
orr r1, r1, #0x03
str     r1, [r0, #NFCONT_OFFSET]
     应该不涉及MLC的问题,之后跟踪后续代码(即打印“OK”后),知道uboot要将自己copy到RAM,start.s里面是通过 “ bl  copy_uboot_to_ram”调用外部copy_uboot_to_ram C函数实现的,奇怪的是没有跳回来(bl指令是要跳回来的吧?)。跟踪了copy_uboot_to_ram函数,加入了打印信息,根据打印信息知道copy_uboot_to_ram函数是执行完了的,为什么确跳不回来呢?? (问题可能就出在这里??)
     :在start.s正常流程的最后有跳到start_armboot的入口,之后就如网上说的进入了uboot启动的第二阶段,在这里就会有一大堆的初始化,就会打印如
U-Boot 1.1.6 (Aug 17 2009 - 15:12:10) for SMDK6410 
CPU:    S3C6410@532MHz 
        Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:  SMDK6410 
DRAM:    128 MB 
Flash:  0 kB 
NAND:    64 MB 
In:      serial 
Out:    serial 
Err:    serial 
Hit any key to stop autoboot:  2 
一连串的打印信息。可惜,很想看到的这些内容确始终不出来。。。(哪怕出来了报错也好哈)
     
    希望高手给点建议啊!!

#11


还是没什么进展,自己顶顶!!

#12


起码flash id总要改的吧。。。除非你的驱动里面本来就带这两种flash的支持。

#13


2g08以上的nandflash写地址的时候多了一次喔,所以还是有点不一样

#14


关注这个问题!解决的话分享一下啊!

#15


有代码,能编译,有trace,还有不能解决的问题嘛?一步步来嘛,一段段代码过,加trace,看死在什么地方。。。。

#16


楼主啊,问题解决了吗。。。能不能分享下。。

#17


一般的BSP会有设置整个BSP应用于MLC或者是SLC的全局变量,或者是有些BSP只适合SLC,有些只适合MLC,这点你先要搞清楚。
另外这两款FLASH的每个PAGE大小一样吗?访问周期是否一样?
MLC还涉及ECC的问题,这些都是需要注意的。

#18


SLC和MLC PAGE大小不一样,很多都不一样,连三星BSP都分两种,SLC和MLC的,就这样简单替换肯定不行

#19


谢谢大家,好久了这贴都忘了,由于我们那时不急着用8G08,所以放了一段时间,最后换了块板子,竟然就跑起来了,晕死!

#1


我记得是你需要在Uboot里面改FLASH大小的,不然Uboot不知道你的Flash有多大,所以又可能你就根本没用到8G,但是你系统启动不起来 我就不太明白了。

#2


     我的boot选择项是从nand启动,在start.s中将nand中的内容拷贝到ram中时的代码:
       #ifdef CONFIG_BOOT_NAND
mov r0, #0x1000
bl copy_from_nand
。。。。
.globl copy_from_nand
copy_from_nand:
mov r10, lr /* save return address */

mov r9, r0
/* get ready to call C functions */
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, #12
mov fp, #0 /* no previous frame, so fp=0 */
mov r9, #0x1000

bl copy_uboot_to_ram

3: tst  r0, #0x0
bne copy_failed

ldr r0, =0x0c000000
ldr r1, _TEXT_PHY_BASE
1: ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne compare_failed /* not matched */
subs r9, r9, #4
bne 1b

4: mov lr, r10 /* all is OK */
mov pc, lr


在这一句bl copy_uboot_to_ram的后面加打印信息,没反应,它是调用外部定义的copy_uboot_to_ram c函数,没跳回来??

#3



引用 1 楼 luocan1986 的回复:
我记得是你需要在Uboot里面改FLASH大小的,不然Uboot不知道你的Flash有多大,所以又可能你就根本没用到8G,但是你系统启动不起来 我就不太明白了。

   谢谢··
uboot里面改flash大小?可能我还没到那一步,这是我的1208nand起来时的打印信息
OK

U-Boot 1.1.6 (Aug 17 2009 - 15:12:10) for SMDK6410


CPU:     S3C6410@532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:   SMDK6410
DRAM:    128 MB
Flash:   0 kB
NAND:    64 MB 
In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot:  2 
    你说的问题应该是在打印 NAND:    64 MB 的时候初始化的时候,我现在郁闷的是换成8g08后为什么只打印“OK”后就什么反应都没有了?

#4


你的flash 没有识别出来啊。

#5


flash.h 在这个文件中 看一下Flash id 。。然后你自己的Flash Id是多少。。  强制修改貌似可以。。。

#6


引用 5 楼 luocan1986 的回复:
flash.h 在这个文件中 看一下Flash id 。。然后你自己的Flash Id是多少。。  强制修改貌似可以。。。

哦,我的没有NOR flash , 我的直接是从nand flash起来的。上面的那个1208的64M的nand flash是能直接跑起来的,换成128M的1g08 nand flash 也是能跑的,但换成1G的8g08之后连Uboot都跑不起来了,不知有何高见呢?

#7


引用 6 楼 zhaojuncq 的回复:
引用 5 楼 luocan1986 的回复:
flash.h 在这个文件中 看一下Flash id 。。然后你自己的Flash Id是多少。。  强制修改貌似可以。。。

哦,我的没有NOR flash , 我的直接是从nand flash起来的。上面的那个1208的64M的nand flash是能直接跑起来的,换成128M的1g08 nand flash 也是能跑的,但换成1G的8g08之后连Uboot都跑不起来了,不知有何高见呢?


晕菜了。。。没遇到过。。 

#8


SLC和MLC区别非常大,两种的驱动差别非常大;不知道你用的是哪款处理器,你先读读处理器的Datasheet,看看支持不支持MLC,看NAND Flash控制器那章节就可以,MLC需要硬件ECC支持的。如果硬件处理器可以支持,然后检查uboot是否有MLC的驱动,有的话要检查这个驱动是否和你的硬件设备匹配。

#9


不懂uboot

#10


引用 8 楼 ccyu 的回复:
SLC和MLC区别非常大,两种的驱动差别非常大;不知道你用的是哪款处理器,你先读读处理器的Datasheet,看看支持不支持MLC,看NAND Flash控制器那章节就可以,MLC需要硬件ECC支持的。如果硬件处理器可以支持,然后检查uboot是否有MLC的驱动,有的话要检查这个驱动是否和你的硬件设备匹配。

    谢谢,我用的是samsung的6410,手册上说是支持mlc的,uboot里面有mlc的驱动,不过是在nand初始化的时候,即打印“NAND  : xx M”的时候调用的,我的似乎还没跑到那里去哦。
    网上说uboot首先是从start.s开始的,里面有打印“OK”的代码(即我的问题:打印OK后什么反应都没有了),在start.s里面有很简单的nand初始化代码,
nand_asm_init:
ldr r0, =ELFIN_NAND_BASE
ldr r1, [r0, #NFCONF_OFFSET]
orr r1, r1, #0x70
orr r1, r1, #0x7700
str     r1, [r0, #NFCONF_OFFSET]

ldr r1, [r0, #NFCONT_OFFSET]
orr r1, r1, #0x03
str     r1, [r0, #NFCONT_OFFSET]
     应该不涉及MLC的问题,之后跟踪后续代码(即打印“OK”后),知道uboot要将自己copy到RAM,start.s里面是通过 “ bl  copy_uboot_to_ram”调用外部copy_uboot_to_ram C函数实现的,奇怪的是没有跳回来(bl指令是要跳回来的吧?)。跟踪了copy_uboot_to_ram函数,加入了打印信息,根据打印信息知道copy_uboot_to_ram函数是执行完了的,为什么确跳不回来呢?? (问题可能就出在这里??)
     :在start.s正常流程的最后有跳到start_armboot的入口,之后就如网上说的进入了uboot启动的第二阶段,在这里就会有一大堆的初始化,就会打印如
U-Boot 1.1.6 (Aug 17 2009 - 15:12:10) for SMDK6410 
CPU:    S3C6410@532MHz 
        Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:  SMDK6410 
DRAM:    128 MB 
Flash:  0 kB 
NAND:    64 MB 
In:      serial 
Out:    serial 
Err:    serial 
Hit any key to stop autoboot:  2 
一连串的打印信息。可惜,很想看到的这些内容确始终不出来。。。(哪怕出来了报错也好哈)
     
    希望高手给点建议啊!!

#11


还是没什么进展,自己顶顶!!

#12


起码flash id总要改的吧。。。除非你的驱动里面本来就带这两种flash的支持。

#13


2g08以上的nandflash写地址的时候多了一次喔,所以还是有点不一样

#14


关注这个问题!解决的话分享一下啊!

#15


有代码,能编译,有trace,还有不能解决的问题嘛?一步步来嘛,一段段代码过,加trace,看死在什么地方。。。。

#16


楼主啊,问题解决了吗。。。能不能分享下。。

#17


一般的BSP会有设置整个BSP应用于MLC或者是SLC的全局变量,或者是有些BSP只适合SLC,有些只适合MLC,这点你先要搞清楚。
另外这两款FLASH的每个PAGE大小一样吗?访问周期是否一样?
MLC还涉及ECC的问题,这些都是需要注意的。

#18


SLC和MLC PAGE大小不一样,很多都不一样,连三星BSP都分两种,SLC和MLC的,就这样简单替换肯定不行

#19


谢谢大家,好久了这贴都忘了,由于我们那时不急着用8G08,所以放了一段时间,最后换了块板子,竟然就跑起来了,晕死!

#20