dimitrus
Харьков сообщений: 4 |
#76 Дата 15 авг 2015 20:14
den054,
Очень советую пользоваться J-Mem, можно открыть адрес nand контроллера, нарисовать блок схему последовательности чтения и отработать ее, только запись не проверяйте так, сотрете все :) Очень удобно и наглядно пошагово отработать код. Так же очень поможет J-Link Debugger или IDA.
Еще такой момент, очень советую читать данные не словом, а блоками используя функцию JLINKARM_ReadMem, размер блока - страница, обычно 512 байт. Скорость возрастет значительно, так же пробуйте увеличивать скорость поднятием частоты до 8Мгц, получите еще прибавку. Обратите внимание на конфигурационные регистры nand_cfg0/1 от них зависит внешний вид данных, возможно у вас в этом загвоздка.
Вот код функции которая тоже может помочь для определения конфигурации nand:
код:
void nand_hwinfo() {
unsigned int cfg0=READ32(0x60000020);
printf("\n **** NAND CFG0: 0x%08X *****",cfg0);
printf("\n * NUM_ADDR_CYCLES = %X",(cfg0>>27)&7);
printf("\n * SPARE_SIZE_BYTES = %X",(cfg0>>23)&0xf);
printf("\n * ECC_PARITY_SIZE_BYTES = %X",(cfg0>>19)&0xf);
printf("\n * UD_SIZE_BYTES = %X",(cfg0>>9)&0x3ff);
printf("\n * CW_PER_PAGE = %X",((cfg0>>6)&7) | ((cfg0>>2)&8));
printf("\n * DISABLE_STATUS_AFTER_WRITE = %X",(cfg0>>4)&1);
printf("\n * BUSY_TIMEOUT_ERROR_SELECT = %X\n",(cfg0)&7);
unsigned int cfg1=READ32(0x60000024);
printf("\n **** NAND CFG1: 0x%08X *****",cfg1);
printf("\n * ECC_MODE = %X",(cfg1>>28)&3);
printf("\n * ENABLE_BCH_ECC = %X",(cfg1>>27)&1);
printf("\n * DISABLE_ECC_RESET_AFTER_OPDONE= %X",(cfg1>>25)&1);
printf("\n * ECC_DECODER_CGC_EN = %X",(cfg1>>24)&1);
printf("\n * ECC_ENCODER_CGC_EN = %X",(cfg1>>23)&1);
printf("\n * WR_RD_BSY_GAP = %X",(cfg1>>17)&0x3f);
printf("\n * BAD_BLOCK_IN_SPARE_AREA = %X",(cfg1>>16)&1);
printf("\n * BAD_BLOCK_BYTE_NUM = %X",(cfg1>>6)&0x3ff);
printf("\n * CS_ACTIVE_BSY = %X",(cfg1>>5)&1);
printf("\n * NAND_RECOVERY_CYCLES = %X",(cfg1>>2)&7);
printf("\n * WIDE_FLASH = %X",(cfg1>>1)&1);
printf("\n * ECC_DISABLE = %X\n",(cfg1)&1);
printf("\n* 000 NAND_FLASH_CMD = %08X",READ32(0x60000000));
printf("\n* 004 NAND_ADDR0 = %08X",READ32(0x60000004));
printf("\n* 008 NAND_ADDR1 = %08X",READ32(0x60000008));
printf("\n* 00c NAND_CHIP_SELECT = %08X",READ32(0x6000000c));
printf("\n* 010 NANDC_EXEC_CMD = %08X",READ32(0x60000010));
printf("\n* 014 NAND_FLASH_STATUS = %08X",READ32(0x60000014));
printf("\n* 018 NANDC_BUFFER_STATUS = %08X",READ32(0x60000018));
printf("\n* 020 NAND_DEV0_CFG0 = %08X",READ32(0x60000020));
printf("\n* 024 NAND_DEV0_CFG1 = %08X",READ32(0x60000024));
printf("\n* 028 NAND_DEV0_ECC_CFG = %08X",READ32(0x60000028));
printf("\n* 030 NAND_offset 030 = %08X",READ32(0x60000030));
printf("\n* 034 NAND_offset 034 = %08X",READ32(0x60000034));
printf("\n* 040 NAND_FLASH_READ_ID = %08X",READ32(0x60000040));
printf("\n* 044 NAND_FLASH_READ_STATUS = %08X",READ32(0x60000044));
printf("\n* 048 NAND_FLASH_READ_ID2 = %08X",READ32(0x60000048));
printf("\n* 064 FLASH_MACRO1_REG = %08X",READ32(0x60000064));
printf("\n* 070 FLASH_XFR_STEP1 = %08X",READ32(0x60000070));
printf("\n* 074 FLASH_XFR_STEP2 = %08X",READ32(0x60000074));
printf("\n* 078 FLASH_XFR_STEP3 = %08X",READ32(0x60000078));
printf("\n* 07c FLASH_XFR_STEP4 = %08X",READ32(0x6000007c));
printf("\n* 080 FLASH_XFR_STEP5 = %08X",READ32(0x60000080));
printf("\n* 084 FLASH_XFR_STEP6 = %08X",READ32(0x60000084));
printf("\n* 088 FLASH_XFR_STEP7 = %08X",READ32(0x60000088));
printf("\n* 0a0 FLASH_DEV_CMD0 = %08X",READ32(0x600000a0));
printf("\n* 0a4 FLASH_DEV_CMD1 = %08X",READ32(0x600000a4));
printf("\n* 0a8 FLASH_DEV_CMD2 = %08X",READ32(0x600000a8));
printf("\n* 0ac FLASH_DEV_CMD_VLD = %08X",READ32(0x600000ac));
printf("\n* 0d0 FLASH_DEV_CMD3 = %08X",READ32(0x600000d0));
printf("\n* 0d4 FLASH_DEV_CMD4 = %08X",READ32(0x600000d4));
printf("\n* 0d8 FLASH_DEV_CMD5 = %08X",READ32(0x600000d8));
printf("\n* 0dc FLASH_DEV_CMD6 = %08X",READ32(0x600000dc));
printf("\n* 0e8 NAND_ERASED_CW_DET_CFG = %08X",READ32(0x600000e8));
printf("\n* 0ec NAND_ERASED_CW_DET_ST = %08X",READ32(0x600000ec));
printf("\n* 0f0 EBI2_ECC_BUF_CFG = %08X\n",READ32(0x600000f0));
}
Базовый адрес нанд замените на свой, его кстати очень легко найти используя J-Mem, если нет datasheet.
Отредактировано: dimitrus 15 авг 2015 21:21 |