Skip to main content
Everything in this guide uses the USB cable only, with no WiFi or Bluetooth LE setup. Each step prints something you can check before moving on.
1

Plug in and discover

Every attached M1 prints with its device_id and serial:
If nothing shows up, check the cable (data, not charge-only) and the udev rule (see Install Linux or Install Jetson).
2

Device information

Serial, firmware version, enabled capture modes, camera calibration, IMU noise densities, and WiFi/BT MAC addresses, all of it cached by the SDK at open(). Note the firmware_version line — the next step changes it.
3

Update the firmware

A device fresh out of the box is usually behind. Update it before anything else, so everything after this runs on current firmware.
The bundle is pushed over USB, so this path needs no network at all. Each phase completes in order and the tool prints the running version at the end:
The device reboots partway through and the tool waits for it to come back. Allow a couple of minutes end to end. Saved WiFi networks, recordings, and the device serial all survive the update.
With the device on a network you can skip the file: ef-cli check-update asks the update service what is available, and ef-cli update fetches and applies it. See Firmware updates.
4

Health check

Each probe prints PASS / FAIL with detail, ending in an overall= line. The quick sweep covers 22 checks; --deep adds nine more — eMMC throughput, a multi-core coherency burn, thermals under load, camera frame statistics, and IMU streaming.Two lines surprise people, and both are correct:
  • usb: … speed=high-speed is expected. The control plane and this quickstart work at high speed.
  • cpu: … load1= can read high on an otherwise idle device. The media threads sit in uninterruptible sleep, which counts toward load average without consuming CPU.
5

Live video

A window opens with the decoded stream and a status bar showing the frame count and live IMU values. Q or Esc quits.

The same thing in C++

open() claims and configures the device. The first grab() starts the live USB data plane and waits for a frame; there is no separate start-streaming call.

Next steps

Capture video

The grab / retrieve loop, pixel formats, and compression modes.

Read the IMU

Accelerometer and gyroscope samples, timestamps, motion state.