Иван Штильбенгшухер (stilbengschuher) wrote,
Иван Штильбенгшухер
stilbengschuher

Category:

Боремся с вебкамерой под FreeBSD

Теоретически веб-камера во FreeBSD устанавливается несложно:

1. Ставим порт devel/linux-kmod-compat чтобы сделать возможным использование линуксовых драйверов.

2. Ставим драйвер камеры multimedia/linux-gspca-kmod (по крайней мере, для большинства камер от Logitech да и многих других нужен именно он).

3. Ставим порт multimedia/pwcbsd с которым идет еще какой-то драйвер (мне не подошел) и полезная утилитка pwcview, о которой скажу ниже.

4. Загружаем драйвер:
kldxref /boot/modules/
kldload gspca

5. Смотрим камеру вышеупомянутой утилиткой.

На практике все немного сложнее.

Проблема первая: kldload не находит драйвера gspca. Говорит, нет такого.
Проблема вторая: после запуска камеры системные логи (/var/log/messages) засираются абсолютно ненужными сообщениями о поведении камеры и USB порта.

Вот это две прорблемы попробуем побороть.

Первая решается относительно просто. Если запустить kldxref с ключом -v, станет видно, что он ругается на неправильный формат драйвера gspca.ko. Гугль это быстро объясняет тем, что в исходниках linux-kmod-compat неправильно проверяется версия FreeBSD, из-за чего линковщик не находит символ msleep. Открываем /usr/local/share/linux-kmod-compat/linux_compat/linux_compat.c, находим строку "#if __FreeBSD_version > 700100" и заменяем 700100 на 700054. Перекомпилируем драйвер, повторяем пункт 4 из теории - готово, камера работает.

Остается вторая проблема - огромное количество спама в логах. Пытаемся исправить ситуацию через настройки syslogd - запрещаем сообщения от ядра типа debug, потом notice и так далее до crit. Мусор пропал, но критические сообщения ядра, все-таки, хочется видеть. Надо быть полным идиотом, чтобы выводить отладочную информацию с таким уровнем. Видимо, проблема где-то в драйвере.

Еще немного возни и она найдена. Только не в самом драйвере, в все в том же linux-kmod-compat - там определяется макрос DBG (debug!), который выводит сообщения через обычный printf. Который и пишет их как критические.

Что ж, снова лезем в исходники - на этот раз в /usr/local/share/linux-kmod-compat/linux_compat/linux/kernel.h. Ищем кривой макрос:

#define DBG(fmt , A...)                 \
        printf("%d [%4d] %s: " fmt , ticks, __LINE__, __FUNCTION__, ## A)

Заменяем его на умный вариант:

#define LOG_DEBUG 7
#define DBG(fmt , A...)                 \
        log(LOG_DEBUG, "%d [%4d] %s: " fmt , ticks, __LINE__, __FUNCTION__, ## A)

Снова перекомпилируем драйвер, перегружаем модуль. Редактируем /etc/syslog.conf, чтобы убрать kernel.debug из файла /var/log/messages (сообщения все равно пойдут в файл /var/log/debug.log, но это уже не страшно), обновляем настройки syslogd (killall -HUP syslogd), запускаем pwcview - красота. Мусора стало гораздо меньше, хотя отдельные сообщения от драйвера все еще идут.

Снова ищем причину и находим еще один подлый макрос - PDEBUG. Правда, на этот раз уже в самом драйвере linux-gspca-kmod. По идее, этот макрос должен работать только в отладочных версиях драйвера. Но в порт FreeBSD почему-то просочился флаг, включающий его. Отключаем:

- Выгружаем драйвер kldunload gspca (если он еще запущен).
- Идем в директорию порта multimedia/linux-gspca-kmod, удаляем уже установленный вариант: make deinstall.
- Заново готовим исходники: make fetch patch.
- Редактируем work/gspca*/Makefile и work/gspca*/Makefile.kld - убираем строки, упоминающие флаг GSPCA_ENABLE_DEBUG.
- Собираем и устанавливаем новый вариант драйвера, чистим за собой: make install clean.

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

Да, утилитка pwcview - гениальная вещь. Умеет просто показывать камеру в окне. Умеет работать в консоли, просто сохраняя отдельные кадры или перенаправляя сырое видео кодирующей программе (например, mencoder). Умеет работать как детектор движения и выдавать видео только при наличии в выбранных частях кадра двигающихся объектов. Вобщем, чудо, а не программа.
Tags: freebsd
Subscribe

  • Фряха все

    Фряха ушла на пенсию. Ее полностью заменила убунта. Правда, не обошлось без небольших накладок. Например, в линуксе оказалось несколько сложнее…

  • Фряха чудит

    Снова фокусы с портами. Какие-то умники задепрекейтили и заигнорили порт openssl. Потому что там обнаружилась уязвимость. Итог - невозможно…

  • Снова фряху сломали.

    Снова поломали фряху очередным обновлением. Вчера все работало, сегодня пхп сегфолтится. Причем на выходе, когда все уже отработано и результаты…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments