Skip to content

Add a getting-started guide for the NXP FRDM i.MX 93, and fix its console device - #475

Open
jetm wants to merge 7 commits into
mainfrom
hardware/frdm-imx93-console-and-container
Open

Add a getting-started guide for the NXP FRDM i.MX 93, and fix its console device#475
jetm wants to merge 7 commits into
mainfrom
hardware/frdm-imx93-console-and-container

Conversation

@jetm

@jetm jetm commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

What this fixes

The FRDM i.MX 93 had no getting-started page. Every other board with hardware on a desk has one - the Pi, Jetson, qemu - and this board's hardware page instead sent readers to the generic target selector, which asks them to pick a target and hands back three commands. Someone holding the board could not get from it to a running system without filling in the gaps themselves.

It also documented the wrong serial device. The entry said /dev/ttyUSB0; this board carries its console on the onboard USB-C port and enumerates as two CDC-ACM devices, so anyone following it opened a device that does not exist and got a dead terminal with nothing explaining why.

Changes

  • New getting-started/frdm-imx93, following the Raspberry Pi page: prerequisites, serial console, initialize, install, build, provision, run, SSH. Plus a container section, since a board that keeps running a workload across a power cycle is what people are evaluating.
  • Serial entry corrected to ttyACM0, leading with the stable by-id path - the ttyACM number moves as soon as another USB serial device is attached.
  • Hardware page now links to the guide instead of repeating a shortened version of it, matching how the other boards are laid out.
  • Target metadata points at the new guide rather than the selector, and the generated snapshot is refreshed to match.

Three details in the container section are called out because each fails silently rather than loudly, and all three cost hardware time to find: the unit must sit under overlay/usr/lib/systemd/system where enable_services looks for it; types needs both sysext and confext, because the unit ships in one and its enablement symlink is written into the other; and Restart=always rather than on-failure, since --rm plus Type=simple leaves a cleanly-exited container's unit inactive with nothing to restart it.

Verified

make build passes and both pages render. The serial device, the boot output and the container behaviour were all taken from a board rather than written from the datasheet.

The guide deliberately does not link the container dev mode guide: that page is still draft on its own branch, and onBrokenLinks is throw, so linking it fails the build from main.

jetm added 3 commits August 7, 2026 16:58
…ntainer

The serial entry pointed at /dev/ttyUSB0. This board carries its debug
console on the onboard USB-C port and enumerates as two CDC-ACM devices,
so anyone following it opened a device that does not exist and got a dead
terminal with nothing to explain it. The by-id path is what the page now
leads with, because the ttyACM number moves as soon as another USB serial
device is attached and the by-id name does not.

The hands-on section also stopped at "power it on", which leaves the reader
without the two things they came for: knowing the board is up, and running
their own workload on it. It now shows the login prompt to expect, and a
worked container extension.

Two details in that walkthrough are there because getting either wrong
produces an extension that builds, merges, presents its unit, and never
runs it: the unit belongs under overlay/usr/lib/systemd/system, which is
where enable_services looks for it, and types needs both sysext and
confext, because the unit ships in one and its enablement symlink is
written into the other. Restart=always rather than on-failure for the same
class of reason - with --rm and Type=simple a container that exits cleanly
leaves the unit inactive and nothing brings it back.

The serial device is verified on an FRDM-IMX93 v1.2; the container
walkthrough is the shape proven on that board, generalised off the
specific demo image.

Signed-off-by: Javier Tia <javier@peridio.com>
Every other board with hardware on someone's desk has a step-by-step page
under getting-started - the Pi, Jetson, qemu. The i.MX 93 had none, so its
hardware page sent readers to the generic target selector, which asks them
to pick a target and then hands them three commands. Someone holding the
board could not get from it to a running system without filling in the
gaps themselves.

This follows the Raspberry Pi page: prerequisites, serial console,
initialize, install, build, provision, run, SSH. It also carries the
container section, because a board that runs a workload across a power
cycle is the thing people are evaluating, and three details decide whether
that works - all three fail silently rather than loudly. The unit has to
sit under overlay/usr/lib/systemd/system, where enable_services looks for
it. types needs sysext and confext both, because the unit ships in one and
its enablement symlink is written into the other. And Restart=always,
since --rm plus Type=simple leaves a cleanly-exited container's unit
inactive with nothing to bring it back.

