# 固件发布包（Git 可下载）

本目录存放 **准备提交到 Git 的已编译二进制**，与本地 `build/` 分离：

| 目录 | 进 Git？ | 何时更新 |
|------|----------|----------|
| `build/` | 否 | 每次 `idf.py build` 自动覆盖 |
| `firmware/release/` | **是** | **仅**在你手动运行复制脚本时更新（见下） |

> **`idf.py build` 不会自动往 `firmware/` 里拷文件。**  
> 日常编译只用 `build/`；要发版、给产线/安卓下载时，编译成功后执行一次脚本即可。

## 版本信息（每次运行脚本会刷新）

| 文件 | 说明 |
|------|------|
| **`release/VERSION.txt`** | 人类可读：版本号、编译时间、OTA 文件大小与 SHA256 |
| **`release/ota_manifest.json`** | Android OTA 机器可读版本 JSON：版本、固件大小、SHA256 |
| **`release/manifest.json`** | 机器可读：同上 + 全部 factory 文件校验 |
| **`release/Android端设备对接文档_v<版本>.md`** | 与固件同版本的 Android 对接说明（WiFi/BLE/UART，脚本从 `docs/` 复制） |

版本号来自 menuconfig 项 **`CONFIG_MY_APP_VERSION`**（`main/Kconfig.projbuild`，默认在 `sdkconfig.defaults` 里为 `1.0.1`）。发版前请先改版本再 `idf.py build`。

## 目录说明

| 路径 | 内容 |
|------|------|
| `release/ota/ESPRCCar.bin` | **BLE OTA / Android 升级**（仅应用镜像） |
| `release/ota_manifest.json` | **Android OTA 版本 JSON**（与 `ESPRCCar.bin` 配套） |
| `release/factory/*.bin` | **量产烧录**（乐鑫 Flash Download Tools 加载） |
| `release/factory/flash_args.txt` | 烧录地址摘要（与 `build/flash_args` 一致） |

## 烧录地址（ESP32-S3，16MB Flash）

| 文件 | 偏移 |
|------|------|
| `bootloader.bin` | `0x0` |
| `partition-table.bin` | `0x8000` |
| `ota_data_initial.bin` | `0xf000` |
| `ESPRCCar.bin` | `0x20000` |
| `storage.bin` | `0xc20000` |

Flash：`dio`，`80m`，`16MB`。产线请使用 **乐鑫 Flash Download Tools**，按上表地址加载 `factory/` 内各文件。

## 更新发布包（维护者）

```bat
idf.py build
scripts\copy_firmware_release.bat
```

脚本会刷新 **`VERSION.txt`**、**`ota_manifest.json`** 与 **`manifest.json`**。打开 `ota_manifest.json` 核对 Android OTA 版本、大小与 SHA256；**Git 提交由你自行操作**，脚本不会执行任何 git 命令。

## 他人使用

- **OTA**：下载 **两个文件**：`release/ota/ESPRCCar.bin` + `release/ota_manifest.json`。  
- **Android 联调**：同目录下的 **`Android端设备对接文档_v<版本>.md`** + `release/ota/ESPRCCar.bin` + `release/ota_manifest.json`。  
- **量产**：下载 `release/factory/` 全部 bin，用 Flash Download Tools 烧录。  
- **安装与配网**（环境、三种链路、热点填什么）：见仓库 [`docs/安装与配网指南.md`](../docs/安装与配网指南.md)。
