Ключевые слова: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 и главное сэкономит время и силы.
>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).
Началась подписка на журнал Linux Format на 2010 год.
Спешите оформить подписку на единственный в России ежемесячный журнал о Linux!
Все, оформившие подписку на печатную версию журнала, получают диск с архивом журнала Linux Format за
2005-2009г. в подарок. Также в подарок вы получаете именную электронную версию в формате PDF.
Теперь вы можете приступить к чтению журнала сразу в момент выхода свежего номера, не дожидаясь,
пока вам доставят бумажную версию.
Кроме того, все, оформившие подписку на первую половину или весь 2010 год в
интернет-магазине ГНУ/Линуксцентра, автоматически становятся участниками розыгрыша ценных призов: