.. zephyr:board:: ctcc

Overview
********

The Connectivity Card nRF52840 enables BLE and IEEE 802.15.4 connectivity
over mPCIe or M.2 using USB port with on-board nRF52840 SoC.

This board has following features:

* CLOCK
* FLASH
* :abbr:`GPIO (General Purpose Input Output)`
* :abbr:`MPU (Memory Protection Unit)`
* :abbr:`NVIC (Nested Vectored Interrupt Controller)`
* RADIO (Bluetooth Low Energy and 802.15.4)
* :abbr:`RTC (nRF RTC System Clock)`
* :abbr:`USB (Universal Serial Bus)`
* :abbr:`WDT (Watchdog Timer)`

.. figure:: img/ctcc_nrf52840_mpcie.webp
     :align: center
     :alt: CTCC nRF52840 mPCIe

     ctcc/nrf52840 mPCie board

.. figure:: img/ctcc_nrf52840_m2.webp
     :align: center
     :alt: CTCC nRF52840 M.2

     ctcc/nrf52840 M.2 board

More information about the board can be found at the
`ctcc_nrf52840 Website`_ and for SoC information: `Nordic Semiconductor Infocenter`_.

Hardware
********

The ``ctcc/nrf52840`` board target has one external oscillator of the 32.768 kHz.

Supported Features
==================

The ``ctcc/nrf52840`` board target supports the following
hardware features:

+-----------+------------+----------------------+
| Interface | Controller | Driver/Component     |
+===========+============+======================+
| CLOCK     | on-chip    | clock_control        |
+-----------+------------+----------------------+
| FLASH     | on-chip    | flash                |
+-----------+------------+----------------------+
| GPIO      | on-chip    | gpio                 |
+-----------+------------+----------------------+
| MPU       | on-chip    | arch/arm             |
+-----------+------------+----------------------+
| NVIC      | on-chip    | arch/arm             |
+-----------+------------+----------------------+
| RADIO     | on-chip    | Bluetooth,           |
|           |            | ieee802154           |
+-----------+------------+----------------------+
| RTC       | on-chip    | system clock         |
+-----------+------------+----------------------+
| USB       | on-chip    | usb                  |
+-----------+------------+----------------------+
| WDT       | on-chip    | watchdog             |
+-----------+------------+----------------------+

Connections and IOs
===================

LED
---

Note that board does not have on-board LEDs, however it exposes
LED signals on mPCIe/M.2 pins.

* LED1 = P0.23
* LED2 = P0.22

Programming and Debugging
*************************

Applications for the ``ctcc/nrf52840`` board target can be
built in the usual way (see :ref:`build_an_application` for more details).

Flashing
========

The board supports the following programming options:

1. Using an external :ref:`debug probe <debug-probes>`
2. Using MCUboot with DFU support

Option 1: Using an External Debug Probe
---------------------------------------

Connectivity Card can be programmed using an external debug probe (Segger J-Link) by connecting
to on-board SWD test pads.

For Segger J-Link debug probes, follow the instructions in the
:ref:`nordic_segger` page to install and configure all the necessary
software. Further information can be found in :ref:`nordic_segger_flashing`.

Then build and flash applications as usual (see :ref:`build_an_application` and
:ref:`application_run` for more details).

Here is an example for the :zephyr:code-sample:`usb-cdc-acm-console` application which prints out
logs on emulated USB port.

.. zephyr-app-commands::
   :zephyr-app: samples/subsys/usb/console
   :board: ctcc/nrf52840
   :goals: build flash

Debugging
=========

The ``ctcc/nrf52840`` board target does not have an on-board J-Link debug IC, however
instructions from the :ref:`nordic_segger` page also apply to this board,
with the additional step of connecting an external debugger.

Option 2: Using MCUboot with DFU support
----------------------------------------

It is also possible to use the MCUboot bootloader with DFU support to flash
Zephyr applications. You need to flash MCUboot with DFU support and fill in slot0 with
some application one-time using Option 1. Then you can re-flash an application using DFU utility
by loading images to slot1. Note, it's not possible to have only MCUboot and load directly
software to slot0 due to DFU implementation in Zephyr, which for present slot0 and slot1 in flash
map, it assumes only slot1 partition as writeable.

Install ``dfu-util`` first and make sure MCUboot's ``imgtool`` is
available for signing your binary for MCUboot as described on :ref:`west-sign`.

Next, do the **one-time setup** to flash MCUboot with DFU support.
We'll assume you've cloned the `MCUboot`_ as a submodule when initializing
Zephyr repositories using :ref:`west` tool.

#. Compile MCUboot as a Zephyr application with DFU support.

   .. zephyr-app-commands::
      :app: mcuboot/boot/zephyr
      :board: ctcc/nrf52840
      :build-dir: mcuboot
      :goals: build
      :gen-args: -DCONFIG_BOOT_USB_DFU_WAIT=y

#. Flash it onto the board as described in Option 1.

#. Flash other Zephyr application to fill in slot0 e.g:

   .. zephyr-app-commands::
      :zephyr-app: samples/subsys/usb/dfu
      :board: ctcc/nrf52840
      :build-dir: dfu
      :goals: build
      :gen-args: -DCONFIG_BOOTLOADER_MCUBOOT=y -DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE=\"path/to/mcuboot/boot/root-rsa-2048.pem\"

You can now flash a Zephyr application to the board using DFU util.
As an example we'll use the :zephyr:code-sample:`usb-cdc-acm-console` sample.

   .. zephyr-app-commands::
      :zephyr-app: samples/subsys/usb/console
      :board: ctcc/nrf52840
      :goals: build flash
      :gen-args: -DCONFIG_BOOTLOADER_MCUBOOT=y -DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE=\"path/to/mcuboot/boot/root-rsa-2048.pem\"

.. note::

   In all examples it is assumed to use default :file:`root-rsa-2048.pem` file from ``mcuboot/boot``
   directory. Providing certificate in build args produces signed binary automatically.
   Do not use this certificate in your production firmware!

#. Plug in ``ctcc/nrf52840`` card to mPCIe/M.2 slot or use mPCIe/M.2 adapter to USB
   and plug such adapter to USB port.

   You should see ``NordicSemiconductor MCUBOOT`` or ``NordicSemiconductor Zephyr DFU sample``
   (if you flashed ``dfu`` sample to slot0) device once plugging it into host
   USB port. You can check that on Linux system by entering ``lsusb`` command.

   To check if DFU device is visible you can enter ``sudo dfu-util -l`` command. Once the
   device is visible you can flash Zephyr image using DFU util: ``sudo dfu-util --alt 1 --download build/zephyr/zephyr.signed.bin``


References
**********

.. target-notes::

.. _ctcc_nrf52840 Website:
   https://cthings.co/products/connectivity-cards
.. _Nordic Semiconductor Infocenter:
   https://infocenter.nordicsemi.com
.. _MCUboot:
   https://github.com/JuulLabs-OSS/mcuboot
