Настройка GoTView PCI 7135 под Linux

ANdyCV
  • 3 августа 2005
  • 15k

Решил я себе прикупить новый ТВ-тюнер для компьютера вместо своего старенького AverMedia 203 (на BT878), работавшего мне верой и правдой. Побудил меня к смене любимой железки тот факт, что у него нет стерео приёма на FM. По крайней мере в Linux. Да и просто разнообразия захотелось. Кроме того, многочисленные статьи расхваливали новый чип от Phillips.

К слову говоря, AverMedia 203 прекрасно работал под Windows и Linux. Соответственно, первое, что я сделал - это посмотрел обзоры на IXBT.com, посмотрел отзывы в различных форумах и понял, что ситуация неоднозначная...

Промахнуться мне очень не хотелось, жива ещё память о Pinnaсle PCTV Pro (чип BT878). Несмотря на то, что Pinnacle Systems имеет авторитет в дорогих железках и софте для телевидения, её тюнер имел софт, который регулярно вис и тормозил. Таким образом, Pinnacle был отвергнут по горькому опыту. Далее из конкурентов оставались AverMedia, Beholder и GoTView при всём при этом, цены этих тюнеров отличаются не в разы. Тут я написал на форум сайта PcTuner.Ru, посвященного только ТВ-тюнерам, где мне однозначно посоветовали приобретать GoTView PCI 7135. Сайт я этот считаю наиболее авторитетным и поэтому без особых размышлений купил себе GoTView PCI 7135 - далее буду называть его GTV.

Я принёс GTV домой, распаковал красивую коробочку, с заманчивыми и зазывными надписями. Комплектация оказалась очень разумной. В коробке не было ненужных бирюлек, но было всё, что необходимо. Там были: аудио переходник, плата, пульт, инструкция, ИК-приёмник, диск с драйверами. Посмотрев на всю эту красоту, я поставил софт под Windows и всё великолепно заработало... Пульт имеет нереально хорошую чувствительность и работает отлично. Программа телевидения скачивается по интернету и автоматически обновляется. Это тоже очень удобно. Ну из недостатков могу назвать только то, что у GTV нету плагина, который борется с рекламой. Это на мой взгляд большой минус. Но думаю, что в дальнейшем это решится программистами GoTView.

Вывод: под Windows всё работает отлично, так что смело ставим оценку 5+. Хотя "+" это аванс на "противорекламный плагин".

Теперь решил я всё это запустить под Linux. Эту систему я очень люблю и стараюсь как можно больше времени проводить в ней. Причины моих предпочтений я объяснять не стану, т.к. это не входит в предмет описания. Так вот я запускаю Linux и ничего не работает. Далее в /var/log messages читаю...

saa7133[0]: found at 0000:02:05.0, rev: 240, irq: 185, latency: 32, mmio: 0xf7202000 <- вот найдена плата
saa7133[0]: subsystem: 5456:7135, board: UNKNOWN/GENERIC [card=0,autodetected] <- а вот она же неопознана.
saa7133[0]: board init: gpio is 0
saa7133[0]: dsp access wait timeout [bit=WRR]
saa7133[0]: dsp access wait timeout [bit=WRR]
saa7133[0]: i2c eeprom 00: 56 54 35 71 ff ff ff ff ff ff ff ff ff ff ff ff <- содержание EPROM ТВ-тюнера.
saa7133[0]: i2c eeprom 10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

В общем вывод такой такой, ТВ-тюнер видится, но не опознаётся. Соответственно работать он не собирается.

Тут я решил, что вероятно кто-то уже заставил работать эту железку... и к своему удивлению обнаружил, что никому не удавалось полноценно запустить запустить GTV под Linux. Зато на форуме присутствует значительное количество людей, желающих использовать GoTView под Linux. Тогда я написал в support GoTView, где мне ответили, что Linux направление совсем не поддерживается. Это меня чрезвычайно расстроило. В общем, ситуация образовалась патовая, никто не мог мне помочь. И выход был только один либо я всё делаю сам, либо не делает никто. А я не программист совсем, я юрист, только что закончивший институт. Ладно, пришлось разбираться с нуля, к слову говоря это заняло у меня два месяца. И если бы не помощь очень многих людей, то вряд ли бы я смог завершить эту работу так быстро.

