Ядро 2.6, звук и TV тюнер в Linux XP Professional.

Почему Linux XP Professional.

Достаточно долгое время, начиная еще с версии 6.2, я использовал на своем компьютере Red Hat. Но после "раздвоения" флагманского дистрибутива на корпоративную и общественную версии задумался. Видимо, все таки поставил бы Федору, если бы не появился Linux XP. Он имеет свой сайт, на котором достаточно информации, чтобы составить о нем представление. Скажу только, что его основой стал Fedora Core 1, в которую добавлены мультимедийные возможности и русификация, насколько это сейчас возможно. Фактически добавлено то, что в первую очередь пришлось бы доделывать после установки Федоры.

Сразу скажу, что мои ожидания оправдались. В Open Office были русские шрифты, xmms воспроизводил mp3, MPlayer сразу показывал кино, в том числе и в DVD формате. И еще - это первый дистрибутив, на котором у меня стал правильно работать GRUB. До сих пор он не понимал геометрию дисков, что на прежнем моем компьютере, что на новом, поэтому приходилось использовать LILO.

Зачем обновлять ядро.

Причин может быть много, и в то же время - у каждого они свои. Меня больше всего интересовала поддержка нового железа. Если сказать честно, то не такого уж и нового. Но время шло, а моя системная плата на i865 с интегрированным звуком и видео так и не получила нормальной поддержки в ядре 2.4. Звук, для которого Intel выпустил alsa-драйвер, то работал, то нет, хотя, в свое время меня и это устраивало ("Red Hat 9 и Intel 865 - настройка звука)".

В новом ядре alsa (Advanced Linux Sound Architecture) заменила устаревшую аудио подсистему OSS (Open Sound System), что сулило звук без проблем. Кроме того, подсистема поддержки радио-, TV- тюнеров и плат видеозахвата v4l (Video For Linux) была усовершенствована и также добавлена в ядро 2.6.

Заманчивым выглядело заявление о том, что при работе пользовательской настольной системы с ядром 2.6 она становится более чувствительной к таким вещам как пользовательский ввод, т.е. пользователь имеет более быстрый отклик, а значит чувствует себя более комфортно (говоря по-умному - улучшается интерактивная производительность).

Конечно, изменений в новом ядре по сравнению с прежним намного больше, чем здесь упомянуто, но меня интересовали именно эти.

Как обновлять.

Есть два способа обновления ядра, - правильный и быстрый. Правильный предполагает получение самых свежих исходников, их компиляцию, установку в систему и настройку загрузки. Кроме того, переход на другую ветку ядра тянет за собой замену многих важных для системы пакетов и выполнение не всегда очевидных действий. Это - очень увлекательное занятие и, конечно же, каждый должен овладеть этим искусством, но... Все мы торопимся, хотим скорее получить результат - в общем, в данном конкретном случае я выбрал быстрый. Быстрый способ - установка нового ядра из RPM-пакета. Процедура аналогична установке любой программы и занимает меньше пяти минут вместе с перезагрузкой компьютера, что при замене ядра, естественно, необходимо.

Вот что говориться в Linux XP FAQ о том, как установить в этот дистрибутив ядро 2.6:

Все необходимые для этого rpm-пакеты Вы найдете на четвертом, дополнительном, диске дистрибутива. Скопируйте эти пакеты в Вашу домашнюю директорию и введите в терминале команды:
rpm -Uhv modutils*
rpm -ihv kernel-2.6.0*

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

Действительно, на четвертом диске есть rpm-пакеты ядра 2.6.0. Делаем, как сказано и перезагружаемся. В GRUB появился пункт меню с 2.6.0. Выбираем его, пошла загрузка, и почти сразу вот что:

General protection fault: 000(#1)
EIP: 0098:<00001013> Not tained
Bad EIP Value
Kernel panic

Загрузка рушится. Видимо есть проблема с распознаванием железа, я так понимаю. Но это не катастрофа, потому что пункт загрузки ядра 2.4, с которым инсталлировалась система, в GRUB остался, и он работает как ни в чем ни бывало. Система жива.

Поэтому, после некоторого размышления отправляюсь к месту рождения (или к месторождению) rpm-пакетов нового ядра. Оказывается, на сайте Red Hat уже есть версия 2.6.2. Наверняка она обкатана лучше. Процедура установки в точности такая же.

Перед перезагрузкой все таки есть смысл подстраховаться и сменить runlevel5 на runlevel3, иначе говоря отменить автоматический старт X Window, оставив только консоль. Находим файл /etc/inittab, в нем строку
id:5:initdefault:
исправляем на
id:3:initdefault:

Снова перезагружаемся. Теперь все идет нормально, заново обнаружились мои USB- клавиатура и мышь и в консольном режиме появляется приглашение login. Для входа в X Window надо набрать startx. Все работает.

Как оказалось - не совсем. При выходе из X Window получаем просто темный экран. Монитор работает, светится зеленый индикатор. Можно вслепую набрать команду, например reboot, и она выполниться. Такая же ситуация возникает при включении некоторых хранителей экрана.

При старте системы с автоматическим запуском X Window (runlevel5) происходит примерно то же самое - сначала, как положено, в консольном режиме идут сообщения, затем стартует X Window (появляется Х-поле и Х-курсор) и почти сразу изображение пропадает.

Похожие проблемы, возникающие при замене ядра 2.4 на версию 2.6 в Fedora Core 1, обсуждаются в форумах, причем связи с типом видео похоже нет. У меня интегрированное видео Intel 865, но то же самое происходит и на NVidia, и на ATI. Возможной причиной называют неправильную работу framebuffer, предлагаются какие то решения, но они не всегда срабатывают. Скорее всего, придется ждать более новой версии ядра 2.6, где эта ошибка будет исправлена.

Звук.

Теперь настроим звук. Честно говоря, я ожидал, что звук появится сразу. А зря, потому что если подумать, то станет ясно - в системе нет ничего от alsa, кроме модулей ядра. Конечно, звуковая карта определилась, но инструментов для работы с ней нет. Поэтому надо установить alsa-utils и alsa-lib, причем той же версии, что и модули, в данном случае 1.0.2. Их можно взять на alsa-project.org. Устанавливать и проверять работу лучше в консоли, до старта X Window, чтобы избежать конфликтов со звуковым сервером KDE arts. Ставятся они стандартным образом:

# cd ./alsa-utils-1.0.2/
# cd ./alsa/alsa-lib-1.0.2/
# ./configure
# make
# make install

Теперь в системе появились инструменты для работы со звуком. Конфигурируем звуковую плату утилитой alsaconf. Затем запускаем миксер alsamixer, снимаем mute (M), устанавливаем нужные уровни громкости и запоминаем сделанные изменения alsactl store. Теперь можно проверить звук - пробуем проигрывать файл:

# aplay /usr/share/sounds/info.wav

Если все работает, добавляем строку в файл /etc/rd.d/rc.local для того, чтобы установленные в миксере уровни громкости восстанавливались при старте системы:

alsactl restore

Итак, в консоли звук работает, в KDE пока нет. Для настройки звукового сервера KDE arts нужно сделать следующее:

Для возможности вывода звука приложениями, написанными для OSS, добавляем в файл /etc/modules.conf строки

alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss

Далее запускаем X Window и заходим в Центр управления KDE > Звук и мультимедиа > Звуковая система > Ввод-вывод звука. Устанавливаем метод ввода-вывода звука "Threaded Open Sound System". Звук в KDE появился - системные уведомления и xmms работают. Звук стабильно определяется после каждого старта системы, не то что при прежнем ядре. Как и положено, сервер звука arts обслуживает одновременно несколько источников. В этом можно убедиться, включив сразу несколько плееров на воспроизведение. У каждого есть свой регулятор громкости и можно микшировать источники звука - чем не пульт диджея.

TV тюнер.

TV.

У меня TV тюнер RoverMedia TV Link Pro FM (он очень похож на FlyTV Prime 34 FM). Вряд ли о его существовании известно ядру. Тем не менее попробуем, что получится.

Никаких сообщений при загрузке компьютера не было, но в списке устройств на шине PCI тюнер присутствует как Multimedia controller Phillips Semiconductors SAA7134. Это соответствует действительности, так как в качестве микросхемы управления используется именно saa7134. Но, одно дело для системы разобраться, что за pnp-карта установлена в компьютере, другое - заставить ее работать. Проверим. Из программ просмотра телевидения пока есть только xawtv, запускаем ее в окне Х-терминала. Ответ такой:

# xawtv
This is xawtv-3.88, running on Linux/i686 (2.6.2-1.160)
can't open /dev/video0: No such device
v4l-conf had some trouble, trying to continue anyway
v4l2: open /dev/video0: No such device
v4l2: open /dev/video0: No such device
v4l: open /dev/video0: No such device
no video grabber device available

Вот и появилась ясность - в системе нет устройств для работы с железом, подобным тюнеру. Именно так надо понимать /dev/video0. К просмотру, например, видео на CD это не имеет никакого отношения. Итак, нужен драйвер. Драйверов под Linux ни на CD из комплекта тюнера, ни на сайте RoverMedia нет. Потому что они не нужны (хотя, рекомендации по установке и конфигурационные файлы не помешали бы).

Небольшое отступление. Linux работает с устройствами через ядро и через модули, которые являются подгружаемой частью ядра. В основном все то, что для Windows распространяется на CD в качестве драйверов к устройствам, в Linux уже включено в ядро.

Чтобы получить доступ к устройству, нужно либо использовать ядро, либо подключить нужный модуль из числа имеющихся. Прикладные программы пишутся именно для работы с ядром и (при необходимости) с его модулями. Применительно к тюнеру, главное загрузить нужные для его работы модули (так как уже ясно, что само ядро ничего не знает про мой тюнер), возможно с какими то параметрами, а потом можно использовать любую понравившуюся программу для поиска каналов, просмотра и записи TV.

В ядре 2.4 модулей для работы с мультимедиа устройствами было не очень много, а для включения новых ядро нужно было пересобирать. В 2.6 мультимедийных модулей намного больше, и они, что называется, готовы к использованию.

Теперь придется разобраться, какие именно модули нужны. v4l и v4l2 - это программные модули Video for Linux и Video for Linux 2, но для их работы нужна связка с "железом". Чтобы выяснить, что же это за связка, надо хоть что то узнать про тюнеры. Так уж устроен Linux. Иногда приходиться копнуть поглубже.

Как уже говорилось, тюнер RoverMedia TV Link Pro FM основан на микросхеме управления saa7134. Это - самая большая микросхеме на печатной плате и на ней белым по черному напечатано ее наименование. Посмотрим, есть ли что то подходящее среди модулей ядра. Выведем список всех имеющихся в системе модулей в файл modules.txt, чтобы спокойно его изучить.

# modprobe -l > ./modules.txt

Искать надо в разделе /drivers/media/video/. Кажется, нашелся подходящий и называется он saa7134.ko. Попробуем его запустить.

# modprobe -v saa7134
insmod /lib/modules/2.6.2-1.160/kernel/drivers/media/video/videodev.ko
insmod /lib/modules/2.6.2-1.160/kernel/drivers/media/common/ir-common.ko
insmod /lib/modules/2.6.2-1.160/kernel/drivers/i2c/i2c-core.ko
insmod /lib/modules/2.6.2-1.160/kernel/drivers/media/video/v4l1-compat.ko
insmod /lib/modules/2.6.2-1.160/kernel/drivers/media/video/v4l2-common.ko
insmod /lib/modules/2.6.2-1.160/kernel/drivers/media/video/video-buf.ko
insmod
/lib/modules/2.6.2-1.160/kernel/drivers/media/video/saa7134/saa7134.ko

Судя по всему, результат положительный. Больше того, в соответствии с зависимостями, которые система знает лучше нас, этот модуль потянул за собой и другие. Вообще, о том, что нужно было запускать ir-common.ko (пульт ДУ), v4l1-compat.ko (совместимость со старым Video for Linux), v4l2-common.ko (Video for Linux 2), i2c-core.ko (поддержку цифровой шины I2C) можно было бы догадаться и сразу (а может и нет). Проверим, заработает ли xawtv сейчас.

# xawtv
This is xawtv-3.88, running on Linux/i686 (2.6.2-1.160)
scroll by 61    length 150      shown 0,000000  top 0,501961 => 0,583294
Error: Object "xawtv" does not have windowed ancestor

На окне Х-терминала появился прямоугольник с характерным "снежком" ненастроенного телевизора. Посмотрим вывод команды man xawtv, чтобы разобраться с клавишами управления. Нам сейчас достаточно стрелок вправо и влево на клавиатуре. Это - клавиши настройки частоты приема. В верхней части окна бегут увеличивающиеся числа, и на 49.75 МГц ловим ОРТ. Все заработало. Конечно, xawtv это не супер навороченная программа, но для быстрой проверки тюнера вполне подходит, ведь она есть практически в каждом дистрибутиве Linux. А если ее настроить, то вполне можно использовать постоянно. Раз все работает, можно вставить в файл /etc/rd.d/rc.local строку modprobe saa7134. Для начала этого достаточно, хотя в дальнейшем правильнее будет запускать каждый модуль отдельно и со своими параметрами, что позволит точнее настроить работу программ.

tvtime - более продвинутая программа. На сайте говорится, что основной целью при ее создании было получить качественное телевизионное изображение. Дополнительный плюс то, что есть rpm пакет именно для Red Hat Fedora Core 1, поэтому установка никаких проблем не вызвала. Для просмотра телевидения tvtime оказалась довольно удобной. Меню позволяет точно настроиться на канал, использовать фильтры и иметь действительно хорошие картинку и звук.

Сейчас звук от тюнера к звуковой карте передается внешним кабелем. Мне не удалось получить звук по шине PCI, хотя такой режим работы предусмотрен в микросхеме saa7134. Возможно, этого не позволяет соответствующий модуль ядра, или я просто что то пропустил, так что пока этот вопрос остается. Если кто то найдет решение и поделится опытом, буду благодарен.

Радио.

Мой тюнер умеет также принимать FM радио. QtRadio - небольшая программа как раз для этих целей. Автор Pawel Pustelnik. Программа имеет все необходимые функции - автоматическую и ручную (кнопочную и ползунковую) настройки, эквалайзер, возможность записи звука в файл, скины. Для установки имеется инсталлятор. Архив распаковываем, заходим в него и там выполняем:

#./install.sh

Инсталлятор задаст только один вопрос - хотите ли использовать lirc (модуль для пульта дистанционного управления). Конечно "Y". Ждем завершения компиляции и установки, набираем в X-терминале qtradio или создаем ссылку на рабочем столе KDE, настраиваемся на станции - все работает.

Пульт ДУ.

Пульт заработал сразу, ведь модуль ir-common загружен. Надо сказать, что ir - новый модуль поддержки пультов ДУ для устройств Video for Linux. Он является частью saa7134. Обычно для этих целей использовался проект lirc, обладающий большими возможностями, но и требующий более сложной настройки. Модуль ir превращает для системы кнопки пульта ДУ в дополнительные клавиши мультимедийной клавиатуры. Их настройка может производиться средствами X Window. ir может работать как совместно с lirc, так и без него. Не могу сказать, что я сильно в этом разбирался, пока меня устроило, что работает переключение каналов нажатием на пульте цифровых кнопок и кнопок вперед-назад. Главное что, и TV и FM понимают пульт ДУ. Пожалуй, нужно будет повозиться со всем этим хозяйством, оно того стоит.

Очень короткое заключение.

Linux XP Professional - удачный дистрибутив. Надеюсь, он будет совершенствоваться и дальше.

Несмотря на некоторые проблемы, переход даже на ранние версии ядра 2.6, на мой взгляд, оправдан. Положительного гораздо больше. Поддержка мультимедиа устройств в новом ядре меня полностью устроила.

Вот адрес, где собраны ссылки на десятки программ для TV и FM тюнеров, сотни для мультимедиа, тысячи для системы в целом.

Андрей Ракитин.
февраль 2004 г.


Пульт ДУ и мультимедиа клавиатура в Linux XP Professional.

В предыдущей статье "Ядро 2.6, звук и TV тюнер в Linux XP Professional" речь шла о том, как установить тюнер RoverMedia TV Link Pro FM. Напомню, что тюнер заработал, но остался вопрос управления им. В тот момент с пульта можно было только переключать каналы с помощью цифровых клавиш, и это, как оказалось, была чистая случайность. Хотелось задействовать нормальную поддержку пульта ДУ и мультимедийных клавиш на клавиатуре.

Сейчас мы восполним этот пробел. По прежнему используется система Linux XP Professional на ядре 2.6.2, установленном из rpm, запущены модули saa7134, v4l, v4l2 и ir , обеспечивающие работу TV тюнера.

Пульт ДУ

Вот фото пульта (предположительно RM-050, 24 кнопки, но точных сведений о модели нет) - не ради рекламы, а просто чтобы знать, с кем имеешь дело.

Если у Вас есть клавиатура с дополнительными мультимедийными клавишами, то мы настроим и ее. На моей USB клавиатуре Logitech iTouch Y-BA9 имеются 12 дополнительных клавиш для работы с интернет- и мультимедиа- приложениями.

Два слова о клавиатуре. Я встречал мнения о том, что USB клавиатура в Linux- это проблема, что на чистом USB не будут работать менеджеры загрузки, что в некоторых ситуациях клавиши не выдают скан код. Хочу заметить, что это не так. У меня работает GRUB, а раньше я использовал LILO, и никаких проблем никогда не было.

Итак, желательно обеспечить поддержку пульта и дополнительных клавиш, причем - самым простым способом.

Обычно для этой цели используют lirc. Этот пакет имеет большие возможности, но пока ядро 2.6 не готово для работы с ним. Или наоборот. В общем, они вместе еще не живут. Наверняка в ближайшее время ситуация изменится к лучшему, а пока используем другие средства.

Идея очень простая. Как отмечалось в первой части статьи, модуль ir, который входит в состав драйвера saa7134, превращает для системы кнопки пульта ДУ в дополнительные клавиши на клавиатуре. Поэтому, и в силу того, что некоторые скан коды клавиш уже известны системе, часть кнопок пульта заработала сразу после установки модулей ядра для тюнера. Наша задача - настроить кнопки пульта ДУ, а заодно и дополнительные клавиши на клавиатуре так, чтобы они выполняли требуемые нами действия по управлению тюнером, а может и не только им. После того, как модуль ir запущен, для системы становиться безразлично, где находятся эти клавиши, на самой клавиатуре, или на пульте ДУ. Поэтому будем настраивать сразу и то, и другое.

Небольшое отступление. Можно просто сделать так, как рассказано ниже. Но лучше все таки почитать очень полезный и ставший уже классическим труд Ивана Паскаля "X Keyboard Extension", он есть на многих сайтах в интернете. Потому, что начинать надо именно с настройки клавиатуры. И еще - стандартное, но обязательное предупреждение. Почти все действия, о которых здесь говорится, требуют полномочий суперпользователя, а такое вмешательство в систему может быть небезопасным. И поэтому лучше все-таки понимать, что делаешь. А перед исправлением конфигурационных файлов - конечно же сохранить оригинал, чтобы в случае неудачи можно было вернуться к исходному состоянию. Должен также заметить, что, хотя у меня все, о чем рассказывается ниже, получилось, статья эта не является рекомендацией к действиям. Простой обмен опытом, не более того.

Изначально дополнительные клавиши на клавиатуре и кнопки на пульте не работают. Конечно, какой-то скан код ими выдается. Но, в X Window он ни с чем не ассоциирован. В этом можно убедиться выполнив команду xev. Вывод, например, такой:

KeyPress event, serial 24, synthetic NO, window 0x2800001,
    root 0x3f, subw 0x0, time 215447, (-29,320), root:(742,405),
    state 0x0, keycode 174 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes:  ""

keycode 174 - это и есть скан код клавиши. А NoSymbol означает, что символическое имя этой клавише не присвоено. Но даже если бы эти ассоциации и были, то они не привязаны к каким-то действиям в конкретных программах (или, говоря по-другому - не назначены горячие клавиши).

Как же установить связь между скан кодом клавиши и ее символическим именем? Это поясняется на схеме.

Схема выбора значений клавиш
/usr/X11R6/include/X11/XF86keysym.h - файл, описывающий "физические" функции клавиш.
/usr/X11R6/lib/X11/xkb/symbols/us, ru или inet- файлы раскладок, в которых задается соответствие между именами скан-кодов и "физическими" функциями клавиш.
/usr/X11R6/lib/X11/xkb/keycodes/xfree86 - файл, в котором для всех скан-кодов задаются имена этих скан-кодов, которые потом используются в файлах раскладок для назначения каждой "физической" клавише всех возможных значений.
Обратите внимание, что файлы находятся в разных каталогах: /usr/X11R6/lib и /usr/X11R6/include. Довольно запутанно. Еще раз советую почитать Паскаля.

Для выполнения такой привязки существует программа LinEAK - Linux support for Easy Access and Internet Keyboards, разработчик Mark Smulders. Она позволяет настроить и использовать дополнительные мультимедиа- и интернет- клавиши. Можно, конечно, установить эту программу, но гораздо интереснее, да и полезнее сделать всю работу самому.

Раскладка клавиатуры определяется файле /etc/X11/XF86Config. В секции InputDevice этого файла есть строки, относящиеся к клавиатуре. Вот один из вариантов:

        Identifier  "Keyboard0"
        Driver      "keyboard"
        Option      "XkbRules" "xfree86"
        Option      "XkbModel" "logiitc"
        Option      "XkbLayout" "us,ru(winkeys)"
        Option      "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"

О настройке этой секции написано много. Поясню только, что "XkbModel" "logiitc" означает, что из файла /usr/X11R6/lib/X11/xkb/rules/xfree86 должен быть взят шаблон logiitc, который описывает клавиатуру Logitech iTouch Cordless Keyboard (model Y-RB6). В свою очередь, "XkbLayout" "us,ru(winkeys)" определяет используемые раскладки, файлы для которых находятся в каталоге /usr/X11R6/lib/X11/xkb/symbols. Латинская раскладка - это файл us, русская - это секция winkeys файла ru. "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll" позволяют переключать раскладку с одного языка на другой нажатием Control+Shift, при этом загорается светодиод Scroll.

Все возможные типы клавиатур, раскладок и модификаторов описаны в файле /usr/X11R6/lib/X11/xkb/rules/xfree86lst.

Особый интерес представляет указание модели клавиатуры. Обычно здесь присутствует что-нибудь вроде pc104, обозначая использование стандартной клавиатуры, имеющей 104 клавиши. А вот правила для logiitc подразумевают использование дополнительного файла /usr/X11R6/lib/X11/xkb/symbols/inet, в котором заданы раскладки для интернет- и мультимедиа- клавиш. Именно этим файлом мы и займемся.

Надо сказать, что способ настройки клавиатуры через файл /etc/X11/XF86Config работает в том случае, если в используемом оконном менеджере не указаны свои параметры конфигурации. Например, в KDE имеются средства выбора модели, раскладки и способа переключения клавиатуры. Если они включены, то они и действуют, независимо от того, что указано в XF86Config. Поэтому можно добиться того же эффекта не правя конфигурационный файл, а пощелкав мышкой в Центре управления KDE на вкладке Регион специальные возможности, Раскладка клавиатуры.

В нашем случае можно использовать любой способ настройки, на результат это не повлияет.

Вернемся к файлу /usr/X11R6/lib/X11/xkb/symbols/inet. Как уже говорилось, при выборе модели, имеющей дополнительные клавиши (а только такие нас интересуют) этот файл автоматически подключается. Для нас главное сейчас - правильно указать тип используемой клавиатуры. Заглянем в файл inet. Начало файла говорит само за себя:

// EAK (Easy Access, Internet, Multimedia, PDA) keyboards
// Copyright (C) 2002 Stanislav Brabec <sbrabec@suse.cz>
//
// Based on LinEAK project
// LinEAK - Linux support for Easy Access and Internet Keyboards
// Copyright (C) 2001, 2002 Mark Smulders <Mark@PIRnet.nl>

Как говорится, движемся в правильном направлении. Самой программы LinEAK в дистрибутиве нет. Но конфигурационный файл есть. Это именно то, что нужно.

Каждая секция файла описывает дополнительные клавиши для одной из моделей клавиатур. Назначение кнопок понятно. При указании типа клавиатуры в XF86Config или в KDE нужно выбрать свою модель из перечисленных здесь. Если нужного типа нет, то выбрать наиболее похожий. Если клавиатура вообще без дополнительных клавиш, то можно выбрать любой тип из имеющихся в файле inet. Все равно его придется править. Ненужные кнопки удалим, нужные, реально имеющиеся на клавиатуре и пульте (или только на пульте) - добавим. Вот фрагмент файла inet, описывающий клавиатуру, похожую на мою.

partial alphanumeric_keys
xkb_symbols "logiitc" {
    name[Group1]= "Logitech iTouch Cordless Keyboard (model Y-RB6)";

    key <I5F>     {       [ XF86PowerOff          ]       };
    key <I20>     {       [ XF86AudioMute         ]       };
    key <I2E>     {       [ XF86AudioLowerVolume  ]       };
    key <I30>     {       [ XF86AudioRaiseVolume  ]       };
    key <I22>     {       [ XF86AudioPlay, XF86AudioPause ] };
    key <I24>     {       [ XF86AudioStop         ]       };
    key <I10>     {       [ XF86AudioPrev         ]       };
    key <I19>     {       [ XF86AudioNext         ]       };
    key <I32>     {       [ XF86HomePage          ]       };
    key <I6C>     {       [ XF86Mail              ]       };
    key <I65>     {       [ XF86Search            ]       };
    key <I66>     {       [ XF86Favorites         ]       };
};

Неправильно работают две кнопки на клавиатуре (XF86Search и XF86HomePage) и, конечно, нет кнопок пульта. Составим таблицу, с правильными значениями скан кодов, их имен и действий. Скан коды получим с помощью xev.

Функция Скан код файл xfree86 файл XF86keysym.h

Клавиатура (клавиши, действия которых надо исправить)
Поиск 122 <FK17> XF86Search
Домой 130 <I02> XF86HomePage

Кнопки пульта ДУ
Air/CFTV - - -
Video - - -
Audio - - -
Power 222 <I5E> XF86PowerOff
AV Source 136 <I08>
Full Screen - - -
Stereo 249 <I79>
Mute 160 <I20> XF86AudioMute
1 87 <KP1> KP_1
2 88 <KP2> KP_2
3 89 <KP3> KP_3
Vol+ 176 <I30> XF86AudioRaiseVolume
4 83 <KP4> KP_4
5 84 <KP5> KP_5
6 85 <KP6> KP_6
Vol- 174 <I2E> XF86AudioLowerVolume
7 79 <KP7> KP_7
8 80 <KP8> KP_8
9 81 <KP9> KP_9
Ch+ - - -
Recall 133 <AE13>
0 90 <KP0> KP_0
Enter 108 <KPEN> KP_Enter
Ch- - - -

Пояснения к таблице.
Некоторым кнопкам, например "AV Source", не поставлено в соответствие символическое имя, поэтому они не будут работать. Просто я пока не нашел им применения. Но, конечно, назначить символическое имя можно.
Вывод команды xev показывает, что некоторые кнопки пульта, например "Air/CFTV", не выдают код. На самом деле, код выдается, как и положено, что показывает вывод команды showkey. Просто X сервер эти коды не понимает.

Как уже говорилось, в файле /usr/X11R6/lib/X11/xkb/keycodes/xfree86 содержится таблица перекодировки, а в файле /usr/X11R6/include/X11/XF86keysym.h - все возможные действия клавиш, которые надо переписывать в файл inet без префикса "XK_". Создавая новую секцию файла inet, не обязательно присваивать клавише ту функцию, которую подразумевали разработчики. Нужно только учитывать, что если клавиша с каким-либо кодом уже определена на клавиатуре, то и на пульте она будет выполнять то же самое действие. Другими словами, - если код, выдаваемый кнопкой пульта, совпадает с кодом клавиши на клавиатуре, то прописывать его уже не надо. Например, цифровые кнопки пульта - это то же самое, что клавиши на цифровой клавиатуре справа, и точно также, они будут работать только при включенной функции NumLock. С другой стороны, кнопке Recall на пульте можно назначить любое действие, так как она не имеет аналога на клавиатуре.

Теперь можно начинать править выбранную нами секцию файла inet. Первые строки секции - заголовок - трогать нельзя, они прописаны во многих местах в системе. У меня исправленный фрагмент выглядит так:

partial alphanumeric_keys
xkb_symbols "logiitc" {
    name[Group1]= "Logitech iTouch Cordless Keyboard (model Y-RB6)";
// Left side
    key <I5F>     {       [ XF86PowerOff          ]       };
// Media keys
    key <I20>     {       [ XF86AudioMute         ]       };
    key <I2E>     {       [ XF86AudioLowerVolume  ]       };
    key <I30>     {       [ XF86AudioRaiseVolume  ]       };
    key <I22>     {       [ XF86AudioPlay, XF86AudioPause ] };
    key <I24>     {       [ XF86AudioStop         ]       };
    key <I10>     {       [ XF86AudioPrev         ]       };
    key <I19>     {       [ XF86AudioNext         ]       };
// Right side
    key <I02>     {       [ XF86HomePage          ]       };
    key <I6C>     {       [ XF86Mail              ]       };
    key <FK17>    {       [ XF86Search            ]       };
    key <I66>     {       [ XF86Favorites         ]       };
// Remote
                         //Video
                         //Audio
    key <I08>   { [XF86AudioStop          ]       };
                         //Full Screen
    key <I79>   { [XF86ZoomOut            ]       };
                         //Ch+
    key <AE13>  { [XF86Video              ]       };
                         //Ch-
};

Теперь можно заменить наш фрагмент в файле /usr/X11R6/lib/X11/xkb/symbols/inet на отредактированный вариант (предварительно скопировав куда-нибудь оригинал), перезагрузить X Window, и попробовать, что получилось выполнив команду xev. Все должно работать в том смысле, что кнопки пульта и дополнительные клавиши должны сообщать свои символические имена. Для того, чтобы нажатие клавиши вызывало конкретное действие, нужно сделать ее "горячей".

Можно просто привязать клавиши и кнопки - в KDE это делается просто. Например, я использую kmixer. Достаточно щелкнуть на нем правой кнопкой мыши и выбрать пункт меню Привязка клавиш. У меня установлено, что key<I2E> уменьшает общую громкость, а Alt+key<I2E> уменьшает громкость канала PCM. Для увеличения громкости используются key<I30> и Alt+key<I30> соответственно.

Теперь - наведение красоты. Существует библиотека xosd, которая позволяет выводить на экран монитора всякие надписи и знаки. И существуют программы, которые это используют. Результат похож на возникающие на экране телевизора цифры с номерами каналов или на линейку изменения громкости при нажатии кнопок пульта. Можно перенаправить на xosd системное время или какой-нибудь другой достойный внимания параметр.

Установка библиотеки xosd и соответствующего демона проста, поскольку есть rpm-пакет для Fedora Core 1.

rpm -ihvv xosd-2.2.1-0.rhfc1.dag.i386.rpm
rpm -ihvv xosd-devel-2.2.1-0.rhfc1.dag.i386.rpm

То же относится и к модулю для xmms.

rpm -ihvv xmms-xosd-2.2.1-0.rhfc1.dag.i386.rpm

После установки модуль нужно включить (это делается прямо в xmms - параметры-свойства-общие расширения) и настроить цвет, шрифт и место расположение надписи на экране дисплея. Теперь на экране будет появляться номер композиции, а при нажатии соответствующих кнопок - линейка изменения громкости.

Напоследок - три небольших замечания на тему использования TV тюнера.

Телетекст, во всяком случае в его теперешнем виде, кажется архаизмом в эпоху массового распространения интернета. Тем не менее, я установил и запустил довольно старую программу просмотра страниц телетекста alevtv, после чего мне пришлось переустанавливать систему. Как я понял, во-первых, alevtv работает только с драйвером bttv. А во-вторых, ее работа может привести к фатальным последствиям, что и подтвердилось. Есть еще gnometv, которая тоже замерла где-то в районе 2001 года. Ее я уже не пробовал.

О загрузке процессора при просмотре телепрограмм. Многие считают, что платформа Windows лучше справляется с обработкой графики, чем X Window. А вот что было у меня: при работе TV тюнера в Windows, и с его собственным программным обеспечением, загрузка процессора составляла от 50 до 60 процентов. В подтверждение этому факту можно вспомнить, что системные требования для использования TV тюнера в Windows обычно довольно высоки. Кроме того, при изменении размеров окна происходил срыв изображения и звука. Само изображение не могло масштабироваться произвольно, минимальный размер составлял примерно четверть экрана. Все это создает ощущение запуска тяжелого приложения. А вот в X Window, наоборот, масштабирование работало без проблем, окно можно было сделать любого размера, хоть с почтовую марку, а при его изменении никаких срывов не было. Суммарная загрузка процессора программой просмотра TV и Х сервером составляла от 10 до 17 процентов. Напомню, в Linux использовалась программа tvtime, процессор Intel Celeron 2100, встроенное видео i865.

К сожалению, мне так и не удалось передать звук от TV тюнера к звуковой карте по шине PCI, хотя такая возможность есть, и в Windows она реализована. Поэтому в Linux пришлось использовать внешний кабель из комплекта тюнера. Такая же проблема возникнет с любым другим внутренним тюнером на основе микросхемы saa7134, а таких моделей сейчас много. Если кто-то нашел решение проблемы - поделитесь.

Андрей Ракитин.
апрель 2004 г.




Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости