Про MinnowBoard Max

MinnowBoard Max - платка с процессором Intel Atom. При включении питания и при условии, что прошит рабочий uefi, на экране монитора, подключенного по hdmi, увидим командную строку uefi.

Инструкция по сборке UEFI располагается в Release Notes по адресу http://firmware.intel.com/projects/minnowboard-max.

Так, например, для сборки версии 0.78 открываем соответствующий Release Notes и выполняем последовательность действий.

1. Получаем ревизию 16867 для UDK2014.SP1

svn checkout -r 16867  https://svn.code.sf.net/p/edk2/code/branches/UDK2014.SP1

2. Получаем ревизию 17039 в другую директорию

svn checkout -r 17039  https://svn.code.sf.net/p/edk2/code/branches/UDK2014.SP1

и из этой директории берем только две папочки Vlv2DeviceRefCodePkg и Vlv2TbltDevicePkg и подменяем ими в ревизии 16867

3. Получаем FatPkg ревизии 92 и затем помещаем в корень дерева ревизии 16867

svn checkout -r 92  https://svn.code.sf.net/p/edk2-fatdriver2/code/trunk/FatPkg

4. Получаем архив MinnowBoard_MAX-0.78-Binary.Objects.zip. Распаковываем и копируем три директории (IA32FamilyCpuPkg, Vlv2BinaryPkg, Vlv2MiscBinariesPkg) в корень дерева ревизии 16867.

5. Рабочей директорией будет папочка с ревизией 16867, поэтому остальные полученные файлы можно смело удалить. Всё дальнейшее описание действий будет относится к папочке с ревизией 16867.

Выполняем следующую последовательность действий:

$ make -C ./BaseTools
$ export EDK_TOOLS_PATH=/home/user1/MyWork/Minnow/UDK2014.SP1/BaseTools
$ . edksetup.sh BaseTools

6. Выполняем то что написано в этом файле CryptoPkg\Library\OpensslLib\Patch-HOWTO.txt, а именно- скачиваем архив openssl-0.9.8ze.tar.gz и распаковываем его в CryptoPkg\Library\OpensslLib, затем применяем патч

$ patch -p0 -i ../EDKII_openssl-0.9.8ze.patch

и выполняем скрипт:

$ ./Install.sh

7. Переходим в директорию Vlv2TbltDevicePkg и запускаем сборку:

$ cd ./Vlv2TbltDevicePkg
$ . Build_IFWI.sh MNW2 Release

Первая сборка у меня почему-то заканчивается ошибкой. Повторяю действия:

$ cd ./Vlv2TbltDevicePkg
$ . Build_IFWI.sh MNW2 Release

Опять ошибка. Снова повторяю действия:

$ cd ./Vlv2TbltDevicePkg
$ . Build_IFWI.sh MNW2 Release

И собралось. Что за муть - не понятно (возможно из-за многопотоковости, разбираться в лом).

При этом важно, чтобы совпадали версии компилятора и сборка происходила на x64, если выбрана данная конфигурация. К примеру, если gcc -v показывает, что версия 4.8, то значит и при сборке переменная должна иметь соответствующее значение Toolchain = GCC48. (Переменная может быть установлена в файле bld_vlv.sh)

Сборка buildroot для minnowboard max.
1. качаем дистрибутив buildroot с официального сайта любым из доступных способов.
2. выполняем конфигурацию дистрибутива под платку minnowboard max:

$ make minnowboard_max_defconfig

3. добавляем в ядро поддержку файловой системы efi для возможности получения доступа к переменным efi через /sys/firmware/efi/vars:

$ make linux-menuconfig

отметить звездочкой опции:
CONFIG_EFI_VARS
CONFIG_EFIVAR_FS

Добавляем в buildroot утилиту efibootmgr.
1. создаем папочку buildroot/package/efibootmgr
2. в этой папочке создаём файл Config.in следующего содержания:

config BR2_PACKAGE_EFIBOOTMGR 
        bool "efibootmgr" 
        select BR2_PACKAGE_PCIUTILS 
        help 
          efibootmgr 

3. в этой папочке создаём файл efibootmgr.mk

EFIBOOTMGR_VERSION = 0.6.0 
EFIBOOTMGR_SOURCE = efibootmgr-$(EFIBOOTMGR_VERSION).tar.gz 
EFIBOOTMGR_SITE = http://linux.dell.com/efibootmgr/efibootmgr-0.6.0/ 
EFIBOOTMGR_INSTALL_STAGING = YES 


$(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION): $(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION)/.unpacked 
        cd $(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION); make 

define EFIBOOTMGR_INSTALL_STAGING_CMDS 
        cd $(BUILD_DIR)/efibootmgr-$(EFIBOOTMGR_VERSION); make 
        $(INSTALL) -D -m 0755 $(@D)/src/efibootmgr/efibootmgr $(STAGING_DIR)/usr/sbin/efibootmgr 
endef 

define EFIBOOTMGR_INSTALL_TARGET_CMDS 
        $(INSTALL) -D -m 0755 $(@D)/src/efibootmgr/efibootmgr $(TARGET_DIR)/usr/sbin/efibootmgr 
