Ключевые слова:video, v4l, linux, kernel, patch, driver, hardware, xawtv, (найти похожие документы)
From: Богословский Виктор (THK) <bogovic at bk.ru>
Newsgroups:
Date: Mon, 21 Jan 2009 17:02:14 +0000 (UTC)
Subject: Поддержка устройств видео захвата на кодеках SAA713x в Linux
Поддержка устройств видео захвата на кодеках SAA713x в Linux, на примере карты Orient HW-504.
Дело было так. Решил я сделать себе дома систему видео наблюдения и
после долгих поисков и опытов с сетевыми камерами пришел к выводу, что
наибольшим удобством и функциональностью будет обладать связка:
компьютер + карта видео захвата + аналоговые камеры. Посмотрел прайсы,
почитал характеристики и решил брать китайскую карту Orient HW-504
(клон Hawell HW-404M7). Плюсы этой карты: низкая цена, отсутствие
коммутаторов входов, четыре кодека (по одному на каждый вход) и как
следствие высокая скорость захвата видео. Минусы - полное отсутствие
поддержки Linux и мягко говоря, не совсем стабильное программное
обеспечение под Windows. Плюсы перевесили... Решено! Еду в магазин,
привожу домой долгожданную железку.
Устанавливаю ее в компьютер и вижу, что моя система (Debian Etch 4.0)
её увидела, но не опознала. Вернее опознала как четыре UNKNOWN/GENERIC
карты с кодеками SAA7130 от Philips (хотя во всех обзорах и прайсах
писали о BT878A) и предложила мне выбрать модель карты из списка, в
котором ничего похожего на Orient HW-504 я не обнаружил.
Ну что ж, отчаиваться рано. Несколько дней проведённых в Google привел
меня к мысли, что надо самому пробовать осуществить поддержку моей
карты модулем SAA7134. Собственно эта статья о том, как это сделать.
Для нормальной работы карты необходимо правильно инициализировать её
регистры. Выяснить параметры инициализации можно с помощью программы
flytest. Работает она под Windows, как и софт, который идет в комплекте
с картой. И так. Устанавливаем карту в компьютер, загружаем Windows,
инсталлируем драйвера и софт. Перед рестартом системы надо удалить
запуск программы DVR из автозагрузки. Рестарт. Запускаем программу
flytest, я использовал версию 1.5, далее надо выбрать чип из
выпадающего списка и нажать кнопку "Dump SAA713x PCI registers" из
полученной информации нам потребуется следующее:
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode: 0x00389200
Value: 0x00010000
Video input: 3
Audio input: Analog Line1
Далее необходимо проделать тоже самое для остальных чипов платы.
Получится следующее:
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode : 0x00389200
Value: 0x0001FC00
Video input: 3
Audio input: Analog Line1
Для второго чипа.
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode : 0x00389200
Value: 0x00010000
Video input: 3
Audio input: Analog Line1
Для третьего чипа.
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode : 0x00389200
Value: 0x00010000
Video input: 3
Audio input: Analog Line1
Для четвертого чипа.
Следующий шаг - это запуск родного софта, для того чтобы
инициализировать плату, и повторение выше описанной процедуры, для
получения параметров инициализации. Должно получиться следующее:
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode : 0x00389C00
Value: 0x00016C00
Video input: 3
Audio input: Analog Line1
Для первого чипа.
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode : 0x00389200
Value: 0x00010000
Video input: 3
Audio input: Analog Line1
Для второго чипа.
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode : 0x00389200
Value: 0x00010000
Video input: 3
Audio input: Analog Line1
Для третьего чипа.
SAA7130 (0x7130, SubVenID:1131, SubDevID:0000, Rev: 01)
I2C slave devices found:
No devices
GPIO pins:
Mode : 0x00389200
Value: 0x00010000
Video input: 3
Audio input: Analog Line1
Для четвертого чипа.
Это вся информация, которую можно получить в Windows для
удачной правки модуля SAA7134. Все дальнейшие действия надо проводить в
Linux, я использую Debian Etch 4.0. Для получения дополнительной
информации надо выполнить команду
lspci -vn
(утилита v4l-info входит в состав пакета xawtv).
Интерес для нас представляет только та часть лога команды, где
фигурирует Subsystem: 1131:0000 (Subsystem = SubVenID & SubDevID,
которые берем из лога программы flytest).
Вот часть лога, интересная для нас:
02:0c.0 0480: 1131:7130 (rev 01)
Subsystem: 1131:0000
Flags: bus master, medium devsel, latency 64, IRQ 201
Memory at fe9ff000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [40] Power Management version 1
02:0d.0 0480: 1131:7130 (rev 01)
Subsystem: 1131:0000
Flags: bus master, medium devsel, latency 64, IRQ 185
Memory at fe9ff400 (32-bit, non-prefetchable) [size=1K]
Capabilities: [40] Power Management version 1
02:0e.0 0480: 1131:7130 (rev 01)
Subsystem: 1131:0000
Flags: bus master, medium devsel, latency 64, IRQ 177
Memory at fe9ff800 (32-bit, non-prefetchable) [size=1K]
Capabilities: [40] Power Management version 1
02:0f.0 0480: 1131:7130 (rev 01)
Subsystem: 1131:0000
Flags: bus master, medium devsel, latency 64, IRQ 169
Memory at fe9ffc00 (32-bit, non-prefetchable) [size=1K]
Capabilities: [40] Power Management version 1
Поля первой строки имеют следующие значения:
PCI ID Device Class Vendor ID Device ID
02:0c.0 0480 1131 7130
Ну вот, теперь у нас имеются все необходимые данные, пора
ковырять модуль SAA7134. Сначала надо установить исходные тексты ядра,
запускаем aptitude и устанавливаем пакет linux-source-2.6.18 со всеми
зависимостями. После этого в каталоге /usr/src/ появится архив с
исходными текстами, распакуем их в каталог
/usr/src/linux-source-2.6.18/. Я пользуюсь Midnight Commander'ом,
поэтому не привожу здесь консольные команды. Переходим в каталог
/usr/src/linux-source-2.6.18/drivers/media/video/ и на всякий случай
делаем копию каталога ./saa7134/ в ./saa7134_orig/. Дальнейшие действия
делаем в "родном" каталоге ./saa7134/.
Открываем для редактирования файл saa7134.h, находим там список карт,
из которого нам в самом начале предлагалось выбрать кару. В самый конец
добавляем нашу карту, назовем ее SAA7134_BOARD_ORIENT_HW_504 и
присваиваем ей следующий номер 96:
#define SAA7134_BOARD_AVERMEDIA_A169_B1 92
#define SAA7134_BOARD_MD7134_BRIDGE_2 93
#define SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS 94
#define SAA7134_BOARD_FLYVIDEO3000_NTSC 95
#define SAA7134_BOARD_ORIENT_HW_504 96
#define SAA7134_MAXBOARDS 8
#define SAA7134_INPUT_MAX 8
/* ----------------------------------------------------------- */
Сохраняемся, закрываем файл.
Открываем для редактирования файл saa7134-input.c, находим там вот
такой участок кода и добавляем нашу карту:
/* detect & configure */
switch (dev->board) {
case SAA7134_BOARD_FLYVIDEO2000:
case SAA7134_BOARD_FLYVIDEO3000:
case SAA7134_BOARD_ORIENT_HW_504:
case SAA7134_BOARD_FLYTVPLATINUM_FM:
case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
ir_codes = ir_codes_flyvideo;
mask_keycode = 0xEC00000;
mask_keydown = 0x0040000;
break;
Больше в этом файле ничего писать не надо, т.к. пульта ДУ у карты нет.
Сохраняемся, закрываем файл.
Открываем для редактирования файл saa7134-cards.c, находим там вот
такой участок кода и добавляем описание нашей карты:
.radio = {
.name = name_radio,
.amux = LINE2,
.gpio = 0x2000,
},
.mute = {
.name = name_mute,
.amux = TV,
.gpio = 0x8000,
},
},
[SAA7134_BOARD_ORIENT_HW_504] = {
/* Orient HW-504 (Возможно Orient HW-508 и Hawell HW-404M7) */
/* Богословский Виктор E-mail: bogovic at bk.ru */
.name = "Orient HW-504",
.audio_clock = 0x00200000,
.tuner_type = UNSET,
.radio_type = UNSET,
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
.gpiomask = 0x01fc00,
.inputs = {{
.name = name_comp1, /* название входа */
.vmux = 3, /* номер канала видео микшера */
.amux = LINE1, /* название канала аудио микшера */
.gpio = 0x389c00, /* битовая маска GPIO */
}
}},
[SAA7134_BOARD_FLYVIDEO2000] = {
/* "TC Wan" <tcwan@cs.usm.my.> */
.name = "LifeView/Typhoon FlyVIDEO2000",
.audio_clock = 0x00200000,
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
.radio_type = UNSET,
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
Думаю, будет уместно рассмотреть здесь поля структуры
SAA7134_BOARD_ORIENT_HW_504
* .name - имя карты, которое будет присвоено ей после определения
модулем, пишем "Orient HW-504"
* .audio_clock - аудио частота (как правило, 2 варианта 0x00200000
или 0x00187de7) и хотя аудио наша плата не поддерживает, я написал
0x00200000
* .tuner_type - тип TV тюнера у нас, его нет, пишем UNSET
* .radio_type - тип радио, и его у нас нет, пишем UNSET
* .tuner_addr - адрес TV тюнера, пишем ADDR_UNSET
* .radio_ addr - адрес радио, пишем ADDR_UNSET
* .gpiomask - битовая маска GPIO оказывает самое важное влияет на
работу платы в целом. Значение маски GPIO можно получить путем
побитового сложения всех его значений (берем все значения GPIO
Value из программы flytest), т.е. 0x00010000 | 0x0001FC00 |
0x00016C00 = 0x01fc00, пишем 0x01fc00
* .name - название входа, пишем name_comp1
* .vmux - номер канала видео микшера, смотрим лог программы flytest -
Video input: 3, пишем 3
* .amux - название канала аудио микшера, пишем LINE1 (flytest - Audio
input: Analog Line1), думаю можно вообще не описывать этот
параметр, т.к. аудио наша плата не поддерживает
* .gpio - Возможно надо формировать так же, как gpiomask , я
полностью не разобрался и просто взял значение из первого чипа,
после инициализации (flytest - GPIO Mode: 0x00389C00), тем более
результат будет таким же, пишем 0x389c00
Далее в этом же файле ищем вот такой участок кода и добавляем описание
нашей карты, как устройства в целом, для того, чтобы модуль смог сам
опознать карту:
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
.subvendor = 0x4e42, /* "Typhoon PCI Capture TV Card" Art.No. 50673 */
.subdevice = 0x0138,
.driver_data = SAA7134_BOARD_FLYVIDEO3000,
},{
.vendor = 0x1131,
.device = 0x7130,
.subvendor = 0x1131,
.subdevice = 0x0000,
.driver_data = SAA7134_BOARD_ORIENT_HW_504,
},{
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7130,
.subvendor = 0x5168,
.subdevice = 0x0138,
.driver_data = SAA7134_BOARD_FLYVIDEO2000,
Здесь поля структуры имеют следующие значения:
* .vendor - берем из лога команды lspci -vn Vendor ID, пишем 0x1131
(можно PCI_VENDOR_ID_PHILIPS)
* .device - берем из лога команды lspci -vn Device ID, пишем 0x7130
(можно PCI_DEVICE_ID_PHILIPS_SAA7130)
* .subvendor - берем из лога программы flytest - SubVenID, пишем
0x1131
* .subdevice - берем из лога программы flytest - SubDevID, пишем
0x0000
* .driver_data - то, как назвали карту в файле saa7134.h, пишем
SAA7134_BOARD_ORIENT_HW_504
Сохраняемся, закрываем файл.
Ну вот, все необходимые исправления сделаны, пора компилировать
наш новый модуль. Переходим в каталог /usr/src/linux-source-2.6.18/ и
выполняем следующие команды:
make oldconfig - для сохранения текущей конфигурации и
make modules - для компиляции модулей.
Возможно, гуру поморщатся и предложат еще десяток <<самых правильных>>
вариантов компиляции, но гуру почему-то таких статей не пишут и
наверное не читают, так что все в порядке.
После завершения компиляции копируем из каталога
/usr/src/linux-source-2.6.18/drivers/media/video/ файлы
saa6752hs.ko,
saa7134.ko,
saa7134-alsa.ko,
saa7134-dvb.ko,
saa7134-empress.ko,
saa7134-oss.ko
в каталог /lib/modules/2.6.18-4-686/kernel/drivers/media/video/saa7134/,
предварительно сохранив оригинальные файлы. Теперь можно очистить
исходные тексты, от результатов компиляции выполнив команду make clean
и перезагрузить систему.
Чтобы посмотреть загрузился ли наш модуль надо выполнить команду
v4l-info /dev/video0 | head -n 9
(утилита v4l-info входит в состав пакета xawtv) вот результат ее работы:
### v4l2 device info [/dev/video0] ###
general info
VIDIOC_QUERYCAP
driver : "saa7134"
card : "Orient HW-504"
bus_info : "PCI:0000:02:0c.0"
version : 0.2.14
capabilities : 0x5000015
[VIDEO_CAPTURE,VIDEO_OVERLAY,VBI_CAPTURE,READWRITE,STREAMING]
А чтобы посмотреть, как она работает надо выполнить команду
xawtv -nodga -noxv -geometry 640x480 -c /dev/video0
естественно к карте должна быть подключена камера.
Ну вот вроде бы и все. Надеюсь, что эта статья поможет, кому ни
будь прикрутить свою карту к Linux и главное сэкономит время и силы.
> Не интересует ли вас кстати включение поддержки вашей карты в основное ядро ?
Хотя я не автор, но позволю заметить по этому поводу следующее.
Включить патч в ядро было бы здорово и очень правильно,
но российские гавнюки маркетологи,
завозящие коробки с наваленными россыпью платами с китая и тайваня
брендируют(меняют на вымышленные технически бесполезные имена) названия плат,
чтобы скрыть от подобных им маркетологов
завод (кооператив, подвальчик) изготовителя.
И что? ...
Уважаемый, Линус.
Высылаю патч для модуля saa7134 семейства v4l2.
Патч обеспечивает поддержку платы, которая продаётся
в далёкой заснеженной России под вымышленным именем STUKNI_MARKETOLOGA_V_BUBEN_v1.
Прошу также включить в документацию ядра linux 3 фото этой платы,
может это поможет её опознать другим пользователям.
P.S. С другой стороны, если бы не было таких маркетологов,
на рынке продавались бы одни дорогие модели только крупных известных фирм.
Все это совершенно не является проблемой. Описываемые вами ужасы вовсе не являются чисто российской проблемой, говнюки маркетологи (кстати по моему эти слова - синонимы) есть не только у нас.
В описанном автором статьи случае проблема вовсе не в этом, а в том что жадные китайцы сэкономили на копеечной еепромке и в результате чип использует стандартные филлипсовские PCI идентификаторы. Что в свою очередь делает невозможной автоматическое опознавание карты драйвером. Изменения, описанные в статье, для включения в стандартное ядро увы не годятся. Сбственно поэтому я и задал свой вопрос.
>> Изменения, описанные в статье, для включения в стандартное ядро увы не годятся.
>> Сбственно поэтому я и задал свой вопрос
Согласен с тем, что мой патч не годится для помещения в стандартное ядро, т.к. нет возможности однозначно идентифичировать плату... Маркетологи постарались!
Еще Вы писали:
>> Не интересует ли вас кстати включение поддержки вашей карты в основное ядро ?
В общем немного,
1. адаптировать ваши изменения к последней версии ядра, исключив часть с PCI идентификаторами и добавив строку в Documentation/video4linux/CARDLIST.saa7134
2. убедиться что все работает
3. сгенерить патч и отправить его автору драйввера и в LKML
Если у вас нет на это времени, пункты 1 и 3 могу взять на себя, тогда с вас только тестирование :)
>Если у вас нет на это времени, пункты 1 и 3 могу
>взять на себя, тогда с вас только тестирование :)
1. Как я понимаю для этого надо, как минимум, поставить последнию версию ядра и "убедиться что все работает" (а мои задачи, к сажалению, далеки от академического интереса).
2. "Если у вас нет на это времени" - а его действительно нет, незнаю как умудрился написать статью (мне подобная писанина помогает упорядочить свои мысли).
3. Самое основное препядствие, это от, что на карте есть один TV выход и я никак его не описал в своем патче :( . А отсылать недоделаный патч, по крайней мере, не совсем порядочно.
4. Немного оффтопика... Если есть люди знакомые с ZoneMinder 1.22.3 прошу откликнуться на bogovic@bk.ru (бьюсь с ним уже третью неделю...)
Читал у кого-то не заработали новые модули (modprob ругался на неверный формат)
У меня было тоже самое!
Я долго не эксперементировал.
Вообще говоря "make modules" - это старая как мир команда. Сейчас все обходится только "make".
Возможно в этом проблема.
Я делал на Ubuntu 9.04 и просто заюзал "make-kpkg kernel_image"
/установил новое ядро как новый пакет и все заработало. бага была лишь в том что initrd не прописался у GRUBa в menu.lst
vlc отлично показывает!
Родная прога из комплекта (под Windows) работала хуже!!! (по качеству картинки)
мучаюсь с zoneminder-ом, ругается на "shared memory not valid"
хотя все как по мануалам в /etc/syscntr.conf прописывал и так и сяк...
За статью спасибо. Хотел бы принять участие в разработке драйвера для AverTV Express Slim. Ибо надоело запускать нехорошую ось для просмотра телевизора...
У меня тоже имеется плата видеозахвата на saa7134
с 4-мя входами. вот что про нее:
Linux video capture interface: v2.00
saa7130/34: v4l2 driver version 0.2.14 loaded
saa7134 0000:01:01.0: PCI INT A -> GSI 21 (level, low) -> IRQ 21
saa7134[0]: found at 0000:01:01.0, rev: 1, irq: 21, latency: 64, mmio: 0xdfeffc00
saa7134: <rant>
saa7134: Congratulations! Your TV card vendor saved a few
saa7134: cents for a eeprom, thus your pci board has no
saa7134: subsystem ID and I can't identify it automatically
saa7134: </rant>
saa7134: I feel better now. Ok, here are the good news:
saa7134: You can use the card=<nr> insmod option to specify
saa7134: which board do you have. The list:
saa7134: card=0 -> UNKNOWN/GENERIC
saa7134: card=1 -> Proteus Pro [philips reference design] 1131:2001 1131:2001
/dev/video0 нормально показывает и при GENERIC. Но на плате-то 4 входа для захвата, и хочется использовать их все. Гуглил интернет, но у большинства почему-то тюнеры... Подскажите, как задействовать остальные входы.
>/dev/video0 нормально показывает и при GENERIC. Но на плате-то 4 входа
>для захвата, и хочется использовать их все. Гуглил интернет, но у
>большинства почему-то тюнеры... Подскажите, как задействовать остальные входы.
Вывод загрузки модуля saa7134 для безымянных плат
(без EEPROM в которых прошит ID производителя)
абсолютно ни о чём не говорит.
У тебя есть мизерный шанс что тебе кто-то подскажет,
но только если ты приведёшь ссылку на фото платы и(или хотя бы) название платы,
которое в 90% придумал г.вномаркетолог-продавец, а не производитель,
что ещё сильнее запутывает дело.
>2 Android
>
>На плате один чип?
>Если да, то Вам необходимо в просмоторщике (например Xawtv) попробывать выбрать номер
>входа.
>Дайте вывод команды lspci -vn.
2THK
да, чип один, но входов 4. При GENERIC работает только первый, т.к. есть только /dev/video0
lspci говорит
>[оверквотинг удален]
>>
>>На плате один чип?
>>Если да, то Вам необходимо в просмоторщике (например Xawtv) попробывать выбрать номер
>>входа.
>>Дайте вывод команды lspci -vn.
>
>2THK
>
>да, чип один, но входов 4. При GENERIC работает только первый, т.к.
>есть только /dev/video0
в программе захвата указывайте номер канала - 0,1,2,3
Сама статья, готовые модули с поддержкой Orient HW-504, HW-508, Howell HW-404M7 и других клонов находятся по адресу:
Поддержка устройств видео захвата на кодеках SAA713x в Linux
Здесь Вы найдете модули для Debian Etch 4.0 (ядро 2.6.18 ) и Debian Lenny 5.0 (ядро 2.6.26).