zephyr/doc/board/arduino_101_ble.rst
Johan Hedberg 9edc472c3e doc: boards/arduino_101: Update BLE firmare for latest MyNewt version
The dependencies for the HCI firmware are now part of the latest
stable MyNewt release, so special editing of project.yml is no longer
needed.

Change-Id: Ia3658ab1da03e208cd5230e0cda4c96a4628e8f0
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-06-07 05:39:16 +00:00

176 lines
6.1 KiB
ReStructuredText

.. _arduino_101_ble:
Bluetooth firmware for the Arduino 101
######################################
The Arduino 101 board comes with a Nordic Semiconductor nRF51 Bluetooth
LE controller. The Arduino 101 factory-installed firmware on this
controller is not supported by Zephyr, so a new one needs to be flashed
onto it. The best option currently is to use MyNewt
(http://mynewt.apache.org) as a basis for this firmware, which makes it
possible to use the controller with the native Bluetooth stack of
Zephyr.
Building the firmware yourself
******************************
#. Set up the newt tool. For Fedora the dependencies are:
.. code-block:: console
$ sudo dnf install dfu-util libcurl-devel golang arm-none-eabi-gdb \
arm-none-eabi-newlib arm-none-eabi-gcc-cs \
arm-none-eabi-binutils-cs arm-none-eabi-gcc-cs-c++
General instructions, as well as Ubuntu/Debian dependencies can be
found here: http://mynewt.apache.org/newt/install/newt_linux/
#. Once the newt tool is installed create your project:
.. code-block:: console
$ newt new arduino-mynewt
Downloading project skeleton from apache/incubator-mynewt-blinky...
Installing skeleton in arduino-mynewt...
Project arduino-mynewt successfully created.
$ cd arduino-mynewt/
#. After that, initialize the project with:
.. code-block:: console
$ newt install -v
apache-mynewt-core
Downloading repository description for apache-mynewt-core... success!
Downloading repository incubator-mynewt-core (branch: master; commit: mynewt_0_9_0_tag) at https://github.com/apache/incubator-mynewt-core.git
Cloning into '/tmp/newt-repo072720113'...
remote: Counting objects: 24003, done.
remote: Compressing objects: 100% (559/559), done.
remote: Total 24003 (delta 373), reused 13 (delta 13), pack-reused 23359
Receiving objects: 100% (24003/24003), 8.53 MiB | 1.82 MiB/s, done.
Resolving deltas: 100% (14213/14213), done.
Checking connectivity... done.
apache-mynewt-core successfully installed version 0.9.0-none
#. Create a target for the bootloader:
.. code-block:: console
$ newt target create boot
$ newt target set boot app=@apache-mynewt-core/apps/boot
$ newt target set boot bsp=@apache-mynewt-core/hw/bsp/nrf51-arduino_101
$ newt target set boot build_profile=optimized
#. Create a target for the HCI over UART application:
.. code-block:: console
$ newt target create blehci
$ newt target set blehci app=@apache-mynewt-core/apps/blehci
$ newt target set blehci bsp=@apache-mynewt-core/hw/bsp/nrf51-arduino_101
$ newt target set blehci build_profile=optimized
#. Verify that the targets were properly created:
.. code-block:: console
$ newt target show
targets/blehci
app=@apache-mynewt-core/apps/blehci
bsp=@apache-mynewt-core/hw/bsp/nrf51-arduino_101
build_profile=optimized
targets/boot
app=@apache-mynewt-core/apps/boot
bsp=@apache-mynewt-core/hw/bsp/nrf51-arduino_101
build_profile=optimized
#. Build the bootloader
.. code-block:: console
$ newt build boot
Compiling...
...
Linking boot.elf
App successfully built: <path>/arduino-mynewt/bin/boot/apps/boot/boot.elf
#. Build the HCI over UART application:
.. code-block:: console
$ newt build blehci
Compiling...
...
Linking blehci.elf
App successfully built: <path>/arduino-mynewt/bin/blehci/apps/blehci/blehci.elf
.. code-block:: console
$ newt create-image blehci 0.0.0
App image succesfully generated: <path>/arduino-mynewt/bin/blehci/apps/blehci/blehci.img
Build manifest: <path>/arduino-mynewt/bin/blehci/apps/blehci/manifest.json
#. Combine the bootloader and application into a single firmware image
(:file:`ble_core.img`)
.. code-block:: console
$ cat bin/boot/apps/boot/boot.elf.bin /dev/zero | dd of=ble_core.img bs=1k count=256
$ dd if=bin/blehci/apps/blehci/blehci.img of=ble_core.img bs=1 seek=32768
#. Reset Arduino 101 with USB plugged and wait a few seconds (you might
need several repeated attempts):
.. code-block:: console
$ dfu-util -a ble_core -D ble_core.img
...
Opening DFU capable USB device...
ID 8087:0aba
Run-time device DFU version 0011
Claiming USB DFU Interface...
Setting Alternate Setting #8 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 0011
Device returned transfer size 2048
Copying data from PC to DFU device
Download [=========================] 100% 69008 bytes
Download done.
state(2) = dfuIDLE, status(0) = No error condition is present
Done!
After successfully completing these steps your Arduino 101 should now
have a HCI compatible BLE firmware. The Zephyr tree contains several
sample config files for this firmware (named after the MyNewt BLE stack,
Nimble), e.g. :file:`samples/bluetooth/peripheral_hr/prj_nimble.conf`
Getting HCI traces
******************
By default you will only see normal log messages on the console, without
any way of accessing the HCI traffic between Zephyr and the nRF51
controller. There is however a special Bluetooth logging mode that
converts the console to use a binary protocol that interleaves both
normal log messages as well as the HCI traffic. To enable this protocol
the following Kconfig options need to be set:
.. code-block:: none
CONFIG_BLUETOOTH_DEBUG_MONITOR=y
CONFIG_UART_CONSOLE=n
CONFIG_UART_QMSI_1_BAUDRATE=1000000
The first item replaces the BLUETOOTH_DEBUG_STDOUT option, the second
one disables the default printk/printf hooks, and the third one matches
the console baudrate with what's used to communicate with the nRF51, in
order not to create a bottle neck.
To decode the binary protocol that will now be sent to the console UART
you need to use the btmon tool from `BlueZ 5.40
<http://www.bluez.org/release-of-bluez-5-40/>`_ or later:
.. code-block:: console
$ btmon --tty <console TTY> --tty-speed 1000000