Архивы: по дате | по разделам | по авторам

Укрощение железного пингвина. Часть I

АрхивСовременные технологии
автор : Андрей Филиппов   28.01.2004

Попробуем взглянуть на популярную платформу GNU/Linux с необычной точки зрения. Не со стороны пользователей и не со стороны программистов, а со стороны разработчиков "железа".

=+=+=+=

Попробуем взглянуть на популярную платформу GNU/Linux с необычной точки зрения. Не со стороны пользователей, и не со стороны программистов, а со стороны разработчиков "железа".

Об авторе: Андрей Филиппов, к.ф.-м.н., президент компании Elphel, разрабатывающей специализированные цифровые камеры, в которых используется GNU/Linux.

Во второй половине девяностых я был сотрудником американской компании Cordin и делал так называемые "считки" - специализированные цифровые камеры. В этой области я работал со времен  дипломного проекта в МФТИ в 1978 году. Тогда я подключил фотоприемную матрицу 16 х 16 (0,00025 мегапикселя) к миникомпьютеру - стойке с CAMAC и Nova 2/10.

Когда я работал над своей первой камерой в США, трудности поджидали меня не при создании схемы и не при освоении FPGA  (я впервые столкнулся с технологией программируемых вентильных матриц, но давно на нее "облизывался"). Камеры, которые я разрабатывал в Cordin, использовали охлаждаемые ПЗС-сенсоры, аналоговые цепи, позволяющие получить динамический диапазон 10000:1, и сигнальный процессор. Они подключались к компьютеру через интерфейс SCSI, и именно он стал камнем преткновения. Написать "с нуля" на Ассемблере реализацию SCSI для сигнального процессора было труднее всего.

Впервые с Линуксом я столкнулся в 2001 году. Я продолжал заниматься своими "железками", а мои коллеги пытались решить другую задачу - им нужно было подключить одновременно несколько стандартных цифровых камер с интерфейсом Firewire к единственному встраиваемому компьютеру, практически обычному РС, только сделанному в другом конструктиве - PC104.

По привычке они выбрали самый простой, как тогда казалось, путь и заказали Windows CE. Промучавшись с месяц, решили попробовать Embedded NT, еще одну майкрософтовскую операционную систему для встроенных устройств. Результат опять нулевой. Подключить к компьютеру одну камеру несложно, но несколько штук параллельно... Нет, такого не предусматривалось, и никакая поддержка от разработчиков ПО не помогла.

В итоге, мои коллеги решили опробовать операционную систему, с которой я в то время еще не сталкивался. Это была совсем не Windows: и цвет экрана другой, а на месте привычного флага Microsoft - странная закорючка. В Линукс (а это был именно он) никакой готовой поддержки параллельно работающих камер, конечно, тоже не оказалось. Но не было и "бетонной стены", отделяющей в опробованных системах готовую поддержку одной камеры от желаемой поддержки четырех-восьми.

Конкурс: Объявляется конкурс на разработку видеостримера для камер Elphel. Подробности после статьи.

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

Вот тут я уже заинтересовался. У меня ушло три месяца на реализацию SCSI, а тут всего "десяток строк"?

Убедить руководство компании в перспективах, открываемых новым подходом к разработке ПО, мне не удалось. Тогда я принял рискованное решение: уйти из компании и открыть собственную фирму. Там я стал заниматься цифровыми камерами, основанными на открытых программно-аппаратных решениях. Завершив проект в Cordin, я отыскал подходящее короткое доменное имя в зоне ".com" и основал компанию Elphel.

Забегая вперед, вынужден признаться: увы, большая часть моих расчетов не оправдалась. События развивались не совсем так, как планировалось, и в довершение всего, общее падение американской экономики и растущая безработица сделали "запасной вариант" с устройством куда-нибудь на работу довольно проблематичным. В итоге, я остался без зарплаты не на пару месяцев, а почти на целых два года. Впрочем, обо всем по порядку. Покинув Cordin, я еще не догадывался о будущих неприятностях и приступил к разработке своей камеры с Linux.

Начать следовало с выбора процессора и разработки схемы камеры. Когда я стал искать в интернете процессоры, на которых можно запустить Линукс, меня ожидал приятный сюрприз. Эта операционная система работала практически со всеми известными мне архитектурами (да и с неизвестными тоже). Годился практически любой процессор.

