Я пытался записать загрузочную 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:"
Возможно есть менее грубое решение этой проблемы? Никто не сталкивался?