- Семейства СБИС ПЛ серии Cyclone
- Обновление Linux в устройстве на базе чипа Altera SoC FPGA и получение доступа к расшаренным ресурсам Windows-сервера
- Задачи
- Сборка ядра
- Сборка файловой системы
- Окончательная доводка
- Платы видеозахвата в Linux.
- Теория (коротко).
- Определение типа платы.
- Модуль в автозагрузку.
- Debian/Ubuntu
- Cложный способ через udev.
- Простой способ — блокировка загрузки модуля из initramfs.
Семейства СБИС ПЛ серии 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. Скачать этот пакет можно прямо с сайта Альтеры.
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:
В результате компиляции создалось два файла:
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.
Запрещаем автозагрузку модулей устройств видеоввода:
Источник