Неудачный результат – тоже результат

Так и не выходит запустить эмулятор PAVO, скомпилированный под MinGW. Сам эмулятор, видимо, работает, но ничего, кроме черного экрана от него добиться не удалось. Как предлагает Библия, седьмой день недели надо посвятить Богу своему, поэтому, как русский православный человек, ничего делать в воскресенье я уже не буду (есть, конечно, те, кто начинает отсчет дней недели с воскресенья, по-американски, и посвящяет своему Б-гу субботу, но таких мы единогласно осуждаем). Для очистки совести напишу, с чем конкретно я столкнулся. Все это делалось в MinGW под Windows 7, так что “костыли и подпорки” касаются только этого “build environment”.

Для компиляции QEMU я воспользовался пошаговой инструкцией с qemu-forum.ipi.fi, творчески ее модифицировав. Шаги с первого по пятый выполняем без изменений. Проблемой может стать поиск старой версии MinGW. Я нашел MinGW 3.1.0-1 на сайте Kudzu World.

Затем я установил пакет directx-devel, как описано на седьмом шаге, а при установке SDL столкнулся с трудностями – он не компилировался, какие-то странные глюки возникали при копировании файлов. Поэтому вместо восьмого шага руководства я скачал уже готовую библиотеку SDL 1.2.1.14 для MinGW с официального сайта. Распаковываем архив и выполняем make install.

Девятый шаг – установка zlib, там все нормально и соответствует инструкции. Дальше начинаются пляски с бубном. Скачиваем с jz-hacking исходники qemu-jz. Распаковываем, запускаем ./configure --target=mipsel-softmmu. Если теперь попытаться выполнить make, вылетит ошибка – используемая версия gcc не знает об одном из параметров командной строки. Поэтому в файлах config-host.mak и mipsel-softmmu\Makefile надо убрать параметр компилятора -Wendif-labels. Заодно в файле qemu-sockets.c на 155 и 273 строках надо заменить вызов функции gai_strerror на любую строку – этой функции почему-то нет в MinGW, да и не пригодится нам ее выдача. После этого делаем make. На этом qemu готов, перемещаем файлик qemu-system-mipsel.exe в какое-нибудь более пристойное место и подкладываем к нему SDL.dll.

Кстати, иногда configure “на ровном месте” спотыкается при определении наличия zlib. Не паникуем, а просто запускаем еще раз. Иногда просветление настигает железного болвана на третий-четвертый раз.

Теперь займемся изготовлением прошивки для флешки. Она состоит из трех частей – загрузчик на основе u-boot, ядро Linux и файловая система. Загрузчик и ядро Linux уже “собраны”, их достаточно только скачать.

Файл u-boot-nand-pavo-20090207.bin переименовываем в u-boot-nand.bin, uImage-pavo-20090207 – в uImage.

Файловую систему предлагают построить из ее же, но заархивированной, с помощью утилиты mkyaffs2image, но не оригинальной версии, а чуть-чуть модифицированной. В MinGW собрать работающую версию мне не удалось, но konst.cranky любезно поделился собственноручно сделанным файлом, скачать его можно отсюда – http://files.mail.ru/6DBIGD.

Так или иначе, разжившись файлами u-boot-nand.bin, uImage и rootfs.yaffs2 складываем их в одно место и готовимся делать образ флешки. Для этого надо скомпилировать утилиту pavo_nandflash. Как водится, начнем продираться через dependency hell. Для утилиты требуется библиотека libconfuse. Займемся ее сборкой. Китайцы советовали версию 2.5, скачиваем ее в архиве и распаковываем. Дальше, казалось бы, все просто – ./configure, make – и тут спотыкаемся. В исходниках не предусмотрено, что бывают Win32-системы без dllimport – а конкретно, MinGW. Лезем в файл confuse.h и заменяем там конструкцию

# ifdef BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
# else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
# endif /* Not BUILDING_DLL */

на кошерную

#ifndef __GNUC__ /* Not MINGW */
# ifdef BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
# else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
# endif /* Not BUILDING_DLL */
#else /* MINGW */
# define DLLIMPORT
#endif /* MINGW */

Кроме того, надо отредактировать examples/Makefile – примеры использования библиотеки кривые и не компилируются. Заменяем all: all-am на

all:
  echo "foo"

В начале второй строки должен стоять Tab. Теперь с чистой совестью выполняем make и make install.

Теперь можно попытаться собрать утилиту от братьев-китайцев. Скачиваем архив, распаковываем, чистим от мусора.

wget http://jz-hacking.googlecode.com/files/jz_tools_20090207.tar.gz
tar zxvf jz_tools_20090207.tar.gz
cd jz_tools/nand_flash
make clean

В файле pavo_nandflash.c после всех define-ов добавляем typedef unsigned int uint32_t;. Теперь make моментально соберет pavo_nandflash.exe. Перекидываем его в директорию с “частями” прошивки и пишем файл pavo_nandflash.conf, примерно такой:

#
# pavo board nand flash configuration file.
# Copyright (C) 2008 yajin(yajin@vm-kernel.org)
#

# comment the unwanted part
flash_image = pavo-nand.bin

uboot_image = u-boot-nand.bin
uboot_start = 0x00000000
uboot_end = 0x00400000
uboot_add_ecc = 0

kernel_image = uImage
kernel_start = 0x00400000
kernel_end = 0x00800000
kernel_add_ecc = 0

rootfs_image = rootfs.yaffs2
rootfs_start = 0x00800000
rootfs_end = 0x08000000
rootfs_oob = 1
rootfs_add_ecc = 0

Запускаем исполняемый файл, получаем гигабайтный образ флешки – pavo-nand.bin. Подкладываем его к эмулятору и пытаемся запустить командой

qemu-system-mipsel -M pavo -mtdblock pavo-nand.bin

К сожалению, мне удалось получить лишь черный экран. С помощью Ctrl+Alt+(цифры) можно переключаться между несколькими “консолями” – в том числе и “монитором”. Дамп памяти показывает, что u-boot загружается, а вот ядро Linux – уже нет.

Если кто-то будет более удачлив – то после загрузки ядра надо набрать в консоли runqpe, тогда запустится qtopia.

В общем, предлагаю желающим опробовать китайский рецепт на “полноценном” линуксе.

9 комментариев

  1. konst.cranky пишет:

    Я вообще не понимаю, зачем советуют использовать старые версии утилит.
    Я, например, указанную здесь версию QEMU без ошибок собрал с помощью GCC 4.5.1

    Соберу все – отпишусь в соседней теме.

  2. antsnark пишет:

    а не проще ли было поставить какой-нить средних размров дистриб, и под ним заняться сборкой? Поствить хоть в виртуалбокс под виндой :)