--- /dev/null
+I've been setting up a USB-bluetooth adapter so I can transfer files
+between my phone and computer. You'll need kernel support (in
+`menuconfig` look in `Networking ---> Bluetooth subsystem support`).
+
+With a proper kernel, after plugging in your adapter you should see
+something like
+
+ $ lsmod
+ Module Size Used by
+ sco 6484 2
+ bnep 7889 2
+ rfcomm 25356 4
+ l2cap 27398 16 bnep,rfcomm
+ btusb 8762 2
+ bluetooth 42079 9 sco,bnep,rfcomm,l2cap,btusb
+ ...
+ $ lsusb
+ Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
+ Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
+ Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
+ Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
+ Bus 003 Device 010: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
+ Bus 003 Device 011: ID 0a5c:4502 Broadcom Corp. Keyboard (Boot Interface Subclass)
+ Bus 003 Device 012: ID 0a5c:4503 Broadcom Corp. Mouse (Boot Interface Subclass)
+ Bus 003 Device 013: ID 0a5c:2154 Broadcom Corp.
+
+Once you've got the kernel working, you should install [BlueZ][], the
+userspace Bluetooth stack. On Gentoo, you'll want to enable the
+`test-programs` USE flag (which brings in additional stuff like
+`simple-agent`). Then run
+
+ $ sudo emerge -av net-wireless/bluez
+
+This brings in a bunch of tools, among them `hcitool` and `hciconfig`.
+Check that BlueZ finds your adapter with:
+
+ $ hcitool dev
+ Devices:
+ hci0 00:01:02:03:04:05
+
+Put your phone in "discovery mode", and then detect it from the
+computer with:
+
+ $ hcitool scan
+ Scanning ...
+ 00:0A:0B:0C:0D:0E Grayhat
+
+Verify communication with:
+
+ $ sudo l2ping 00:0A:0B:0C:0D:0E
+ Ping: 00:0A:0B:0C:0D:0E from 00:01:02:03:04:05 (data size 20) ...
+ 20 bytes from 00:0A:0B:0C:0D:0E id 200 time 69.85ms
+ 20 bytes from 00:0A:0B:0C:0D:0E id 201 time 9.97ms
+ 20 bytes from 00:0A:0B:0C:0D:0E id 202 time 56.86ms
+ 20 bytes from 00:0A:0B:0C:0D:0E id 203 time 39.92ms
+ 4 sent, 4 received, 0% loss
+
+
+Pairing
+=======
+
+Make computer discoverable with:
+
+ $ sudo hciconfig hci0 piscan
+
+which adds ISCAN to hciconfig's output.
+
+To setup pairing, you should setup a pair pin by editing
+
+ $ cat /var/lib/bluetooth/00:01:02:03:04:05/pincodes
+ 00:0A:0B:0C:0D:0E 12345
+ AA:AA:AA:AA:AA:AA 67890
+ $ /etc/init.d/bluetooth restart
+
+where `00:01:02:03:04:05` is the address for your adapter (from
+`hcitool dev`) and the file contains `addr pin` lines. You can get the
+addresses of the pair devices with `hcitool scan` (discussed above).
+After you edit the `pincodes` file, you'll have to restart the
+bluetooth daemon.
+
+ $ sudo /etc/init.d/bluetooth restart
+
+If you want to use `simple-agent` instead of mucking about in
+`/var/lib/bluetooth`, usage looks something like
+
+ $ simple-agent
+ Agent registered
+ RequestPinCode (/org/bluez/16306/hci0/dev_00_0A_0B_0C_0D_0E)
+ Enter PIN Code: 12345
+
+where you start `simple-agent` and then initiate pairing from the
+phone. After entering a pin on the phone, you will be prompted to
+re-enter the pin by `simple-agent`.
+
+Gentoo may need to be told that the cell phone is allowed to connect,
+so create/edit `/var/lib/bluetooth/00:01:02:03:04:05/trusts`
+
+ $ cat /var/lib/bluetooth/00:01:02:03:04:05/trusts
+ 00:0A:0B:0C:0D:0E [all]
+
+which allows the phone to use any Bluetooth service provided by your
+computer. It's possible that you can accomplish the same result with
+something like
+
+ $ sudo bluez-test-device trusted 00:0A:0B:0C:0D:0E yes
+
+but I haven't been able to figure out the right syntax yet.
+
+
+Pushing files from the phone
+============================
+
+There are a number of OBEX push servers you can run on your box. My
+favorite so far is [ObexPushD][], which is easy to use, GPLv2
+licensed, and Git versioned. Can't beat that. I've added an ebuild
+(`app-mobilephone/obexpushd`) to my [[Gentoo overlay]] for easier
+installation.
+
+
+Pushing files to the phone
+==========================
+
+Check for an OBEX Push service on the phone:
+
+ $ sdptool search --bdaddr 00:0A:0B:0C:0D:0E OPUSH
+ Searching for OPUSH on 00:0A:0B:0C:0D:0E ...
+ Service Name: Object Exchange
+ Service RecHandle: 0x10003
+ Service Class ID List:
+ "OBEX Object Push" (0x1105)
+ Protocol Descriptor List:
+ "L2CAP" (0x0100)
+ "RFCOMM" (0x0003)
+ Channel: 3
+ "OBEX" (0x0008)
+ Profile Descriptor List:
+ "OBEX Object Push" (0x1105)
+ Version: 0x0100
+
+Push a file to the phone using `ussp-push` (`net-wireless/ussp-push`)
+
+ $ ussp-push 00:0A:0B:0C:0D:0E@3 LFILE RFILE
+
+which pushes the local `LFILE` to the remote `RFILE`.
+
+Note that phone's can be finicky about what they accept. For example,
+my Casio C721 is running BREW 3.x (see my [[Java ME]] post), and has a
+number of issues:
+
+* It attempts to detect file type by file extension (so you can't send
+ over a JPG with a `.jpeg` extension). It pops up an "Unsupported
+ Media" warning if you try.
+* It does not accept music in any of the following formats: (AAC
+ (`.aac`), MP3 (`.mp3`), MP4/AAC (`.mp4`, `.m4a`), WAV (`.wav`).
+* It does accept JPGs with a `.jpg` extension.
+* It does accept VCARDs (with a `.vcf` extension), but they must have
+ DOS endlines (e.g. via `unix2dos`).
+* If you include multiple VCARDs in a single file, it enters all the
+ information under the name from the first VCARD.
+* If you send a VCARD whos name matches an already existing contact,
+ it leaves the first contact unaltered and creates a new contact
+ storing the VCARD information.
+
+Both images and VCARDs should get pushed in without directory names.
+Once the phone guesses the file type from the extension, it seems to
+save the information in the appropriate place automatically.
+
+
+obexfs
+======
+
+Note: my phone doesn't support the Bluetooth's File Transfer Profile
+(FTP), so I haven't been able to test the following commands.
+
+With `sys-fs/obexfs` you can mount a phone with
+
+ $ sudo mount -t fuse obexautofs /tmp/mnt
+
+When you're done, unmount with
+
+ $ sudo umount /tmp/mnt
+
+`obexautofs` scans for available devices, so your device must be
+visible (discoverable). If that's a pain, you can mount a specific
+device with
+
+ $ sudo mount -t fuse "obexfs#-b00:0A:0B:0C:0D:0E -B3" /tmp/mnt
+
+Depending on your kernel, you may need to load the `fuse` module
+before doing all of that:
+
+ $ sudo modprobe fuse
+
+
+Debugging
+=========
+
+Use `hcidump` (`net-wireless/bluez-hcidump`) to trace the bluetooth
+stack for debugging.
+
+
+References
+==========
+
+A good deal of this information came from the more detailed [Gentoo
+Bluetooth Guide][guide] and [Bluetooth Network Aggregation Point
+Howto][nap].
+
+
+[BlueZ]: http://www.bluez.org/
+[ObexPushD]: http://www.gitorious.org/obexpushd
+[guide]: http://www.gentoo.org/doc/en/bluetooth-guide.xml
+[nap]: http://en.gentoo-wiki.com/wiki/Bluetooth_Network_Aggregation_Point