Теперь по пунктам опишу последовательность действий. В качестве дистрибутива у меня стоит ASPLinux. Это мой любимый дистрибутив. Хотя уверен, что всё описанное будет работать и на других дистрибутивах. Все действия описанные мною, производим под правами root. Это необходимо.

И так, находим модули ядра Linux. Как правило, они находятся в директории /lib/modules/ваша версия ядра. Впрочем путь может немного отличаться в зависимости от дистрибутива. Для тех, у кого нет исходных текстов ядра и проблемы с их скачкой, я выкладываю уже готовые модули. Для их установки, необходимо:

Зайти в /lib/modules/ваша версия ядра (например у меня .6.11-1.14.1aspsmp) /kernel/drivers/media/video/saa7134 Зашли? Отлично.

Мы должный увидеть файл saa7134.ko. Это файл, который является демоном (т.е. драйвером), нашего ТВ-тюнера. Мы его сохраняем на всякий случай. Т.е. переименовываем его оригинальный файл saa7134.ko в файл saa7134.ko.bak Для этого находясь в директории saa7134, пишем в консоли вот такую команду:

cp saa7134.ko saa7134.ko.bak

и нажимаем "Enter". Если у вас этот файл совсем отсутствует, могу сообщить, что ваше ядро собрано без поддержки saa7134 и вам его необходимо перекомпилировать и включить поддержку в виде модуля - желательно. Или встроить в ядро. После сохранения оригинального файла, мы в эту папку пишем файл saa7134.ko, который я уже скомпилировал.

Точно по такому же алгоритму мы поступаем и с файлом tda9887.ko Он расположен /lib/modules/ваша версия ядра/kernel/drivers/media/video. Далее переименовываем его в tda9887.ko.bak пишем в терминале:

cp tda9887.ko tda9887.ko.bak

И копируем на его место мой файл tda9887.ko. Из директории стерео или моно... это влияет только на режим работы радио. При этом всё равно будет отбражаться режим работы MONO. Но реально звук будет все-таки стерео.

Или правим ручками файл tda9887.c.

Ищем там структуру вида:

