Add a getting-started guide for the NXP FRDM i.MX 93, and fix its console device - #475
Add a getting-started guide for the NXP FRDM i.MX 93, and fix its console device#475jetm wants to merge 7 commits into
Conversation
…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>
|
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. |
|
@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: 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. |
|
@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>
|
@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. 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. |
There was a problem hiding this comment.
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.
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>
There was a problem hiding this comment.
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
descriptionis 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 togettingStartedUrlfor 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.
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>
There was a problem hiding this comment.
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
commandstill 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 oftargets.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/ttyUSB0for this board's serialcommand, 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
SerialConsoleOptionaldescribes 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_filesrequirement fordocker_images, this section should no longer say there are only three quiet failure points, and it should explicitly call outvar_filesas 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: truewill make the TargetSelector render an "Optional: serial console" note that currently says "Connect the Micro USB cable" (seesrc/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 likeserial.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
SerialConsoleOptionalimport 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_imagesbut omits the requiredvar_filesexclusion for Docker storage (var/lib/docker/**). Existing docs and the config schema indicatedocker_imagesrequiresvar_filesso the Docker data ends up on the writable/varpartition 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>
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
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.ttyACM0, leading with the stableby-idpath - thettyACMnumber moves as soon as another USB serial device is attached.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/systemwhereenable_serviceslooks for it;typesneeds bothsysextandconfext, because the unit ships in one and its enablement symlink is written into the other; andRestart=alwaysrather thanon-failure, since--rmplusType=simpleleaves a cleanly-exited container's unit inactive with nothing to restart it.Verified
make buildpasses 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
onBrokenLinksisthrow, so linking it fails the build frommain.