Introduction

A HCI interface can be implemented in lieu of smartBasic on Laird Linux IG60. The benefit of making this change to the firmware is the ability to use the BL654 with standard tools such as bluetoothctl.

Prerequisites

For this project you will need:

  • IG60 with Laird Linux that includes an internal BL654. The part numbers for this device are 455-00076 or 455-00088 (LTE)
  • MicroSD card to install Laird Linux
  • Workstation with Linux installed
  • Network connection to the IG60 to copy files with SCP. By default, wired connections are configured for DHCP. To set a static address a serial connection is also required.
  • microSD card

Optional:

  • BT510 or other bluetooth device

Software Configuration

Provision microSD with Laird Linux

Build Laird Linux, or download and flash the prebuilt image from our GitHub repository:

https://github.com/LairdCP/IG60-Laird-Linux-Release-Packages/releases#flashing-a-developers-sd-card-image

Build or download hci_uart.hex

To build the hci_uart example for BL654_DVK, download the hci_uart sample found at:

https://docs.zephyrproject.org/latest/samples/bluetooth/hci_uart/README.html

Before compiling, set the offset for the bootloader.

vi samples/bluetooth/hci_uart/prj.conf

Add the following line:

CONFIG_FLASH_LOAD_OFFSET=0x1000

Compile the example. Use the -d switch to direct the output to a folder, for example:

west build -b bl654_dvk samples/bluetooth/hci_uart --pristine -d my_firmware

If you’re unable to compile, a pre-built zephyr.hex is included in the next section.

Download and copy these files to your IG60

The files below are contained in this repo in this zip file:

  • zephyr.hex
  • Ubutil_Linux_RPi
  • bl654_bl_util.py
  • btpa_firmware_loader.py #this file is already present in the default Laird Linux build in the /bin folder

Flashing the BL654

Add execute permissions.

chmod +x UBUtil_Linux_RPi

UBUtil is used to generate key pairs and firmware update images as follows:

./UBUtil_Linux_RPi --create-key hci_uart.pem

./UBUtil_Linux_RPi --application-key-file hci_uart.pem --a0-version 43 --a0-compressed --a0-target 0 --a0-startaddress 0x1000 --a0-filetype 1 --a0-filename  zephyr.hex --a0-keytype 1 --append-pub-key --output hci_uart.hex --ubu-output hci_uart.uwf --ubu-platform 5ECB654F --ubu-flash-size 2097152 --ubu-sector-size 4096 --ubu-base-address 0 --ubu-align-length 4

Image Expand

Use the python script “bl654_bl_util.py” to erase the existing firmware and key.

python bl654_bl_util.py erase

Flash the signed firmware file to the BL654.

python btpa_firmware_loader.py /dev/ttyS2 115200 hci_uart.uwf

Verify the app version is “43”.

python bl654_bt_util version

Image Expand

Starting the HCI interface and using Bluetoothctl

The final step is to create an HCI interface is to use btattach on the serial interface.

btattach -B /dev/ttyS2 -P h4 -S 115200 &

Verify there are two HCI interfaces.

ls /sys/class/bluetooth/

Image Expand

Use Bluetoothctl to control the HCI and pair with a device.

bluetoothctl 

In the bluetoothctl shell, list the interfaces.

list

The show command will show the attributes of each interface

show <mac>

Select the interface you wish to use.

select <mac>

Begin scanning.

scan on
scan off

Image Expand

Display a list of detected devices.

devices

Image Expand

Pair with your desired device.

pair <mac>
trust <mac>

Image Expand