endef 

$(eval $(generic-package)) 

4. В файл buildroot/package/Config.in добавляем строчку:

source "package/efibootmgr/Config.in"

Утилита efibootmgr позволяет изменять переменные uefi при загруженном ядре из пространства пользователя.

Если сборка выполняется стандартным образом через запуск make из корня efibootmgr(т.е. вне дистрибутива buildroot или yocto), то возможно появление вот такой ошибки:

src/lib/efi.c:38:21: фатальная ошибка: pci/pci.h: Нет такого файла или каталога

Самый простой способ её преодоления - это использовать компилятора из yocto или из buildroot (в buildroot компилятор должен быть собран с поддержкой соответствующих опций). Для использования стороннего компилятора следует изменить Makefile как-то так:

 RELEASE_DATE := "03-Jan-2008" 
  RELEASE_MAJOR := 0 
  RELEASE_MINOR := 5 
  RELEASE_SUBLEVEL := 4 
  RELEASE_EXTRALEVEL := 
  RELEASE_NAME := efibootmgr 
  RELEASE_STRING := $(RELEASE_NAME)-$(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_SUBLEVEL)$(RELEASE_EXTRALEVEL) 

  CFLAGS = $(EXTRA_CFLAGS) -DEFIBOOTMGR_VERSION=\"$(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_SUBLEVEL)$(RELEASE_EXTRAL 
EVEL)\" \ 
            -Wall -g -D_FILE_OFFSET_BITS=64 

  LDFLAGS += -lz 

  CC = /home/user1/MyWork/MB/poky/build/tmp/sysroots/x86_64-linux/usr/bin/x86_64-poky-linux/x86_64-poky-linux-gcc 

  MODULES := src 

Сборка yocto для Minnowboard Max.

1. Качаем дистрибутив yocto:

$ git clone -b dizzy git://git.yoctoproject.org/poky

2. Качаем рецепты интел

$ cd poky
$ git clone -b dizzy git://git.yoctoproject.org/meta-intel

3. Настраиваем переменные окружения и создаём директорию, в которой будет осуществляться сборка проекта с помощью незатейливой команды:

$ source oe-init-build-env

4. В файл conf/bblayers.conf добавляем путь до директории meta-intel

$ echo "BBLAYERS += \"/home/user1/MyWork/MB/poky/meta-intel\"" >> conf/bblayers.conf 

5. Прописываем цель сборки:

echo "MACHINE = \"intel-corei7-64\"" >> conf/local.conf

6. Запускаем сборку.
Можно через вызов утилиты hob:

$ hob

или с помощью bitbake:

$ bitbake core-image-minimal

Запуск uefi в Qemu

Для отладки uefi имеет смысл использовать qemu. Как запустить uefi в qemu:
1. переходим в папочку OvmfPkg и запускаем build.sh
2. после удачной сборки должна появиться папочка с файлами:
Build/OvmfX64/DEBUG_GCC48/FV
в этой папочке нас интересует файл OVMF.fd это и есть файл биоса для qemu.
3. для запуска нужно выполнить:

$ qemu-system-x86_64 -bios ./OVMF.fd 
Could not open option rom 'vapic.bin': No such file or directory 
qemu-system-x86_64: pci_add_option_rom: failed to find romfile "vgabios-cirrus.bin" 
qemu-system-x86_64: pci_add_option_rom: failed to find romfile "pxe-rtl8139.rom"

После чего появится окно, в котором будет происходить запуск uefi. После старта появится возможность работы в shell uefi.

4. Для запуска ядра линукс через qemu можно использовать ФС и образ ядра полученных после сборки yocto.

Команда для запуска ядра через uefi в qemu выглядит так:

qemu-system-x86_64 -bios ./OVMF.fd -cdrom ./fs.iso

где fs.iso - это iso образ, полученный в результате сборки цели core-image-minimal в yocto.

Если необходимо, чтобы при запуске qemu была возможность сохранения лога в файл, то запуск qemu будет выглядеть так:

 qemu-system-x86_64 -bios ./OVMF.fd -cdrom ./fs.iso -serial stdio

При этом используется следующая команда для получения данного iso образа:

#!/bin/sh

./mkisofs -A boot -V boot \
 -o /home/user1/MyWork/MB/tmp/qemu/fs.iso \
 -b isolinux/isolinux.bin \
 -c isolinux/boot.cat \
 -r -no-emul-boot -boot-load-size 4 -boot-info-table \
 -eltorito-alt-boot -eltorito-platform efi -b efi.img -no-emul-boot \
 -no-emul-boot /home/user1/MyWork/MB/tmp/qemu/iso/iso_dir

Хотя утилита mkisofs является стандартной и присутствует в юбунте, но в данном случае mkisofs тоже взята из дистрибутива yocto ( её можно найти через поиск в poky/build/tmp/work). Запуск стандартной утилиты почему-то заканчивается вот такой ошибкой:

Invalid node — 'efi'.