Сборка ядра для Орикса

Материал из SRNS
Перейти к: навигация, поиск

Приведенный мануал справедлив для Kubuntu 14.04 64bit.

Xilinx-design-flow-linux.jpg

Втянуться в тему можно на странице Xilinx Wiki Getting Starting.

Наша цель - собрать новый uImage с применением патча PREEMPT_RT.

Если смотреть на схему, то складывается ощущение, что ядро входит в BOOT.BIN. Но на практике флешка содержит boot.bin, device tree, uImage и образ rootfs. Например, на ZC702:

root@zynq:/mnt# ls -la
drwxr-xr-x    3 root     root          4096 Jan  1 00:00 .
drwxrwxr-x   19 1000     1000             0 Aug 15  2014 ..
drwxr-xr-x    5 root     root          4096 Aug 15  2014 .Trash-1000
-rwxr-xr-x    1 root     root        442480 Jun 19  2014 boot.bin
-rwxr-xr-x    1 root     root          9219 Jun  3  2014 devicetree.dtb
-rwxr-xr-x    1 root     root       3488208 May 30  2001 uImage
-rwxr-xr-x    1 root     root       6054766 Aug 15  2014 uramdisk.image.gz

Поэтому простая подмена uImage тоже работает.

Содержание

Устанавливаем кросскомпилятор

Теоретически этот шаг можно пропустить, воспользовавшись билд-сервером. Но на практике я использовал кросс-компилятор от Xilinx'а.

Скачиваем инсталлер

Страница на Xilinx Wiki: Install Xilinx Tools ведет в раздел Downloads.

На текущий момент самая свежая версия имеет номер 2014.4, поэтому скачиваем Vivado 2014.4 WebInstall for Linux 64.

Потребуется зарегистрироваться на сайте (требует пароль с циферкой ;)).

В результате получаем файл типа Xilinx_Vivado_SDK_2014.4_1119_1_Lin64.bin

Устанавливаем SDK

Устанавливаем SDK и, при желании, Vivado WebKit. Оба инструмента бесплатные:

sudo ./Xilinx_Vivado_SDK_2014.4_1119_1_Lin64.bin

В начале установки поступит предложение Select Edition to Install, выбираем:

  • Vivado Web Pack, если хотим установить Vivado+SDK
  • Software Development Kit, если хотим ограничиться SDK

Драйвер для кабеля для компиляции ядра не потребуется, но иметь в системе его полезно.

Директорию установки оставляем по-умолчанию в /opt

После скачивания файлов программа установки предложит получить лицензию на сайте Xilinx, что и следует сделать (Get Free License, далее Xilinx MicroBlaze/All Programmable SoC Software Development Kit - Standalone для SDK или Vivado WebPACK License для Vivado).

Прописываем пути в PATH

По-умолчанию интерпретатор не знает пути до компиляторов. В переменную PATH их умеет добавлять специальный скрипт. Чтобы не вызывать его каждый раз руками, следует добавить строки в ~/.bashrc:

export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
source /opt/Xilinx/SDK/2014.4/settings64.sh # use settings32.sh on 32-bit operating systems

Переменная CROSS_COMPILE используется в некоторых Makefile'ах ниже. Сейчас с её помощью выбран кросс-компилятор для целевой Linux.

Появились новые возможности:

  • можно открыть среду разработки командой xsdk
  • можно компилировать прошивку для приемника не на билд-сервере, а на своей машине.

Заставляем работать кросскомпилятор

Самый простой способ убедиться, что кросскомпилятор начал работать - скомпилировать с его помощью прошивку для приемника.

Для этого в personal.conf изменяем SERVER_BUILD_FIRMWARE на 0 и добавляем TOOLS, GCC, GPP:

SERVER_BUILD_FIRMWARE=0

TOOLS=LC_ALL=POSIX arm-xilinx-linux-gnueabi
GCC=$(TOOLS)-gcc $(CFLAGS)
GPP=$(TOOLS)-g++ $(CFLAGS)

Дале выполняем make в /src/firmware, на что получаем невнятное сообщение об отсутствии в системе компилятора arm-xilinx-linux-gnueabi-g++. Дело в том, что для его работы нужен ряд 32-битных библиотек:

sudo apt-get install lib32z1

После чего кросскомплилятор начинает успешно работать.

Собираем Xilinx U-boot

Наv потребуется mkimage, которая входит в пакет сборки u-boot'а. Эта утилита позволяет завернуть файл ядра Image в uIamge, который уже может быть запущен u-boot'ом.

Забираем у Xilinx'a:

git clone git://github.com/Xilinx/u-boot-xlnx.git

