BLUETOOTH-mini-HOWTO for Headsets
 =================================
 
 Some words in the beginning:
 I'm an absolute newbie to the whole bluetooth stuff and I'm
 glad that I was able to get everything working in two days
 although it wasn't that easy all the time.
 A big "Thank you!" goes to Jonathan Paisley who wrote the
 snd-bluez-sco driver and also was patient with me to help
 me with my first steps in the Bluetooth-world.
 Of course not to forget all the others of bluez: 
 kudos to all of you!
 
 The sections marked with /* */ are just some thoughts I had
 during writing this stuff. If you are only interested in the
 howto, ignore them :)
 
 
 I have tested it using 
 
   - Anycom AHS-10 Headset
   - Anycom USB100 Bluetooth-dongle
   - Bluetake BT007SV Bluetooth-dongle
 
   - Kernel 2.4.22
   - Kernel 2.4.21-ac4
 
   - Alsa 0.9.6 (www.alsa-project.org)
     (Alsa 0.9.7 currently won't work)
     - alsa-driver-0.9.6
     - alsa-lib-0.9.6
 
   - from bluez.sourceforge.net:
     - bluez-libs-2.4.tar.gz
     - bluez-utils-2.3.tar.gz
     - bluez-sdp-1.5.tar.gz
     - bluez-pan-1.1.tar.gz
     - bluez-hcidump-1.5.tar.gz
     - bluez-hciemu-1.0.tar.gz
     - bluez-bluefw-0.9.tar.gz
 
   - from http://www.dcs.gla.ac.uk/~jp/snd-bluez-sco/
     - snd-bluez-sco-2003-09-15.tar.gz 
  
   - Time (lots of)...
 
 
 
 Let's start:
 ~~~~~~~~~~~~
 
 First, you'll need to patch the alsa-driver, alsa-libs and your
 kernel:
 
 Unpack the alsa stuff and the snd-bluez-sco package from J. Paisley.
 You'll find the required patches in the snd-bluez-sco directory.
 
 So do a:
    cd alsa-driver-0.9.6
    patch -p1 < alsa-driver-0.9.6-bluezsco.patch
 
    cd alsa-libs-0.9.6
    patch -p1 < alsa-lib-0.9.6-bluezsco.patch
 
    cd /usr/src/linux (or where your kernel-sources are)
    patch -p1 < hciusb-isoc.patch
    (this should not produce any errors)
 
    You might need to give the patch command the absolute path to
    the .patch-files 
    (e.g. patch -p1 < /tmp/snd-bluez-sco-2003-09-15/hciusb-isoc.patch)  
 
 
 Depending on the version of your snd-bluez-sco package it might be
 neccessary to add this line to alsa-driver-0.9.6/alsa-kernel/core/Makefile:
  
  obj-$(CONFIG_SND_BLUEZ_SCO) += snd-pcm.o snd-page-alloc.o snd.o snd-hwdep.o
  
 (see http://sourceforge.net/mailarchive/message.php?msg_id=6056143)
 
 This line was forgotten in the patch and I got "unresolved symbols"
 when I tried to load the module without it.
 
 
 
 Having everything patched, you'll need bluetooth support in your
 kernel:
 
    cd /usr/src/linux
    make menuconfig	(or xconfig, or whatever you like)
    in "Bluetooth support" enable all the modules.
    
    /* 
     * I actually don't know what modules are really 
     * needed, I've just switched everything on and 
     * it worked - so someone with more experience
     * may enlighten me :)
     */
 
    Then build and install your kernel (and the modules).
 
 
 
 Now, it's time for alsa:
 
    cd alsa-driver-0.9.6
    aclocal
    autoconf
    ./configure --with-cards=bluez-sco 
    (depending on your system you might want to add other soundcards or
    things like oss too - see ./configure --help for all the possibilities)
    make
    make install
 
    cd alsa-lib-0.9.6
    ./configure
    make
    make install
 
 
 
 Then install the bluez-packages:
 
    Unpack every archive and install each one:
    cd <package-name>
    ./configure
    make
    make install
 
 
 
 ...build the bluezsco-tool
 
    cd snd-bluez-sco-2003-09-15/bluezsco-0.1/
    ./configure
    make
 
 
 After having built and installed everything you'll need to edit some
 files in /etc:
 
    in /etc/modules.conf add the following lines:
       alias net-pf-31 bluez
       alias bt-proto-0 l2cap
       alias bt-proto-2 sco
       alias bt-proto-3 rfcomm
       alias bt-proto-4 bnep
       alias tty-ldisc-15 hci_uart
 
    or - depending on your distro (e.g. debian), write these 
    lines in /etc/modutils/bluez (and do an update-modules)
 
 
    in /etc/bluetooth/ you'll find these files:
       hcid.conf
       pin
       rfcomm.conf
 
    I didn't need to edit hcid.conf. Just enter the
    pin of your headset in the pin-file and change the 
    device-entry in rfcomm.conf to the MAC (or btaddr 
    how it's called in the bluetooth-world) of your 
    Bluetooth-USB-dongle.
 
    /*
     * Again, I don't really know what all the possible
     * options are good for (some of them are described though)
     * so perhaps someone might explain them a bit further
     * than it is in the files. (I like to know what I'm
     * doing when I enable certain features without having
     * to consult an RFC first ;)
     */ 
 
 
 If you managed it to proceed until here, it's now 
 time to reboot your machine with the new kernel.
 
 
 
 
 
 Testing...
 ~~~~~~~~~~
 
 Plug-in your Bluetooth adapter and start the Bluetooth-subsystem
 with 
      /etc/init.d/bluetooth start
 
 Check if the following modules are loaded (using lsmod):
      
      snd-bluez-sco
      hci_usb
      rfcomm
      l2cap
      bluez
 
 If not, load them with modprobe.
 
 Now, "hciconfig hci0" should show you the Bluetooth-Adapter:
 
 hci0:   Type: USB 
         BD Address: xx:xx:xx:xx:xx:xx ACL MTU: 192:8  SCO MTU: 64:8
         UP RUNNING PSCAN ISCAN 
         RX bytes:52636 acl:27 sco:1905 events:80 errors:0
         TX bytes:52112 acl:25 sco:1895 commands:31 errors:0
 
 Then, switch the Headset on in Pairing-mode (on the AHS-10: 
 hold the On-Off-Switch pressed for 10 seconds until the LED
 starts flashing red and green)
 Do "sdptool search HSET". If a window appears asking for the
 headset-pin, enter it (0000 is factory default). 
 
  /*
   * I might be wrong... but if I have an /etc/bluetooth/pin 
   * file, why is it asking me again for the pin and doesnt
   * use the one specified there?
   * Also, the pin-window irritates me... I was logged in via
   * ssh -X on my notebook and ran this command on my PC
   * and this window appeared on the notebook-screen and not
   * on the monitor of my PC.... what's that ?
   * Why is this hardcoded to the local Xserver of the PC where
   * the bluetooth-stuff is running on? 
   * (..one should LART the person who did that ;)
   *
   * Another thing which I think is quite annoying is the fact
   * that pin and btaddr of the headset must be entered 
   * manually each time. Support for a ~/.bluetoothrc would
   * be much more comfortable.
   */
 
 After this you should see an output similar to this:
 
     Inquiring ...
     Searching for HSET on xx:xx:xx:xx:xx:xx ...
     Service Name: Headset
     Service RecHandle: 0x20000
     Service Class ID List:
       "Headset" (0x1108)
       "Generic Audio" (0x1203)
     Protocol Descriptor List:
       "L2CAP" (0x0100)
       "RFCOMM" (0x0003)
       Channel: 6
     Language Base Attr List:
       coade_ISO639: 0x656e
       encoding:    0x6a
       base_offset: 0x100
 
 xx:xx:xx:xx:xx:xx is the btaddr of your headset 
 (called MAC ID on the sticker of the headset)
 
 
 
 ...aaand Action!
 ~~~~~~~~~~~~~~~~
 
 If everything worked fine until here, the following
 command should finally let you send and receive audio
 from your headset:
 
 snd-bluez-sco-2003-09-15/bluezsco-0.1/bluezsco <btaddr> <channel>
 
 where channel is the same as in the output of the sdptool command
 above. i.e. 
     
     bluezsco xx:xx:xx:xx:xx:xx 6
      
 And you should get an output similar to this:
 
     Device is 2:0
     Voice setting: 0x0040
     RFCOMM channel connected
     SCO audio channel connected (handle 44, mtu 64)
     Setting sco fd
     Done setting sco fd
     AT+VGS=15
     Sending up speaker change 15
 
 
 That's it!
 
 Now you should be able to play s.th. using
 
     aplay -D plughw:Headset blah.wav
 or
     alsaplayer -d plughw:Headset blah.mp3
 
 And for recording:
 
     arecord -D plughw:Headset blah.wav
 
 
 If you examine your audiodevices, you should also find your headset
 there. On my PC it was /dev/dsp1, on my notebook /dev/unknown 
 ...yes, really... 
 
 
 Quite easy, isn't it? *SCNR*
 
 
 
 Notes for devfs-users:
 ~~~~~~~~~~~~~~~~~~~~~~
 
 If you installed the debian packages and have s.th. like
 
     /etc/devfs/devices.d/bluez
 
 on your system - delete the file, or uncomment every entry
 as described in:
 
 http://sourceforge.net/mailarchive/message.php?msg_id=5461094
 
 It'll work then. (my notebook has devfs and I needed to do so)
 
 
 
 
 That's all folks...
 Again,  I'm a complete bluetooth-newbie and just a linux-geek
 who wanted to get his bluetooth headset working with linux. So if you
 have any questions about some details or why something isn't working:
 I'm the wrong person to ask.
 Search the Mailing-list archives and read the stuff on bluez.sf.net
 or if this shouldn't help, ask the bluetooth-gurus on the
 mailing-list.
 
 
 Of course I welcome any feedback and improvements on this topic :)
 
 
 Some additional thoughts:
 Is it possible to have the BT-dongle run via hotplug-agent so
 everything (modules, enabling of the voice settings) is done 
 automagically and having the hcid listen to commands from the 
 headset (e.g. pushing a knob there) and doing a certain action 
 (like enabling/disabling the voice connection). 
 I guess this is what the hcid is good for?
 
 
 
 -- 
 This email was written on 100% recycled electrons.
 
 Rainer Jochem	              rainer@gr...
 http://www.admininside.org/   http://graphics.cs.uni-sb.de/~rainer/
