# ota_tool

`ota_tool` 是一款用于嵌入式设备 OTA（ Over-The-Air）升级管理的命令行工具。支持版本检查、分区管理、包签名验证、自动升级及强制升级等功能，它主要用于设备的固件更新。

- 有关 `ota_tool` 的详细说明，请参阅 **[OTA 功能与介绍](../system_component_development/ota/1-ota.html#span-id-use-by-ota-tool)** 章节。

## 语法说明

以下是执行 `ota_tool` 的帮助信息：

```bash
ota_tool Usage:
   -v, --version                      get this library's version, system version, antirollback version
   -b, --boot                         check ota update status when boot.
   -s, --setpartition [partition]    set A/B slot partition, 0--A; 1--B.
   -g, --getpartition                 get A/B slot partition, 0--A; 1--B.
   -p, --package [package_path]       specify the path of package, the package paths can be relative or absolute, it's length must be smaller than 64 bytes.
   -n, --noreboot                     request ota without reboot.
   -c, --checksign                    signature check.
   -i, --signature                    signature information file.
   -h, --help                         Display this help screen.
```

## 参数选项说明

- -v, --version：获取 OTA 库版本、系统版本和防回滚版本。
- -b, --boot：在启动时检查 OTA 更新状态
- -s, --setpartition [partition]：设置当前使用的分区（ A/B 分区）。
  - 参数：
    - 0 ：表示 A 分区。
    - 1 ：表示 B 分区。
- -g, --getpartition：获取当前使用的分区（ A/B 分区）。返回值为 0 或 1 。
- -p, --package [package_path]：指定升级包的路径，可以是相对路径或绝对路径，路径长度必须小于 64 字节。
- -n, --noreboot：执行 OTA 更新时不自动重启设备。
- -c, --checksign：执行签名验证，确保升级包的完整性和真实性。
- -i, --signature [signature_file]：指定签名文件路径，用于签名验证。
- -h, --help：显示帮助信息。

## 各项命令选项及其功能说明

### 查询版本信息

命令：

```bash
root@buildroot:~# ota_tool -v
```

功能：

输出 OTA 库版本、系统版本和防回滚版本。

打印输出：

```bash
root@buildroot:/userdata/gmsl# ota_tool -v
OTA Library version is 1.0.1
system version is V1.0.16_20250311-1228
```

字段解析：

- OTA Library version：表示当前 OTA 库的版本号
- system version is V1.0.16_20250311-1228 ：表示当前系统的版本号。

### OTA 分区管理

命令：

```bash
root@buildroot:~# ota_tool -s 1
```

```bash
root@buildroot:~# ota_tool -s 0
```

功能：

设置下次启动 A/B slot, 0 代表 A 分区， 1 代表 B 分区。

设置 A 分区打印输出 :

```bash
root@buildroot:~# ota_tool -s 0
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[fe2954d5], newcrc[fe2954d5], offset[1352]
[OTA_INFO][veeprom_flag.c:396] update part num: [0]
[OTA_INFO][ota_boot_control.c:142] curslot read from misc is: 1
[OTA_INFO][ota_boot_control.c:650] next expected slot is:1
[OTA_INFO][ota_boot_control.c:688] set slot:0 to next expected success!
[OTA_INFO][veeprom_flag.c:632] next slot veeprom 0
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[fe2954d5], newcrc[fe2954d5], offset[1352]
[OTA_INFO][veeprom_flag.c:310] veeprom: flag [7], value [0]
```

设置 B 分区打印输出 :

```bash
root@buildroot:~# ota_tool -s 1
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[637d5378], newcrc[637d5378], offset[1352]
[OTA_INFO][veeprom_flag.c:396] update part num: [0]
[OTA_INFO][ota_boot_control.c:142] curslot read from misc is: 0
[OTA_INFO][ota_boot_control.c:650] next expected slot is:0
[OTA_INFO][ota_boot_control.c:688] set slot:1 to next expected success!
[OTA_INFO][veeprom_flag.c:632] next slot veeprom 1
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[637d5378], newcrc[637d5378], offset[1352]
[OTA_INFO][veeprom_flag.c:310] veeprom: flag [7], value [1]
```

命令：

```bash
root@buildroot:~# ota_tool -g
```

功能：

获取当前激活分区。

打印输出：

```bash
root@buildroot:~# ota_tool -g
[OTA_INFO][hobot_ota_hl.c:462] current slot is:A
```

### OTA 固件升级

使用 ota_tool 进行升级前，需要将 OTA 升级包上传至板端。编译 OTA 升级包命令如下：

```bash
./bd.sh otapackage
```

OTA 打包端详细介绍请参阅 **[X5 OTA 打包端介绍](../system_component_development/ota/1-ota.html#span-id-use-by-ota-tool)** 章节。

命令：

```bash
root@buildroot:~# ota_tool -p all_in_one.zip
```

功能：

启动 OTA 固件升级，但不验证包完整性。

命令：

```bash
ota_tool -c -p all_in_one.zip -i all_in_one.signature
```

功能：

启动 OTA 固件升级并验证包完整性。

### OTA 状态检查

命令：

```bash
root@buildroot:~# ota_tool -b
```

功能：

启动时检查 OTA 更新状态，并标记当前分区的启动状态，使用 OTA 更新固件后系统会自动启用该命令选项 。

手动打印输出：

```bash
root@buildroot:~# ota_tool -b
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[637d5378], newcrc[637d5378], offset[1352]
[OTA_INFO][veeprom_flag.c:396] update part num: [0]
Normal boot
[OTA_INFO][ota_boot_control.c:304] This slot has been marked success before, no need to mark it repeatedly
[OTA_INFO][ota_boot_control.c:797] set slot:0 boot success
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[637d5378], newcrc[637d5378], offset[1352]
[OTA_INFO][veeprom_flag.c:310] veeprom: flag [0], value [3]
```

系统自启打印输出：

```bash
[OTA_INFO][veeprom_flag.c:396] update part num: [1]
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[4db4cddd], newcrc[4db4cddd], offset[1352]
[OTA_INFO][veeprom_flag.c:396] update part num: [1]
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[4db4cddd], newcrc[4db4cddd], offset[1352]
[OTA_INFO][veeprom_flag.c:396] update part num: [1]
[OTA_INFO][ota_utils.c:876] normal mode
[OTA_INFO][hobot_ota_hl.c:755] OTA update status check success
[OTA_INFO][ota_boot_control.c:797] set slot:0 boot success
[OTA_INFO][veeprom_flag.c:86] veeprom crc, oricrc[4db4cddd], newcrc[4db4cddd], offset[1352]
[    4.355944] printk: S99ota_update_c: 16 output lines suppressed due to ratelimiting
```