Use an i.MX board plugged into your own PC (the client) from a devcontainer running on a
remote Docker host (the remote): uuu in the container flashes the board over its
USB serial-download port, and the board's UARTs show up in the container as ttys.
client (Windows/Linux) remote (Linux + Docker)
┌───────────────────────────────┐ ┌──────────────────────────────────────┐
│ VS Code + imx-devtool (UI) │ VS Code │ container │
│ libusb ── USB/IP server ─────┼── port fwd ──►│ imx-devtool-agent ─► vhci_hcd ──► uuu│
│ serial ports ── byte pump ───┼──────────────►│ imx-devtool-agent ─► /dev/ttyIMX-A55 │
└───────────────────────────────┘ └──────────────────────────────────────┘
- USB: the client extension implements the device side of USB/IP on top of libusb.
Attach forwards every device uuu knows (boot ROM SDP/SDPS, SPL SDPU/SDPV, U-Boot
fastboot), including the new devices the board enumerates while uuu runs. The agent hands
each connection to the remote kernel's
vhci_hcd, so in the container the device is a
normal USB device and every uuu feature works unchanged. Detach gives the devices back
to the client.
- UART: configured serial ports are bridged to ptys in the container, linked as
/dev/ttyIMX-<name> (or /tmp/imx-devtool/tty<name> without root/sudo).
- Everything travels over VS Code's own port forwarding, so no SSH tunnels or open ports are
needed and the client can sit behind NAT.
There are two extensions: imx-devtool runs on the client (UI extension) and depends on
imx-devtool-agent, which VS Code installs in the container (workspace extension). To
preinstall the agent in every container, add to devcontainer.json:
"customizations": { "vscode": { "extensions": ["inabox.imx-devtool-agent"] } }
Setup
Remote host (once)
sudo modprobe vhci-hcd
echo vhci-hcd | sudo tee /etc/modules-load.d/vhci-hcd.conf
Devcontainer
Add to the repo's .devcontainer/devcontainer.json:
// Merge into the repo's .devcontainer/devcontainer.json to let i.MX Devtool forward the board.
{
"runArgs": [
// vhci_hcd attach (sysfs) and access to hot-plugged USB devices
"--privileged",
// libusb/uuu only see devices appearing (board re-enumerating ROM -> SPL -> fastboot)
// with the host's udev events: host network namespace + udev runtime dir
"--network=host"
],
"mounts": [
"source=/dev/bus/usb,target=/dev/bus/usb,type=bind",
"source=/run/udev,target=/run/udev,type=bind,readonly"
]
}
Why each setting is needed:
| Setting |
Why |
--privileged |
vhci attach goes through /sys, and hot-plugged USB devices need access |
/dev/bus/usb bind mount |
device nodes of devices attached after the container started |
--network=host + /run/udev mount |
libusb (uuu) learns about new devices from udev events, which only reach the container this way. Without both, uuu does not see the board re-enumerate (ROM → SPL → fastboot) |
The agent runs vhci_hcd attach as root: either the container user is root, or it has
passwordless sudo.
Client
- Install i.MX Devtool from the Marketplace.
- Open the devcontainer. The agent is installed into it automatically (if not, run
i.MX Devtool: Install Agent in Container).
- Run i.MX Devtool: Check Container Setup.
- Run i.MX Devtool: Configure UART Ports... and pick the board's debug ports (A55, M33).
Client OS notes:
- Windows: the boot ROM (HID) works through libusb's HID backend. If a device is reported
as "no WinUSB/HID driver", install WinUSB for that VID:PID once (e.g. with Zadig). U-Boot
fastboot normally gets WinUSB automatically.
- Linux: your user needs access to the device, e.g.
/etc/udev/rules.d/70-imx.rules:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1fc9", MODE="0666" (repeat for 15a2 and 0525).
- macOS: not supported yet.
Use
- Status bar i.MX USB: click to attach/detach. While attached, put the board in serial
download mode and run
uuu ... in the container as usual.
- Status bar i.MX UART: click to connect/disconnect, then
picocom -b 115200 /dev/ttyIMX-A55 in the container. Set the baud rate in the UART
configuration; baud changes made in the container are not passed on.
- i.MX Devtool: Show Status / Show Log for troubleshooting.
Settings: imxDevtool.usb.extraDeviceFilters (extra vid:pid to forward; also see
List Local USB Devices...), imxDevtool.usb.useDefaultFilters,
imxDevtool.usb.attachOnStartup, imxDevtool.uart.ports, imxDevtool.uart.connectOnStartup.