Тогда я стал ужесточать требования. Мне потребуется "настоящий" Линукс, а не усеченный uCLinux. Это значит, что процессор должен поддерживать защиту и распределение памяти; на кристалле, кроме CPU, лучше иметь побольше необходимой мне периферии (порты, котроллер SDRAM, Ethernet и т.д.). Для удобства начального программирования системы не должно быть лишних разъемов или колодок для ПЗУ. Наконец, хотелось иметь подробную документацию по включению процессора (желательно, с примерами реальных схем) и легкодоступное программное обеспечение для разработки под него (желательно недорого, а еще лучше - бесплатно).

Дополнительные условия резко сузили круг поисков, пока,  наконец, не остался один-единственный претендент: чип ETRAX 100LX  шведской фирмы Axis Communications AB. На него и пал выбор.

Миновал месяц. Я перерешал множество мелких вопросов вроде "как припаять корпус BGA к печатной плате", и вот, наконец, в руках у меня готовое "железо" - компьютер для Линукса на плате размером 89 х 38 мм и плату с КМОП-сенсором в 1288 х 1032 пикселя.

Тут-то и поджидала меня первая проблема. Выяснилось, что программировать придется мне самому. Мой коллега, который подключал камеры к компьютеру с GNU/Linux, вернулся в Москву. Это была неприятная неожиданность. В то время я почти совсем не разбирался в Линукс. Даже предназначение команды ls для меня оставалось тайной за семью печатями.

Что ж, придется разобраться в Линукс самому. Я начал с того, что распечатал и переплел себе описание команд процессора и мнемоник Ассемблера. Сделал - и ни разу не воспользовался. Работа с программным обеспечением проходила на совсем другом уровне.

Первым делом нужно было заставить операционную систему работать. Можно было ожидать худшего. И тип флэш-памяти, и разрядность SDRAM у меня отличались от прототипа, Development board LX. Вдобавок, такую комбинацию архитектуры CPU и памяти - Axis ETRAX и Intel flash - едва ли кто-нибудь, кроме меня, использовал. Но как оказалось, все не так страшно.

Запустив, согласно инструкции, menuconfig, я поменял несколько значений. Пришлось еще раз заглянуть в описания внутренней периферии процессора (первый раз я их читал на стадии проектирования схемы), чтобы верно вычислить магические значения конфигурационных регистров. Затем, опять же по инструкции, последовали новые "заклинания" - make kernel, make install и make images.

Так я получил образ для флэш-памяти, который можно загрузить в камеру. Но не тут-то было. Оказалось, что хотя в ядре Линукс есть готовая поддержка флэш-памяти Intel Strataflash, в начальном загрузчике Axis она отсутствовала. Следующие пару дней я, вооружившись описанием флэш-памяти и исходным кодом соответствующего драйвера ядра, переписывал начальный загрузчик под свои нужды.

Усилия были тщетны, ничего не заработало. Еще целую неделю я мучился, пытаясь найти причину. Делаю ли я что-то не так:? Или ошибка в схеме? Может быть, все дело в некачественной печатной плате? Или нет контакта в пайке где-нибудь под процессором, куда без рентгена не очень-то и заглянешь? Я был почти готов сдаться, когда отыскался виновник - плохо припаянный вывод у крохотной резисторной сборки. Вскоре на подключенном через последовательный порт отладочном терминальном эмуляторе, наконец, появились заветные слова Uncompressing Linux...

И сразу же на спроектированной мной "железке" заработал веб-сервер, а также FTP и Telnet. Все эти серверы и другие приложения были заранее сконфигурированы Axis. Я-то привык, что схема начинает "дышать" только спустя месяцы утомительного программирования на Ассемблере. С Линукс хватило считанных недель. Это был совершенно другой уровень.

Попробовав откомпилировать и запустить классическую Hello, World!, я вооружился книжкой O'Reilly про написание драйверов для Линукс и стал готовить обеспечение для взаимодействия с приемником изображений и FPGA. Именно они отличали мою разработку от прототипа.

Всё оказалось достаточно несложно, и через пару недель я уже мог управлять сенсором и считывать изображения в статический массив по каналу прямого доступа к системной памяти. Тут нужно сказать доброе слово об Axis: при программировании ПДП у меня возникли вопросы, на которые программисты в Швеции ответили быстро и с толком, такую поддержку мне редко удавалось получить внутри США по телефону.

