LINUX.ORG.RU

Не удается обеспечить поддержку NAND.

 , , , ,


1

4

Имею плату Core9G25, на ней расположенно NAND на 256 метров. Ядро 4.1.18. В device-tree указал:

				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 */
					};
				};

		nand0: nand@40000000 {
			compatible = "atmel,at91rm9200-nand";
			#address-cells = <1>;
			#size-cells = <1>;
			reg = <0x40000000 0x10000000
			       0xffffe000 0x600		/* PMECC Registers */
			       0xffffe600 0x200		/* PMECC Error Location Registers */
			       0x00100000 0x100000	/* PMECC looup table in ROM code  */
			      >;
			atmel,pmecc-lookup-table-offset = <0x8000 0x10000>;
			atmel,nand-addr-offset = <21>;
			atmel,nand-cmd-offset = <22>;
			//adding
			nand-bus-width = <8>;
			nand-ecc-mode = "hw";
			atmel,has-pmecc;
			atmel,pmecc-cap = <2>;
			atmel,pmecc-sector-size = <512>;
			nand-on-flash-bbt;
			
			atmel,nand-has-dma;
			pinctrl-names = "default";
			pinctrl-0 = <&pinctrl_nand>;
			gpios = <&pioD 5 0
				 &pioD 4 0
				 0
				>;
			status = "okay";
			
				bootstrap@0 {
					label = "bootstrap";
					reg = <0x0 0x20000>;
				};
				uimage@20000 {
					label = "uimage";
					reg = <0x20000 0x420000>;
				};
				dtbs@420000 {
					label = "device-tree";
					reg = <0x420000 0x439000>;
				};
				sg@439000 {
					label = "settings";
					reg = <0x439000 0x539000>;
				};
				rootfs@539000 {
					label = "rootfs";
					reg = <0x539000 0xf539000>;
				};
		};


При загрузке выдает:
[    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


При том родная прошивка на базе 3.6.9+ успешно загружается:
brd: module loaded
loop: module loaded
atmel_nand: Use On Flash BBT
atmel_nand 40000000.nand: Using dma0chan0 for DMA transfers.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit), page size: 2048, OOB size: 64
atmel_nand 40000000.nand: NAND chip is not ONFI compliant, assume ecc_bits is 2 in 512 bytes
atmel_nand 40000000.nand: Initialize PMECC params, cap: 2, sector: 512
Bad block table found at page 131008, version 0x01
Bad block table found at page 130944, version 0x01
nand_read_bbt: bad block at 0x000006260000
nand_read_bbt: bad block at 0x0000080e0000
nand_read_bbt: bad block at 0x000008e40000
8 cmdlinepart partitions found on MTD device atmel_nand
Creating 8 MTD partitions on "atmel_nand":
0x000000000000-0x000000040000 : "bootstrap"
0x000000040000-0x0000000c0000 : "uboot"
0x0000000c0000-0x000000100000 : "env"
0x000000100000-0x000000140000 : "env_redundant"
0x000000140000-0x000000180000 : "spare"
0x000000180000-0x000000200000 : "dtb"
0x000000200000-0x000000800000 : "kernel"
0x000000800000-0x000010000000 : "rootfs"
UBI: attaching mtd7 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    126976 bytes
UBI: smallest flash I/O unit:    2048
UBI: VID header offset:          2048 (aligned 2048)
UBI: data offset:                4096
UBI: max. sequence number:       180
UBI warning: print_rsvd_warning: cannot reserve enough PEBs for bad PEB handling, reserved 29, need 38
UBI: attached mtd7 to ubi0
UBI: MTD device name:            "rootfs"
UBI: MTD device size:            248 MiB
UBI: number of good PEBs:        1977
UBI: number of bad PEBs:         7
UBI: number of corrupted PEBs:   0
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     1
UBI: available PEBs:             0
UBI: total number of reserved PEBs: 1977
UBI: number of PEBs reserved for bad PEB handling: 29
UBI: max/mean erase counter: 2/1
UBI: image sequence number:  108941888
UBI: background thread "ubi_bgt0d" started, PID 452


Что я делаю не так?

★★★★★

Что я делаю не так?