The serial section is spelled out rather than assumed: this board's
console is on its onboard USB-C and enumerates as two CDC-ACM devices, so
the generic "plug in a 3.3V adapter and open ttyUSB0" advice does not
apply and lands the reader on a dead terminal.

The hardware page keeps the summary and links here instead of repeating
the steps, matching how the other boards are laid out, and the target
metadata now points at this page rather than the selector.

The guide deliberately does not link container dev mode: that page is
still draft on its own branch, and onBrokenLinks is throw.

Signed-off-by: Javier Tia <javier@peridio.com>
sync-targets.js reconciles the live feed's target list with the
hand-maintained targets.json and commits the result, so that
`docusaurus start` and offline builds work without reaching the feed. The
snapshot still carried the old i.MX 93 console device and the generic
getting-started URL, so a build from a clean checkout would have served
them.

Regenerated rather than hand-edited: the file is build output, and the
diff is exactly the two fields that changed upstream of it.

Signed-off-by: Javier Tia <javier@peridio.com>
@nicksinas

Copy link
Copy Markdown
Contributor

Does this leverage the existing way we handle Getting Started? Its done dynamically, but custom per target. We only have a few targets we pin in the left side nav.

@jetm

jetm commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

@nicksinas Yes — same pattern as the Pi/Jetson/qemu pages. Those are the small pinned set that sit next to the dynamic per-target generator rather than replacing it; this joins that set rather than bypassing it. Nothing about the dynamic selector changes.

Separate from the draft status: can you boot whatever's currently on your FRDM i.MX 93 (doesn't need to be our BSP) and paste back:

cat /sys/devices/soc0/soc_id
cat /sys/devices/soc0/revision
dmesg | grep -i imx93

This PR is waiting on meta-avocado#259, which only boots on Rev1.2 silicon — the 6.6.36 BSP your board might currently have doesn't get far enough to boot on that revision. If your board comes back as something earlier than 1.2, that changes what "waiting on #259" actually means for you, so I'd rather know now than after it un-drafts.

@nicksinas

Copy link
Copy Markdown
Contributor

@jetm I would not add this target to the side nav. I think we reserve that for imx95-frdm as its more popular than the 93. I would keep this update in the dynamic section/UI only.

Nick flagged in review that the pinned left-nav slot should go to
imx95-frdm instead, since it is the more popular board. The i.MX 93
guide stays - it is still linked from the hardware page and from
targets.json's gettingStartedUrl - it just is not one of the small
hand-picked set alongside qemu/Pi/Jetson in the sidebar.

Signed-off-by: Javier Tia <javier@peridio.com>
@jetm
jetm marked this pull request as ready for review August 18, 2026 21:20
Copilot AI lite review requested due to automatic review settings August 18, 2026 21:20
@jetm

jetm commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

@nicksinas Done - dropped it from the pinned Getting Started list, kept imx95-frdm's future slot open. The page itself stays (still linked from the hardware page and from targets.json's gettingStartedUrl), just not in the hand-picked sidebar set anymore. npm run build passes. Let me know if that's not what you meant.

Un-drafting this now. Not gating it on the board-revision question from my last comment - I've asked for that a few times over the past two weeks with no reply, and nothing in this PR depends on the answer either way.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a dedicated “Getting Started” guide for the NXP FRDM i.MX 93 and updates the target metadata to reflect the board’s onboard USB-C serial console.

Changes:

  • Update FRDM i.MX 93 target serial settings to onboard USB-C CDC-ACM and add a detailed serial-console description.
  • Point FRDM i.MX 93 target metadata and board page to a new FRDM-specific getting-started guide.
  • Add a new FRDM i.MX 93 getting-started guide covering init/build/provision/run and persistent container deployment.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
src/src/data/hardware/targets.json Updates FRDM i.MX 93 serial console metadata and links to the new getting-started guide.
src/src/data/hardware/generated-targets.json Mirrors the FRDM i.MX 93 metadata changes in the generated hardware index.
src/docs-hardware/nxp/frdm-imx-93/index.mdx Replaces generic getting-started steps with a pointer to the FRDM-specific guide and updated quickstart commands.
src/docs-guides/getting-started/frdm-imx93.mdx New end-to-end getting-started guide for the FRDM i.MX 93 including serial console and container persistence.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/src/data/hardware/targets.json Outdated
Comment thread src/src/data/hardware/targets.json
Comment thread src/src/data/hardware/generated-targets.json
Copilot flagged that the command example still used /dev/ttyACM0 while
the description right next to it explains why that number is unstable
and tells the reader to prefer the by-id path instead - the field
contradicted itself. Match the command to what the description already
recommends and to what the getting-started guide itself runs.

