docs: present-state build and update docs; fix the ring-size arithmetic

- kas/README.md: the real-time rationale rests on the feeder's bounded
  queue depth, not ring size; the ring is 16 MiB (~84 s at 200 kHz,
  ~28 min at the 10 kHz cloud tick), a capacity for cloud-mode preload.
- BUILD.md, kas config, release checklist, cold-build workflow: only
  forgefirm and meta-openglow (branch scarthgap) are cloned as
  siblings; every ForgeFIRM source repo is fetched by pinned SRCREV.
- UPDATE-SYSTEM.md reads as the present-state design: the cloud-mode
  compatibility baseline is the cloud client's configured firmware
  version, not release metadata; decisions and open items listed
  plainly.
- README.md states what GRBL mode still needs the Glowforge service
  for (camera-referenced homing) and what runs without it.
- BRINGUP.md: generic build-host and fwup-lab references, the retained
  reproductions of the no-fire drill, the System tab.
- LIGHTBURN.md: the arm-window timeouts are machine settings.
- forgefirm-image.bb describes forgectrl as the machine-services
  daemon and points at the right backlog entry.
- American spelling throughout.
This commit is contained in:
ScottW514
2026-08-15 06:12:51 -04:00
parent ff117c4f6b
commit 0a05b6b114
10 changed files with 141 additions and 142 deletions
+24 -19
View File
@@ -29,15 +29,15 @@ openglow-forgefirm/
│ ├── build/ ← bitbake output incl. images (gitignored)
│ ├── downloads/ sstate-cache/ ← caches (gitignored)
│ └── .gitignore
├── meta-openglow/ ← Glowforge BSP layers (local sibling, under migration)
└── kernel-module-glowforge/ ← glowforge.ko sources (pulled by recipe SRC_URI)
└── meta-openglow/ ← Glowforge BSP layers (local sibling checkout)
```
`meta-openglow` is referenced as a **local sibling** (`../meta-openglow`) while
we migrate it to Scarthgap, so its in-place edits are what gets built. Once that
migration is committed/pushed, flip it to a kas-cloned + pinned repo (commented
block in `forgefirm-glowforge.yml`) and the forgefirm repo becomes fully
self-contained.
`meta-openglow` is referenced as a **local sibling** (`../meta-openglow`), so
its in-place edits are what gets built. The commented pinned-remote block in
`forgefirm-glowforge.yml` makes the forgefirm repo fully self-contained when
flipped on. The source repos the recipes build (`kernel-module-glowforge`,
`grblHAL-glowforge`, `forgectrl`, `python3-gfhardware`, `Glowforge-Utilities`)
are fetched by pinned `SRCREV` and are not needed as local checkouts.
## Prerequisites
@@ -122,7 +122,7 @@ config move in the right order. The sequence, with current status:
All recipes fetch their pinned revision from GitHub, so an image build is
reproducible from the repos alone. For fast iteration on a source repo, bump
its pin per iteration, or add a **local, untracked** `externalsrc` bbappend
pointing at the sibling checkout — never commit one, or released images stop
pointing at a working checkout — never commit one, or released images stop
matching the pins.
## Scarthgap migration backlog
@@ -158,8 +158,8 @@ Scarthgap, but the legacy (Dunfell/Gatesgarth) layers won't build clean until:
- **`glowforge.ko`**: ported across many 6.12 API changes
(`tasklet_hrtimer`→soft hrtimer, `timer_setup`, LED-trigger API,
`pwm_get`, `spi_delay`/`controller`, `filelock.h`, void `.remove`,
1-arg i2c probe). Compiles + links, 0 undefined symbols. Built from the
local sibling via an `externalsrc` bbappend during migration.
1-arg i2c probe). Compiles + links, 0 undefined symbols; the recipe
fetches the module by pinned `SRCREV`.
- **DT**: `glowforge,cnc/thermal/pic/head` re-added with `pwms`/`pwm-names`
phandles; `glowforge.dtb` compiles with all motion nodes.
Motion polish: PWM prescaler (factory 1001) is **obsolete** — 6.12
@@ -173,7 +173,7 @@ Scarthgap, but the legacy (Dunfell/Gatesgarth) layers won't build clean until:
- **Camera — DONE and hardware-validated.** The factory
`ov5648_mipi.c` (NXP's removed `v4l2_int_device`/`mxc_v4l2_capture`) is
replaced by the mainline `ovti,ov5648` subdev + imx6 `imx-media` (IPU CSI)
+ `imx6-mipi-csi2` receiver. The factory CAM_SEL MIPI switch is modelled
+ `imx6-mipi-csi2` receiver. The factory CAM_SEL MIPI switch is modeled
with the mainline `video-mux` (gpio-mux on `gpio7 10`): both sensors →
video-mux → `mipi_csi` → IPU CSI. Sensor `xvclk` is the board's 24 MHz
fixed oscillator (matching the factory DTB); avdd/dovdd/dvdd rails are in
@@ -202,14 +202,19 @@ Scarthgap, but the legacy (Dunfell/Gatesgarth) layers won't build clean until:
5. **Real-time strategy — decided.** The kernel runs
`CONFIG_PREEMPT=y` (factory behavior; `imx_v6_v7_defconfig` alone gives only
`PREEMPT_VOLUNTARY`). **PREEMPT_RT is not selectable on arm32 6.12** (no
`ARCH_SUPPORTS_RT`) and is **not needed for the pulse feeder**: the SDMA
ring is 128 MiB draining at 1 byte per EPIT tick — ≤200–400 KB/s even at
the 200 kHz ceiling — so a full ring holds **~5–11 minutes** of stream and
a modest 1 MiB of queued data already rides out ~3–5 s of scheduling
latency, orders of magnitude beyond anything PREEMPT exhibits. Deep
buffering + `SCHED_FIFO` for the feeder is the design; revisit RT only if
the underrun bench ever contradicts this arithmetic. (Bench: 5 s of
continuous feed at a 1 s buffer depth, zero underruns.)
`ARCH_SUPPORTS_RT`) and is **not needed for the pulse feeder**. The
argument is about queue depth, not ring size: the ring drains at 1 byte
per EPIT tick (≤200 KB/s even at the 200 kHz ceiling), so the live
feeder's bounded queue depth of ~150 ms — a few KB in flight — already
rides out worst-case scheduling latency with orders of magnitude to spare
(measured: 0.2 ms worst write latency under full CPU + I/O load; the
underrun bench ran 100 kHz for 120 s with zero underruns). The ring
itself is 16 MiB (the `ring_mb` module parameter, backed by the 16 MiB
reserved pool): ~84 s of stream at 200 kHz, ~28 min at the 10 kHz
cloud-mode tick — a capacity that matters for the whole-job preload of
cloud mode, not for latency. Bounded queue depth + `SCHED_FIFO` for the
feeder is the design; revisit RT only if the underrun bench ever
contradicts this arithmetic.
6. **gfui-client → forgectrl — DONE.** The stock `gfui-client` is excluded
from `forgefirm-image` (`IMAGE_INSTALL:remove = "gfui-client"` in
+7 -13
View File
@@ -73,11 +73,10 @@ repos:
.:
# --- meta-openglow — Glowforge BSP layers ---------------------------------
# ACTIVE DEVELOPMENT: referenced as a local sibling checkout (no url => kas
# performs no git ops, so the scarthgap-migration edits we're making are what
# gets built). The kernel-module-glowforge sources are NOT a layer; they are
# pulled by the kernel-module-glowforge.bb recipe's SRC_URI, so kas does not
# manage them here.
# Referenced as a local sibling checkout (no url => kas performs no git ops,
# so in-place BSP edits are what gets built). The kernel-module-glowforge
# sources are NOT a layer; the kernel-module-glowforge.bb recipe fetches them
# by pinned SRCREV, so kas does not manage them here.
meta-openglow:
path: ../meta-openglow
layers:
@@ -85,11 +84,8 @@ repos:
meta-glowforge-bsp:
# meta-openglow-bsp (separate OpenGlow_std board) intentionally excluded.
#
# FUTURE — flip to this pinned-remote block at release time (gated on
# active BSP development settling — see kas/README.md "Push & release order".
# When flipping, also drop meta-openglow's kernel-module-glowforge.bbappend
# (externalsrc to the local sibling) so a fresh clone is self-contained; its
# perl-native DEPENDS is already carried in the base recipe):
# Pinned-remote alternative for a fully self-contained clone (see
# kas/README.md "Push & release order"):
# meta-openglow:
# url: https://github.com/ScottW514/meta-openglow.git
# branch: scarthgap # pin via kas lock / a tag at release
@@ -122,9 +118,7 @@ local_conf_header:
# release.sh gates the release rootfs against a passwordless root entry.
build-tweaks: |
# Parallelism for the 12-core / 16 GB WSL2 VM. (The earlier mid-build deaths
# were the mirrored-networking vsock relay, not memory — see .wslconfig — so
# this can comfortably use more of the VM.)
# Parallelism sized for a 12-core / 16 GB build VM; raise on larger hosts.
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
# Caches kept inside the forgefirm repo (gitignored):