De0 nano soc linux

Обновление Linux в устройстве на базе чипа Altera SoC FPGA и получение доступа к расшаренным ресурсам Windows-сервера

Недавно компания Terasic начала продажи весьма интересной платы DE0-Nano-SoC Kit. Интересна она тем, что за весьма скромную цену предлагается очень мощный и функционально-насыщенный комплект разработчика на основе чипа Altera Cyclone V SoC FPGA со встроенным двухъядерным процессором ARM Cortex-A9. Кроме того, производитель в комплекте с платой даёт ОС Linux, развёрнутую на карту памяти MicroSD.

Но получив эту плату в своё распоряжение, я довольно быстро наткнулся на несколько проблем, обусловленых тем, что Linux был скомпилирован из исходников Yocto Project. В основном все проблемы были связаны с отсутствием общедоступных репозиториев, из которых можно было бы добавить в систему недостающие компоненты. Например, для того, чтобы получить доступ с этого устройства через сеть к расшаренным ресурсам Windows-сервера, в ядре не хватало модуля поддержки файловой системы Cifs.

Поэтому прежде всего было решено обновить ядро, заменить Yocto на более привычный Debian Wheezy и доустановить всё, что необходимо для доступа к расшаренным ресурсам Windows-сервера.

Процесс сборки изучался мной и выполнялся следуя рекомендациям из этой статьи, за что её автору Des333 огромное спасибо!

Полная переделка в мои планы не входила, поэтому загрузчики на карточке было решено оставить родные — от образа Linux 3.13, идущего в комплекте с платой. Так что раздел с типом A2 было решено не трогать совсем.

Задачи

Сборка ядра

Так как основной моей рабочей средой по жизни является Windows, то все действия по сборке Linux выполнялись из-под ОС Linux Mint 17.2 Cinnamon, установленной на виртуальную машину.

1. Запускаем терминалку и входим в root-режим — чтобы не набирать каждый раз команду sudo:

При этом /root будет нашей домашней директорией — всё будем делать в ней.

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:

4. Установливаем libncurses:

5. Скачиваем исходники linux-socfpga из репозиториев Альтеры и распаковываем их в домашнюю директорию:

  • Заходим в релизы linux-socfpga в репозиториях Альтеры
  • Находим нужный релиз. Я выбрал версию 4.1 — так как это была самая свежая стабильная версия на данный момент времени
  • Скачиваем архив с исходниками
  • Распаковываем исходники в домашнюю директорию

В результате появляется директория /root/linux-socfpga-4.1 с исходниками ядра Linux версии 4.1.

Нужно брать не master и не tags а бренчи socfpga-*.
Например, socfpga-4.3
Именно туда накладывают патчи с нужной для SoC функциональностью.

Поэтому за исходниками нужно заходить сюда. Большое спасибо Des333 за подсказку!

6. Запускаем альтеровский скрипт, который запустит новый BASH и подправит в нём некоторые переменные окружения (например, PATH). Все действия по компиляции будем проводить не выходя из этого BASH:

7. Создаём несколько переменных окружения:

8. Создаём дефолтную конфигурацию для socfpga:

При этом будет создан конфигурационный файл .config, заточенный для компиляции под ARM.

9. Добавляем недостающие компоненты в конфигурацию ядра (или удаляем лишние):

Нам нужно добавить драйвер файловой системы CIFS — чтобы иметь возможность заходить на сетевые расшаренные ресурсы. Существует два способа добавления драйверов в систему — добавить прямо в ядро или добавить в виде внешних подключаемых модулей.

Итак, идём по пути File Systems -> Network File Systems, становимся на CIFS Support и нажимаем клавишу пробел — напротив строки CIFS Suport должна появиться буква M — значит будет использоваться подключаемый внешний модуль. Нужно будет позднее скомпилировать его отдельно и положить в директорию внешних модулей. Если же нажать клавишу пробел ещё раз, то буква M изменится на символ звёздочки — значит драйвер будет встроен прямо в ядро.

Примечание: в дальнейшем, при проверке работоспособности системы, выяснилось, что внешний модуль cifs крэшится при попытке копирования файла с расшаренного диска сервера Windows. Встроенный же в ядро драйвер cifs работал совершенно нормально. Хотя при использовании внешних модулей с другими версиями ядра (например, 3.19) подобных проблем не возникало. Причину происходящего мне так и не удалось выяснить.

Также нужно включить поддержку HighMem — иначе система не сможет использовать верхние 256 мегабайт ОЗУ. Для этого идём по пути Kernel Features -> High Memory Support и также нажимаем клавишу пробел.

Читайте также:  Lock screen для windows phone

Выходим из меню — нажимаем EXIT пока не выйдем. На вопрос — надо ли сохранять конфигурацию — отвечаем Yes.

10. Компилируем ядро:

В моём случае виртуальной машине было отдано только одно ядро. Процесс компиляции занял около 20 минут. Если же компилирование будет выполняться в машине с несколькими ядрами, то для скорости можно распараллелить процесс компиляции на несколько ядер. Для этого надо явно задать количество ядер через опцию -j. Например, для компиляции силами трёх ядер:

11. Компилируем dtb-файл, соответствующий нашему устройству. Если воспользоваться старым dtb-файлом, то или устройство повиснет при загрузке или будут страшные глюки при работе:

    Ищем все файлы, имеющие в названии cyclone5 и заканчивающиеся на dts:

  • Выбираем наиболее подходящий из найденых файлов. Я просто просматривал их содержимое и в одном из них увидел слово terasic. Мне подумалось, что это самый подходящий файл для данного устройства — вот его и использовал. Файл назывался socfpga_cyclone5_sockit.dts.
  • Запускаем компиляцию socfpga_cyclone5_sockit.dtb:

    В результате компиляции создалось два файла:

    12. Если на этапе конфигурации был выбран вариант использования внешних модулей, то необходимо скомпилировать их.
    Компилируем модуль CIFS:

    и компилируем модули криптографии — они понадобятся при монтировании расшаренных ресурсов Windows:

    13. Копируем файлы ядра и dtb на карточку. Исходно карточка была нарезана так, что ядро и DTB-файл лежали на отдельном партишене FAT32. Вот на него эти файлы и записываем. Единственное замечание: DTB-файл нужно переименовать — чтобы он назывался также, как тот, который уже лежит на разделе FAT32 карточки:

    • Подключаем карточку к виртуальной машине. Мне пришлось воспользоваться внешним кардридером, подключенным прямо к порту USB2 компьютера. Сделать то-же самое через встроенный в компьютер кардридер почему-то не удалось. Также не удалось подсоединить внешний кардридер к виртуальной машине, если подключать его через порт USB3.
    • Произойдёт автомонтирование разделов карточки — нельзя размонтировать разделы через GUI, потому что в этом случае происходит полное отключение кардридера от виртуальной машины.
    • Смотрим названия примонтированных разделов:

    Увидим нечто в этом роде:

    Раздел типа vfat (первая строка) — то, что нас интересует в данный момент.

    Смотрим, что лежит на разделе vfat:

    Видим нечто в этом роде:

    Значит dtb-файл называется socfpga.dtb.

    Копируем наши файлы на карточку:

    Сборка файловой системы

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

    Собирать будем Debian 7 Wheezy:

    1. Устанавливаем пакеты, которые понадобятся для сборки файловой системы:

    2. Создаем директорию и загружаем в неё все необходимые файлы:

    3. Чтобы запускать приложения, собранные под ARM-архитектуру, будем использовать qemu static. Для этого скопируем файл в нашу директорию debian7:

    4. Переходим в нашу новую файловую систему:

    5. Если приглашение интерпретатора изменилось на «I have no name!@hostname:/#», значит всё прошло успешно.
    Заканчиваем процесс сборки:

    6. В /etc/inittab оставляем следующие строки:

    7. Устанавливаем пароль для root-аккаунта:

    8. Запаковываем новую файловую систему в архив:

    9. Выходим из chroot:

    10. Размонтируем и затем форматируем раздел ext3 на карточке (названия разделов смотрим в пункте 13 из сборки ядра):

    11. Монтируем раздел ext3:

    12. Распаковываем архив с файловой системой на карточку в раздел ext3:

    13. Если при сборке ядра был выбран вариант использования внешних модулей, то необходимо записать на карточку внешние модули, скомпилированные на этапе 12 процесса сборки ядра:

    14. Размонтируем разделы:

    На этом всё — карточка готова, можно устанавливать её в устройство и загружаться.

    Окончательная доводка

    После загрузки устройства дотачиваем образ на месте:

    1. Логинимся в Debian на устройстве, подключившись к нему через встроенный serial-порт.

    2. Если при сборке ядра был выбран вариант использования внешних модулей, то необходимо сгенерить файлы с информацией о внешних модулях ядра:

    3. Добавляем в список репозиториев репозиторий Debian 7 (я добавил немецкий сервер):

    4. Подключаем устройство к Ethernet-сети. Получаем адрес по DHCP:

    5. Поднимаем NTP, так как с неправильным временем не удастся примонтировать расшаренные ресурсы:

    6. Устанавливаем наш часовой пояс:

    7. Для проверки, что всё собралось нормально, монтируем серверную шару. Например, в моём случае я делал это так:

    8. Устанавливаем SSH-сервер. Пользоваться serial-портом неудобно, так как при работе через него происходит заворот набираемых команд на начало строки после достижения колонки 80:

    9. Назначаем статический адрес интерфейсу eth0 — чтобы в дальнейшем проще было подключаться к устройству по SSH. Для этого редактируем файл interfaces:

    В моём случае он стал выглядеть вот так:

    10. Редактируем файл resolv.conf — чтобы нормально работал DNS-клиент:

    Добавляем в него строки:

    11. Перезагружаем устройство.

    12. Для проверки, что всё сделано правильно

    Источник

    DE0-Nano-SoC ещё один миникомпьютер для творчества

    FPGA+CPU или в данном случае Cyclone V SoC

    Один из вариантов решения проблемы может быть DevKit DE0-Nano-Soc. Данное решение построено на базе чипа Altera Cyclone V SE, а именно 5CSEMA4U23C6N. Который в свою очередь является комбинацией аппаратного ядра ARM Cortex A9 в данном случае двуядерным, и FPGA Cyclone V. Зачем может понадобиться такой тандем? А нужен он достаточно часто: FPGA хорошо подходит для быстрой обработки сигналов, обычные IO пины спокойно могут работать на сотнях мегагерц, а в моделях с аппаратными трансиверами и до шести гигагерц. А также для параллельной, конвейерной обработки поступающих сигналов. Однако описывать всё на языках вроде Verilog или VHDL достаточно сложно, медленно и неудобно. Поэтому достаточно часто была практика ставить в дизайн на FPGA реализацию процессора: специализированных NIOS II для Altera, MicroBlaze для Xilinx, варианты AVR ядер написанных энтузиазитстами и тому подобное. Из плюсов такого решения это простота, добавил в дизайн процессор и периферию и пиши себе программу на C/C++ для них, к минусам можно отнести то, что они во первых занимают ресурсы FPGA (логические ячейки, блоки памяти, PLL), во вторых достаточно медленны. Ну и в третьих несмотря на разнообразную периферию, она обычно достаточно проста, то есть поддержки DMA для UART в базовом наборе вы вряд ли найдёте, можно конечно написать своё, но это долго и достаточно сложно. С полными характеристиками чипа можно ознакомится здесь. Но рассмотрим детальней наш devkit.

    DE0-Nano-SoC

    Основной чип: Altera Cyclone V SE 5CSEMA4U23C6N
    Часть аппаратного ядра(HPS):

    • 1GB DDR3 SDRAM (32-bit data bus)
    • 1 Gigabit Ethernet
    • USB OTG Port, USB Micro-AB(работает как в режиме хоста так и девайса)
    • Micro SD
    • UART to USB, USB Mini-B connector
    • Accelerometer (I2C interface + interrupt)
    • Кнопки: cold reset, warm reset, user button
    • Светодиод
    • LTC разём расширения

    Часть FPGA:

    • EPCS128 для хранения конфигурации FPGA
    • Две кнопки
    • Четыре переключателя
    • Восемь светодиодов
    • Два 40пиновых разъёма(36 GPIO+2GND+5V Pin+3V Pin) стандарный для плат от Terasic.
    • Разъём расширения совместимый с Arduino Uno R3
    • Аналого цифровой преобразователь 8ми канальный

    Выводы

    Плата достаточно мощная, имеет гибкую конфигурацию, может быть использована в домашних разработках, если нужна высокая скорость или нестандартные интерфейсы, которые можно реализовать на FPGA стороне. Отлично подойдёт для повышения скила как в разработке для FPGA, так и в программировании ARM. Однако, для начального обучения FPGA я бы её не посоветовал из-за малого количества установленной периферии. Она всё же больше плата для использования, в каком либо устройстве, как готового блока управления. Ну и немного подводя итоги:

    Плюсы:

    • ARM Cortex A9
    • FPGA часть на базе Cyclon V(на данный момент самый современный чип семейства Cyclone)
    • Гибкая конфигурация: FPGA часть может использовать большую часть пинов HPS части, а в свою очередь HPS часть может направлять сигналы с периферии(UART/SPi/I2C/CAN) «внутрь» FPGA а не только на заданные ноги.
    • 72 GPIO выведенных с FPGA части.
    • 8 каналов ADC
    • 1 Gb Ethernert
    • USB OTG порт

    Минусы:

    • Цена: 99$ что достаточно дорого на фоне Raspberry Pi и её аналогов
    • Сложность: придётся работать как с FPGA так и с ARM частью
    • документация: документация на сам devkit очень подробна, а вот с документацией на сам чип местами всё достаточно плохо, если FPGA часть описана хорошо, то вот с HPS не так всё радужно, некоторые моменты описаны совсем не интуитивно и можно сказать поверхностно, хотя основные моменты всё же описаны хорошо.
    • Сообщество: его можно сказать нет

    Достаточно мощная и интересная плата, но как всегда за гибкость приходится платить сложностью в освоении. Если есть, какие либо вопросы по этой плате, задавайте в комментариях, постараюсь ответить.

    Источник

    Linux в устройстве на базе чипа Altera SoC FPGA: восстанавливаем утраченный функционал

    Некоторое время назад ко мне в руки попал набор разработчика DE0-Nano-SoC, построенный на базе чипа Altera Cyclone V. Данный набор используется мной не с какой-то одной целью — с его помощью решаются разные задачи. Для каждой из этих задач создаётся схема для FPGA и пишется программа для HPS. Схема для FPGA создаётся в среде Quartus II и в процессе разработки загружается в FPGA через JTAG-интерфейс посредством USB-бластера. Когда же схема окончательно отлажена, она записывается на SD-карточку в виде файла прошивки. Затем, когда нужно использовать плату с той или иной целью, берётся нужная прошивка, загружается в FPGA командой вида
    и затем запускается нужная программа.

    Всё шло своим чередом, но однажды я обновил в плате ядро Linux — о чём рассказывал в этой статье. И вот спустя некоторое время обнаружилось, что из списка драйверов исчез FPGA-менеджер, позволявший загружать прошивку в FPGA подобным способом. Первой мыслью было то, что я забыл включить драйвер в конфигурацию при сборке ядра. Однако, к моему удивлению, скоро обнаружилось, что среди исходников ядра этого драйвера нет в принципе! Конечно, можно было бы грузить прошивку в FPGA другими способами, коих есть ещё как минимум три. Но этот способ был для меня наиболее оперативным и удобным, вот почему было принято решение восстановить утраченный функционал. Если Вам интересно, как это было сделано — добро пожаловать под кат.

    Небольшое лирическое отступление

    Для решения проблемы прежде всего нужно было найти исходные тексты FPGA-менеджера. Естественно, первым делом были обследованы репозитории Альтеры. И опять же я был удивлён тем, что этого драйвера в них не оказалось. Пришлось искать по всему гитхабу и в результате исходники были найдены в репозиториях Терасика. И тут опять образовались грабли: Терасик давно не публиковал ничего на гитхабе и самое свежее ядро было версии 3.12. Как следствие, взятые из этого репозитория исходники FPGA-менеджера отказывались компилироваться под новые ядра из-за того, что в них использовались некоторые «устаревшие» структуры, попросту ликвидированные из новых версий. Переделывать драйвер под новые реалии что-то меня никак не тянуло. Поэтому поиск был продолжен и в конце концов увенчался таки успехом — нашлись адаптированные исходники драйвера в репозитории некоего мистера из Канады с ником xaxaxa. За что ему низкий поклон.

    Итак приступим

    Подробности сборки ядра можно посмотреть в моей предыдущей статье — далее, чтобы не повторяться, я буду ссылаться на неё время от времени. Всё дальнейшее повествование будет построено на предположении, что весь процесс сборки ядра, описанный в той статье, уже выполнен и все исходники ядра лежат на прежнем месте в целости и сохранности.

    1. Запускаем терминалку и входим в root-режим — чтобы не набирать каждый раз команду sudo:

    При этом /root будет нашей домашней директорией — всё будем делать в ней.

    2. Скачиваем исходники драйвера FPGA-менеджера отсюда и кладём в директорию /root/linux-socfpga-4.1/drivers/fpga/

    Также забираем отсюда хидер fpga.h и записываем его в директорию /root/linux-socfpga-4.1/include/linux/

    3. Редактируем файл /root/linux-socfpga-4.1/drivers/Kconfig — добавляем в него одну строку:

    Куда конкретно её добавить — особого значения не имеет. Главное, чтобы она была не самой первой и не самой последней строкой файла. Я добавил её сразу после первой строки. Получилось вот так:

    4. Редактируем файл /root/linux-socfpga-4.1/drivers/Makefile — добавляем в него одну строку:

    Куда конкретно её добавить — опять же значения не имеет. Я добавил её сразу после начальных комментариев. Получилось вот так:

    5. Запускаем альтеровский скрипт, который запустит новый BASH и подправит в нём некоторые переменные окружения (например, PATH). Все действия по компиляции будем проводить не выходя из этого BASH:

    6. Создаём несколько переменных окружения:

    7. Переходим в директорию с исходниками ядра и добавляем драйвер FPGA-менеджера в конфигурацию ядра:

    При этом откроется псевдографическое окно с менюшками. Заходим в подменю Device Drivers. Здесь увидим, что на первом месте появилось новое подменю FPGA devices — заходим в него. Внутри будет драйвер FPGA Framework — добавляем его в ядро: нажимаем на нём пробел дважды — при этом напротив него появится символ звёздочки, говорящий о том, что данный драйвер будет встроен в ядро. Сразу после выполнения этих действий в списке появится ещё один драйвер Altera — включаем и его тоже: нажимаем на нём дважды пробел:

    Так как мы сейчас не выполняли сброс конфигурации в исходное состояние командой make socfpga_defconfig, то остальные настройки должны остаться в прежнем состоянии — как мы их установили в процессе сборки ядра.

    Выходим из меню — нажимаем Exit пока не выйдем. На вопрос — надо ли сохранять конфигурацию — отвечаем Yes.

    8. Компилируем ядро:

    Так как ядро компилировалось нами ранее, то теперь на его пересборку с новыми драйверами уйдёт совсем мало времени.

    9. Добавляем в дерево устройств информацию о FPGA-менеджере.
    Для этого добавляем в файл /root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga.dtsi следующие строки:

    Эти строки можно добавить в блок soc.

    10. Конвертируем файл дерева устройств в бинарный формат:

    11. Копируем ядро и .dtb-файл на карточку в раздел FAT32. Повторяться не буду: о том, как это сделать, подробно описано в подразделе 13 раздела Сборка ядра этой статьи.

    На этом всё — процесс сборки ядра в комплекте с драйвером FPGA-менеджера завершён.

    Проверка работоспособности

    Поставим SD-карточку в плату, загрузимся и проверим работоспособность.
    Для этого сначала посмотрим содержимое директории /dev — в ней должен появиться файл драйвера fpga0:

    Ну и в завершение загрузим какую-нибудь прошивку в FPGA:

    Источник

    Читайте также:  Appdata local microsoft windows wer reportarchive
  • Оцените статью