MPC8309 NAND Flash启动

Table of Contents

之前我做了MPC8309+K9F5608U0D (16MB)的启动。一直想把移植过程写出来,后来耽搁了也没写。正好这次公司定MPC8309 CPU方案准备采用K9F2G08U0C(256MB)。移植完后就有了下面的文章。

前景提要

之前移植K9F5608U0C的时候可谓复杂。我们最早焊的是64M的K9F1208U0C,但是Freescale的Code Warrior上只有K9F5608U0D的选项。本着Dev的考虑,我认为1208和5608仅仅在与前者比后者多了几个Block,产品ID不一样,于是我试着改了一下Code Warrior的FPDeviceConfig.xml。

结果惊奇的发现在FPDeviceConfig.xml文件中,K9F5608U0D的manufacturerid是35,id是75。这个不合道理啊。如果按照Freescale的CWFLASHPROWP.pdf上所述,SamSung的manufacturerid应该是EC,id应该是75。于是我把manufacturerid和id来回调换,都不成。于是我直接直接换了一片K9F5608U0D,又找FAE要了他机器上面的K9F5608x0D.elf和K9F5608x0D_utility.elf。终于可以用CW烧写NAND Flash了。

移植K9F2G08SU0C

有了上次的经验,我试了一下CW自带的K9F2G08X0A。结果很悲剧,还是无法操作FLASH,我看了看它的manufacturerid和id,分别被设置成23和EC。还是猜不透。

我又翻读了AN3859.pdf文档,AN3859上说:”Samsung uses its own algorithm for flash programming, not compatible with other vendors”。如果本身自带的elf不行的话只有自己编写适合自己所用芯片的algorithem文件了。于是我找到了CW目录下的NAND Flash例程。而他的例程针对的是MPC8360和K9NBG08U5M,NAND Flash和我目前所用差距太大,直接在CPU上仿真发现老是进入取指异常。而查看它的源码有了点新发现。它的getFlashID实现中:

看起来manufacturerid取的是第3个字节,id取的是第二个字节,于是我有来回倒腾manufacturerid和id。最终一无所获。

实在没有办法,我在Freescale的论坛上发了帖子。同时我试图先通过NOR Flash启动,然后在u-boot下将编好的U-boot下载到NAND Flash,在跳线至NAND Flash启动。

第一次烧进去后调试口显示”NAND boot… read failed (ltesr)”,这个太好了,说明我的配置基本是没有问题的,估计是还有个地方没有改。这个问题我在移植5608的时候出现过一次。但是忘了后来怎么解决的啦。google之,有个回答说是NAND的ECC没有设置好。看来下MPC8309SOM.h中NAND的ECC果然是开的,关掉试一下,还是一样。

突然想起来是不是NOR Flash启动的时候没有正确的配置Large Page,因为我们之前用的5608是Small Page,导致u-boot在写入NAND的时候就是写错的了。于是重新做了一个支持Large Page的NOR启动u-boot。依次下载,成功,算FW的地址,下载。成了。

NAND boot…… transfering control

U-Boot 2010.06-dirty (May 07 2013 – 13:13:05) MPC83XX

Reset Status:

CPU:   e300c3, MPC8309E, Rev: 1.1 at 400 MHz, CSB: 133.333 MHz, QE: 200 MHz
Board: Freescale MPC8309SOM
I2C:   ready
DRAM:  256 MiB
Firmware ‘Microcode version 0.0.0 for MPC8309 r1.0’ for 8309 V1.0
QE: uploading microcode ‘Microcode for MPC8309 r1.0’
NAND:  256 MiB
Bad block table found at page 131008, version 0x01
Bad block table found at page 130944, version 0x01
nand_read_bbt: Bad block at 0x000000220000
nand_read_bbt: Bad block at 0x000000c40000
nand_read_bbt: Bad block at 0x0000016a0000
nand_read_bbt: Bad block at 0x0000046c0000
nand_read_bbt: Bad block at 0x000004fe0000
nand_read_bbt: Bad block at 0x000006aa0000
nand_read_bbt: Bad block at 0x000007da0000
nand_read_bbt: Bad block at 0x000007ec0000
nand_read_bbt: Bad block at 0x000008d80000
nand_read_bbt: Bad block at 0x000009900000
nand_read_bbt: Bad block at 0x00000c260000
nand_read_bbt: Bad block at 0x00000c7c0000
nand_read_bbt: Bad block at 0x00000e740000
*** Warning – bad CRC or NAND, using default environment

In:    serial
Out:   serial
Err:   serial
MMC:  FSL_ESDHC: 0
Net:   FSL UEC0, FSL UEC1
No such device: FSL UEC2
Hit any key to stop autoboot:  0
=>

中间打印的好多坏扇区估计是第一次把它当成Small Page时写错了。

参考

  • Adding Flash Devices to the EPPC Flash Programmer (CWFLASHPROWP.pdf)
  • Adding Device(s) to CodeWarrior Flash Programmer for Microcontrollers V10.0 (AN3859.pdf)
  • http://comments.gmane.org/gmane.comp.boot-loaders.u-boot/65296
  • https://community.freescale.com/message/10876#10876

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.