static struct tvnorm radio = {
.name = "radio",
.b = ( cFmRadio | cQSS ),
.c = ( cDeemphasisON | cDeemphasis50 ),
.e = ( cAudioIF_5_5 | cRadioIF_38_90 ),

И меняем её на следующую структуру:

static struct tvnorm radio = {
.name = "radio",
.b = ( cFmRadio | cQSS ),
.c = ( cDeemphasisOFF ),
.e = ( cAudioIF_5_5 | cRadioIF_38_90 ),

Всё, теперь у вас радио работает в стерео режиме. Хотя GNOMERADIO показывать этого не будет.

Итак, файлы мы подменили... в принципе если вас не интересует пульт дистанционного управления, то этого достаточно.

ВНИМАНИЕ!!! Тщательно смотрите какой версии ядро у вас стоит. Т.к. при несовпадении версии ядра и модуля, никакой работоспособности я не гарантирую. То есть, если модуль скомпилирован для ядра версии 2.6.12, а вы его подсунете ядру 2.6.9, то вы виноваты сами.

Если же вас интересует пульт ДУ, то необходимо заменить файл saa7134-inputs.c Впрочем с пультом я пока не успел разобраться до конца. Тут вообще ситуация не очень ясна. Но в прилагаемом мною файле он опознан т.е. в var/log/messages мы можем обнаружить строчку registered device for IR – что собственно и есть пульт.

Есть второй путь, на мой взгляд наиболее правильный. Это правка исходных текстов ядра с последующей перекомпиляцией оного. Необходимо исправить 3 файла: saa7134-cards.c, tda9887.c, saa7134-input.c. Последний стоит править если вы хотите поиграться с пультом ДУ. Или использовать файлы, уже исправленные мною. Что в общем то проще.

ВНИМАНИЕ!!! Следите за соответствием версии ядра и файла.

Если же вы решили править, то вот алгоритм действий.

Находим /usr/src/ваша версия ядра/drivers/media/video/saa7134/saa7134-cards.c и ищем вот такую структуру:

[SAA7134_BOARD_FLYDVBTDUO] = {
/* LifeView FlyDVB-T DUO */
/* "Nico Sabbi <nsabbi@tiscali.it> */
.name = "LifeView FlyDVB-T DUO",
.audio_clock = 0x00200000,
.tuner_type = TUNER_PHILIPS_TDA8290,
//.gpiomask = 0xe000,
.inputs = {{
.name = name_tv,
.vmux = 1,
.amux = TV,
//.gpio = 0x0000,
.tv = 1,
},{
.name = name_comp1,/* Composite signal on S-Video input */
.vmux = 0,
.amux = LINE2,
//.gpio = 0x4000,
},{
.name = name_comp2,/* Composite input */
.vmux = 3,
.amux = LINE2,
//.gpio = 0x4000,
},{
.name = name_svideo,/* S-Video signal on S-Video input */
.vmux = 8,
.amux = LINE2,
//.gpio = 0x4000,
}},
}

И добавляем после нее еще одну... которая описывает нашу любимую карту. А именно GoTView PCI 7135:

},
[SAA7135_BOARD_GOTVIEW_7135] = {
/* "Andrey Cvetcov" <ays14@yandex.ru,andrey@ruadvokat.ru> */
.name = "GoTview 7135 PCI",
.audio_clock = 0x00187de7,
.tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
/*.tda9887_conf = TDA9887_PRESENT, - закомментировано намеренно */
.gpiomask= 0x00200003,
.inputs = {{
.name = name_tv,
.vmux = 1, /* Верно */
/* Use TV instead LINE0 - BigBiker <adminbsd@gmail.com> */
.amux = TV,
.gpio = 0x00200003,
.tv = 1,

},{
.name = name_comp1, /* Composite signal on S-Video input */
.vmux = 3,
.amux = LINE1,
.gpio = 0x00200003,

},{
.name = name_comp2,/* Composite Input */
.vmux = 8,
.amux = LINE1,
.gpio = 0x00200003,
},{
.name = name_tv_mono,/* TV - mono only */
.vmux = 1,
.amux = LINE2,
.gpio = 0x00200003,
}},
.radio = {
.name = name_radio,
/* .vmux = TV */
.vmux = 1,
.amux = LINE2,
.gpio = 0x00200003,
},},
};

Т.е. мы должны получить в итоге:

[SAA7134_BOARD_FLYDVBTDUO] = {
/* LifeView FlyDVB-T DUO */
/* "Nico Sabbi <nsabbi@tiscali.it> */
.name = "LifeView FlyDVB-T DUO",
.audio_clock = 0x00200000,
.tuner_type = TUNER_PHILIPS_TDA8290,
//.gpiomask = 0xe000,
.inputs = {{
.name = name_tv,
.vmux = 1,
.amux = TV,
//.gpio = 0x0000,
.tv = 1,
},{
.name = name_comp1,/* Composite signal on S-Video input */
.vmux = 0,
.amux = LINE2,
//.gpio = 0x4000,
},{
.name = name_comp2,/* Composite input */
.vmux = 3,
.amux = LINE2,
//.gpio = 0x4000,
},{
.name = name_svideo,/* S-Video signal on S-Video input */
.vmux = 8,
.amux = LINE2,
//.gpio = 0x4000,

/* add new bracket - BigBiker <adminbsd@gmail.com> */
}},
},
[SAA7135_BOARD_GOTVIEW_7135] = {
/* "Andrey Cvetcov" <ays14@yandex.ru,andrey@ruadvokat.ru> */
.name = "GoTview 7135 PCI",
.audio_clock = 0x00187de7,
.tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
/*.tda9887_conf = TDA9887_PRESENT, -заккоментированно намерянно */
.gpiomask= 0x00200003,
.inputs = {{
.name = name_tv,
.vmux = 1,
/* Use TV instead LINE0 - BigBiker <adminbsd@gmail.com> */
.amux = TV,
.gpio = 0x00200003,
.tv = 1,

},{
.name = name_comp1, /* Composite signal on S-Video input */
.vmux = 3,
.amux = LINE1,
.gpio = 0x00200003,

},{
.name = name_comp2,/* Composite Input */
.vmux = 8,
.amux = LINE1,
.gpio = 0x00200003,
},{
.name = name_tv_mono,/* TV - mono only */
.vmux = 1,
.amux = LINE2,
.gpio = 0x00200003,
}},
.radio = {
.name = name_radio,
/* .vmux = TV */
.vmux = 1,
.amux = LINE2,
.gpio = 0x00200003,
},
},
};
const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);

Далее в этом же файле ищем сторочку:

struct pci_device_id saa7134_pci_tbl[] = {
{
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
.subvendor = PCI_VENDOR_ID_PHILIPS,
.subdevice = 0x2001,
.driver_data = SAA7134_BOARD_PROTEUS_PRO,
},{

И добавляем после неё следующее:

.vendor = 0x1131,
.device = 0x7133,
.subvendor = 0x5456, /* GoTView */
.subdevice = 0x7135, /* Model PCI 7135 */
.driver_data = SAA7135_BOARD_GOTVIEW_7135
},{

В итоге мы получаем следующую структуру:

struct pci_device_id saa7134_pci_tbl[] = {
{
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
.subvendor = PCI_VENDOR_ID_PHILIPS,
.subdevice = 0x2001,
.driver_data = SAA7134_BOARD_PROTEUS_PRO,
},{
.vendor = 0x1131,
.device = 0x7133,
.subvendor = 0x5456, /* GoTView */
.subdevice = 0x7135, /* Model PCI 7135 */
.driver_data = SAA7135_BOARD_GOTVIEW_7135

},{

Далее в этом же файле ищем структуру:

case SAA7134_BOARD_AVERMEDIA_307:

И добавляем после неё:

case SAA7135_BOARD_GOTVIEW_7135:
dev->has_remote = 1;
break;

И получаем вот что:

case SAA7134_BOARD_AVERMEDIA_305:
case SAA7134_BOARD_AVERMEDIA_307:
case SAA7135_BOARD_GOTVIEW_7135:
dev->has_remote = 1; /* <-это говорит ядру о том, что у карты есть пульт ДУ */
//case SAA7134_BOARD_SABRENT_SBTTVFM не успел его оттестировать.

Уффф всё, с файлом saa7134-cards.c закончили.

Теперь приступим к файлу saa7134.h.

Ищем вот такую строчку:

#define SAA7134_BOARD_FLYDVBTDUO 55

И после неё добавляем:

#define SAA7135_BOARD_GOTVIEW_7135 56

И вот что получаем:

#define SAA7134_BOARD_FLYDVBTDUO 55
#define SAA7135_BOARD_GOTVIEW_7135 56 /* <- теперь карта имеет номер 56 т.е. modprobe saa734 card=56 */

#define SAA7134_MAXBOARDS 8
#define SAA7134_INPUT_MAX 8

С этим файлом тоже пока всё.

Теперь приступим к файлу saa7134-input.c.

Ищем в нём:

case SAA7134_BOARD_AVERMEDIA_307:
ir_codes = md2819_codes;
mask_keycode = 0x0007C8;
mask_keydown = 0x000010;
polling = 50; // ms
/* Set GPIO pin2 to high to enable the IR controller */
saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
break;

И после сразу дописываем:

case SAA7135_BOARD_GOTVIEW_7135:
ir_codes = md2819_codes;
mask_keycode = 0x0007C8;
mask_keydown = 0x000010;
polling = 50; // ms
break;

И в итоге получаем вот такую картинку:

case SAA7134_BOARD_AVERMEDIA_307:
ir_codes = md2819_codes;
mask_keycode = 0x0007C8;
mask_keydown = 0x000010;
polling = 50; // ms
/* Set GPIO pin2 to high to enable the IR controller */
saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
break;
case SAA7135_BOARD_GOTVIEW_7135:<-тут широкое поле для деятельности , т.к. эти настройки относятся ir_codes = md2819_codes; <- только к пульту ДУ и являются пробным и тестовым вариантом.
mask_keycode = 0x0007C8;
mask_keydown = 0x000010;
polling = 50; // ms
break;
case SAA7134_BOARD_VIDEOMATE_TV_PVR:
ir_codes = videomate_tv_pvr_codes;
mask_keycode = 0x00003F;
mask_keyup = 0x400000;
polling = 50; // ms
break;
}

В принципе всё... можно компилировать ядро.

Вот содержимое моего скрипта запуска:

#!/bin/sh
/sbin/rmmod saa7134
/sbin/rmmod tda9887
/sbin/modprobe saa7134 card=56
/sbin/modprobe tda9887 secam=d

Параметрами можно смело поиграться...

Сам скрипт я тоже прилагаю... В принципе можно прописать загрузку модулей автоматически в /etc/modules.conf. Тут никаких хитростей и тонкосетй нет. Мне просто на фоне экспериментов было удобнее пользоваться скриптом.

Теперь поговорим про пульт ДУ...

Ядро нужно компилировать вот с такими параметрами:

CONFIG_VIDEO_BTTV := n
CONFIG_VIDEO_SAA7134 := m
CONFIG_VIDEO_IR := m
CONFIG_VIDEO_TUNER := m
CONFIG_VIDEO_TVAUDIO := n
CONFIG_VIDEO_CX88 := n

Хорошо, ядро мы скомпилировали, пишем cat /proc/bus/input/devices и далее смотрим вывод:

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
H: Handlers=kbd event0
B: EV=120013
B: KEY=4 2000000 3802078 f840d001 f2ffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
^^^^^^^^^^^^^^^^^^^^^^^^^^
это нам не очень нужно... это просто клавиатура PS/2

I: Bus=0011 Vendor=0002 Product=0006 Version=0000
N: Name="ImExPS/2 Generic Explorer Mouse"
P: Phys=isa0060/serio1/input0
H: Handlers=mouse0 event1
B: EV=7
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=103
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
это просто мышка... на PS/2

I: Bus=0001 Vendor=5456 Product=7135 Version=0001
N: Name="saa7134 IR (GoTview 7135 PCI)"
P: Phys=pci-0000:02:05.0/ir0
H: Handlers=kbd event2
B: EV=100003
B: KEY=40fc310 82140000 0 0 0 0 2048000 180 4001 9e0000 7bb80 0 0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
а вот это именно то что нам нужно... это и есть IR-датчик GOTVIEW.

Хорошо... а теперь посмотрим вывод /var/log/messages , пишем:

cat /var/log/messages | grep device
и видим приблизительно следующее:
Jul 3 18:32:02 localhost kernel: saa7133[0]: registered input device for IR <- ДУ приёмник видится ядром!
Jul 3 18:32:02 localhost kernel: saa7133[0]: registered device video0 [v4l2] <- ТВ тюнер т.е. Video for Linux
Jul 3 18:32:02 localhost kernel: saa7133[0]: registered device vbi0
Jul 3 18:32:02 localhost kernel: saa7133[0]: registered device radio0 <- Радио тоже прекрасно видится.

Итог, радио у нас играет, телевизор показывает и пульт видится... Что и требовалось доказать. Теперь наша карта работает в Linux. В принципе раз у меня есть уже исправленные файлы, прилагаю их к данной статье (744KB). Кстати тут, в общем-то, написана УНИВЕРСАЛЬНЯ методика, как заставить работать тюнер под Linux. Просто для разных моделей тюнеров следует указывать разные адреса GPIO.

С пультом ничего сложного разобраться нет. Думаю, что скоро будет вторая часть этой статьи, посвящённая только пульту. Более подробно про самостоятельную настройку пульта вы можете прочитать тут:

Приятной вам работы в Linux... Если у Вас буду вопросы, то пишите, с удовольствием отвечу. Так же вы можете оставлять комментарии к статье.

Огромное СПАСИБО... форуму ASPLinux и отдельно: ukv; GoRo, Bomberman; Andriy (ASPLinux), bigbiker, pahan – это те люди, которые очень значительно помогли и облегчили мне работу.

Комментарии