blob: 40ba1d9ca062a6d5cfe2063c27d3babb38ea9d4a [file] [log] [blame]
.. _arduino_101:
Arduino/Genuino 101
###################
Overview
********
The Arduino/Genuino 101 is a learning and development board which contains an
Intel |reg| Curie |trade| Module. This board is designed to integrate the core's low
power-consumption and high performance with the Arduino's ease-of-use. The
Arduino 101 adds Bluetooth Low Energy capabilities and has an on-board 6-axis
accelerometer/gyroscope, providing exciting opportunities for building creative
projects in the connected world.
.. figure:: img/arduino_101.jpg
:width: 442px
:align: center
:alt: Arduino/Genuino 101
Arduino/Genuino 101 (Credit: Intel)
The Intel Quark* SE SoC in the Curie module contains a single core 32 MHz x86
(Intel Quark* processor) and the 32 MHz Argonaut RISC Core (ARC)* EM processor.
The two processors operate simultaneously and share memory. The ARC processor is
also referenced as the digital signal processor (DSP) sensor hub or a sensor
subsystem depending on what document you're looking at. In theory, the DSP can
run using a minimal amount of power, gathering and processing sensor data while
the x86 processor waits in a low power mode, which would be ideal for always-on
applications.
Zephyr can be flashed to an Arduino 101 for experimentation and testing
purposes; keep in mind that running the Zephyr OS on the Arduino 101 is not
supported by Arduino LLC.
Hardware
********
Board Layout
============
General information for the board can be found at the
`Arduino 101 website <https://www.arduino.cc/en/Main/ArduinoBoard101>`_,
which also includes schematics and BRD files
for the board.
Arduino 101 Pinout
==================
When using the Zephyr kernel, the pinout mapping for the Arduino 101 becomes a
little more complicated. The table below details which pins in Zephyr map to
those on the Arduino 101 board for control. Full details of the pinmux
implementation, what valid options can be configured, and where things map can
be found in the :file:`boards/x86/arduino_101/pinmux.c` file.
+-------------+----------+------------+
| Arduino Pin | Function | Zephyr Pin |
+=============+==========+============+
| IO-0 | UART1-RX | 17 |
+-------------+----------+------------+
| IO-1 | UART1-TX | 16 |
+-------------+----------+------------+
| IO-2 | GPIO | 52 |
+-------------+----------+------------+
| IO-3 | GPIO | 51 |
| | | 63 |
+-------------+----------+------------+
| IO-4 | GPIO | 53 |
+-------------+----------+------------+
| IO-5 | GPIO | 49 |
| | | 64 |
+-------------+----------+------------+
| IO-6 | PWM2 | 65 |
+-------------+----------+------------+
| IO-7 | GPIO | 54 |
+-------------+----------+------------+
| IO-8 | GPIO | 50 |
+-------------+----------+------------+
| IO-9 | PWM3 | 66 |
+-------------+----------+------------+
| IO-10 | AIN0 | 0 |
+-------------+----------+------------+
| IO-11 | AIN3 | 3 |
+-------------+----------+------------+
| IO-12 | AIN1 | 1 |
+-------------+----------+------------+
| IO-13 | AIN2 | 2 |
+-------------+----------+------------+
| ADC0 | GPIO SS | 10 |
+-------------+----------+------------+
| ADC1 | GPIO SS | 11 |
+-------------+----------+------------+
| ADC2 | GPIO SS | 12 |
+-------------+----------+------------+
| ADC3 | GPIO SS | 13 |
+-------------+----------+------------+
| ADC4 | AIN14 | 14 |
+-------------+----------+------------+
| ADC5 | AIN9 | 9 |
+-------------+----------+------------+
.. note::
IO-3 and IO-5 require both pins to be set for functionality changes.
Supported Features
==================
The Zephyr kernel supports multiple hardware features on the Arduino 101 through
the use of drivers. Some drivers are functional on the x86 side only, some on
the ARC side only, and a few are functional on both sides. The table below shows
which drivers and functionality can be found on which architectures:
+-----------+------------+-----+-----+-----------------------+
| Interface | Controller | ARC | x86 | Driver/Component |
+===========+============+=====+=====+=======================+
| APIC | on-chip | N | Y | interrupt_controller |
+-----------+------------+-----+-----+-----------------------+
| UART | on-chip | N | Y | serial port-polling; |
| | | | | serial port-interrupt |
+-----------+------------+-----+-----+-----------------------+
| SPI | on-chip | Y | Y | spi |
+-----------+------------+-----+-----+-----------------------+
| ADC | on-chip | Y | N | adc |
+-----------+------------+-----+-----+-----------------------+
| I2C | on-chip | Y | Y | i2c |
+-----------+------------+-----+-----+-----------------------+
| GPIO | on-chip | Y | Y | gpio |
+-----------+------------+-----+-----+-----------------------+
| PWM | on-chip | Y | Y | pwm |
+-----------+------------+-----+-----+-----------------------+
| mailbox | on-chip | Y | Y | ipm |
+-----------+------------+-----+-----+-----------------------+
Required Hardware and Software
==============================
Before flashing the Zephyr kernel onto an Arduino 101, a few additional pieces
of hardware are required.
* The USB port for power will work; however, we recommend the 7V-12V barrel
connector be used when working with the JTAG connector.
* If you wish to grab any data off the serial port, you will need a TTL-to-USB
adapter. The following adapters require male-to-male jumper cables in order to
connect to the Arduino 101 board.
* USB to 3.3V TTL Serial Cable
* FTDI USB to TTL Serial Part #TTL-232R-3V3 http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm
We recommend using the ``dfu-util`` tool to flash the Arduino 101 board.
For Linux environments, verify that ``udev`` has the proper rules for granting
you access to the Arduino 101 board in DFU mode. You can easily add the required
rules, using the ``create_dfu_udev_rule`` script provided with the
`Intel Curie Boards package`_ for the Arduino Desktop IDE. You can get and run
this script standalone with the following commands:
.. code-block:: console
$ wget https://github.com/01org/intel-arduino-tools/raw/linux64/scripts/create_dfu_udev_rule
$ chmod +x create_dfu_udev_rule
$ sudo ./create_dfu_udev_rule
$ rm create_dfu_udev_rule
If you'd like to flash using JTAG, the following additional hardware is needed:
* Flyswatter2 JTAG debugger
* ARM Micro JTAG Connector, Model: ARM-JTAG-20-10
Connecting Serial Output
========================
The default configuration defined in the Zephyr kernel supports serial output
via the UART1 on the board. To read the output, you will need a USB to 3.3V TTL
serial cable. To enable serial output:
* Connect the Serial Cable RX pin to the Arduino 101's TX->1 pin.
* Connect the Serial Cable TX pin to the Arduino 101's RX<-0 pin.
* Connect the Serial Cable GND pin to the Arduino 101's GND pin.
Once connected, on your development environment, you will need to:
* Open a serial port emulator (i.e. on Linux minicom, screen, etc)
* Attach to the USB to TTL Serial cable, for example, on Linux this may be
/dev/ttyUSB0
* Set the communication details to:
* Speed: 115200
* Data: 8 bits
* Parity: None
* Stopbits: 1
Programming and Debugging
*************************
The Arduino 101 is powered by a Quark CPU and a sensor subsystem powered by an
ARC processor. When building applications, depending on the usage, two Zephyr
images need to be built and flashed.
The Arduino 101 has a bootloader that supports flashing over USB using the DFU
protocol. Additionally, the factory installed bootloader supports flashing of
the firmware for the Bluetooth device of the Curie module.
Use the ``arduino_101`` board definition to build a kernel for the Quark core. Use
the ``arduino_101_sss`` board definition when targeting the sensor subsystem.
When your application is targeting the Quark processor only, it is important to
disable the sensor subsystem processor using the ``CONFIG_ARC_INIT=n`` option,
otherwise the board will appear to hang waiting for the sensor subsystem
processor to boot.
Bootloader (Boot ROM)
=====================
Support for the `QMSI Bootloader`_ has been removed starting from Zephyr 1.4.0.
Thus, the factory boot ROM can be kept supporting the flashing of the board over
DFU and flashing the Bluetooth firmware.
If you have previously installed a different boot ROM it is recommended to
restore the factory boot ROM image using the `Flashpack Utility`_. Consult
the README available in the `Flashpack Utility`_ package and follow the
instructions for your environment.
Flashing
========
The ``dfu-util`` flashing application will only recognize the Arduino 101 as a
DFU-capable device within five seconds after the Master Reset button is pressed
on the board. You can run this application with the help of the Zephyr build
system by defining the environment variable ``ZEPHYR_FLASH_OVER_DFU=y`` before
flashing Zephyr applications (as described in :ref:`application_run`).
If you regularly use this method, you can add the following line into your
``~/.zephyrrc`` file:
.. code-block:: console
export ZEPHYR_FLASH_OVER_DFU=y
Flashing the Sensor Subsystem Core
----------------------------------
When building for the ARC processor, the board type is listed as
``arduino_101_sss``.
The sample application :ref:`hello_world` is used for this tutorial. To build
and flash this application using ``dfu-util``, first set
``ZEPHYR_FLASH_OVER_DFU=y`` in the environment as described above, then run:
.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: arduino_101_sss
:build-dir: arduino_101_sss
:goals: build flash
Flashing the x86 Application Core
---------------------------------
When building for the x86 processor, the board type is listed as
``arduino_101``. To build and flash the :ref:`hello_world` application to this
board using ``dfu-util``, first set ``ZEPHYR_FLASH_OVER_DFU=y`` in the
environment as described above, then run:
.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: arduino_101
:build-dir: arduino_101
:goals: build flash
.. _bluetooth_firmware_arduino_101:
Flashing the Bluetooth Core
---------------------------
To be interoperable with the Zephyr Bluetooth stack the Bluetooth controller of
the Arduino 101 (Nordic Semiconductor nRF51) needs to be flashed with a
compatible firmware.
The Arduino 101 factory-installed firmware on this controller is not supported
by the Zephyr project, so you need to flash a new one onto it.
Luckily, starting with Zephyr 1.6, Zephyr itself is able to act as the firmware
for the controller. The application you need is ``samples/bluetooth/hci_uart`` and
the target board is called ``arduino_101_ble``.
To build the Bluetooth controller image and flash it using ``dfu-util``, first
set ``ZEPHYR_FLASH_OVER_DFU=y`` in the environment as described above, then
run:
.. zephyr-app-commands::
:zephyr-app: samples/bluetooth/hci_uart
:board: arduino_101_ble
:goals: build flash
After successfully completing these steps your Arduino 101 should now have a HCI
compatible BLE firmware.
Flashing using JTAG Adapter
---------------------------
We recommend using the ``dfu-util`` tool to flash the Arduino 101 board for typical
development work. JTAG is intended for advanced development and debugging.
* Connect the ARM Micro JTAG Connector to the Flyswatter2.
* Locate the micro JTAG header on the Arduino 101 board. It is adjacent to the
SCL and SDA pins in the Arduino headers, highlighted as the red square in the
figure below.
.. figure:: img/arduino_101_flat.jpg
:width: 442px
:align: center
:alt: Arduino/Genuino 101 JTAG
* Beside the micro JTAG header is a small white dot indicating the location of
pin 1 on the header. The green arrow on the figure points to the dot.
* Connect the ARM Micro JTAG Connector to the Arduino 101 micro JTAG header.
Ensure that both the cable and header pin 1 locations line up. The cable from
the ARM Micro JTAG Connector uses a red wire on the cable to denote which end on
the cable has the pin 1.
For Linux environments, to control the Flyswatter2 your Linux account needs to be
granted HAL layer interaction permissions. This is done through the group
'plugdev'. Verifying the group exists and adding your username can be
accomplished with the usermod command:
.. code-block:: console
$ sudo usermod -a -G plugdev $LOGNAME
If the group does not exist, you can add it by running the following command:
.. code-block:: console
$ sudo groupadd -r plugdev
For Linux environments, verify that ``udev`` has the proper rules for giving your
user control of the Flyswatter2 device. Adding the following rule to udev will
give members of the plugdev group control of the Flyswatter2.
.. code-block:: console
$ sudo su
$ cat <<EOF > /etc/udev/rules.d/99-openocd.rules
# TinCanTools Flyswatter2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"
EOF
$ exit
Once your udev rules are setup, you will need to reload the rules:
.. code-block:: console
$ sudo udevadm control --reload-rules
Plug the USB Type B cable into the Flyswatter2 and your computer. On Linux, you
should see something similar to the following in your dmesg:
.. code-block:: console
usb 1-2.1.1: new high-speed USB device number 13 using xhci_hcd
usb 1-2.1.1: New USB device found, idVendor=0403, idProduct=6010
usb 1-2.1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-2.1.1: Product: Flyswatter2
usb 1-2.1.1: Manufacturer: TinCanTools
usb 1-2.1.1: SerialNumber: FS20000
ftdi_sio 1-2.1.1:1.0: FTDI USB Serial Device converter detected
usb 1-2.1.1: Detected FT2232H
usb 1-2.1.1: FTDI USB Serial Device converter now attached to ttyUSB0
ftdi_sio 1-2.1.1:1.1: FTDI USB Serial Device converter detected
usb 1-2.1.1: Detected FT2232H
usb 1-2.1.1: FTDI USB Serial Device converter now attached to ttyUSB1
Debugging
=========
The instructions below will help you debug the Arduino 101 on the x86 core or
the ARC core, respectively.
Application Core (x86)
----------------------
Build and flash an x86 application, then launch a debugging server with the
following commands:
.. zephyr-app-commands::
:app: <my x86 app>
:board: arduino_101
:goals: build flash debugserver
Connect to the debug server at the x86 core from a second console:
.. code-block:: console
$ cd <my x86 app>
$ $ZEPHYR_SDK_INSTALL_DIR/sysroots/x86_64-pokysdk-linux/usr/bin/i586-zephyr-elfiamcu/i586-zephyr-elfiamcu-gdb build/zephyr/zephyr.elf
(gdb) target remote localhost:3333
(gdb) b main
(gdb) c
Sensor Subsystem Core (ARC)
---------------------------
Enable ARC INIT from the x86 core. This can be done by flashing an x86
application that sets the ``CONFIG_ARC_INIT=y`` option, such as the booting stub
provided with the Zephyr Test Framework, like so:
.. zephyr-app-commands::
:zephyr-app: tests/booting/stub
:board: arduino_101
:goals: flash
Then build the ARC application, flash it, and launch a debug server with the
following commands:
.. zephyr-app-commands::
:app: <my arc app>
:board: arduino_101_sss
:goals: flash debugserver
Connect to the debug server at the ARC core from a second console:
.. code-block:: console
$ cd <my arc app>
$ $ZEPHYR_SDK_INSTALL_DIR/sysroots/x86_64-pokysdk-linux/usr/bin/arc-zephyr-elf/arc-zephyr-elf-gdb build/zephyr/zephyr.elf
(gdb) target remote localhost:3334
(gdb) b main
(gdb) c
Bluetooth Firmware
------------------
You will only see normal log messages on the console, by default, without any
way of accessing the HCI traffic between Zephyr and the nRF51 controller.
However, there is 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. Set the following Kconfig options to enable this protocol before
building your application:
.. code-block:: console
CONFIG_BT_DEBUG_MONITOR=y
CONFIG_UART_CONSOLE=n
CONFIG_UART_QMSI_1_BAUDRATE=1000000
The first item replaces the BT_DEBUG_LOG 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 bottleneck.
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 or later:
.. code-block:: console
$ btmon --tty <console TTY> --tty-speed 1000000
Release Notes
*************
When debugging on ARC, it is important that the x86 core be started and running
BEFORE attempting to debug on ARC. This is because the IPM console calls will
hang waiting for the x86 core to clear the communication.
References
**********
.. _QMSI Bootloader: https://github.com/quark-mcu/qm-bootloader
.. _Flashpack Utility: https://downloadcenter.intel.com/downloads/eula/25470/Arduino-101-software-package?httpDown=https%3A%2F%2Fdownloadmirror.intel.com%2F25470%2Feng%2Farduino101-factory_recovery-flashpack.tar.bz2
.. _Intel Curie Boards package: https://www.arduino.cc/en/Guide/Arduino101#toc2