Настройка Bluetooth в Debian GNU/Linux 5.0 "Lenny"

Всё началось с того, что пропал интернет :)
Сразу же пришла мысль о заблаговременно купленном bluetooth-адаптере, которым и решил воспользоваться.

andrew@newstar:~$ lsusb
Bus 002 Device 002: ID 0a48:5014 I/O Interconnect Mass Storage Device
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
andrew@newstar:~$

Только вот даже при установленных ранее bluez-utils и стандартном ядре из дистрибутива подключение настроено не было, а в /var/log/kernel.log и /var/log/syslog после присоединения адаптера сыпалось очень много сообщений об ошибках:

Feb 22 23:51:49 newstar kernel: [24980.359767] Bluetooth: HCI USB driver ver 2.9
Feb 22 23:51:49 newstar kernel: [24980.359767] usbcore: registered new interface driver hci_usb
Feb 22 23:52:07 newstar kernel: [24998.638066] usb 2-5: new full speed USB device using ohci_hcd and address 7
Feb 22 23:52:07 newstar kernel: [24998.840514] usb 2-5: configuration #1 chosen from 1 choice
Feb 22 23:52:07 newstar kernel: [24998.846267] usb 2-5: New USB device found, idVendor=0a12, idProduct=0001
Feb 22 23:52:07 newstar kernel: [24998.846273] usb 2-5: New USB device strings: Mfr=0, Product=0, SerialNumber=0
Feb 22 23:52:46 newstar kernel: [25038.857528] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar last message repeated 2 times
Feb 22 23:52:46 newstar kernel: [25038.867195] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.867204] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.867207] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.876347] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.876359] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.876361] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.886327] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.886334] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.886337] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:46 newstar kernel: [25038.886339] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.896324] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.896335] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.896338] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.905574] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.905584] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.905587] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.915577] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.915588] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.915591] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.915593] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.925580] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.925589] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.925591] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.935577] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.935588] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.935591] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92
Feb 22 23:52:47 newstar kernel: [25038.945577] hci_scodata_packet: hci0 SCO packet for unknown connection handle 92

Что любопытно, ошибки появлялись только при запущеном hcid

Погуглив немного по интернету решил внести правки в модуль ядра и подложить вместо дистрибутивного. На помощь пришло не руководство по сборке нового ядра, а Руководство по сборке пакета официального ядра Debian, потому что нужно было максимальное соответствие с оригинальным дистрибутивным (практически - правки в модуль дистрибутивного ядра)
Вкратце, было сделано следующее:

andrew@newstar:~$ apt-get source linux-image-2.6.26-2-686
andrew@newstar:~$ apt-get build-dep linux-image-2.6.26-2-686
andrew@newstar:~$ apt-get install fakeroot build-essential
andrew@newstar:~$ cd linux-2.6-2.6.26
andrew@newstar:~/linux-2.6-2.6.26$ fakeroot make -f debian/rules.gen setup_i386_none_686

После этого вносим в drivers/bluetooth/hci_usb.c следующие правки:

--- drivers/bluetooth/hci_usb.c.orig	2008-07-14 00:51:29.000000000 +0300
+++ drivers/bluetooth/hci_usb.c	2009-02-22 21:53:18.000000000 +0200
@@ -105,7 +105,8 @@
 
 static struct usb_device_id blacklist_ids[] = {
 	/* CSR BlueCore devices */
-	{ USB_DEVICE(0x0a12, 0x0001), .driver_info = HCI_CSR },
+	//{ USB_DEVICE(0x0a12, 0x0001), .driver_info = HCI_CSR },
+	{ USB_DEVICE(0x0a12, 0x0001), .driver_info = HCI_BROKEN_ISOC },
 
 	/* Broadcom BCM2033 without firmware */
 	{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = HCI_IGNORE },

Вообще-то непонятно что за чёрный список и зачем он нужен, и почему в отдельную категорию выделены кстройства от Cambridge Silicon Radio, Ltd ...
Не знаю к чему может привести это вмешательство, но мусор в логах исчез :)
(Да, понимаю что метод неправильный, но на глубокие разборки времени нет :( )

Если необходима дополнительная конфигурация ядра перед сборкой - можно перейти в каталог debian/build/build_i386_none_686 и запустить там make menuconfig, после чего для продолжения работы вернуться в основной каталог cd ../../.. (правда, в таком случае трудно гарантировать совместимость модулей)
Выполняем сборку пакетов:

andrew@newstar:~/linux-2.6-2.6.26$ fakeroot make -f debian/rules.gen binary-arch_i386_none_686 binary-indep DEBIAN_KERNEL_JOBS=${NR_CPUS}

Псле сборки модуль можно смело подкладывать вместо дистрибутивного - разницы ядро не заметит :)

Далее пошли танцы с настройкой bluetooth-соединения:

newstar:/var/log# hcitool scan
Device is not available: No such device
newstar:/var/log#

Ничего нет. Попробуем сконфигурировать:

newstar:/var/log# hciconfig
hci0:	Type: USB
	BD Address: 00:00:00:00:00:00 ACL MTU: 0:0 SCO MTU: 0:0
	DOWN 
	RX bytes:0 acl:0 sco:0 events:0 errors:0
	TX bytes:0 acl:0 sco:0 commands:0 errors:0
