Олег Шалаев  > Мой Debian-опыт  > Первоначальная настройка

Компиляция ядра 2.6.21 (проверено на процессорах AMD 32 bit и AMD Sempron 64 bit)

Я использую версию ядра 2.6.21. Более поздними версиями я пользоваться не могу, т.к. с ними несовместим один из патчей. Для нормальной работы беспроводной bluetooth-гарнитуры (headset) необходимо наладить работу alsa-sco (протокола для звуковых bluetooth-устройств). Замечу: есть два типа звуковых bluetooth-устройств: sco (моно – всякие там наушники-гарнитуры, надеваемые на ухо) и a2dp (стерео). Здесь речь идёт о sco-устройствах. Для начала установим необходимые для дальнейшей работы пакеты:

aptitude install lftp build-essential libbluetooth2-dev automake autoconf cvs libtool libasound2-dev libdbus-1-dev libdbus-glib-1-dev bluez-gnome

Скачиваем СТАНДАРТНОЕ ядро (для более новых и/или нестандартных ядер патч, возможно, не будет работать):

cd /usr/src/
lftp -e "get pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2 ; quit" ftp.ch.kernel.org
tar xjf linux-2.6.21.tar.bz2

Налагаем на ядро патч /usr/share/doc/bluetooth-alsa/patches/sco-flowcontrol-v4.0.diff.gz:

ln -sf linux-2.6.21 a
ln -sf linux-2.6.21 linux
cp /usr/share/doc/bluetooth-alsa/patches/sco-flowcontrol-v4.0.diff.gz .
gunzip sco-flowcontrol-v4.0.diff.gz
patch -p0 < sco-flowcontrol-v4.0.diff

К файлу /usr/src/linux/drivers/media/video/bt8xx/bttv-input.c вручную применяем lirc-patch.diff (ну что делать, если команда patch применять его отказывается?) Это нужно для того, чтобы заработал мой пульт ДУ (который входит в комплект поставки ТВ-тюнера). На пульте работают не все кнопки, но и работающих мне вполне хватает.

Ещё ядро не хочет просто так распознавать мой ТВ-тюнер Leadtek Winfast. Я заставляю его это сделать, меняя .tuner_type в файле /usr/src/linux/drivers/media/video/bt8xx/bttv-cards.c:
Было: .tuner_type = 5, /* default for now, gpio reads BFFF06 for Pal bg+dk */
Стало: .tuner_type = 38, /* default for now, gpio reads BFFF06 for Pal bg+dk */

Сохраняем мою конфигурацию ядра в файл /usr/src/linux/.config Ну всё, теперь можно компилировать ядро командами

cd /usr/src/linux/ && \
make oldconfig && make menuconfig && make-kpkg --rootcmd=fakeroot clean && \
make-kpkg --rootcmd=fakeroot kernel_headers kernel_image modules_image && \
make clean

(Перед компиляцией откроется меню, где вы должны изменить конфигурацию ядра в соответствии с запросами вашего компьютера.) По окончании процесса в /usr/src появляются два новых deb-файла, которые надо установить с помощью dpkg -i

Перезагружаемся под новым ядром. Втыкаем bluetooth-антенну в компьютер. Внимание: в моём компьютере не все usb-порты одинаковы в том смысле, что некоторые не чувствуют, когда я втыкаю в них мою bluetooth-антенну. Если я воткнул антенну в "правильный" порт, то последующая команда hcitool dev выдаст мне строчку вида

Devices:
	hci0	00:1F:81:00:02:00

После апрейда lenny (дело было где-то между сентябрём 2008 и февралём 2009) мой bluetooth-наушник вдруг перестал работать. Долго не мог понять, в чём дело. Оказалось, надо было просто добавить пользователя (меня то есть) в группу netdev командой
adduser shalaev netdev

Переводим нашу bluetooth-гарнитуру (или, проще говоря, наушник) в "открытый" режим (когда он в радиоэфире всем сообщает о своём присутствии). У меня для этого надо при включении наушника долго не отпускать кнопку включения. Одновременно запускаем (из-под root) команду hcitool scan, которая выдаёт нам адрес наушника (что-то вроде 00:11:22:33:44:55). Прописываем этот адрес в файл ~/.asoundrc и запускаем из-под обычного пользователя:

bluetooth-applet &
hcitool cc 00:11:22:33:44:55
На экране появится окошечко, предлагающее ввести пароль для связи с наушником. В моём случае это "1234", но бывает ещё "0000". Однажды введённый пароль запоминается и больше вводить его уже никогда не придётся.

Далее компилируем драйвер для sco-наушника и создаём файл ~/.asoundrc, следуя инструкциям из файла /usr/share/doc/bluetooth-alsa/build.html или отсюда. Файл ~/.a2dprc для sco-устройства не нужен.

