Информация для тех, кому хотелось бы пользоваться тюнером Behold TV T7 под Linux.
Все права на исходные, бинарные и прочие коды, которые вам потребуются, принадлежат их владельцам и их авторам. Я не имею к ним никакого отношения и не претендую на их авторство.
Я, со своей стороны, выкладываю на всеобщее обозрение только результат своей работы, целью которой было добиться приемлемой работы тюнера Behold TV T7 под операционной системой Linux.
Результатом моей работы, по сути, является хак, в классическом понимании этого слова. Поэтому, в исходниках, после применения моих diff-ов, остаётся много ненужного, но не мешающего работе кода.
Что осталось не решенным, и с чем, на мой взгляд, можно смириться:
Я не ставил себе целью решить вопрос с переключением антенного входа RF тюнера XC5000C. Так как тюнер эксплуатируется в “стриммер-сервере”, круглосуточно вещающем в локальную сеть уже несколько месяцев, то необходимость переключать на нём антенные входы не возникает. При желании, никто не мешает сделать такую доработку самостоятельно.
Кроме того, даже довольно слабый сигнал всё равно проникает на вход RF тюнера, даже если выбран другой вход. Код драйвера фиксировано работает с антенным входом (ЕМНИП) номер 1.
“Попугаи”, в которых должен отображаться уровень принимаемого сигнала, уровень качества цифрового потока, и тд. и тп., все эти “попугаи” показывают либо "температуру на Марсе", либо вообще остаются неизменны.
Чтобы эти “попугаи” показывали что-нибудь достоверное, необходима техническая документация на применённые RF тюнер XC5000C и сам демодулятор SI2168. Без неё непонятно, с каких регистров, как, и что читать. В каких единицах интерпретировать полученные данные.
Документации в публичном доступе, естественно, нет. Иначе бы, давным-давно, тюнеры с подобным набором микросхем поддерживались бы любым дистрибутивом Linux, что называется, “из коробки”. Так что, увы. Да и не нужно это было для моей задачи.
Система АРУ.
У меня нет измерительной аппаратуры и генераторов сигнала, для того, чтобы корректно провести замеры и оценить, правильно ли работает Автоматическая Регулировка Уровня сигнала. (AGC на англ.)
Всё, что я смог сделать, это сравнить поведение напряжения регулировки на соответствующей ножке RF тюнера, при работе под Windows и Linux драйвером. При неизменных условиях приёма, в одном и том же месте, на одной и той же антенне. В моменты, когда тюнер только что залочил мультиплекс, при вынутой антенне, только что вставленной, и тд и тп.
Могу сказать, что АРУ под Linux ведёт себя очень похоже с Windows драйвером, но не идентично.
Если я ошибся С АРУ, и чем это грозит.
Я занимался Linux драйвером на 4 этаже кирпичного здания с окнами, смотрящими не на передающую антенну, и передающая антенна находилась от меня на расстоянии несколько километров. Всё это в условиях городской застройки. (Центр города)
Приём вёлся на обрезок витой пары длиной около метра.
Что под Windows, что под Linux, оба мультиплекса открывались с одинаковой скоростью, и приём шел одинаково уверенно.
Но, если я неправильно разобрался с АРУ, и если вы живёте в непосредственной близости от передающей антенны/пользуетесь телевизионной кабельной сетью с очень большим уровнем сигнала, то есть вероятность перегрузить антенный вход RF тюнера и получить искаженный сигнал до такой степени, что ни один мультиплекс не залочится и ни один канал не откроется. В этом случае, вам может помочь делитель уровня сигнала, как на старых отечественных телевизорах, с соотношением примерно 1 к 10.
Либо вам придётся разбираться с константами АРУ самостоятельно.
Аналоговый приём телевидения на этот тюнер обеспечивается.
Я не проверял низкочастотные (AV) аналоговые входы, но, по идее, они должны работать.
Также не проверял работу пульта ДУ, хотя соответствующее устройство добавляется.
Также не проверял приём аналогового радио.
Работа с кабельным цифровым DVB-C телевидением тоже не проверялась.
В процессе работы над драйвером я пользовался популярным плеером VLC, для того, чтобы принимать как цифровое, так и аналоговое эфирное ТВ.
Попутно обнаружил в нём несколько ошибок, связанных как раз с работой с ТВ тюнерами, отправил разработчикам патчи, и баги были исправлены начиная с версии VLC 2.1.3 .
https://trac.videolan.org/vlc/ticket/10309https://trac.videolan.org/vlc/ticket/10287Единственное но, авторы VLC отказались внести одно исправление в код VLC, поэтому для работы аналогового ТВ в свежих версиях VLC с данным тюнером (чип SAA7135) необходимо принудительно включать режим YUYV командой :v4l2-chroma=YUYV .
https://trac.videolan.org/vlc/ticket/10378Для вещания мультиплексов в сеть я воспользовался программой DVBLAST, дописав её немного, чтобы можно было переключать PLP.
Код с моей доработкой я отправлял в их mail лист, если кому-нибудь будет интересно.
Материнская плата в стриммер-сервере имеет 4 “честных” PCI слота, в каждый из которых я планировал установить по одному тюнеру Behold TV T7, чтобы вещать в сеть мультикастом все 20 каналов ТВ и 3 радио одновременно. Нагрузка на процессор при работе DVBLAST и одного тюнера минимальна. Плюс DVBLAST ещё и в том, что с его помощью можно ретранслировать Program Guide (телепрограмма с описанием, наш второй мультиплекс идёт с ним), субтитры, где они есть, телетекст. Deinterlace можно делать непосредственно на клиентском VLC, если это необходимо. Даже ActiveX плагин VLC, по идее, это умеет.
Почему 4 тюнера для 2х мультиплексов? Потому, что один демодулятор способен обрабатывать только один Physical Layer Pipe (PLP) в конкретный момент времени. Поскольку, в первом мультиплексе у нас сразу 3 PLP, то для 2 наших мультиплексов требуется 4 демодулятора, а значит и 4 тюнера T7.
К сожалению, обстоятельства поменялись, и проверить работу 4х тюнеров одновременно мне не удалось. С одним тюнером “полёт” несколько месяцев нормальный.
Где взять исходники.
Для успешной сборки драйвера вам потребуется самостоятельно (из-за проприетарности кода) найти исходные коды, которые раньше были свободно доступными для загрузки у другого вендора под его продукт, но с таким же точно демодулятором.
Сейчас ссылка на этот архив с деревом media_build пока что доступна для загрузки со страницы
http://members.quicknet.nl/pe63/DVBSky-T9580.htmlДистрибутив и версия операционной системы, с которой я работал - Fedora 19 I686.
Какие пакеты требуются, и как подготовить ОС к сборке v4l media_build очень хорошо расписано на сайте
http://www.linuxtv.org/wiki/index.php/H ... ce_Drivers , поэтому, описывать этот процесс я здесь не буду.
Главное, в итоге, добиться того, чтобы пробная компиляция media_build проходила без ошибок. И после этого можно положить в ваш media_tree недостающие компоненты исходников для драйвера Si2168, подключить их, применить мои diff-ы, и собственно собрать сам драйвер для Behold TV T7.
Где взять обновление микропрограммы для Si2168.
Благодаря содействию компании Behold фирма производитель чипов Silabs выпустила исправление микропрограммы для своего демодулятора. Это обновление исправляет работу с PLP2 первого мультиплекса, своеобразная версия которого вещается в некоторых регионах.
“Вытащить” данное обновление можно из свежих drv_v5450.zip Windows драйверов для тюнера T7.
Вам нужно самостоятельно (из-за проприетарности кода), вашим любимым HEX редактором открыть файл beholder.bin и найти последовательность байт 04 01 80 00 61 D3 92 EC. С начала этой последовательности и до последовательности байт 05 2B D8 0E BE BB 7D 2D включительно выделить блок и сохранить полученный бинарный блок в отдельный бинарный файл.
Далее, какой-либо утилитой (под windows идеально подойдёт эта:
http://stahlworks.com/dev/swiss-file-knife.html ) конвертировать полученный бинарный файл в HEX формат и привести его к виду (на примере первой последовательности байт) 0x04,0x01,0x80,0x00,0x61,0xD3,0x92,0xEC, - по 8 байт на строку.
В заголовок файла, перед первой последовательностью байт, добавить строки:
Код:
#ifndef _Si2168_PATCH_3_0b20_TABLE_H_
#define _Si2168_PATCH_3_0b20_TABLE_H_
#define Si2168_PATCH_3_0b20_PART 68
#define Si2168_PATCH_3_0b20_ROM 3
#define Si2168_PATCH_3_0b20_PMAJOR '3'
#define Si2168_PATCH_3_0b20_PMINOR '0'
#define Si2168_PATCH_3_0b20_PBUILD 2
unsigned char Si2168_Patch_3_0b20[] = {
<тут пошли хекс коды>
…
…
…
А в конце, добавить:
Код:
};
#define Si2168_Patch_3_0b20_LINES (sizeof(Si2168_Patch_3_0b20)/(8*sizeof(unsigned char)))
#endif /* _Si2168_PATCH_3_0b20_TABLE_H_ */
Файл с бинарным патчем микропрограммы готов, переименуйте его в si2168_30_ROM3_Patch_3_0b20.h (Заглавные и прописные сохраняем!).
Он должен получиться размером примерно 130 килобайт.
Из-за довольно большого патча первый запуск тюнера после включения компьютера длится примерно 20 секунд. Последующие запуски почти мгновенны.
Не забудьте, что для RF тюнера XC5000C тоже требуется микропрограмма. Если в вашем дистрибутиве её нет, то загрузить её можно по ссылке
http://www.kernellabs.com/firmware/xc50 ... .1.30.7.fw и положить в соответствующее место. (/lib/firmware/)
Также для модуля ядра RF тюнера XC5000C необходимо при его загрузке передавать параметр options xc5000 no_poweroff=1
Исправлено 2015-05-30Для этого, в Fedora 19, я ошибочно воспользовался "левым" для модуля XC5000C файлом: openfwwf.conf
В моём случае ничего страшного не произошло, и всё заработало как надо, но конечно, лучше действовать так, как задумано авторами вашего дистрибутива. (Если есть, то применить утилиту modconf, или создать/отредактировать файл в /etc/modprobe.d/<имя файла как имя модуля>.conf или tuner.conf или behold.conf) В каждом дистрибутиве по-своему. Особенно, если его покусал Поттеринг. :-)
Это или баг в его драйвере, или просто недоработка, но без этого параметра в RF тюнер ЕМНИП бесконечно начинает заливаться его микропрограмма, и, никакой настройки на нужную частоту, естественно, не происходит.
Сама фича с выключением, вроде бы и полезная, экономит энергию, при неиспользовании RF тюнер меньше греется, но для меня это было некритично, так как стример работает круглосуточно.
Все файлы с исходниками для SI2168 начинаются на SI216 или на SI215. Если вы будете собирать их в свежем, или моём снапшоте media_build , то их нужно скопировать и положить по тому же самому пути: media_build\linux\drivers\media\dvb-frontends\ Сюда же нужно скопировать файл с бинарным патчем для демодулятора si2168_30_ROM3_Patch_3_0b20.h
Чтобы подключить исходники демодулятора к дереву media_build нужно:
В файл media_build/v4l/.myconfig добавить строку:
Код:
CONFIG_DVB_SI2168 := m
В файл media_build/linux/drivers/media/dvb-frontends/Kconfig добавить перед строкой config DVB_SI21X
Код:
config DVB_SI2168
tristate "Si2168 based"
depends on DVB_CORE && I2C
default m if !MEDIA_SUBDRV_AUTOSELECT
help
A DVB-T2/T/C tuner module. Say Y when you want to support this frontend.
В файл media_build/linux/drivers/media/dvb-frontends/Makefile добавить после строки drxk-objs := drxk_hard.o
Код:
si2168-objs := si2168_demod.o si2168_si2158.o si2168_drv.o
и в самом конце этого файла добавить строку:
Код:
obj-$(CONFIG_DVB_SI2168) += si2168.o
Мой снапшот v4l от 18 ферналя 2014 года. Я присоединю его к сообщению, diff-ы должны лечь на него без проблем, единственное, что, возможно, его предварительно потребуется очистить от следов моей системы.
После попытки первой сборки станет понятно, требуется ли чистка.
Diff-ы в отдельном аттаче.
saa7134*.diff для соответствующих файлов в media_build/linux/drivers/media/pci/saa7134/
si2168*.diff для соответствующих файлов в media_build/linux/drivers/media/dvb-frontends/
xc5000.c.diff для файла media_build/linux/drivers/media/tuners/xc5000.c
PS:
Присоединить к сообщению снапшот media_build не получилось, видимо, из-за размера 13 магабайт.
Вот ссылка на file.mail.ru:
http://files.mail.ru/77C2EAB043AF4A64AC3E5ED4AEF41120"Файлы будут храниться до 22 мая 2014 года, каждое скачивание файлов продлевает их срок хранения еще на 5 дней."