Files
2026-10-19 22:44:51 +08:00

144 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: release_zynq7k
description: Package a hardware-verified Zynq-7000 (PetaLinux) product version into a release for colleagues — PetaLinux BSP, QSPI flash files and a whole-flash image, eMMC/SD flash files and deploy script, the final merged rootfs, PL bitstream, PS runtime files, app sources (PS and companion MCUs such as i.MX6), a README and SHA-256 manifest — under ./release/<name>_<version>/. Use when the user asks to make/build/prepare a release package, "release 包", "打包 release", "制作发布包", "交付给同事", hand a Zynq-7000 version to another team, or names a requirement doc (e.g. Notes/PRxx.md) listing release items for a Zynq-7000 board. Not for building or deploying the system itself (petalinux-qspi / petalinux-emmc / petalinux-ps / petalinux-pl do that).
---
# release_zynq7k:Zynq-7000 release 打包
把一个**已经在硬件上验证过**的版本,整理成同事拿到就能部署、能重建的 release 包。
release 只做收集、整理、合成、校验和说明,不重新设计,也不改变已验证的产物。
凡是没在硬件上验证过的东西(新脚本、新合成的文件),README 里必须如实写明。
## 0. 先读
- **项目约定**:项目 adapter(AGENTS.md / CLAUDE.md)、全局与本项目 bmem 记忆、用户指定的需求文档(如 `Notes/PRxx.md`)。
需求文档列出的条目就是 release 必须交付的条目;它明确排除的内容(例如 "除了 vivado 工程源码")不放进包里。
- **机器参数**:交叉编译 VM 的地址和账号、PetaLinux / Vivado 路径都从 `~\skills_env.md` 读取,不写死在任何地方。
plink/pscp 第一次连接时会报未知主机指纹,从报错里取出指纹,用 `-hostkey` 传入。
- **参考案例**:[references/emv93-dvbt2.md](references/emv93-dvbt2.md) 是第一次用本流程做的 release(EMV9.3 DVB-T2),
里面记录了版式、证据来源,以及这次踩过的坑。
## 1. 确定发布哪个版本(门禁 R0)
1. **定位版本**:在 git tag、bmem 恢复入口和交付目录里找到要发布的版本,列出每个产物的 SHA-256。
2. **核对产物来源**:每个产物都必须有证据表明它就是硬件验收时用的那份。
证据可以是:交付目录里的哈希、板上读回的哈希,或 VM `images/linux` 里与交付一致的哈希。
没有证据的文件不进 release;若它确实必需,就在 README 里标成"未验证"。
3. **源码 tag**:源码有 git 就用 tag。没有 git 先问用户;若用户同意,`git init` 后提交并打 tag。
新建仓库要做三件事:
- 设置 `core.autocrlf=false`,否则板上的 shell 脚本会被转成 CRLF;
- 在 `.gitignore` 里排除构建目录和大体积抓包;
- 排除 Windows 保留文件名(如 `COM3.log`),git 无法打开这类文件。
4. **板子不是必需的**:打包只用已验证的文件。不要为了打包去改板上的状态,也不要重启板子。
## 2. 目录版式
`./release/<NAME>_v<版本>/`(目录名与 git tag 一一对应):
| 目录 | 内容 |
|---|---|
| `01_petalinux_bsp/` | 每个 PetaLinux 工程一个 `.bsp`(正式系统 + QSPI 救援系统) |
| `02_qspi_flash/` | BOOT.BIN、QSPI 内核 FIT、整片镜像 `qspi_full_0x0.bin`、`uboot_scripts/` |
| `03_emmc_flash/` | `p1_boot_fat/`(FIT + PL bin)、`emmc_deploy.sh`、`EMMC_SHA256SUMS`、`rescue_scripts/`(原来验证过的脚本) |
| `04_rootfs/` | 最终根文件系统 tar.gz,以及生成它的 spec 和脚本 |
| `05_pl_bit/` | 板上实际加载的 `.bin`,同次构建的 `.bit` 和 `.hdf` / `.xsa` |
| `06_ps_runtime/` | 应用二进制、init 脚本、配置、内核模块、运行数据,按板上目录分子目录 |
| `07_ps_app_src/` | 用 `git archive <tag> <dir>` 导出的应用源码和 PetaLinux meta-user 层 |
| `08_<mcu>_app_src/`、`09_<mcu>_runtime/` | 其它处理器(如 i.MX6)的源码和部署件;没有就省略 |
| `10_pc_tools/` | 可选:PC 端验证工具 |
| `README.md` | 说明文档,从 [templates/README_template.md](templates/README_template.md) 开始写 |
| `00_SHA256SUMS` | 全部文件的校验和,`sha256sum -c` 格式 |
另在 `./release/` 下放 `<目录名>.tar.gz` 和对应的 `.sha256`。`.tar.gz` 不入 git(它只是目录的打包,可以随时重新生成),目录本身入 git。
## 3. 逐项制作
### BSP(R1)
- 在 VM 上执行 `petalinux-package --bsp -p <proj> --output <name>.bsp`。
- **先同步应用配方**:打包前确认 `project-spec/meta-user` 里各应用配方的 `files/src` 是本次发布的源码。
若不是,先把旧配方 tar 备份,再用发布源码替换,并去掉 CR。替换后读回配方里关键文件的 sha 核对。
- 每个归档解到**各自的空目录**,避免两个包混在同一个目录里。
- **HDF 一致性**:比较 BSP 中 `hw-description/ps7_init.c` 与发布 `.hdf` 里的 `ps7_init.c`。
- 相同:说明只有 PL 不同(PL 由 U-Boot 加载),README 写明"换 PL 不需要重建 Linux";
- 不同:必须告诉用户,由用户决定是否用发布的 HDF 重建。
- 检查 `tar tzf` 的结果,确认 BSP 里包含配方、DT 和 U-Boot 补丁,并且没有 `build/` 和 `images/`。
### QSPI(R2)
- **布局从证据取**:U-Boot 烧写脚本、`/proc/mtd`、flash 布局 json,不要猜。
- 生成整片镜像和布局 json:
```
python scripts/qspi_image.py qspi_full_0x0.bin 0x0:BOOT.BIN <KOFF>:image.ub.qspi --erase <ENVOFF>:<ENVLEN> --layout qspi_layout.json
```
每段的 CRC32 必须与证据记录的一致。
- 用 [templates/qspi_program.txt](templates/qspi_program.txt) 填好长度和 CRC,IP 留占位符;原来验证过的脚本一并附上。
### eMMC / SD(R3)
- **分区计划从证据取**:`fdisk -l`、`/proc/partitions`、`blkid`,记录扇区边界、文件系统、卷标和 FAT 容量。
- 从 [templates/emmc_deploy.sh](templates/emmc_deploy.sh) 改出本板脚本:只改顶部 profile 变量,其余照搬已验证脚本的步骤顺序。
- 写成 LF 换行,在 VM 上跑 `sh -n` 和 `busybox sh -n`;
- **不要用 `! cmd` 当检查**:`set -e` 不会因为它失败而退出,要写成显式的 `if`。
- 脚本没在板上整体跑过,就在 README 写"未上板实测,首次对照原脚本"。
- `EMMC_SHA256SUMS` 只写文件名,与 TFTP 下载到板上的文件对应。
### rootfs(R4)
- 写一个 spec json,交给 [scripts/merge_rootfs.py](scripts/merge_rootfs.py) 合成。
- spec 要还原已验证部署脚本的效果:基础 rootfs、覆盖包、替换的文件(带权限)、符号链接、目录。
- spec 的 `expect` 里写每个关键文件的已验证 sha。
- 运行 `merge_rootfs.py spec.json out.tar.gz --verify`,结果必须全部 OK。
- 用 tarfile 合成,不在 Windows 上解开再重新打包,否则会丢失属主、权限、符号链接和设备节点。
- 生成后在 VM 上跑一次 `tar tzf`,确认 GNU tar 能读,成员数与预期一致。
- **不放每板唯一的数据**:DPD/校准曲线、主机密钥、序列号、MAC 都不放。若 rootfs 自带这类文件,用 spec 的 `remove` 去掉,并在 README 写明新板如何生成。
### PL / PS 运行文件 / 源码(R5–R7)
- **PL**:发布板上实际加载的 `.bin`(或 bootgen 产物),再附同次构建的 `.bit` 和 `.hdf`。
- **PS 运行文件**:从交付目录或合成的 rootfs 里取,哈希与 rootfs 中的成员一致。
- **源码**:用 `git archive <tag> <dirs> | tar x`,只导出纳入版本控制的源码。
- 用 `release_check.py scan --src-dirs` 检查源码目录里没有 ELF、`.o` 或 `.ko`;
- 需求文档排除的部分(如 Vivado 工程)不导出。
### README(R8)
按模板写,必须包括:
- 版本清单(板上位置 + sha 前 16 位)、存储布局表;
- 从全新或出厂板开始的部署步骤,以及冷启动验收的期望值;
- 现场相关设置:每板唯一值和站点值,逐个写出所在文件;
- 从源码构建的方法、已知限制。
写完后自己对照脚本和包内实际内容核对每一步,例如 `install.sh` 是否已经做了某一步。别把旧板专用的步骤写成通用步骤。
## 4. 检查与收尾(R9)
1. **扫描**:
```
python scripts/release_check.py scan <dir> --env ~/skills_env.md --mac <测试板 MAC> ... --src-dirs 07_ps_app_src,08_xxx_app_src
```
- 退出码 2 表示找到了凭据值或 `user:pass@` URL,必须清除后重做,不得发布;
- 工具脚本里写死的口令,改成从环境变量读取,并在源头(仓库)修正后重新导出,不要只改 release 副本;
- 例外:厂商出厂默认账户(随固件发布,常常就是品牌名,比如网页里的品牌 URL)。确认属实后,用 `--allow <KEY>` 把它归为 acknowledged,并在 README 写明"出厂默认账户,现场建议修改";
- 工具状态文件(`*.upstate.json` 等)从源码目录里删掉;
- 测试板 MAC:发布用的配置文件要留空或改成占位符,源码和旧脚本里残留的要在 README 列出;
- 开发机路径、私钥(例如 mini_httpd 自带的示例 pem):逐项判断后写进 README。
2. **生成并核对校验和**:`release_check.py sums <dir>`,然后 `release_check.py verify <dir>` 必须 0 bad、0 not listed。
3. **打包**:`tar czf` 生成整包,再生成 `.sha256`。
4. **git**:提交 release 目录,打 tag `release-v<版本>`,`.gitignore` 加上 `release/*.tar.gz`。
5. **bmem**:用 `bmem add --prj` 记一条:
- release 位置、tag、整包 sha;
- 各目录的要点、VM 上做过的改动(备份位置)、未验证项;
- 然后执行 `bmem sync`。
6. **向用户汇报**:目录表、未验证项、需要同事注意的每板值和站点值、仓库与 bmem 状态。
有硬件异常(例如打包中途板子失联)要说明,但不要擅自重启板子。
## 脚本
| 脚本 | 用途 |
|---|---|
| `scripts/qspi_image.py` | 按偏移拼整片 QSPI 镜像(空隙 0xFF),检查重叠,输出每段的 CRC32 和布局 json |
| `scripts/merge_rootfs.py` | 按 spec 无损、可复现地合成 rootfs tar.gz;`--verify` 核对 expect 哈希和符号链接 |
| `scripts/release_check.py` | `sums` / `verify` 生成和核对 `00_SHA256SUMS`;`scan` 查凭据、MAC、开发机路径、源码目录里的二进制、保留文件名 |
| `templates/` | README 骨架、U-Boot QSPI 烧写脚本、eMMC 部署脚本模板 |