--- title: "Arduino UNO Q" description: >- The Arduino UNO Q has a Qualcomm QRB2210 running Debian and an STM32U585 microcontroller running Zephyr. The LAA tests Zephyr on the STM32U585. The image goes to the board over adb, and the console uses the [Flylead MIB](/hardware/mibs/flylead.md). --- ```{include} common-alert-enablement.md ``` The [Arduino UNO Q](https://docs.arduino.cc/hardware/uno-q/) has a Qualcomm QRB2210 running Debian and an STM32U585 microcontroller (Arm Cortex-M33) running Zephyr. The LAA tests Zephyr on the STM32U585. The SWD pins of the STM32U585 are only wired to the QRB2210, so the image goes to the board over adb, and OpenOCD on the QRB2210 writes it. This document applies to the following boards: - Arduino UNO Q (ABX00162): arduino-uno-q ## Components The following components are required to automate the board: - [Flylead MIB](/hardware/mibs/flylead.md) - USB-C male to USB-C male cable - Three jumper wires for the serial console ## Hardware modification None. The board doesn't need a reset wire. The LAA resets it by turning the USB power off and on. ## Connections ### Power Set the flylead MIB VIO jumper `J17` to 3V3. Connect a USB C-to-C cable from the LAA [USB port 1](/hardware/peripherals.md#usb-ports) to the `JUSB1` USB-C connector of the board. The board needs 5 V at 3 A, doesn't have a power button, and boots when it gets power. ```shell laam laacli power 3v3 on laam laacli usb 1 on ``` The same cable carries adb to the QRB2210 for the flasher. ### Serial The console is the STM32U585's `USART1` on the `JDIGITAL` header. Connect it to the `J12` (UART 4) connector of the flylead MIB: | `J12` pin | Signal | UNO Q pin | |-----------|----------------|-----------------------| | 2 | `SIB_UART4_RX` | D1 (PB6, `USART1_TX`) | | 3 | `SIB_UART4_TX` | D0 (PB7, `USART1_RX`) | | 4 | GND | GND, next to AREF | Leave `J12` pin 1 (`Vio`) unconnected. The console is `/dev/ttymxc3`, on port `2000` at 115200 8N1: ```shell laam serials connect ttymxc3 ``` ## Software ### Flashing The flasher doesn't need a tool in the LAA overlay. The deploy steps are in the device dictionary's `flasher_deploy_commands`: 1. Power on the board. Debian boots on the QRB2210. 2. Copy `zephyr.elf` to `/tmp` on the board with `adb wait-for-device push`, in a `linaro/kir` container. 3. Run OpenOCD on the board with `adb shell`. It uses `/opt/openocd/bin/openocd` and `openocd_gpiod.cfg` from the Debian image, and writes and verifies the STM32U585 flash over SWD. Waiting for Debian adds about 25 seconds to the deploy. OpenOCD doesn't reset the STM32U585 after the flash. The boot action connects to the console first and then turns the USB power off and on, so the console shows the Zephyr boot banner from the first byte. During `reset-init`, OpenOCD prints `Error: Translation from khz to adapter speed not implemented`. The GPIO SWD adapter can't change its speed. The write and the verify still pass, and OpenOCD exits with 0. ### Debian image The flasher needs adb on the QRB2210. The Debian image `20260528-558` has adb on the USB-C connector, and the board shows up as `2341:0078`. An older image showing only a USB Ethernet gadget (`1d6b:0104`) doesn't have adb. To reflash such board, see [Recovery](#recovery). ## Recovery ```{admonition} Recovery isn't automated :class: warning Reflashing Debian on the QRB2210 needs a jumper on the `JCTL` header, set by hand. ``` `JCTL` is the header with 2 rows of 5 pins below the USB-C connector. Its pins use 1.8 V logic. Seen from the top, with the USB-C connector at the top: ```text VBUS_DISABLE o o +1V8 (out) PMIC_RESET o o GND SOC_SE4_RX o o VOL_UP SOC_SE4_TX o o VOL_DOWN USB_BOOT o o GND ``` A jumper on the bottom row (`USB_BOOT` to GND) starts the QRB2210 in EDL mode. Prepare the LAA once: - `qcserial` claims the EDL device as `ttyUSB0`, so `qdl` doesn't get an answer from the board. Unload it with `sudo modprobe -r qcserial` and blacklist it in `/etc/modprobe.d/`. - `qdl` needs write access to the USB device node. After each enumeration, run `sudo chown torizon /dev/bus/usb/001/`. Reflash the board: 1. Download `qdl` v2.4-26 for Linux ARM64 from [arduino/qdl-packing](https://github.com/arduino/qdl-packing/releases/tag/v2.4-26). 2. Download then unpack the [Arduino Debian image](https://downloads.arduino.cc/debian-im/Stable/20260528-558/arduino-unoq-debian-image-20260528-558.tar.zst) using `tar --zstd -xf`. 3. Turn the power off, put the jumper on the bottom row of `JCTL` and turn the power on. `lsusb` shows `05c6:9008`. Remove the jumper. 4. In the `flash/` directory of the image, run: ```shell qdl --allow-missing --storage emmc prog_firehose_ddr.elf rawprogram0.xml patch0.xml ``` `arduino-flasher-cli` 0.5.4 doesn't work on the LAA. It runs `qdl` twice, and the second run opens the old USB device before the board has reset. It fails with `failed to read sahara request from device`. ## Health check There isn't a health check yet.