Signed-off-by: Javier Tia <javier@peridio.com>
Copilot AI review requested due to automatic review settings August 18, 2026 21:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

Suppressed comments (4)

src/src/data/hardware/targets.json:562

  • This description is very long and includes multi-step guidance that’s likely duplicated in the new getting-started guide. If this field is rendered in a compact UI (cards/tables/tooltips), it may become hard to read and maintain. Consider shortening this to a brief summary and linking users to gettingStartedUrl for the full instructions.
      "description": "The board carries its debug console on the onboard USB-C port, so no separate TTL adapter is needed. It enumerates as two CDC-ACM devices and the Linux console is the first one. Prefer the by-id path over the ttyACM number, which moves when other USB serial devices are attached: `tio -b 115200 /dev/serial/by-id/usb-1a86_USB_Dual_Serial_*-if00`. Run `ls /dev/serial/by-id/` to see the serial number for your board."

src/docs-guides/getting-started/frdm-imx93.mdx:20

  • The guide lists macOS as a supported host OS, but the serial console instructions shown are Linux-specific (/dev/serial/by-id). Add an explicit Linux-only note and provide macOS-equivalent device discovery/paths (e.g., /dev/cu.*) or clarify that the detailed serial steps below assume Linux.
- A USB-C cable (the board's debug console and power)
- macOS 10.12+ or Linux (Ubuntu 22.04+, Fedora 39+)

src/docs-guides/getting-started/frdm-imx93.mdx:30

  • The guide lists macOS as a supported host OS, but the serial console instructions shown are Linux-specific (/dev/serial/by-id). Add an explicit Linux-only note and provide macOS-equivalent device discovery/paths (e.g., /dev/cu.*) or clarify that the detailed serial steps below assume Linux.
    src/docs-guides/getting-started/frdm-imx93.mdx:98
  • The example login banner hard-codes Avocado OS 0.0.0, which is likely to become stale quickly and may confuse users if their output differs. Consider using a placeholder (e.g., <version>) or omitting the version number from the snippet.

Comment thread src/src/data/hardware/targets.json Outdated
Comment thread src/src/data/hardware/generated-targets.json Outdated
jetm added 2 commits August 19, 2026 13:30
The console command carried a specific by-id path
(usb-1a86_USB_Dual_Serial_5B6D003987-if00) baked in, so copying it
verbatim opens a device that only exists on the board it was captured
from and fails silently for everyone else. Every other onboard-console
target in this file (rubikpi3, jetson-agx-orin-devkit, imx8mp-var-dart)
uses the generic `tio -b 115200 /dev/ttyUSB0` placeholder and leaves the
board-specific detail to the description text, which the TargetSelector
component also assumes: it renders a fixed "replace /dev/ttyUSB0 with
the appropriate device path" caption below the command regardless of
what the command actually contains.

Revert `command` to the same generic placeholder the sibling onboard
targets use. The description already explains the by-id preference and
gives a wildcarded example command, so the board-specific guidance is
not lost - it just no longer lives in the field a reader is expected to
copy-paste unmodified.

Signed-off-by: Javier Tia <javier@peridio.com>
generated-targets.json is build output: `npm run sync-targets` merges
the live package feed with targets.json and overwrites it, and
scripts/build.sh runs that step before every docusaurus build. The
committed snapshot only exists so `docusaurus start` and offline builds
have something to read without reaching the feed, so a hand-edit here
would just be overwritten - the file has to move by re-running the
generator, or it drifts from what a real build produces.

Ran `node scripts/sync-targets.js` after the previous commit's
targets.json fix; the only change is the imx93-frdm serial command
carrying forward the same placeholder.

Signed-off-by: Javier Tia <javier@peridio.com>
Copilot AI review requested due to automatic review settings August 19, 2026 19:37

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (7)

src/src/data/hardware/targets.json:562

  • The serial command still points at /dev/ttyUSB0, which contradicts the new description (CDC-ACM + prefer /dev/serial/by-id/...-if00) and will keep showing the wrong device path in consumers of targets.json (e.g., the TargetSelector). Update the command to match the documented device path pattern.
      "onboard": true,
      "baud": 115200,
      "command": "tio -b 115200 /dev/ttyUSB0",
      "description": "The board carries its debug console on the onboard USB-C port, so no separate TTL adapter is needed. It enumerates as two CDC-ACM devices and the Linux console is the first one. Prefer the by-id path over the ttyACM number, which moves when other USB serial devices are attached: `tio -b 115200 /dev/serial/by-id/usb-1a86_USB_Dual_Serial_*-if00`. Run `ls /dev/serial/by-id/` to see the serial number for your board."

src/src/data/hardware/generated-targets.json:315

  • Same as targets.json: the generated snapshot still uses /dev/ttyUSB0 for this board's serial command, which conflicts with the updated CDC-ACM/by-id guidance. Regenerate or update this entry so the displayed command matches the guide.
      "onboard": true,
      "baud": 115200,
      "command": "tio -b 115200 /dev/ttyUSB0",
      "description": "The board carries its debug console on the onboard USB-C port, so no separate TTL adapter is needed. It enumerates as two CDC-ACM devices and the Linux console is the first one. Prefer the by-id path over the ttyACM number, which moves when other USB serial devices are attached: `tio -b 115200 /dev/serial/by-id/usb-1a86_USB_Dual_Serial_*-if00`. Run `ls /dev/serial/by-id/` to see the serial number for your board."

src/docs-guides/getting-started/frdm-imx93.mdx:29

  • SerialConsoleOptional describes a UART-to-USB adapter being optional, but this board's console is over the onboard USB-C port (no TTL adapter). Replacing the shared callout with a board-specific note avoids contradictory guidance in the Serial console section.
## Serial console

<SerialConsoleOptional />

The board carries its debug console on the onboard USB-C port, so no separate TTL adapter is needed. It enumerates as **two** CDC-ACM devices and the Linux console is the first of them.

src/docs-guides/getting-started/frdm-imx93.mdx:144

  • After adding the var_files requirement for docker_images, this section should no longer say there are only three quiet failure points, and it should explicitly call out var_files as one of them (otherwise readers may still end up with a non-working pre-seeded cache).
Three details decide whether this works, and each one fails quietly rather than loudly:

- **The unit belongs at `overlay/usr/lib/systemd/system/my-app.service`.** That is where `enable_services` looks for it in order to write the enablement symlink.
- **`types` needs both `sysext` and `confext`.** The unit ships in the sysext under `/usr/lib`; the enablement symlink is written under `/etc`, which is confext territory. With only one of the two, the unit is present on the device but never starts.
- **`docker_images` is honored on a runtime build.** It pulls the image into the `/var` partition at build time, so a freshly provisioned board runs it without ever contacting a registry.

src/src/data/hardware/targets.json:560

  • Setting serial.onboard: true will make the TargetSelector render an "Optional: serial console" note that currently says "Connect the Micro USB cable" (see src/src/components/TargetSelector/index.js:297-302). This board uses USB-C for console, so the UI copy becomes incorrect when this flag is enabled. Consider updating the TargetSelector text to be cable/port-agnostic (or driven by a new field like serial.cable), otherwise readers will be told to use the wrong connector.
      "onboard": true,
      "baud": 115200,

src/docs-guides/getting-started/frdm-imx93.mdx:9

  • After replacing the serial-console callout, the SerialConsoleOptional import becomes unused and should be removed to keep the MDX clean and avoid lint/build warnings (depending on configuration).

This issue also appears on line 25 of the same file.

import HostPrerequisites from '@site/src/components/shared/HostPrerequisites'
import SerialConsoleOptional from '@site/src/components/shared/SerialConsoleOptional'

src/docs-guides/getting-started/frdm-imx93.mdx:131

  • This example declares docker_images but omits the required var_files exclusion for Docker storage (var/lib/docker/**). Existing docs and the config schema indicate docker_images requires var_files so the Docker data ends up on the writable /var partition rather than being baked into the read-only extension image.

This issue also appears on line 140 of the same file.

    docker_images:
      - image: docker.io/<org>/<image>
        tag: <tag>

@jetm
jetm requested a review from nicksinas August 19, 2026 23:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants