Недавно компания Терасич начал продавать очень интересную плату Комплект DE0-Nano-SoC .
Он интересен тем, что за весьма скромную цену предлагает очень мощный и функционально насыщенный комплект для разработки на базе FPGA-чипа Altera Cyclone V SoC со встроенным двухъядерным процессором ARM Cortex-A9. Кроме того, производитель комплектует плату ОС Linux, развернутой на карте памяти MicroSD. Но получив в свое распоряжение эту плату, я быстро столкнулся с несколькими проблемами из-за того, что Linux собирался из исходников.
Йокто Проект .
В основном все проблемы были связаны с отсутствием публичных репозиториев, из которых можно было бы добавить в систему недостающие компоненты.
Например, чтобы получить доступ с этого устройства по сети к общим ресурсам Windows-сервера, в ядре не хватало модуля поддержки файловой системы Cifs. Поэтому в первую очередь было решено обновить ядро, заменить Yocto на более привычный Debian Wheezy и установить всё необходимое для доступа к общим ресурсам Windows-сервера.
Процесс сборки был изучен мной и с соблюдением рекомендаций от Эта статья , почему его автор Дес333 большое спасибо! Полный редизайн не входил в мои планы, поэтому было решено оставить на карте загрузчики оригинальные - из образа Linux 3.13, который шел в комплекте с платой.
Поэтому раздел с типом А2 было решено вообще не трогать.
Задания
- Обновить ядро Linux
- Замените RootFS на Debian 7.
- Доработайте образ, чтобы его можно было обновлять из Интернета
- Подключите общий каталог на сервере Windows
Сборка ядра
Так как моя основная рабочая среда в жизни — Windows, все действия по сборке Linux производились из ОС Linux Mint 17.2 Cinnamon, установленной на виртуальной машине.1. Запускаем терминал и входим в root-режим — чтобы не вводить каждый раз команду sudo:
В данном случае /root будет нашим домашним каталогом — все будем делать в нем.sudo -i
2. Скомпилируем ядро с помощью кросс-компилятора, входящего в состав Altera SoC Embedded Design Suite (EDS).
Поэтому скачиваем и устанавливаем последнюю версию пакета Altera SoC EDS. На данный момент Altera SoC EDS имеет версию 15.0. Вы можете скачать этот пакет прямо с Сайт Альтера .
Altera SoC EDS будет установлен в каталог /root/altera/15.0.
3. Установите build-essential: apt-get install build-essential
4. Установите libncurses: apt-get install libncurses5-dev
5. Загрузите исходники linux-socfpga из репозиториев Altera и распакуйте их в свой домашний каталог:
- Пойдем Релизы linux-socfpga в репозиториях Altera
- Находим нужный релиз.
Я выбрал версию 4.1 - так как это была последняя стабильная версия на данный момент
- Скачать архив с исходниками
- Распакуйте исходники в свой домашний каталог.
Нет необходимости брать владелец и не теги и струны socfpga-* .Поэтому нужно идти за исходниками здесь .Например, socfpga-4.3 Здесь применяются патчи с необходимым для SoC функционалом.
Большое спасибо Дес333 за подсказку! 6. Запустите скрипт Alter, который запустит новый BASH и исправит в нем некоторые переменные среды (например, PATH).
Все действия компиляции будем проводить не выходя из этого BASH: cd /root/altera/15.0/embedded
.
/embedded_command_shell.sh
7. Создайте несколько переменных среды: export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export LOADADDR=0x8000
8. Создайте конфигурацию по умолчанию для socfpga: cd /root/linux-socfpga-4.1
make socfpga_defconfig
Это создаст файл конфигурации .
config, предназначенный для компиляции для ARM.
9. Добавляем недостающие компоненты в конфигурацию ядра (или удаляем ненужные): make menuconfig
Откроется псевдографическое окно с меню.
Нам нужно добавить драйвер файловой системы КИФС - иметь возможность доступа к общим сетевым ресурсам.
Есть два способа добавить драйвера в систему — добавить их непосредственно в ядро или добавить в виде внешних плагинов.
Итак, пойдем по тропинке Файловые системы -> Сетевые файловые системы , давай встанем Поддержка CIFS и нажмите пробел напротив строки Поддержка CIFS должно появиться письмо М - это означает, что будет использоваться подключаемый внешний модуль.
Позже вам нужно будет скомпилировать его отдельно и поместить в каталог внешних модулей.
Если еще раз нажать пробел, буква М изменится на символ звездочки, что означает, что драйвер будет встроен непосредственно в ядро.
Примечание : позже при проверке работоспособности системы выяснилось, что внешний модуль cifs зависал при попытке копирования файла с общего диска на Windows-сервере.
Драйвер cifs, встроенный в ядро, работал совершенно нормально.
Хотя при использовании внешних модулей с другими версиями ядра (например, 3.19) таких проблем не возникало.
Я так и не смог понять причину происходящего.
Также необходимо включить поддержку ХайМем - иначе система не сможет использовать верхние 256 мегабайт оперативной памяти.
Для этого мы идем по пути Возможности ядра -> Поддержка большого объема памяти а также нажмите пробел.
Выйти из меню - нажать ВЫХОД пока мы не уйдем.
На вопрос - нужно ли сохранять конфигурацию - отвечаем Да .
10. Скомпилируем ядро: make uImage
В моем случае виртуальной машине было отдано только одно ядро.
Процесс компиляции занял около 20 минут. Если компиляция будет производиться на машине с несколькими ядрами, то для скорости можно распараллелить процесс компиляции на нескольких ядрах.
Для этого нужно явно задать количество ядер с помощью опции -j .
Например, для компиляции с использованием трех ядер: make -j 3 uImage
11. Скомпилируем dtb-файл, соответствующий нашему устройству.
Если использовать старый файл dtb, то либо устройство будет зависать при загрузке, либо при работе будут жуткие глюки:
- Ищем все файлы, в названии которых есть cyclone5 и которые заканчиваются на dts:
find ~/linux-socfpga-4.1 -name "*cyclone5*dts"
- Выбираем наиболее подходящий из найденных файлов.
Я просто просматривал их содержимое и в одном из них увидел слово терасический .
Я подумал, что это самый подходящий файл для этого устройства - вот и воспользовался им.
Файл назывался socfpga_cyclone5_sockit.dts .
- Начинаем компилировать socfpga_cyclone5_sockit.dtb:
make socfpga_cyclone5_sockit.dtb
/root/linux-socfpga-4.1/arch/arm/boot/zImage
/root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga_cyclone5_sockit.dtb
12. Если на этапе настройки вы выбрали вариант использования внешних модулей, то вам необходимо их скомпилировать.
Компиляция модуля КИФС : make M=fs/cifs
и скомпилируйте модули шифрования — они понадобятся при монтировании общих ресурсов Windows: make M=crypto
13. Копируем на карту файлы ядра и dtb. Изначально карту обрезали так, чтобы ядро и файл DTB находились на отдельном разделе FAT32. Сюда мы пишем эти файлы.
Единственное замечание: файл DTB нужно переименовать так, чтобы он имел то же имя, что и тот, который уже находится в FAT32-разделе карты:
- Подключаем карту к виртуальной машине.
Мне пришлось использовать внешний кард-ридер, подключенный напрямую к порту USB2 компьютера.
Через встроенный в компьютер картридер сделать то же самое почему-то не удалось.
Также не удалось подключить к виртуальной машине внешний картридер, если он был подключен через порт USB3.
- Разделы карты будут автоматически смонтированы — размонтировать разделы через графический интерфейс невозможно, поскольку в этом случае картридер будет полностью отключен от виртуальной машины.
- Посмотрим на названия смонтированных разделов:
mount
Мы увидим что-то вроде этого:/dev/sdb1 on /media/user/F725-1429 type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2) /dev/sdb2 on /media/user/41cad05c-898e-49a3-9d00-02b92fa817ba type ext3 (rw,nosuid,nodev,uhelper=udisks2)
Раздел типа vfat (первая строка) — это то, что нас интересует на данный момент. - Посмотрим, что находится на разделе vfat:
ll /media/user/F725-1429
Мы видим что-то вроде этого:-rw-r--r-- 1 user user 1164128 Apr 20 20:23 de0_nano_soc.rbf -rw-r--r-- 1 user user 15274 Jul 26 17:08 socfpga.dtb -rw-r--r-- 1 user user 176 Apr 20 19:59 u-boot.scr -rw-r--r-- 1 user user 3371472 Jul 29 16:50 zImage
Итак, файл dtb называется socfpga.dtb. - Копируем наши файлы на карту:
cp /root/linux-socfpga-4.1/arch/arm/boot/zImage /media/user/F725-1429/ cp /root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga_cyclone5_sockit.dtb /media/user/F725-1429/socfpga.dtb
Сборка файловой системы
Этот подраздел во многом повторяет то, что написано в Эта статья , но тем не менее привожу его полностью, чтобы облегчить использование данного руководства в дальнейшем.
Соберем Debian 7 Wheezy:
1. Установите пакеты, которые понадобятся для сборки файловой системы: apt-get install debootstrap qemu-user-static binfmt-support
2. Создайте каталог и загрузите в него все необходимые файлы: cd /root
mkdir debian7
debootstrap --arch armel --foreign wheezy debian7 http://ftp.debian.org/debian
3. Для запуска приложений, созданных для архитектуры ARM, мы будем использовать qemu статический .
Для этого скопируйте файл в нашу директорию debian7: cp /usr/bin/qemu-arm-static debian7/usr/bin/
4. Перейдем к нашей новой файловой системе: chroot debian7 /bin/bash
5. Если подсказка интерпретатора изменится на «У меня нет имени!@имя_хоста:/#», значит, все прошло успешно.
Завершаем процесс сборки: /debootstrap/debootstrap --second-stage
6. Б /etc/inittab оставьте следующие строки: /etc/inittab
id:5:initdefault:
si::sysinit:/etc/init.d/rcS
~~:S:wait:/sbin/sulogin
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
z6:6:respawn:/sbin/sulogin
S:2345:respawn:/sbin/getty 115200 console
7. Установите пароль для учетной записи root: passwd
8. Упаковываем новую файловую систему в архив: tar -cpzf debian7.tar.gz --exclude=debian7.tar.gz /
9. Выходим из chroot: exit
10. Размонтируем, а затем форматируем раздел ext3 на карте (названия разделов см.
в пункте 13 сборки ядра): umount /dev/sdb2
mkfs.ext3 /dev/sdb2
11. Смонтируйте раздел ext3: mount /dev/sdb2 /mnt/
12. Распаковываем архив с файловой системой на карту в раздел ext3: tar -xzf /root/debian7/debian7.tar.gz -C /mnt/
13. Если при сборке ядра был выбран вариант использования внешних модулей, то нужно записать на карту внешние модули, скомпилированные на 12 этапе процесса сборки ядра: cd /mnt/lib
mkdir modules
mkdir modules/4.1.0
mkdir modules/4.1.0/extra
mkdir modules/4.1.0/kernel
mkdir modules/4.1.0/kernel/crypto
cp /root/linux-socfpga-4.1/fs/cifs/cifs.ko .
/modules/4.1.0/extra/ cp /root/linux-socfpga-4.1/crypto/*.
ko .
/modules/4.1.0/kernel/crypto/
14. Размонтируем разделы: umount /dev/sdb1
umount /dev/sdb2
Вот и все — карта готова, можно устанавливать ее в устройство и загружаться.
Финальная отделка
После загрузки устройства дорабатываем образ на месте: 1. Войдите в Debian на устройстве, подключившись к нему через встроенный последовательный порт. 2. Если при сборке ядра был выбран вариант использования внешних модулей, то необходимо сгенерировать файлы с информацией о внешних модулях ядра: depmod -a
3. Добавьте в список репозиториев репозиторий Debian 7 (я добавил немецкий сервер):
echo "deb http://ftp.de.debian.org/debian wheezy main" > /etc/apt/sources.list
4. Подключите устройство к сети Ethernet. Получаем адрес по DHCP:
dhclient -4 eth0
5. Поднимаем NTP, так как при неправильном времени смонтировать общие ресурсы не получится:
apt-get update
apt-get install ntp
6. Установите наш часовой пояс:
dpkg-reconfigure tzdata
7. Чтобы убедиться, что все прошло успешно, смонтируйте общий ресурс сервера.
Например, в моем случае я сделал это так: mount //192.168.48.4/distrib /mnt -o username=jok40
8. Установите SSH-сервер.
Использовать последовательный порт неудобно, так как при работе через него вводимые команды переносятся в начало строки после достижения 80-го столбца: apt-get install openssh
9. Назначаем статический адрес интерфейсу eth0 — чтобы в дальнейшем было проще подключаться к устройству по SSH. Для этого отредактируйте файл интерфейсов: nano /etc/network/interfaces
В моем случае это стало выглядеть так: # interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.48.27
netmask 255.255.255.0
gateway 192.168.48.1
network 192.168.48.0
broadcast 192.168.48.255
auto eth0
10. Отредактируйте файл resolv.conf, чтобы DNS-клиент работал нормально: nano /etc/resolv.conf
Добавьте к нему строки: nameserver 192.168.48.1
nameserver 8.8.8.8
11. Перезагрузите устройство.
12. Проверить, что все сделано правильно подключаемся к устройству по SSH через Ethernet:
Всем спасибо за внимание!
Теги: #linux #настройка Linux #soc #FPGA #pls #FPGA #pls #altera #altera #embedded
-
Сравните Dell Alienware M18X И M17X
19 Oct, 24 -
Супер Марио На Разных Инструментах
19 Oct, 24