Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Без вторичного загрузчика ядро не определяет Nand-flash

Сб фев 10, 2018 12:50:20

Не нашел на вашем форуме раздела Linux embedded, поэтому пишу сюда.
Есть устройство на базе AT91SAM9G25. ОС Linux-4.1.18. Вот раздел инициализации Nand в dts:
Код:
nand {
pinctrl_nand: nand-0 {
atmel,pins =
<AT91_PIOD 0 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD0 periph A Read Enable */
AT91_PIOD 1 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD1 periph A Write Enable */
AT91_PIOD 2 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD2 periph A Address Latch Enable */
AT91_PIOD 3 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD3 periph A Command Latch Enable */
AT91_PIOD 4 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP /* PD4 gpio Chip Enable pin pull_up */
AT91_PIOD 5 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP /* PD5 gpio RDY/BUSY pin pull_up */
AT91_PIOD 6 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD6 periph A Data bit 0 */
AT91_PIOD 7 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD7 periph A Data bit 1 */
AT91_PIOD 8 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD8 periph A Data bit 2 */
AT91_PIOD 9 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD9 periph A Data bit 3 */
AT91_PIOD 10 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD10 periph A Data bit 4 */
AT91_PIOD 11 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD11 periph A Data bit 5 */
AT91_PIOD 12 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD12 periph A Data bit 6 */
AT91_PIOD 13 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* PD13 periph A Data bit 7 */
};

pinctrl_nand_16bits: nand_16bits-0 {
atmel,pins =
<AT91_PIOD 14 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD14 periph A Data bit 8 */
AT91_PIOD 15 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD15 periph A Data bit 9 */
AT91_PIOD 16 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD16 periph A Data bit 10 */
AT91_PIOD 17 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD17 periph A Data bit 11 */
AT91_PIOD 18 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD18 periph A Data bit 12 */
AT91_PIOD 19 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD19 periph A Data bit 13 */
AT91_PIOD 20 AT91_PERIPH_A AT91_PINCTRL_NONE /* PD20 periph A Data bit 14 */
AT91_PIOD 21 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* PD21 periph A Data bit 15 */
};
};
nand@40000000 {
compatible = "atmel,at91rm9200-nand";
#address-cells = <0x1>;
#size-cells = <0x1>;
reg = <0x40000000 0x10000000
0xffffe000 0x600
0xffffe600 0x200
0x100000 0x100000>;
atmel,pmecc-lookup-table-offset = <0x8000 0x10000>;
atmel,nand-addr-offset = <0x15>;
atmel,nand-cmd-offset = <0x16>;
atmel,nand-has-dma;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_nand>;
gpios = <&pioD 5 GPIO_ACTIVE_HIGH &pioD 4 GPIO_ACTIVE_HIGH 0>;
status = "okay";
nand-bus-width = <0x8>;
nand-ecc-mode = "hw";
atmel,has-pmecc;
atmel,pmecc-cap = <0x2>;
atmel,pmecc-sector-size = <0x200>;
nand-on-flash-bbt;

at91bootstrap@0 {
label = "at91bootstrap";
reg = <0x0 0x40000>; //<0x0 0x100000>;
};

uboot@40000 {
label = "u-boot";
reg = <0x40000 0x80000>; //<0x100000 0x100000>;
};

ubootenv@c0000 {
label = "u-boot env";
reg = <0xc0000 0x140000>; //<0x200000 0x200000>;
};

kernel@200000 {
label = "kernel";
reg = <0x200000 0x400000>;
};
settings@800000 {
label = "settings";
reg = <0x800000 0x200000>;
};
rootfs@A00000 {
label = "rootfs";
reg = <0xA00000 0xDC00000>;
};
};

Загрузка идет из sdcard, то есть там находится at91bootstrap, u-boot, Linux. На устройстве есть NAND SAMSUNG K9F2G08UDC 256MiB, который собственно мне и необходимо увидеть в Linux. Если загружаться at91bootstrap -> U-Boot -> Linux то NAND виден:
Код:
[ 5.010000] atmel_nand 40000000.nand: Use On Flash BBT
[ 5.020000] atmel_nand 40000000.nand: Using dma0chan2 for DMA transfers.
[ 5.030000] nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda
[ 5.030000] nand: Samsung NAND 256MiB 3,3V 8-bit
[ 5.040000] nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
[ 5.040000] atmel_nand 40000000.nand: can't detect min. ECC, assume 2 bits in 512 bytes
[ 5.050000] atmel_nand 40000000.nand: Initialize PMECC params, cap: 2, sector: 512
[ 5.060000] Bad block table found at page 131008, version 0x01
[ 5.070000] Bad block table found at page 130944, version 0x01
[ 5.070000] nand_read_bbt: bad block at 0x000006260000
[ 5.080000] nand_read_bbt: bad block at 0x0000080e0000
[ 5.080000] nand_read_bbt: bad block at 0x000008e40000
[ 5.090000] 6 ofpart partitions found on MTD device atmel_nand
[ 5.090000] Creating 6 MTD partitions on "atmel_nand":
[ 5.100000] 0x000000000000-0x000000040000 : "at91bootstrap"
[ 5.110000] 0x000000040000-0x0000000c0000 : "u-boot"
[ 5.120000] 0x0000000c0000-0x000000200000 : "u-boot env"
[ 5.120000] 0x000000200000-0x000000600000 : "kernel"
[ 5.130000] 0x000000800000-0x000000a00000 : "settings"
[ 5.140000] 0x000000a00000-0x00000e600000 : "rootfs"

