This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335x使用新的nandflash 修改ecc方式后无法启动

之前使用的flash是1bit/512,现在换成4bit/512的flash,容量不变.

对于ecc选择使用BCH8

uboot (U-Boot SPL 2011.09)中修改如下

board_nand_init

    -> ti81xx_nand_switch_ecc(NAND_ECC_HW, 0)改成ti81xx_nand_switch_ecc(NAND_ECC_HW, 2)

->__ti81xx_nand_switch_ecc

    ->nand->ecc.mode = NAND_ECC_HW_SYNDROME;改成 nand->ecc.mode = NAND_ECC_HW;

kernel中

board_am335xevm.c

evm_nand_init

-> pdata->ecc_opt =OMAP_ECC_HAMMING_CODE_DEFAULT; 改成 pdata->ecc_opt =OMAP_ECC_BCH8_CODE_HW;

nandflash烧录MLO uboot uImage rootfs时候全部指定nandecc hw 2

启动的时候打印如下信息

NAND read: device 0 offset 0x280000, size 0x300000
NAND read from offset 280000 failed -74
 0 bytes read: ERROR
## Booting kernel from Legacy Image at 80200000 ...
   Image Name:   Linux-3.2.0
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2691656 Bytes = 2.6 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!

请帮忙分析一下原因.

  • 请问用的SDK是什么版本的?sysboot[9]有没有设成0?
  • 你好:

        刚才把这个问题解决了,原因是nandboot=run nandargs;nandecc sw;中还是使用的sw校验方式,改成nandecc hw 2后kernel可以正常启动

        现在出现新的问题挂载文件系统出错了

        

    [ 1.725148] logo disp!!!
    [ 1.730748] end_request: I/O error, dev mtdblock7, sector 0
    [ 1.736634] Buffer I/O error on device mtdblock7, logical block 0
    [ 1.743906] end_request: I/O error, dev mtdblock7, sector 0
    [ 1.749782] Buffer I/O error on device mtdblock7, logical block 0
    [ 1.756866] end_request: I/O error, dev mtdblock7, sector 8
    [ 1.762740] Buffer I/O error on device mtdblock7, logical block 1
    [ 1.769901] end_request: I/O error, dev mtdblock7, sector 8
    [ 1.775779] Buffer I/O error on device mtdblock7, logical block 1
    [ 1.782864] end_request: I/O error, dev mtdblock7, sector 16
    [ 1.788833] Buffer I/O error on device mtdblock7, logical block 2
    [ 1.795986] end_request: I/O error, dev mtdblock7, sector 16
    [ 1.801954] Buffer I/O error on device mtdblock7, logical block 2
    [ 1.809024] end_request: I/O error, dev mtdblock7, sector 24
    [ 1.814987] Buffer I/O error on device mtdblock7, logical block 3
    [ 1.822137] end_request: I/O error, dev mtdblock7, sector 24
    [ 1.828106] Buffer I/O error on device mtdblock7, logical block 3
    [ 1.834737] List of all partitions:
    [ 1.838470] 1f00 128 mtdblock0 (driver?)
    [ 1.843833] 1f01 128 mtdblock1 (driver?)
    [ 1.849165] 1f02 128 mtdblock2 (driver?)
    [ 1.854517] 1f03 128 mtdblock3 (driver?)
    [ 1.859851] 1f04 1920 mtdblock4 (driver?)
    [ 1.865196] 1f05 128 mtdblock5 (driver?)
    [ 1.870533] 1f06 5120 mtdblock6 (driver?)
    [ 1.875875] 1f07 4096 mtdblock7 (driver?)
    [ 1.881219] 1f08 122880 mtdblock8 (driver?)
    [ 1.886555] 1f09 127488 mtdblock9 (driver?)
    [ 1.891889] No filesystem could mount root, tried: cramfs
    [ 1.897684] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,7)

    使用sdk6

    Thanks!

  • 这个kernel下的NAND读写驱动也应该对应修改。
  • hi 周工:

        请问有没有可以参考的修改呢?没想到要修改的原因

        要修改的主要是这个部分?

    case NAND_ECC_HW:

    /* Use standard hwecc read page function? */
    if (!chip->ecc.read_page)
    chip->ecc.read_page = nand_read_page_hwecc;
    if (!chip->ecc.write_page)
    chip->ecc.write_page = nand_write_page_hwecc;
    if (!chip->ecc.read_page_raw)
    chip->ecc.read_page_raw = nand_read_page_raw;
    if (!chip->ecc.write_page_raw)
    chip->ecc.write_page_raw = nand_write_page_raw;
    if (!chip->ecc.read_oob)
    chip->ecc.read_oob = nand_read_oob_std;
    if (!chip->ecc.write_oob)
    chip->ecc.write_oob = nand_write_oob_std;

    thanks!

  • 是的,主要是驱动层的ECC部分的修改,具体可以去网上搜一下。

  • hi 周工:

        这个是TI的硬件BCH,网上不容易搜索到。

        请问uboot中的bch8的ecc部分是正确的吗?

        如果正确是否可以参考修改呢?

    Thanks!

  • U-boot的BCH8是验证过的,可以参考。

  • hi 周工:

        我尝试使用uboot中的bch8代码,发现问题还是没有解决。

        请问后面的sdk版本中,从哪个开始解决了kernel BCH8的问题呢?

    Thanks!

  • 请问你用的是哪个版本的SDK?我看最新版本的Linux NAND驱动是支持BCH8的:
    processors.wiki.ti.com/.../Linux_Core_NAND_User's_Guide
  • hi 周工:

        我使用的是sdk6,之前您回复说这个sdk下的kernel ecc需要修改。

        我现在将sdk7的BCH8移植到sdk6上了,可以正常挂载cramfs文件系统。

        现在情况是这样的,我们有2个文件系统,一个cramfs,另一个是yaffs2。

        每次挂载yaffs2的时候,发现总会多一个坏块,百度yaffs2文件系统发现,yaffs2文件系统,对于oob中保存ecc校验数据的能力有限,

        无法保存所有的BCH8产生的ecc校验数据。

        这样的话是不是说明,对于2k+64B page的flash,无法使用BCH8和yaffs2这样的组合呢?

        新的flash datasheet上标注的是4bit/512B,如果现在为了使用yaffs2,把ecc改成1bit/512B的话,使用过程中会不会有什么影响?

    Thanks!