Всегда хочется большего, и я решил добиться, чтобы картинки были не просто в виде массива данных, а в виде стандартных JPEG-файлов, раз уж в камере есть веб-сервер. Сказано - сделано, библиотека для работы с JPEG-форматом скачивается с интернета. Разумеется, в виде исходных текстов, ведь у меня же не PC, а вновь разработанная камера с процессором, архитектура которого (linux/arch/cris) отличается от x86. Пару дней работы (я не смог воспользоваться стандартным configure для встроенного процессора и пришлось вручную править/делать Makefile, лишь смутно понимая его устройство) - и изображения из камеры открываются любым браузером.

Весь путь от идеи - попробовать методы свободного ПО для создания устройств (при нулевом начальном знании GNU/Linux или Unix), до реализации - работающей камеры со встроенным веб-сервером, занял менее трех месяцев. Высокая скорость разработки мне очень понравилась, но много заработать мне пока не удалось.

Дело в том, что продукт (высокоскоростная камера со стробируемым усилителем яркости) рассчитан на довольно ограниченный рынок, выйти на который довольно сложно. После того как эта разработка обсуждалась на Slashdot, ко мне стали приходить запросы со всего мира, но в основном, на универсальные сетевые камеры. На этом рынке моей компании, состоящей из одного человека, сложно конкурировать. Слишком низкую цену я установить не мог, так как мелкосерийное (а на большее у меня нет средств) производство обходится дорого, а параметры камеры, если не брать в расчет усилитель яркости, ничего особенного не представляли - на рынке такие уже есть.

Хотя мегапиксельных камер было не много (большинство имели разрешение до 640 х 480), скорость работы моей камеры была невысока (1 полный кадр в 5 с) из-за программной реализации алгоритмов сжатия на не очень быстром процессоре (100 МГц). Устройства дающие почти 1 кадр в секунду при таком же разрешении уже существуют, например, IQeye.

И тогда я начал думать о следующем проекте - создании камеры, в которой алгоритмы сжатия реализованы "в железе"...

(Продолжение следует...)

Конкурс

Объявляется конкурс на разработку видеостримера для камер Elphel. Программа-победитель, естественно, будет распространяться по лицензии GNU/GPL с сохранением копирайта автора. Итак, какие же исходные данные.

Имеется реконфигурируемая сетевая камера Elphel 313 (подробная информация есть на веб-сайте), где FPGA позволяет осуществлять сжатие по алгоритму baseline JPEG со скоростью примерно до 20 полных кадров в секунду (новые сенсоры позволяют делать до 30 кадров/с, и я попытаюсь увеличить скорость компрессора). Для демонстрации возможностей аппаратуры я написал приложение, которое запаковывает отдельные кадры (в виде motion JPEG) в видеоклипы формата Apple Quicktime и передает их как один файл, который может быть гораздо больше, чем оперативная память камеры, так как файл строится "на лету". Такой файл можно даже смотреть на компьютере с небольшой задержкой при соответствующих установках параметров плеера. Это приложение успевает передавать данные с достаточной скоростью - с той, которую обеспечивает компрессор.

Есть также и настоящий multicast videostreamer, сделанный компанией Live Networks. К сожалению, он работает примерно втрое медленнее, чем нужно, и имеет дополнительные ограничения. Может быть, это связано с тем, что он написан на C++ (а не C, как все остальное ПО камеры)? Может быть какие-нибудь лишние копирования? Все исходные тексты доступны.

Теперь условия конкурса, состоящего из двух этапов:

Первый этап (до 1 марта 2004 г.). Ознакомившись с исходными текстами ПО камеры и видеостримера и чувствуя в себе силы решить поставленную задачу, участники могут написать письмо по адресу "videostreamer<собака>elphel.com" и попытаться убедить меня, что они знают способ её решения. Первые три участника, успешно справившиеся с задачей первого этапа, получат камеры Elphel 313, которые достанутся им независимо от результатов второго этапа.

Второй этап продлится до 1 мая 2004 года, когда, надеюсь, счастливые обладатели камер смогут продолжить работу над свободным ПО for fun and profit. Победитель этапа, при условии, что его ПО будет стабильно обеспечивать в камере не менее 15 кадров в секунду для разрешения 1280 х 1024, получит дополнительно приз в размере $3000.

Обсудить условия конкурса можно в форуме

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.