4.8 KiB
4.8 KiB
Worked example: EMV9.3 DVB-T2 release v2026.10.15
First release built with this procedure (project prjID emv93-dvbt2; its bmem
entry records the location and the git tag release-v2026.10.15). Use it as a model.
Board values below belong to EMV9.3 only and must not be reused for another board.
Platform
- Zynq xc7z100 (PL + PS) plus an i.MX6ULL board controller that has its own app and web UI.
- Toolchain: PetaLinux 2018.1, Vivado 2018.1.
- Two PetaLinux projects on the cross-build VM:
emv93_t2: production; FIT on eMMC, PL bin loaded by U-Bootplload.emv93_qspi: rescue initramfs in QSPI.
- The VM host and credentials come from
~\skills_env.md(CROSS_VM_*).
Requirement doc
Notes/PR02.md listed nine items:
- BSP
- QSPI flash files
- eMMC flash files
- rootfs
- PL bit on the rootfs
- PS runtime
- PS app source
- i.MX6 app source
- a README
The Vivado (PL) sources were explicitly excluded.
The i.MX6 runtime and the PC test tools were added as directories 09 and 10, because item 8 cannot be deployed without them.
Layouts recorded from evidence
QSPI layout (from the proven U-Boot scripts g4_stage1.txt and g4g5_write.txt):
| Region | Offset | Content length | Erase length | CRC32 |
|---|---|---|---|---|
| BOOT.BIN | 0x0 | 0x89df0 | 0x500000 | 03cd9c7b |
| U-Boot env | 0x500000 | — | 0x20000, left blank | — |
| image.ub.qspi | 0x520000 | 0x9bbca0 | 0x1800000 | 0653b9e8 |
| Full image | 0x0 | 0xEDBCA0 | — | 183d24ec |
The full image was built with:
qspi_image.py qspi_full_0x0.bin 0x0:BOOT.BIN 0x520000:image.ub.qspi --erase 0x500000:0x20000
eMMC layout:
- Device
/dev/mmcblk1, 7.3 GiB, the factory DOS partition table. - The partition boundaries came from
/proc/partitions(179,1 = 125016 KiB) and afdisk -lline ("16 250047 250032 122.1M b W95 FAT32"). - p1: FAT32, sectors 16–250047. It holds only 120 MB: P-0059 recorded that with seven bit files on it,
cpfailed silently. - p2: ext4, sector 250048 to the end.
Pieces and where they came from
| Release dir | Source |
|---|---|
| 01 BSP | petalinux-package --bsp -p <proj> --output <name>.bsp on the VM, for both projects. Before packaging, the t2ps recipe's files/src was replaced with the released 1.8 sources; the old recipe was tarred as a backup first. |
| 02 / 03 / 05 | The verified delivery directory (Notes/auto/delivery_t2_dpd_20261014). The VM images/linux hashes were checked against it, and they matched. |
| 04 rootfs | Merged from the base rootfs.tar.gz, the T2 runtime overlay, the released binaries and configs, and the C23 symlinks. Each key member hash was checked against the board-verified files, and GNU tar on the VM listed all 1229 members. |
| 06 | Copied from the delivery dirs; the stream files were extracted from the overlay tarball. |
| 07 / 08 | git archive <tag> ps and git archive <tag> imx6, giving 325 files with no build output. |
What the scan / review caught (and how it was handled)
- i.MX6 MACs.
network.confcarried the test board's MAC. It was blanked in the release copy, with a comment.- The source copy and an old deploy script held two other boards' MACs; these were listed in the README.
- Deriving the MAC from OTP does not work on that image, so the README says each board's MAC must be filled in.
- TP receiver address.
t2ps.confholds the receiving PC's MAC/IP for the TP IQ stream; this is documented as a site setting. - DPD curve. It depends on the board and its loopback, so it was left out; a new board runs a full DPD instead.
- Development-machine paths. The PC tools contain dev-machine paths; this is documented under the known limits.
- Credentials. The product's own web account (
usr.conf) is part of the firmware and stays. No infrastructure password appeared. - Hardware not used. The board went silent during packaging. That was harmless, because nothing in the release was taken from the live board.
Script mistakes made the first time (now handled by the skill's scripts)
- Two archives unpacked into one directory. The recipe tarball and the source tarball both unpacked into
t2ps/, mixing their contents. Unpack each archive into its own empty directory. - Shell
set -eignores a negated command.! grepdoes not stop the script; write the test as an explicitif. - Over-eager path normalisation.
n.lstrip("./")also strips the leading dot of names such as./.ssh.merge_rootfs.pyremoves only the./prefixes. - CRLF from Windows editors. Shell scripts written on Windows can get CRLF line endings. Strip them, then run
sh -nandbusybox sh -non the VM. - Archive bytes are not reproducible. The gzip header mtime and the mtime of added files changed the archive hash on every run.
merge_rootfs.pyis now deterministic, so compare member hashes rather than archive bytes across tool versions.