# <img alt="OpenSK logo" src="../img/OpenSK.svg" width="200px">

## Nordic nRF52840-DK board

![Nordic development kit](../img/devkit_annotated.jpg)

### Flashing using JTAG

The development board comes with its own JTAG port, so the default programmer
is the easiest and most convenient. You can flash OpenSK with these steps:

1.  Connect a micro USB cable to the JTAG USB port.

1.  Run our script for compiling/flashing Tock OS and OpenSK on your device:

    ```shell
    ./deploy.py --board=nrf52840dk_opensk --opensk
    ```

1.  Connect a micro USB cable to the device USB port.

**Note**: Due to current limitations of our implementation and Tock, you may
have to press the `BOOT/RESET` button, located next to the device USB port on
the board in order to see your OpenSK device on your system.

### Buttons and LEDs

Out of the 5 buttons, the group of 4 behaves identically. They all convey user
presence to the application. Some actions like register and login will make the
board blink, asking you to confirm the transaction with a button press. The
remaining fifth button restarts the board.

The group of 4 LEDs on the right show the state of the app. There are different
patterns:

| Pattern                            | Cause                  |
|------------------------------------|------------------------|
| LED1 slow blink                    | kernel panic           |
| all LEDs blinking together         | app panic              |
| LED1+4 and LED2+3 fast alternating | asking for touch       |
| fast swirling                      | wink (just saying Hi!) |
| circle                             | allocator panic        |

The LEDs closer to the JTAG port indicates the power and debugging state.

There are 3 switches that need to be in the correct position:

*   Power (bottom left): On
*   nRF power source (center left): VDD
*   SW6 (top right): DEFAULT

### Upgradability

There are variants of the board that introduce A/B partitions for upgrading the
firmware. You can bootstrap an upgradable board using one of the two commands:

```shell
./deploy.py --board=nrf52840dk_opensk_a --opensk --version=0
./deploy.py --board=nrf52840dk_opensk_b --opensk --version=0
```

Afterwards, you can upgrade the other partition with

```shell
./tools/perform_upgrade.sh nrf52840dk_opensk_b --version=1
./tools/perform_upgrade.sh nrf52840dk_opensk_a --version=1
```

respectively. You can only upgrade the partition that is not currently running,
so always alternate your calls to `perform_upgrade.sh`. Otherwise, this script
works like `deploy.py`. You can call it even after you locked down your device,
to deploy changes to your development board.

If you deploy with `--vendor-hid`, also add this flag to `perform_upgrade.sh`,
for example:

```shell
./deploy.py --board=nrf52840dk_opensk_a --opensk --version=0 --vendor-hid
./tools/perform_upgrade.sh nrf52840dk_opensk_b --version=1 --vendor-hid
```