Если загружаться как at91bootstrap -> Linux, то ядро чудесным образом перестает видеть NAND:
Код:
[ 0.632812] atmel_nand 40000000.nand: Use On Flash BBT
[ 0.632812] atmel_nand 40000000.nand: Using dma0chan0 for DMA transfers.
[ 0.640625] nand: second ID read did not match 30,98 against a0,57
[ 0.648437] nand: No NAND device found


Полазил в исходниках U-Boot, вот код инициализации Nand:
Код:
/* NAND flash */
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_ATMEL
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x40000000
#define CONFIG_SYS_NAND_DBW_8 1
/* our ALE is AD21 */
#define CONFIG_SYS_NAND_MASK_ALE (1 << 21)
/* our CLE is AD22 */
#define CONFIG_SYS_NAND_MASK_CLE (1 << 22)
#define CONFIG_SYS_NAND_ENABLE_PIN AT91_PIN_PD4
#define CONFIG_SYS_NAND_READY_PIN AT91_PIN_PD5

/* PMECC & PMERRLOC */
#define CONFIG_ATMEL_NAND_HWECC 1
#define CONFIG_ATMEL_NAND_HW_PMECC 1
#define CONFIG_PMECC_CAP 2
#define CONFIG_PMECC_SECTOR_SIZE 512
#define CONFIG_PMECC_INDEX_TABLE_OFFSET 0x8000
#define CONFIG_CMD_NAND_TRIMFFS

#define CONFIG_MTD_DEVICE
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_PARTITIONS
#define CONFIG_RBTREE
#define CONFIG_LZO
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#endif


Как это побороть? В чем может быть проблема?

Re: Без вторичного загрузчика ядро не определяет Nand-flash

Пн фев 12, 2018 13:24:45

А этот ваш at91bootstrap вообще в курсе Device Treee (dtb, он из DTSа компилится) и умеет его ядру отдавать? Он описывает для ядра какое железо есть.

Переход на DTB и многоплатформенные ядра (способные грузиться на нескольких разных ARM) с кучи самопальных методов что-то делать по поводу бардака с отсутствем у ARMов PnP случился не так давно и это требует изменений в boot loader-е, чтобы тот мог передавать бинарь dtb ядру. Подозреваю что для at91bootstrap этого никто не сделал, в отличие от uboot. Можете попробовать собрать ядро с опцией встраивания DTB в образ ядра, сделано специально для стремных бутлоадеров которые не обновили про это дело. Это в menuconfig или .config файле ядра, dts-ы там же. Если эту опцию врубить, после сборки сборочная система приделает dtb к образу ядра. Это несколько криво, но если бутлоадер глупый... uboot то поддерживает кучу всего и его толпа народа оперативно апдейтит под все что угодно. У него даже свои DTSы есть на случай если вы их забыли. Могут быть старые/минимальные, но все-таки uboot может и сам минимальное devicetree отдать как fallback. А вот атмелский бутстрап врядли кто-то сильно актуализует и шансы что кто-то заморачивался чем-то таким - минимальные.

Могу предположить что при запуске at91bootstrap ядро например стартует совсем без DTB и поэтому не знает параметры флехи или не инициализирует что-то нужное для ее работы, и вообще, инициализирует железо минимально, с какими-то дефолтными параметрами и спасибо что не работает только это. Сравните, есть файлик /sys/firmware/fdt при старте так и сяк? Это собственно DTB подхваченый ядром при загрузке. Если он был. Также см содержимое /sys/firmware/devicetree

Но это так, пальцем в небо, проблемы с детектом железа и загрузчиком - похоже на что-то такое. Кстати то что вы привели - не код инициализации NAND а всего лишь кучка конфигурационных параметров uboot, описывающих фичи с которыми uboot будет собран. Они сейчас от включения фич в исходнике уходят как раз в сторону настроек на манер ядра Linux через ту же самую по смыслу билдсистему, тоже с menuconfig-ом. И вот конкретно таким файликам суждено наполовину умереть вообще для живых платформ. Процитированный кусок вообще с nand сам по себе ничего не делает, это для uboot в основном... :).

Disclaimer: если я не угадал, тапками не кидаться - я вообще с линуксом на именно атмеле дел не имел.
Ответить