Собираем (нам потребуется пока только mkimage, поэтому конкретный конфиг не важен):

cd u-boot-xlnx
make zynq_zc70x_config
make

В каталоге ./tools появился mkimage, которым мы далее будем пользоваться.

Сборка ядра, тестированного OSADL

Существует замечательная контора OSADL, занимающаяся тестированием PREEMPT_RT патча на различных сборках и архитектурах. Они протестировали ядро 3.12.24 с PREEMPT_RT патчем на ZedBoard. Более того, они предоставляют удобные скрипты, которые сами скачивают все нужные ядра (доступен по ссылке внизу страницы, копия).


Скачиваем ядро, патчи, патчим ядро

Скрипт:

  • скачивает с kernel.org ванильное ядро 3.12.24
  • скачивает с сайта OSADL забирает патчи (см. файл series и перечень ниже) для сборки rbs8:
  • применяет патчи к ядру (quilt push -a)
  • скачивает с сайта OSADL .config файл для сборки rbs8

В патчи входит:

patch-3.12.24-rt38.patch

Собственно PREEMPT_RT патч для данного ядра. Переписывает spinlock'и и т.п. так, чтобы более приоритетная задача их могла быстро выгрузить.

zedboard-monster.patch

Огромный патч для поддержки Zynq'а. Содержит:

  • Патчи к ряду важнейших функция ядра
  • Набор device tree файлов (zynq-zc702.dtb, zynq-zc702-base-trd.dtb, zynq-zc702-drm-v4l2.dtb, zynq-afx-nand.dtb, zynq-afx-nor.dtb, zynq-cc108.dtb, zynq-zc770-xm010.dtb, zynq-zc770-xm011.dtb, zynq-zc770-xm012.dtb, zynq-zc770-xm013.dtb, zynq-zc706.dtb, zynq-zed.dtb)
  • Набор конфигов (xilinx_zynq_apf_defconfig, xilinx_zynq_trd_defconfig, xilinx_zynq_drm_defconfig, xilinx_zynq_defconfig)
  • Огромный набор драйверов (AXI, DMA, GPIO, xdevcfg, SPI, USB и т.д.)
  • Документация к драйверам

sched-add-per-cpu-load-measurement.patch

add-kernel-parameter-to-disable-defect-cpus.patch

drivers-misc-kconfig-replace-spaces-with-tabs.patch

save-current-patchset-in-kernel.patch

mm-slabinfo-fix-latency.patch

Фиксит длительный mutex в чтении /proc/slabinfo

drivers-gpu-drm-try-loading-builtin-edids-first.patch

drivers-gpu-drm-make-edid_load-return-a-void.patch

add-cpufreq-operating-points-to-dt.patch

Сборка ядра

Рассказываем, где искать mkimage (потребуется для обертки ядра Image -> uImage)

cd u-boot-xlnx
cd tools
export PATH=`pwd`:$PATH

Возвращаемся в linux-3.12.24-rt38.

Собираем ядро, выполнив в директории linux-3.12.24-rt38 команду make:

make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage

Минут через 5 получаем в каталоге ./arch/arm/boot собранное ядро.

Ядро от Xilinx

Подробнее описано на Wiki Xilinx'а: Build kernel.

Получаем исходники ядра

git clone git://github.com/Xilinx/linux-xlnx.git

В ядро уже включен набор драйверов от Xilinx'а.

Патчим ядро

На данный момент (02.03.2015) в репозитории лежит ядро 3.18, для которого есть доступный PREEMPT RT патч 3.18.7-rt2.

Качаем патч PREEMPT RT (может потребоваться актуализировать номер версии):

cp -R linux-xlnx linux-rt      
cd linux-rt
wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.18/patch-3.18.7-rt2.patch.gz
gunzip patch-3.18.7-rt2.patch

Применяем патч к ядру:

cat patch-3.18.7-rt2.patch | patch -p1

Конфигурируем ядро

Просим собрать конфиг по-умолчанию:

make ARCH=arm xilinx_zynq_defconfig

Вносим желаемые изменения в .config файл, компилируем...и это ядро не запускается на Ориксе (во всяком случае, сети нет)


Пара слов о Device Tree

На PLDA'шных модулях можно найти скомпилированный Device Tree Blob файл. Он легко переводится в читаемый DTS вид:

linux-xlnx/arch/arm/boot/dts$ ./dtc -I dtb -O dts -o somz.dts somz.dtb

Получаем:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, asm, asp, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, oobas, oracle11, oracle8, oxygene, oz, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, python, q, qbasic, rails, rebol, reg, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, uscript, vala, vb, vbnet, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты