Linux В Устройстве На Базе Fpga-Чипа Altera Soc: Восстановление Утраченной Функциональности



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

Некоторое время назад мне попался комплект разработки DE0-Nano-SoC, построенный на чипе Altera Cyclone V. Я не использую этот набор только для одной цели — он помогает решать разные задачи.

Для каждой из этих задач создается схема FPGA и пишется программа для HPS. Схема для ПЛИС создается в среде Quartus II и в процессе разработки загружается в ПЛИС через JTAG-интерфейс с помощью USB-бластера.

Когда схема окончательно отлаживается, она записывается на SD-карту в виде файла прошивки.

Затем, когда вам нужно использовать плату для тех или иных целей, берётся необходимая прошивка и загружается в ПЛИС командой вида

  
  
  
  
  
  
  
  
  
  
  
  
   

cat hardware.rbf > /dev/fpga0

и затем запускается нужная программа.

Все шло как обычно, но однажды я обновил ядро Linux на плате - о чем рассказывал в Эта статья .

И тут, через некоторое время, было обнаружено, что из списка драйверов исчез менеджер ПЛИС, который позволял подобным образом загружать прошивки в ПЛИС.

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

Однако, к моему удивлению, вскоре я обнаружил, что этот драйвер вообще не включен в исходный код ядра! Конечно, можно было бы загрузить прошивку в ПЛИС и другими способами, которых еще как минимум три.

Но для меня этот способ оказался наиболее эффективным и удобным, поэтому было принято решение восстановить утраченный функционал.

Если вам интересно, как это было сделано, добро пожаловать под кат.

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

Для решения проблемы, прежде всего, необходимо было найти исходный код менеджера ПЛИС.

Естественно, первым делом мы изучили репозитории Altera. И снова я удивился, что в них нет этого водителя.

Пришлось искать по всему Github и в результате исходный код был найден в репозиториях Terasik. И тут снова образовались грабли: Терасик давно ничего не публиковал на GitHub и последнее ядро было версии 3.12. В результате исходники менеджера FPGA, взятые из этого репозитория, отказались компилироваться под новые ядра из-за того, что в них использовались какие-то «устаревшие» структуры, которые просто были исключены из новых версий.

Стремления переделывать драйвер под новые реалии не было.

Поэтому поиски были продолжены и в конечном итоге увенчались успехом — адаптированные исходники драйверов были найдены в репозитории некоего мистера из Канады с ником ксаксакса .

За что я ему поклон.



Итак, давайте начнем

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

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

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

sudo -i

В данном случае /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 — добавьте в него одну строку:

source "drivers/fpga/Kconfig"

Куда именно добавлять не имеет особого значения.

Главное, чтобы это была не самая первая и не самая последняя строка файла.

Я добавил его сразу после первой строки.

Получилось вот так:

menu "Device Drivers" source "drivers/fpga/Kconfig" source "drivers/amba/Kconfig" .



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

obj-$(CONFIG_FPGA) += fpga/

Куда именно его добавить, опять же, не имеет значения.

Я добавил его сразу после первых комментариев.

Получилось вот так:

# # Makefile for the Linux kernel device drivers. # # 15 Sep 2000, Christoph Hellwig <[email protected]> # Rewritten to use lists instead of if-statements. # obj-$(CONFIG_FPGA) += fpga/ obj-y += irqchip/ .



5. Запускаем скрипт Альтера, который запустит новый BASH и исправит в нем некоторые переменные окружения (например, PATH).

Все действия компиляции будем проводить не выходя из этого BASH:

cd /root/altera/15.0/embedded .

/embedded_command_shell.sh

6. Создайте несколько переменных среды:

export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export LOADADDR=0x8000

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

cd /root/linux-socfpga-4.1 make menuconfig

Откроется псевдографическое окно с меню.

Перейти в подменю Драйверы устройств .

Здесь мы увидим, что в первую очередь появилось новое подменю.

устройства ПЛИС - давайте разберемся.

Внутри будет водитель Платформа ПЛИС - добавьте его в ядро: дважды нажмите на нем пробел - напротив него появится символ звездочки, обозначающий, что этот драйвер будет встроен в ядро.

Сразу после выполнения этих действий в списке появится еще один драйвер.

Альтера — его тоже включите: дважды нажмите на нем пробел:

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

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

Выйти из меню - нажать Выход пока мы не уйдем.

На вопрос - нужно ли сохранять конфигурацию - отвечаем Да .

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

make uImage

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

9. Добавьте в дерево устройств информацию о менеджере ПЛИС.

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

fpgamgr: fpgamgr@0xff706000 { compatible = "altr,fpga-mgr-1.0", "altr,fpga-mgr"; transport = "mmio"; reg = <0xFF706000 0x1000 0xFFB90000 0x1000>; interrupts = <0 175 4>; };

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

Например, здесь.



.

qspi_clk: qspi_clk { #clock-cells = <0>; compatible = "altr,socfpga-gate-clk"; clocks = <&f2s_periph_ref_clk>, <&main_qspi_clk>, <&per_qspi_clk>; clk-gate = <0xa0 11>; }; }; }; fpgamgr: fpgamgr@0xff706000 { compatible = "altr,fpga-mgr-1.0", "altr,fpga-mgr"; transport = "mmio"; reg = <0xFF706000 0x1000 0xFFB90000 0x1000>; interrupts = <0 175 4>; }; gmac0: ethernet@ff700000 { compatible = "altr,socfpga-stmmac", "snps,dwmac-3.70a", "snps,dwmac"; altr,sysmgr-syscon = <&sysmgr 0x60 0>; reg = <0xff700000 0x2000>; interrupts = <0 115 4>; .



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

make socfpga_cyclone5_sockit.dtb

11. Скопируйте ядро и файл .

dtb на карту в разделе FAT32. Не буду повторяться: как это сделать подробно описано в подразделе 13 раздела Сборка ядра Эта статья .

Вот и все — процесс сборки ядра в комплекте с драйвером менеджера ПЛИС завершен.



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

Вставим SD-карту в плату, загрузимся и проверим ее работоспособность.

Для этого сначала просмотрите содержимое каталога /dev — в нем должен появиться файл драйвера fpga0 :

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

Ну и напоследок загрузим в ПЛИС какую-нибудь прошивку:

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

Вуаля! Все работает так, как ожидалось.

Всем спасибо за внимание! Теги: #linux #настройка Linux #framework #FPGA #прошивка #прошивка #менеджер #драйвер

Вместе с данным постом часто просматривают: