Altera cyclone плата видеозахвата linux

Семейства СБИС ПЛ серии Cyclone

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

Новое семейство СБИС ПЛ Cyclone V включает в себя микросхемы, содержащие аппаратный процессорный блок на основе двухъядерного процессорного ядра ARM Cortex A9.

Семейство Cyclone Cyclone II Cyclone III Cyclone IV Cyclone V
Анонсировано 2002 г. 2004 г. 2007 г. 2009 г. 2011 г.
Технологический процесс 130 нм 90 нм 65 нм 60 нм 28 нм
Рекомендуется для новых разработок Нет Да Да Да Да

Подробнее:

Дистрибуция электронных компонентов www.efo.ru

Конструктивы и корпуса РЭА
www.korpusa.ru

Мир беспроводных решений
www.wless.ru

Профессиональные усилители класса D www.sound-power.ru

Датчики и первичные преобразователи www.efo-sensor.ru

Кварцевые резонаторы и генераторы www.golledge.ru

Компоненты для промавтоматики www.efomation.ru

Продукция Lattice Semiconductor www.latticesemi.ru

© All rights reserved. EFO Ltd. При использовании материалов ссылка на источник обязательна.

Источник

Обновление 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. Скачать этот пакет можно прямо с сайта Альтеры.

Читайте также:  Hkey local machine software microsoft windows currentversion installer

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 и также нажимаем клавишу пробел.

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

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

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

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

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

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

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

    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. Для проверки, что всё сделано правильно

    Источник

    Платы видеозахвата в Linux.

    Теория (коротко).

    Главная микросхема на устройствах аналогово видеоввода — видеокодер. В настоящее время распространены видеокодеры следующих производителей:

    Логически, все платы видеозахвата можно выделить 2 класса устройств:

    Разработку драйверов video4linux для большинства устройств ведёт(вёл?) Gerd Knorr.

    В большинстве дистрибутивов Linux, поставляемое ядро включает драйвера video4linux. По-умолчанию, модули (драйвера) находятся каталоге:

    Обычно, для правильной работы устройств(а) в системе необходимо сделать 2 вещи:

    Определение типа платы.

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

    Для определения типа платы вручную нам понадобятся следующие утилиты:

    С помощью lscpi определяем тип видеокодера:

    Пример вывода lscpi для платы на 4-х видеокодерах BT878

    Вот так выглядит тюнер AverMedia Model 307 на одном Philips SAA7130

    Далее, смотрим как драйвер определил плату:

    Если видим что-то подобное — в большинстве случаев такой вариант Вас не устроит и нужно определить тип платы вручную и «сообщить» об этом драйверу.

    Все драйверы (модули):

    Видео-декодер Основной модуль (драйвер) Список поддерживаемых устройств
    BT878 bttv список
    CX2388x cx88xx список
    SAA713x saa7134 список
    TW68xx tw68 список

    принимают параметр card=тип_платы1,тип_платы2…тип_платыN

    Покажем пример для плат на BT878 (драйвер bttv):

    1. Выгружаем модуль bttv

    2. Загружаем модуль с «принудительным» указанием типа платы:

    3. Проверяем всё ли правильно сделали:

    4. Смотрим видео:

    Таким образом, нужно пробежаться по пунктам 1-4 для всех плат из списка, поддерживаемых драйвером.

    Если плата нормально заработала, нужно просто прописать параметры для загрузки модуля bttv, согласно правил Вашего дистрибутива.

    Модуль в автозагрузку.

    Debian/Ubuntu

    В Debian/Ubuntu драйвера для видеограбберов загружаются автоматически из initramfs.

    Обычно, всё что Вам нужно сделать, так это передать правильные параметры драйверу (тип платы: см. выше).

    Нужно создать файл « /etc/modprobe.d/video4linux.conf » и прописать в него одну или несколько строк. Есть нюансы, поэтому несколько примеров:

    простая одночиповая плата на BT878, типа Orient SDVR-404

    простая одночиповая плата на Techwell TW6805A, типа Orient SDVR-404A

    плата Drive (компания DSSL, софт Trassir) — как 4 ProVideo PV143

    4-x чиповая плата Kodikom 4400R на BT878

    8-x чиповая плата Kodikom KMC-8800R

    TIBET_CS16(4xBT878) и AVERMEDIA DVD EZMAKER(1xSAA7134)

    для платы семейства Orient SDVR-7008 (8 saa7130)

    При долгой загрузке модуля bttv (более 5 сек., обычно сопровождается выводом строк типа »I2C detect»), попробуйте добавить следующие опции:

    Большинство современных дистрибутивов Linux используют двухступенчатую загрузку initramfs/initrd(устаревший способ).

    В этом случае, большинство модулей устройств подгружается именно из initramfs, и чтобы модули получили наши новые параметры, нужно пересобрать образ initramfs командами:

    Дело в том, что начиная с некоторой версии (поправьте) udev обрабатывает устройства параллельно, то есть возможна гонка состояний при обнаружении устройств.

    Этот эффект может привести к отличной от ожидаемой/желаемой привязке реальных чипов к устройствам /dev/videoN.

    Избежать такого перемешивания можно двумя способами.

    Cложный способ через udev.

    C помощью правил udev, попытаться по различию некоторых свойств (доступных udev) «раздать» имена устройств в нужном порядке. В качестве примера поищите как это делается для аналогичной проблемы, только с сетевыми платами.

    Простой способ — блокировка загрузки модуля из initramfs.

    Запрещаем автозагрузку модулей устройств видеоввода:

    Источник

    Читайте также:  Вид linux как mac
  • Оцените статью