ЗАО «ЗЭО»

Техническая поддержка пользователей => Тион270, Тион-Про270, Сириус270 => Тема начата: laborer от 18 Мая, 2011, 14:52:38

Название: Прошивка JFFS2 образа КФС из uBoot
Отправлено: laborer от 18 Мая, 2011, 14:52:38
Интересует сей вопрос. Девайсина - Тион270.

Если КФС держать на каком-нибудь ext2, то её можно прошить примерно так:
erase ${rd_fladdr} +${filesize}; cp.b ${fileaddr} ${rd_fladdr} ${filesize};

Если же КФС держать на каком-нибудь jffs2, то прошивать надо(под линуксом) примерно так:
# flash_eraseall -j /dev/mtd2
# nandwrite -p /dev/mtd2 rootfs.jffs2

где /dev/mtd2 - интересующий меня раздел(стандратный 3-ий для кфс после uboot и ядра).
То есть простое копирование байтов по типу
# dd if=rootfs.jffs2 of=/dev/mtd2 ошибочно.

Команда cp.b насколько я понимаю делает простое копирование. После её выполнения новая кфс получается битой: со следами старой.
Нужно найти аналог линуксового nandwrite для консоли uboot. Нагуглилось, что такая команда есть - nand(https://docs.blackfin.uclinux.org/doku.php?id=bootloaders:u-boot:nand-flash). В uboot нужно включить CONFIG_CMD_NAND ну и заодно ещё кое-что.
Сделал вот такой вот патч(для uboot пропатченного уже u-boot-1.3.3_tion-tion270-series_svn894.patch).
--- a/include/configs/tion270.h 2011-05-18 13:12:26.748849541 +0400
+++ b/include/configs/tion270.h 2011-05-18 13:12:49.140849542 +0400
@@ -252,6 +252,11 @@
 #define MTDPARTS_DEFAULT "mtdparts=flash:512k(u-boot)ro,4m(kernel)ro,-(fs)"
 #define CONFIG_CMD_JFFS2 /* mtdparts command */
 
+#define CONFIG_CMD_NAND
+#define NAND_MAX_CHIPS 1
+#define CFG_MAX_NAND_DEVICE 1
+#define CFG_NAND_BASE 0x480000 //rd_fladd
+
 #define CONFIG_EXTRA_ENV_SETTINGS \
  "mtdparts=" MTDPARTS_DEFAULT "\0" \
  "partition=nor0,2\0" \
Есть сомнение относительно CFG_NAND_BASE. Вроде здесь надо ставить стартовый адрес раздела. Но этого всего оказывается мало. Сыпется ошибка
drivers/mtd/nand/libnand.a(nand.o): In function `nand_init':
nand.c:(.text+0x20): undefined reference to `board_nand_init'

Нужно эту функцию описать в файле <uboot>/board/tion270/nand.c (по аналогии с другими платами). Вот тут совсем ничего не ясно как железо инициализировать.
У кого-нибудь есть такие наработки? И вообще правильно ли я всё понимаю?
Название: Re: Прошивка JFFS2 образа КФС из uBoot
Отправлено: asv от 18 Мая, 2011, 15:21:38
> dd if=rootfs.jffs2 of=/dev/mtd2 ошибочно.

Да, если вы не указали размер блока (не проверял).

cp.b (в U-Boot) справляется со своей задачей, так как при малых объёмах копирует побайтово, а при больших учитывает размер блока во Flash и использует блочную запись.
Название: Re: Прошивка JFFS2 образа КФС из uBoot
Отправлено: laborer от 18 Мая, 2011, 15:39:17
Цитировать
cp.b (в U-Boot) справляется со своей задачей, так как при малых объёмах копирует побайтово, а при больших учитывает размер блока во Flash и использует блочную запись.

У меня не справился. Проверял несколько раз. Память не битая, делал проверку cmp.b для загруженного файла и флеша.
До этого у меня флеш был не чистый, а содержал старую предыдущую версию моего проекта. На первый взгляд после прошивки выглядит всё хорошо. Но пригляделся: большинство файлов имеют новую дату, но также есть файлы из старого проекта. То есть свежий образ переписался поверх старого как-то хитро с наложением.
Я не разбираюсь во внутренностях jffs2, но вот замечания из faq (http://www.linux-mtd.infradead.org/faq/jffs2.html) наводят на такие мысли.
Цитировать
One common mistake is to use /dev/mtdX or /dev/mtdblockX devices to flash JFFS2 images on NAND flashes. E.g.
cp jffs2_fs.img /dev/mtd2

This is incorrect because when dealing with NAND flashes one has to skip bad eraseblocks and write only in NAND page size chunks. Please, use the nandwrite utility instead.

Ну и в конце-концов, зачем же тогда придумали эту команду nand для uboot? А ещё есть такие её вариации "nand write.jffs2".
Название: Re: Прошивка JFFS2 образа КФС из uBoot
Отправлено: asv от 18 Мая, 2011, 15:56:32
> У меня не справился.

При записи файлов в NOR Flash (ядра, КФС) я использую cp.b

> До этого у меня флеш был не чистый

Вы делали erase? Стирали _весь_ соотв. раздел, а не только место для файла (это важно для jffs)?


P.S.
> dd if=rootfs.jffs2 of=/dev/mtd2 ошибочно.

Надо использовать mtdblock2

Да, если вы не указали размер блока (не проверял).
Название: Re: Прошивка JFFS2 образа КФС из uBoot
Отправлено: asv от 18 Мая, 2011, 15:58:15
И на плате не NAND Flash, а NOR для которой bad block это не нормально.
Название: Re: Прошивка JFFS2 образа КФС из uBoot
Отправлено: laborer от 18 Мая, 2011, 16:35:23
>> До этого у меня флеш был не чистый
>Вы делали erase? Стирали _весь_ соотв. раздел, а не только место для файла (это важно для jffs)?

Угу в этом была причина. Спасибо.
Было: erase ${rd_fladdr} +${filesize};
Помогло:  erase  ${rd_fladdr} +0x1B80000;

>P.S.
>> dd if=rootfs.jffs2 of=/dev/mtd2 ошибочно.
>Надо использовать mtdblock2
>Да, если вы не указали размер блока (не проверял).

Конечно. Я тоже не проверял :), писал на уровне идеи.