Difference between revisions of "Bluetooth"
(→Change advertising name) |
(→Change advertising name) |
||
Line 304: | Line 304: | ||
<pre class="apf"> | <pre class="apf"> | ||
[General] | [General] | ||
− | Name = | + | Name = OPOS |
</pre> | </pre> | ||
Revision as of 13:50, 9 August 2018
This page will give you all the informations needed to have a running Bluetooth configuration on your Armadeus board.
Contents
Hardware
First you have to get a compatible hardware. Currently there are 5 solutions:
- You have an OPOS6UL board with the Wi-Fi/Bluetooth chip integrated.
- You have an APF6 board with the Wi-Fi/Bluetooth chip integrated. The chip is on the APF6 Dual and Quad boards by default.
- You have an APF51Dev board, then you're a lucky man because Bluetooth is integrated on the board ;-)
- If you have an APF27Dev, then you can get a Wireless extension board with Wi-Fi/Bluetooth option from Armadeus Systems
- Otherwise: get a cheap USB<->Bluetooth adapter (requires an USB Host port) or a RS232<->Bluetooth adapter
Tested USB adapters
Model | Status APF9328 / APF27 |
Chipset | Comments | |
---|---|---|---|---|
BELKIN - Mini Bluetooth Adapter | TBT | KO | Product: BLUETOOTH USB +EDR ADAPTER v2.1 UHE Manufacturer: Broadcom Corp |
# hciconfig hci1 up piscan
btusb_submit_intr_urb: hci1 urb c3bdac40 submission failed (28) |
TRUST - Bluetooth 2.1 USB Adapter | TBT | KO | Product: BCM2046B1 Manufacturer: Broadcom |
# hciconfig hci1 up piscan
btusb_submit_intr_urb: hci1 urb c3bdac40 submission failed (28) |
RUEDUCOMMERCE - Mini adaptateur USB Bluetooth | TBT | OK | Manufacturer: Cambridge Silicon Radio | |
GIGABYTE - GN-BTD01 | TBT | OK | Manufacturer: Cambridge Silicon Radio | Bluetooth 1.1 ? |
BELKIN - F8T003 v2 | TBT | OK | Manufacturer: Cambridge Silicon Radio | |
D-LINK - DBT-122 | TBT | OK | Product: BCM2035 Manufacturer: Broadcom |
Software
Bluetooth Linux stack is divided into several parts:
- kernel drivers
- userland libraries/daemon (bluez)
Driver installation
$ make linux-menuconfig
[*] Networking support ---> <M> Bluetooth subsystem support ---> --- Bluetooth subsystem support <M> L2CAP protocol support <M> SCO links support <M> RFCOMM protocol support [*] RFCOMM TTY support <M> BNEP protocol support [ ] Multicast filter support (NEW) [ ] Protocol filter support (NEW) <M> HIDP protocol support Bluetooth device drivers ---> <M> HCI USB driver < > HCI SDIO driver (NEW) <M> HCI UART driver [*] UART (H4) protocol support [*] BCSP protocol support [ ] HCILL protocol support (NEW) < > HCI BCM203x USB driver (NEW) < > HCI BPA10x USB driver (NEW) < > HCI BlueFRITZ! USB driver (NEW) < > HCI VHCI (Virtual HCI device) driver (NEW)
$ make
Bluez installation
(Done by default on APF51, APF6 and OPOS6UL)
$ make menuconfig
Package Selection for the target ---> ... [*] XML handling ---> [*] libxml2 ... [*] Hardware handling ---> [*] dbus XML library to use (libxml2) ... Networking applications ---> [*] bluez [*] bluez-utils
$ make
Custom Bring up (each hardware may have a different init sequence)
OPOS6UL
OPOS6UL | OPOS6ULNANO |
---|---|
OPOS6UL has a CM-43438 chip (based on BCM43438), connected to the i.MX6UL UART8 (/dev/ttymxc7) | OPOS6ULNANO has a Murata module with CYM4343 chipset, connected to the i.MX6UL UART3 (/dev/ttymxc2) |
# export BTRESET=42 # export BTDEV=/dev/ttymxc7 |
# export BTRESET=99 # export BTDEV=/dev/ttymxc2 |
- Start the bluetooth deamon and attach your chipset to the kernel bluez UART driver:
# /usr/libexec/bluetooth/bluetoothd & #
- Wake up the chip
# echo $BTRESET > /sys/class/gpio/export # echo out > /sys/class/gpio/gpio$BTRESET/direction # echo 0 > /sys/class/gpio/gpio$BTRESET/value # sleep 1 # echo 1 > /sys/class/gpio/gpio$BTRESET/value # sleep 1
- Attach the chip. Before running the following command, be sure that the file /etc/firmware/BCM43430A1.hcd exists (if not, it can be obtained (wget) here ? or here) !
# hciattach -t 30 $BTDEV bcm43xx 921600 flow bcm43xx_init Set Controller UART speed to 921600 bit/s Flash firmware /etc/firmware/BCM43430A1.hcd Set Controller UART speed to 921600 bit/s Device setup complete #
APF6
- APF6 has a jorjin chip connected to the i.MX6 UART2 (ttymxc1)
- Start the bluetooth deamon and attach your chipset to the kernel bluez UART driver:
# /usr/sbin/bluetoothd NET: Registered protocol family 31 Bluetooth: HCI device and connection manager initialized Bluetooth: HCI socket layer initialized Bluetooth: L2CAP socket layer initialized Bluetooth: SCO socket layer initialized Bluetooth: BNEP (Ethernet Emulation) ver 1.3 Bluetooth: BNEP socket layer initialized
or if you are using BlueZ 5
# /usr/libexec/bluetooth/bluetoothd &
- Wake up the chip
# export BTRESET=43 # echo $BTRESET > /sys/class/gpio/export # echo out > /sys/class/gpio/gpio$BTRESET/direction # echo 0 > /sys/class/gpio/gpio$BTRESET/value # sleep 1 # echo 1 > /sys/class/gpio/gpio$BTRESET/value # sleep 1
- Attach the chip. Before running the following command, be sure that the file /lib/firmware/TIInit_7.6.15.bts exists ! You can download it here (click on the 'Raw' button)
# /usr/sbin/hciattach -s 115200 ttymxc1 texas 115200 Found a Texas Instruments' chip! Firmware file : /lib/firmware/TIInit_7.6.15.bts Loaded BTS script version 1 Device setup complete #
APF51Dev
- APF51Dev has a CSR BlueCore 4 chipset connected to the i.MX51 UART3 (ttymxc1)
- On recent kernel using device tree, you have to "wake up" the chip:
# export BTRESET=60 # echo $BTRESET > /sys/class/gpio/export # echo out > /sys/class/gpio/gpio$BTRESET/direction # echo 0 > /sys/class/gpio/gpio$BTRESET/value # sleep 1 # echo 1 > /sys/class/gpio/gpio$BTRESET/value # sleep 1
- Start the bluetooth deamon and attach your chipset to the kernel bluez UART driver:
# /usr/sbin/bluetoothd # /usr/sbin/hciattach -s 115200 ttymxc1 csr 115200 CSR build ID 0x00-0x37 Bluetooth: Core ver 2.15 NET: Registered protocol family 31 Bluetooth: HCI device and connection manager initialized Bluetooth: HCI socket layer initialized Bluetooth: HCI UART driver ver 2.2 Bluetooth: HCI H4 protocol initialized Bluetooth: HCI BCSP protocol initialized
APF27Dev + APW
- APW has a CSR BlueCore 4 chipset connected to the i.MX27 serial port ttySMX5 (UART6)
- Reset it:
# source /usr/bin/gpio_helpers.sh # gpio_mode PB14 1 # gpio_set_value PB14 0; sleep 1; gpio_set_value PB14 1; sleep 1
- Attach it to the kernel bluez UART driver:
# /usr/sbin/hciattach -s 921600 ttySMX5 csr 921600
USB module
- Make sure your hardware is connected to the APF. If using an USB dongle, load corresponding driver:
# modprobe btusb Bluetooth: Core ver 2.14 NET: Registered protocol family 31 Bluetooth: HCI device and connection manager initialized Bluetooth: HCI socket layer initialized Bluetooth: Generic Bluetooth USB driver ver 0.4 usbcore: registered new interface driver btusb
Common Bring up
- Now that your hardware Bluetooth interface is up, check if it was correctly detected by BlueZ:
# hciconfig hci0: Type: USB or UART 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
- If interface is DOWN, bring it up:
# hciconfig hci0 up piscan
- Check your Bluetooth device is correctly initialized:
# hcitool dev Devices: hci0 00:10:60:D1:92:0F
- From Bluez5, everything can now be done with bluetoohctl interactive command:
# bluetoothctl [NEW] Controller 5C:F3:70:34:D6:66 BlueZ 5.43 [default] [bluetooth]# power on [bluetooth]# scan on
Usage
Scanning network
- To get surrounding devices addresses and names:
# hcitool scan Scanning ...
- To get surrounding devices addresses and classes:
# hcitool inq Inquiring ...
Get info on a given device
# hcitool info 00:19:0E:xx:xx:xx ...
Pinging other devices
# l2ping 00:19:0E:xx:xx:xx Ping: 00:19:0E:xx:xx:xx from 00:19:88:xx:xx:xx (data size 44) ... 44 bytes from 00:19:0E:xx:xx:xx id 0 time 38.05ms 44 bytes from 00:19:0E:xx:xx:xx id 1 time 37.09ms ...
Here 00:19:0E:xx:xx:xx is the Bluetooth MAC address of the Host.
Change advertising name
- to change your module's name on Bluetooth network:
# hciconfig hci0 name ARMADEUS
- From bluez5, you can also specify advertising name in /etc/bluetooth/main.conf file (%h = hostname, %d = device number):
[General] Name = OPOS
Advanced usages
Setup a Terminal between a PC and your APF through Bluetooth
On the APF
- the first step is to create the corresponding node for the future connection:
# mknod /dev/rfcomm0 c 216 0
- then, listen to an incoming connection, on the rfcomm0 (here channel 7 is chosen):
# rfcomm -i hci0 listen /dev/rfcomm0 7 &
Note: If RFCOMM protocol is not built statically in your kernel, you might need to load it before use with: # modprobe rfcomm |
Note: If you plan to connect from your smartphone, don't specify a channel number as most apps will try to connect to channel 1: # rfcomm -i hci0 listen /dev/rfcomm0 & |
- and the last step, when the connection is open, is to connect a terminal (through getty) to the device /dev/rfcomm0:
# getty 38400 /dev/rfcomm0
On the PC
- after the two first steps on the APF, you need to connect the PC to the APF with the same channel (7):
$ rfcomm connect 0 00:19:88:2B:xx:xx 7 (replace 00:19:88:2B:xx:xx with the Bluetooth @ of your APF)
- and configure minicom ($HOME/.minirc.dfl):
pu port /dev/rfcomm0 pu baudrate 38400 pu bits 8 pu parity N pu stopbits 1
- when getty is running on the APF/OPOS, you could you connect with minicom:
$ minicom -o
- it could be a good idea to create an additional user account for remotely login through Bluetooth, by following these instructions.
On your Android smartphone
- install BlueTerm app
- connect to right Bluetooth device... that's it ;-)
Using a Bluetooth keyboard on your APF
The only thing needed after having a bluetooth correctly configured is to use this command :
$ hidd --connect keyboard_bdaddr
Controlling your board from an android device (using rfcomm)
The following section shows how to send commands to the board from an android device via Bluetooth. The goal is to control the two LEDs present on the board. An APF51dev and a Samsung Galaxy Tab 2 are used in this example.
On the APF:
- Enable the SPP profile. Here, it is using the channel 1.
# sdptool add --channel=1 SP Serial Port service registered #
- Listen incomming connections on the channel 1. The script serial-server.sh is located in demos/android/android_remote_controller.
# rfcomm listen hci0 1 ./serial-server.sh {} Waiting for connection on channel 1
On the android device:
- Deploy the app on your device. The app is avalaible here as source or here as apk.
- Start the app.
- Enjoy :-)
Others
- TCP/IP with Bluetooth
- OBEX transfers
- Wiimote
Note: On iOS, it is not possible to use standard Bluetooth devices that are not registered through MFi Program. The only to communicate with your modules is to have a Bluetooth Low Energy interface |
Bluetooth Low Energy (BLE)
- This protocol enhancement for low energy networks is only available on APF6, OPOS6UL and OPOS6UL_NANO modules with corresponding Wi-Fi+BLE hardware option.
- To scan for BLE devices (hci0 interface should be up):
# hcitool hci0 lescan
- Most operations can then be done with bluetoothctl:
# bluetoothctl
APF/OPOS as BLE device
- Most of the job consist in developing a GATT server implementing desired functionalities/characteristics. Some examples are given in Bluez sources. For example (python is needed and bluetoothd should have been launched with --experimental option):
# hciconfig hci0 up # /root/example-gatt-server # hciconfig hci0 leadv (to start BLE Advertising)
- You can then use BLE Scanner or LightBlue Android/iOS app.
- For "iBeacon" stuff, this tutorial may serve as a starting example.