headsetd
aplay -Dplug:headset file.wav где file.wav – какой-нибудь звуковой файл. Если все предыдущие процедуры прошли удачно, то эта команда подсоединит наушник и сыграет в него файл. Всё, настройка закончена. Можно запускать twinkle (звонить родным и знакомым).

Примечания:

  1. Время от времени бывает у меня такой глюк (напр., после перезагрузки под другим ядром) – наушник отказывается подключаться, говоря, что "audio open error: Отказано в доступе". Метод борьбы: стереть из системы информацию о когда либо подключавшихся к ней bluetooth-устройствах командой rm -r /var/lib/bluetooth/*
  2. Если у вас нету такой же ТВ-карты, как у меня (Leadtek Winfast), то вам ничто не мешает пользоваться более новой версией ядра (2.6.23). Только вместо /usr/share/doc/bluetooth-alsa/patches/sco-flowcontrol-v4.0.diff.gz в этом случае следует использовать plugz/patches/sco-flowcontrol-v4.3.diff (Этот файл появился у вас на диске после выполнения вышеупомянутых инструкций.)


Выше описан новый метод подключения bluetooth-гарнитуры. В своё время я написал про старый метод.


У меня есть 2 usb-bluetooth адаптера. Один работает с гарнитурой, а второй -- нет. В чём дело -- не знаю! Хороший адаптер по команде hciconfig -a выдаёт:

hci0:	Type: USB
	BD Address: 00:04:61:85:8E:2B ACL MTU: 192:8 SCO MTU: 64:8
	UP RUNNING PSCAN ISCAN 
	RX bytes:786151 acl:22 sco:15351 events:105 errors:0
	TX bytes:574203 acl:18 sco:11236 commands:60 errors:0
	Features: 0xff 0xff 0x8b 0xf8 0x18 0x18 0x00 0x80
	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
	Link policy: RSWITCH HOLD SNIFF PARK 
	Link mode: SLAVE ACCEPT 
	Name: 'gogol-0'
	Class: 0x080104
	Service Classes: Capturing
	Device Class: Computer, Desktop workstation
	HCI Ver: 1.1 (0x1) HCI Rev: 0x639 LMP Ver: 1.1 (0x1) LMP Subver: 0x639
	Manufacturer: Cambridge Silicon Radio (10)
Плохой (более новый) адаптер выводит
hci0:	Type: USB
	BD Address: 00:1F:81:00:02:00 ACL MTU: 339:6 SCO MTU: 180:1
	UP RUNNING PSCAN 
	RX bytes:1318 acl:0 sco:0 events:40 errors:0
	TX bytes:410 acl:0 sco:0 commands:39 errors:0
	Features: 0xef 0x3e 0x09 0x70 0x00 0x08 0x00 0x80
	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
	Link policy: RSWITCH HOLD SNIFF PARK 
	Link mode: SLAVE ACCEPT 
	Name: 'sputnik-0'
	Class: 0x02010c
	Service Classes: Networking
	Device Class: Computer, Laptop
	HCI Ver: 2.0 (0x3) HCI Rev: 0x3 LMP Ver: 2.0 (0x3) LMP Subver: 0x3
	Manufacturer: R F Micro Devices (40)
В чём дело -- не знаю, надо разбираться. Может быть стоит попробовать изменить класс...
# Get the output from hciconfig -a
# For using SCO, get the output from hciconfig hci0 revision is helpful (Run hciconfig as root)

    * If it prints "SCO mapping: HCI" then your adapter should work.
    * If it prints "SCO mapping: PCM" then you might permanently change the setting using a command like "pskey mapsco 0" or "bccmd psset -s default 0x1ab 0" using bluez-utils-cvs but this is at your own risk.
    * If it doesn't print either of those, you probably need a different bluetooth adapter (preferably "CSR" based). You might be able to get a broadcom adapter to work but it may require that you boot with a kernel argument (the force_scofix parameter of the hci_usb driver?) to force sco mtu values
    * If the adapter is made by Silicon Wave, it will not work. No one has gotten these things to do audio in linux. 
Результаты команды hciconfig hci0 revision:
hci0:	Type: USB
	BD Address: 00:04:61:85:8E:2B ACL MTU: 192:8 SCO MTU: 64:8
	HCI 18.2.1
	Chip version: BlueCore3-ROM
	Max key size: 128 bit
	SCO mapping:  HCI
Для "плохого" адаптера:
hci0:	Type: USB
	BD Address: 00:1F:81:00:02:00 ACL MTU: 339:6 SCO MTU: 180:1
	Unsupported manufacturer

Вывод: "плохой" адаптер безнадёжен, его можно кому-нибудь подарить или выкинуть...

После этого я купил новый адаптер у китайцев на ebay за $2.19 (доставка по США бесплатно). Свидетельствую: он хороший, работает на Debian нормально. Осталось ещё понять, как запустить его на Ubuntu с новым ядром (который стоит на моём EEE-неттопе).

Олег Шалаев
Last modified: Sun Mar 28 12:29:48 CDT 2010