newstar:/var/log# hciconfig hci0 up
newstar:/var/log# hciconfig
hci0:	Type: USB
	BD Address: 00:15:83:15:B1:53 ACL MTU: 672:4 SCO MTU: 48:1
	UP RUNNING 
	RX bytes:342 acl:0 sco:0 events:10 errors:0
	TX bytes:35 acl:0 sco:0 commands:10 errors:0

newstar:/var/log# hcitool scan
Scanning ...
	00:1D:28:B3:7C:84	Andrew K800i
newstar:/var/log#

Таки - Да! :)
Проверяем связь с телефоном:

newstar:/var/log# l2ping 00:1D:28:B3:7C:84
Ping: 00:1D:28:B3:7C:84 from 00:15:83:15:B1:53 (data size 44) ...
44 bytes from 00:1D:28:B3:7C:84 id 0 time 20.90ms
44 bytes from 00:1D:28:B3:7C:84 id 1 time 22.90ms
44 bytes from 00:1D:28:B3:7C:84 id 2 time 26.90ms
^C3 sent, 3 received, 0% loss
newstar:/var/log#

Теперь смотрим что и как он поддерживает

newstar:/var/log# sdptool browse 00:1D:28:B3:7C:84
Browsing 00:1D:28:B3:7C:84 ...
Service Description: Sony Ericsson K800
Service RecHandle: 0x10000
Service Class ID List:
  "PnP Information" (0x1200)

Service Name: OBEX SyncML Client
Service RecHandle: 0x10001
Service Class ID List:
  UUID 128: 00000002-0000-1000-8000-0002ee000002
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
  "OBEX" (0x0008)

Service Name: Dial-up Networking
Service RecHandle: 0x10002
Service Class ID List:
  "Dialup Networking" (0x1103)
  "Generic Networking" (0x1201)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100

Service Name: Serial Port
Service RecHandle: 0x10003
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 3

Service Name: PAN Network Access Point
Service Description: NAP provides access to internet for one connecting PANu
Service RecHandle: 0x10008
Service Class ID List:
  "Network Access Point" (0x1116)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 15
  "BNEP" (0x000f)
    Version: 0x0100
    SEQ8: 0 6 dd
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Network Access Point" (0x1116)
    Version: 0x0100

Service Name: Hands-Free Gateway
Service RecHandle: 0x10009
Service Class ID List:
  "Handsfree Audio Gateway" (0x111f)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 4
Profile Descriptor List:
  "Handsfree" (0x111e)
    Version: 0x0105

Service Name: Headset Gateway
Service RecHandle: 0x1000a
Service Class ID List:
  "Headset Audio Gateway" (0x1112)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 5
Profile Descriptor List:
  "Headset" (0x1108)
    Version: 0x0100

Service Name: OBEX Object Push
Service RecHandle: 0x1000b
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 6
  "OBEX" (0x0008)
Profile Descriptor List:
  "OBEX Object Push" (0x1105)
    Version: 0x0100

Service Name: OBEX File Transfer
Service RecHandle: 0x1000c
Service Class ID List:
  "OBEX File Transfer" (0x1106)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 7
  "OBEX" (0x0008)
Profile Descriptor List:
  "OBEX File Transfer" (0x1106)
    Version: 0x0100

Service Name: OBEX IrMC Sync Server
Service RecHandle: 0x1000d
Service Class ID List:
  "IrMC Sync" (0x1104)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 8
  "OBEX" (0x0008)
Profile Descriptor List:
  "IrMC Sync" (0x1104)
    Version: 0x0100

Service Name: HID Mouse & Keyboard
Service Description: Remote Control of PC applications and other devices
Service Provider: Sony Ericsson
Service RecHandle: 0x1000e
Service Class ID List:
  "Human Interface Device" (0x1124)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 17
  "HIDP" (0x0011)
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Human Interface Device" (0x1124)
    Version: 0x0100

Service Name: OBEX Phonebook Server
Service RecHandle: 0x10010
Service Class ID List:
  "Phonebook Access - PSE" (0x112f)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 9
  "OBEX" (0x0008)
Profile Descriptor List:
  "Phonebook Access - PSE" (0x112f)
    Version: 0x0100

Из ответа выше видно что Dialup Networking находится в канале 2 (Channel 2). Будем использовать эту информацию при подключении с помощью rfcomm:

newstar:~# rfcomm connect rfcomm0 00:1D:28:B3:7C:84

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

newstar:/var/log# rfcomm connect rfcomm0 00:1D:28:B3:7C:84
Can't connect RFCOMM socket: Connection refused
newstar:/var/log# rfcomm connect rfcomm0 00:1D:28:B3:7C:84
Can't connect RFCOMM socket: Connection refused
newstar:/var/log#

Лечится запуском в другом окне волшебной программы passkey-agent из /usr/share/doc/bluez-utils/examples во время запрса пароля на телефоне

newstar:/etc/bluetooth# /usr/share/doc/bluez-utils/examples/passkey-agent 1234
Passkey request for device 00:1D:28:B3:9A:51
^Cnewstar:/etc/bluetooth#