Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Bluetooth is widely used when it is necessary to provide a wireless access to the devices located in short distances. In this application note we will show how to organize a wireless control channel to the NXP i.MX RT1050 EVK RT10XX EVKB running Linux using a USB Bluetooth adapter. In practical embedded applications such a wireless channel may be used to implement a command/response protocol to control your i.MX RT1050 RT10XX based device via Bluetooth from the host machine (computer, notebook, smart-phone, etc.).

1. Hardware Platform

The hardware platform used in this application note is the NXP i.MX RT1050 EVK RT10XX EVKB board with a USB Bluetooth adapter plugged into the USB1 or USB2 interface connector. The adapter used by Emcraft to perform the tests documented below was RFCOMM Protocol TDI Bluetooth Device. The generic Linux kernel device driver for the USB transport HCI layer (CONFIG_BT_HCIBTUSB) is used in this configuration so other USB Bluetooth adapters should work as described below too.

2. Software Platform

The goal is to have the i.MX RT1050 RT10XX act as a device with the Serial Port Profile (SPP) in the Bluetooth network. The i.MX RT1050 RT10XX will emulate the serial port over the Bluetooth transport and therefore the host will see the i.MX RT1050 RT10XX as an ordinary serial RS-232 port.

The Bluetooth Serial Port Profile interface is implemented with the BT_RFCOMM_TTY kernel driver. The sdptool and rfcomm utilities, ported from the bluez-utils package to the Linux NXP i.MX RT1050 RT10XX EVK BSP, are used for configuration. The sdptool utility is used to create the "Serial Port" profile, exported over Bluetooth. The rfcomm utility is started in the "listen" mode and, on the "Serial Port" profile activation, rfcomm emulates a virtual COM port on the /dev/rfcommX device file, looking from the i.MX RT1050 RT10XX side.

The functionality described below is available from the rootfs.uImage project provided by Emcraft for NXP i.MX RT1050 EVKRT10XX EVKB.

3. Test Setup

We will use the following terminology below:

  • Target: NXP i.MX RT1050 EVK EVKB board with the Bluetooth adapter plugged into the USB (J9) port or NXP i.MX RT1060 EVKB board with the Bluetooth adapter plugged into the USB (J47) port.
    The Bluetooth <Target address> in the examples below is 04:7F:0E:31:B7:94.

  • Host: Any computer with a Bluetooth interface, running Linux with the Bluetooth tools (bluez-utils) installed.
    The Bluetooth <Host address> in the examples below is BC30:7703:37C8:5CC9:3210:57E6.

4. Test Connectivity

  1. Power-on the NXP i.MX RT1050 EVK RT10XX EVKB board and wait for the Linux to boot on the Target. Run the Bluetooth daemons in the background:

    Code Block
    ...
    / # hcid -n&
    [1] 97 hcid -n
    hcid[97]: Bluetooth HCI daemon
    / # sdpd -n&
    [2] 98 sdpd -n
    / #
  2. Plug-in the Bluetooth adapter to the USB1 interface of the NXP i.MX RT1050 RT10XX EVK board. Observe the messages like these in the Target console:

    Code Block
    usb 1-1ci_hdrc ci_hdrc.0: EHCI Host Controller
    ci_hdrc ci_hdrc.0: new full-speed USB deviceUSB bus registered, assigned bus number 32
    usingci_hdrc ci_hdrc.0: 
    usb 1-1: Duplicate descriptor for config 1 interface 1 altsetting 5, skipping hcid[229]: HCI dev 0 regBluetooth: hci0: CSR: Unbranded CSR clone detected; adding workarounds and force-suspending once...
    isteBluetoothUSB 2.0 started, EHCI 1.00
    hub 2-0:1.0: USB hub found
    hub 2-0:1.0: 1 port detected
    usb 2-1: new full-speed USB device number 2 using ci_hdrc
    usb 2-1: device no response, device descriptor read/64, error -71
    Bluetooth: hci0: unexpected event for opcode 0x0000
    Bluetooth: hci0: CSR: Setting Failedup todongle suspendwith theHCI device for our Barrot 8041a02 receive-issue workaround
    red
    hcid[229ver=6 rev=22bb
    Bluetooth: hci0: LMP ver=6 subver=22bb; manufacturer=10
    hcid[74]: HCI dev 0 upregistered
    hcid[23574]: Can'tHCI setdev encrypt0 on hci0: Invalid request code (56)
    up
    hcid[22974]: Starting security manager 0
  3. Get the <Target <target address> Bluetooth address of the adapter you have just plugged-in:

    Code Block
    / # hcitool dev
    Devices:
    hci0 04:7F:0E:31:B7:94
    / #
  4. Add the Serial Port profile to the list of Bluetooth profiles. In the example below the Bluetooth channel number to access this profile is 1:

    Code Block
    / # sdptool add --channel=1 SP
    Serial Port service registered
  5. Start the background listening for raw connections on the channel 1:

    Code Block
    / # rfcomm --raw listen /dev/rfcomm0 1 &
    [3] 110 rfcomm --raw listen /dev/rfcomm0 1
    / # Waiting for connection on channel 1
  6. On the Hosthost, open a raw Bluetooth connection to the Target (<Target Address> <target address> Bluetooth Device, channel 1):

    Code Block
    $ sudo rfcomm --raw connect 0 04:7F:0E:31:B7:94 1
    Connected /dev/rfcomm0 to 04:7F:0E:31:B7:94 on channel 1
    Press CTRL-C for hangup
  7. In the Target target console observe an indication of the connection from the Host:

    Code Block
    Connection from BC30:7703:37C8:5CC9:3210:57E6 to /dev/rfcomm0
    Press CTRL-C for hangup
  8. Send a text string (command) to the Target over the Bluetooth serial port from the Host:

    Code Block
    $ echo "Hello from Host over the BT Serial" | sudo tee /dev/rfcomm0
    Hello from Host over the BT Serial
  9. On the Target receive the text string (command) just sent from Host:

    Code Block
    / # cat /dev/rfcomm0
    Hello from Host over the BT Serial
    ^C
  10. Send a text string (response) from the Target to Host over the Bluetooth serial port:

    Code Block
    / # echo "Hello from Target over the BT Serial" > /dev/rfcomm0
  11. Receive the text string (response) just sent from the Target over the Bluetooth serial port:

    Code Block
    $ sudo cat /dev/rfcomm0
    Hello from Target over the BT Serial
    ^C
  12. Disconnect the Host from the Bluetooth serial line by pressing Ctrl-C in the rfcomm --raw connect ... terminal window:

    Code Block
    ^C
    Disconnected
  13. Observe the rfcomm termination on the Target side:

...