ЗАО «ЗЭО»
Техническая поддержка пользователей => Тион-Про28, Орион28 => Тема начата: dm2601 от 13 Ноября, 2012, 01:28:44
-
Я пытался записать загрузочную SD карту с Линуксом, используя LTIB от Freescale. Пробился 2 вечера над одной проблемой и хочу поделиться решением, которое мне в итоге помогло.
Следуя инструкции документа i.MX28 Linux BSP User’s Guide я установил в Ubuntu 10.10 linux target image builder от freescale, запустил конфигуратор ядра а затем запустил построение ядра и корневой файловой системы и записал их в карту. С помощью этой карты я попытался загрузить Тион Про28 с положением перемычек 1001.
Через ком порт пошли строчки лога загрузки ядра, но закончился лог не предложением ввода логина, а вот так:
mmc0: new high speed SD card at address b368
mmcblk0: mmc0:b368 uSD 1.91 GiB (ro)
mmcblk0:
TCP cubic registered
NET: Registered protocol family 17
can: controller area network core (rev 20090105 abi 8)
NET: Registered protocol family 29
can: raw protocol (rev 20090105)
p1 p2 p3
mxs-rtc mxs-rtc.0: setting system clock to 1970-01-01 00:03:50 UTC (230)
VFS: Cannot open root device "mmcblk0p3" or unknown-block(179,3)
Please append a correct "root=" boot option; here are the available partitions:
b300 2010112 mmcblk0 driver: mmcblk
b301 35681 mmcblk0p1
b302 35712 mmcblk0p2
b303 1938368 mmcblk0p3
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,3)
Backtrace:
[<c00344a8>] (dump_backtrace+0x0/0x114) from [<c03c9698>] (dump_stack+0x18/0x1c)
r7:c047ba5e r6:00008000 r5:c75d1000 r4:c0536898
[<c03c9680>] (dump_stack+0x0/0x1c) from [<c03c9714>] (panic+0x78/0xf4)
[<c03c969c>] (panic+0x0/0xf4) from [<c000902c>] (mount_block_root+0x1d8/0x218)
r3:00000000 r2:00000001 r1:c7c27f60 r0:c047bb05
[<c0008e54>] (mount_block_root+0x0/0x218) from [<c0009130>] (mount_root+0xc4/0x)
[<c000906c>] (mount_root+0x0/0xfc) from [<c00092d4>] (prepare_namespace+0x16c/0)
r5:c0029a29 r4:c0535c20
[<c0009168>] (prepare_namespace+0x0/0x1c4) from [<c00084f8>] (kernel_init+0x128)
r5:c0028a94 r4:c05359e0
[<c00083d0>] (kernel_init+0x0/0x170) from [<c005010c>] (do_exit+0x0/0x6dc)
r5:c00083d0 r4:00000000
Суть проблемы заключается в том что карта почему то считается read only устройством (ro) и поэтому ее 3-й раздел (mmcblk0p3) не может быть принят ядром в качестве корневого раздела.
Чтобы это обойти я подредактировал следующие файлы:
..../ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/mach-mx28/device.c
..../ltib/rpm/BUILD/linux-2.6.35.3/drivers/mmc/host/mxs-mmc.c
В device.c есть функция mxs_mmc_get_wp_ssp0 (wp - write protect), я сделал так
static int mxs_mmc_get_wp_ssp0(void)
{
return 0;
// return gpio_get_value(MMC0_WP);
}
В mxs-mmc.c тоже закоментировал весь код функции mxs_mmc_get_ro и сделал безусловный return 0;
/* Return read only state of card */
static int mxs_mmc_get_ro(struct mmc_host *mmc)
{
return 0;
/* struct mxs_mmc_host *host = mmc_priv(mmc);
struct mxs_mmc_platform_data *mmc_data = host->dev->platform_data;
if (mmc_data && mmc_data->get_wp)
return mmc_data->get_wp();
return 0; */
}
После полной пересборки ядра и rootfs загрузочная карта заработала и загрузка завершилась "freescale login:"
Возможно есть менее грубое решение этой проблемы? Никто не сталкивался?
-
Какой был cmdline?
-
Я смогу посмотреть cmdline только вечером, но в общем все выяснил. Я посмотрел содержимое патча для линукса с сайта zao-zeo (http://www.zao-zeo.ru/media/files/linux/2.6.35/tion-pro28_patch_svn2127.zip) и нашел там такое:
+static int mxs_mmc_get_wp_ssp0(void)
+{
+ //return gpio_get_value(MMC0_WP);
+ return 0; // TionPro28 has no WP pin
+}
То есть то же самое, что я и сделал. Вывод видимо такой - мне в исходники взятые с сайта freescale (которые с LTIB идут) следовало закинуть патч с zao-zeo и не пришлось бы изобретать велосипед ).
-
Да, для Тиона-Про28 нужно применить патч с сайта при сборке ядра. Иначе не вся переферия будет работать.
-
Записать загрузочную mmc карту можно и скриптом mk_mx28_sd из архива L2.6.35_10.12.01_SDK_scripts. Но в нем ошибка в функции make_nominal_partition():
function make_nominal_partition() {
if [[ $DEBUG ]] ;
then
WRITE=q
else
WRITE=w
fi
echo "o
n
p
1
1
+32M
t
b
n
p
...
вместо "1" должна быть пустая строка.
-
скрипты от freescale работают изумительно. Ничего не правил всё и так заработало.
-
Вот теперь напоролся на нероботоспособность скрипта! И в самом деле на всех старых дистрибютивах всё работает как часы. на Debian 7 пришлось править как указано выше (убрать единичку)
-
Скрипт писался для Ubuntu 9.04. На других дистрибутивах возможны ошибки.