ХЕЗ.
Вот отрывок из моего _рабочего_ ДТС файла. АТ91SAM9G45 MCU. 4.1.22 ядро. Мож поможет...

		nand0: nand@40000000 {
			nand-bus-width = <16>;
			nand-ecc-mode = "soft_bch";
			nand-on-flash-bbt;
			status = "okay";

			obsolete_bootstrap@0 {		// Obsolete stuff. will be unused but define it to get mtd access to this block
				reg = <0x0 0x20000>;
			};

			kernel_a@20000 {		// 8MB for main kernel
				reg = <0x20000 0x800000>;
			};

			kernel_b@820000 {		// 8MB for reserve kernel
				reg = <0x820000 0x800000>;
			};
			
			rootfs_a@1020000 {		// 76MB reserve more for future features
				reg = <0x1020000 0x4C00000>;
			};

			rootfs_b@5c20000 {		// 76MB reserve more for future features
				reg = <0x5c20000 0x4C00000>;
			};

			backup@a820000 {		// 22MB for backuping of configuration and statistic data
				reg = <0xa820000 0x1600000>;
			};

			config_data@be20000 {		 // 321,875MB for volumes with UBIFS: "configurations" and "data"
				reg = <0xBE20000 0x141E0000>;
			};

			wholeFlash@0 {
				reg = <0x0 0x20000000>;
			};
		};

velikS
()
Ответ на: комментарий от splinter

MX30UF4G16AB. UBI, UBIFS как и у вас. Я тот прибор начинал с 3.10, потом по ходу дела перенёс на 4.1. Пока разобрался, была куча проблем с ДТС с периферией. Но вот флэш запустился сразу.

velikS
()
Ответ на: комментарий от velikS

у меня планируется не UBIFS, YAFFS2 или JFFS2.

splinter ★★★★★
() автор топика

Вытащить ДТС с родной прошивки и сравнить? Ну там еще возможно какието Chip-Select нужно подергать.

cvv ★★★★★
()
Ответ на: комментарий от cvv

Вытащить ДТС с родной прошивки и сравнить?

Не могу исходников найти, ссылаются на какую то версию ядра linux_at91 3.6.9+ даже исходники есть на китайском сайте, но там вроде так же как и у меня.

Ну там еще возможно какието Chip-Select

Выставляю как и положено pioD4, pioD5 в 0.

splinter ★★★★★
() автор топика
Ответ на: комментарий от Dark_SavanT

по даташиту pioD4 и pioD5 почему то описываются в режиме переферии А, в dts они «AT91_PERIPH_GPIO», хотя видимо это для того что бы явно выставить уровни.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

Нет. Память инициализируется в бутстрэпе. Можно (но не нужно) ещё раз инициализировать флэш в ядре.

у меня планируется не UBIFS, YAFFS2 или JFFS2

Кста, у меня там JFFS2 небольшая была.

velikS
()
Ответ на: комментарий от cvv

ЕМНИП их нормлаьно похоронили только в районе 3.10 может чуть раньше

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от velikS

Судя по

         /*
          * Try again to make sure, as some systems the bus-hold or other
          * interface concerns can cause random data which looks like a
          * possibly credible NAND flash to appear. If the two results do
          * not match, ignore the device completely.
          */
 
         chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
 
         /* Read entire ID string */
         for (i = 0; i < 8; i++)
                 id_data[i] = chip->read_byte(mtd);
 
         if (id_data[0] != *maf_id || id_data[1] != *dev_id) {
                 pr_info("second ID read did not match %02x,%02x against %02x,%02x\n",
                         *maf_id, *dev_id, id_data[0], id_data[1]);
                 return ERR_PTR(-ENODEV);
         } 

в drivers/mtd/nand/nand_base.c с чипа читается какой-то мусор вместо ID, так как должно быть Manufacturer ID: 0xec, Chip ID: 0xda а не [30,98] и [a0,57]

alx777 ★★
()
Ответ на: комментарий от splinter

Не могу исходников найти, ссылаются на какую то версию ядра linux_at91 3.6.9+ даже исходники есть на китайском сайте, но там вроде так же как и у меня.

Можно декомпилировать dtb (man dtc, в Ubuntu пакет device-tree-compiler)

dtc -I dtb -O dts -o test.dts test.dtb

или посмотреть в /proc/device-tree/

alx777 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.