Перейти к содержанию
    

Запись Linux в NAND Ti AM1705

Добрый день.

 

Плата на основе TI AM1705, NAND NAND512W3A (ST Micro NAND 64MiB 3,3V 8-bit); u-boot и ядро в NAND памяти.

Проблема : ядро не может корректно про инициализировать NAND память, не создает устройств в dev c которыми можно работать, но при использовании команды u-boot scrub, до первой перезагрузки ядро получает возможность корректно работать с NAND.

 

Куда копать, чтобы у ядра и u-boot не появлялось сообщение "No space left to write bad block table"?

 

 

При старте u-boot выдает сообщение

 

Bad block table not found for chip 0
Bad block table not found for chip 0
No space left to write bad block table

 

Ядро с ним солидарно :

NAND device: Manufacturer ID: 0x20, Chip ID: 0x76 (ST Micro NAND 64MiB 3,3V 8-bit)
Bad block table not found for chip 0
Bad block table not found for chip 0
Scanning device for bad blocks
Bad eraseblock 4092 at 0x000003ff0000
Bad eraseblock 4093 at 0x000003ff4000
Bad eraseblock 4094 at 0x000003ff8000
Bad eraseblock 4095 at 0x000003ffc000
No space left to write bad block table
davinci_nand: probe of davinci_nand.1 failed with error -28

 

Сообщения об ошибках не мешают u-boot работать с NAND, т.е. я смог загрузить ядро в NAND а потом загрузить его из NAND и стартовать с него.

 

U-Boot > nboot.e 0xc0700000 0 0x80000

Loading from NAND 64MiB 3,3V 8-bit, offset 0x80000
  Image Name:   Linux-3.2.1
  Image Type:   ARM Linux Kernel Image (uncompressed)
  Data Size:    2026040 Bytes =  1.9 MB
  Load Address: c0008000
  Entry Point:  c0008000
U-Boot > bootm
## Booting kernel from Legacy Image at c0700000 ...
  Image Name:   Linux-3.2.1
  Image Type:   ARM Linux Kernel Image (uncompressed)
  Data Size:    2026040 Bytes =  1.9 MB
  Load Address: c0008000
  Entry Point:  c0008000
  Verifying Checksum ... OK
  Loading Kernel Image ... OK
OK

 

Если воспользоваться командой u-boot U-Boot > nand scrub 0, то таблица bbt создается :

Really scrub this NAND flash? <y/N>
Erasing at 0x3ffc000 -- 100% complete.
Bad block table not found for chip 0
Bad block table not found for chip 0
Bad block table written to 0x000003ffc000, version 0x01
Bad block table written to 0x000003ff8000, version 0x01
OK

 

И при дальнейшей загрузке ядра, оно корректно работает с NAND, до первой перезагрузки.

 

NAND device: Manufacturer ID: 0x20, Chip ID: 0x76 (ST Micro NAND 64MiB 3,3V 8-bit)
Bad block table not found for chip 0
Bad block table not found for chip 0
Scanning device for bad blocks
Bad block table written to 0x000003ffc000, version 0x01
Bad block table written to 0x000003ff8000, version 0x01
Creating 4 MTD partitions on "davinci_nand.1":
0x000000000000-0x000000040000 : "bootloader"
0x000000040000-0x000000080000 : "params"
0x000000080000-0x000000480000 : "kernel"
0x000000480000-0x000004000000 : "filesystem"
davinci_nand davinci_nand.1: controller rev. 2.5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в том, что ядро не может корректно записать таблицу испорченных блоков (bad block table), т.е. блоки куда помещается таблица при следующей загрузке объявляются битыми.

 

Есть структура

 

static struct nand_bbt_descr da830_evm_nand_bbt_main_descr = {
.options	= NAND_BBT_LASTBLOCK | NAND_BBT_CREATE |
		   NAND_BBT_WRITE | NAND_BBT_2BIT |
		   NAND_BBT_VERSION | NAND_BBT_PERCHIP,
.offs		= 2,
.len		= 4,
.veroffs	= 16,
.maxblocks	= 80,
.pattern	= da830_evm_nand_bbt_pattern
};

 

Определяющая таблицу. Вопрос, как ее корректно настроить? Если выкинуть флаги NAND_BBT_CREATE NAND_BBT_WRITE то работает, но я не уверен что это правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

День добрый!

 

Скорее всего вопрос уже решен, но все же может кому другому пригодится

 

Столкнулся с ней при переходе на более свежее ядро. У меня были след. проблемы:

1. стартовал u-boot и не находил таблицы бад-блоков, после чего создавал ее.

2. стартовал линуксе и так же не находил таблицу бед-блоков, и так же создавал ее.

3. сектора, записанные в линуксе, читались с ошибками ECC в u-boote и наоборот.

 

После долгого ковыряния как обычно обнаружилось простое решение. Оказалось,

1. в ядре была определена только nand_ecclayout , а в u-boote определяется и структура nand_ecclayout и дескрипторы бад-блоков nand_bbt_descr(2шт - обычная и mirror).

2. поля структуры nand_ecclayout в линуксе и у-бууте были заполнены разными значениями

 

Решение - структуры nand_ecclayout, nand_bbt_descr(2шт - обычная и mirror) должны быть одинкаковы. Вообщем-то не так важно откуда куда копировать и или

Для DM36x TI рекомендует след структуру nand_ecclayout http://processors.wiki.ti.com/index.php/DM...Nand_ECC_layout

 

мои структур выглядят след образом:

static struct nand_ecclayout nand_davinci_ecclayout = {
    .eccbytes    = 40,
    .eccpos        = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
              22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
              38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
              54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    },
    .oobfree    = {{2, 4}, {16, 6}, {32, 6}, {48, 6} },
};

static uint8_t nand_davinci_bbt_pattern[] = { 'B', 'b', 't', '0' };
static uint8_t nand_davinci_mirror_pattern[] = { '1', 't', 'b', 'B' };

static struct nand_bbt_descr nand_davinci_bbt_main_descr = {
    .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
    | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
    .offs = 2,
    .len = 4,
    .veroffs = 16,
    .maxblocks = 4,
    .pattern = nand_davinci_bbt_pattern
};

static struct nand_bbt_descr nand_davinci_bbt_mirror_descr = {
    .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
    | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
    .offs = 2,
    .len = 4,
    .veroffs = 16,
    .maxblocks = 4,
    .pattern = nand_davinci_mirror_pattern
};

//только для ядра. файл типа board_evm.c 
static struct davinci_nand_pdata davinci_nand_data = {
    .mask_ale        = MASK_ALE,
    .mask_cle        = MASK_CLE,
    .mask_chipsel    = BIT(14),
    
    .parts            = davinci_nand_partitions,
    .nr_parts        = ARRAY_SIZE(davinci_nand_partitions),
    
    .ecc_mode        = NAND_ECC_HW,
    .ecc_bits        = 4,
    .options        = NAND_USE_FLASH_BBT, //NAND_SKIP_BBTSCAN NAND_USE_FLASH_BBT_NO_OOB
    .ecclayout        = &nand_davinci_ecclayout,
    .bbt_td            = &nand_davinci_bbt_main_descr,
    .bbt_md            = &nand_davinci_bbt_mirror_descr,
    
};

Изменено пользователем vovchk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...