# U 盘升级功能

## 概述与介绍

### 简介

 U 盘升级功能让用户可以通过在设备开机时插入 U 盘，自动完成系统镜像的更新。此功能无需复杂的操作，便于用户快速更新到最新的系统版本，提升使用体验和效率。

### 必要条件

- U 盘必须使用 FAT32 格式的文件系统。
- 升级所需的镜像文件应放置在 U 盘根目录下的 `update_img` 目录中。
- 确保开发板 Uboot 能够正常启动，以支持系统顺利升级。
- 设备在插入 U 盘后，需通过冷启动（断电重启）方式，才能进入 U 盘升级模式。
- 当前版本支持全镜像升级和单分区升级。

## 功能介绍

### 升级类型

 U 盘升级功能支持全镜像升级和单分区升级两种方式。

- **全镜像升级** ：将整个系统镜像文件（包括 emmc_disk.img、nand_disk.img ）放置在 U 盘的 `update_img` 目录下，设备开机后，U 盘自动识别并升级整个系统镜像。
  - 仅支持 nand_disk.img 和 emmc_disk.img 作为镜像文件名称。
- **单分区升级**：将单个分区的镜像文件（如 boot.img、system.img 等）放置在 U 盘的 `update_img` 目录下，设备开机后，U 盘自动识别并升级单个分区的镜像文件。
  - 仅支持 boot.img、system.img、userdata.img、hbre.img、app.img 作为镜像文件名称。

### 升级方法

#### 步骤1：准备升级镜像文件

将升级所需的镜像文件放置在 U 盘的 update_img 目录内，文件名必须符合以上要求。

#### 步骤2：插入U盘

将 U 盘插入设备的 USB 接口，并进行冷启动。

#### 步骤3：开机

设备开机后，U 盘将被自动识别，开始升级系统镜像。

升级过程将持续一段时间，升级过程中，设备将无法正常使用，请耐心等待。

升级完成后，设备将自动重启，系统镜像将更新为最新版本。

## 移植指南

本章介绍 U 盘升级功能在 Uboot 下的实现代码。开发者只需确保 Uboot 正确配置和准备必要的镜像文件，同时确保 FAT32 格式的 U 盘可用即可。

### 代码路径

```
./common/Kconfig
./uboot/cmd/Makefile
./uboot/cmd/usb_autoupdate.c
./uboot/arch/arm/mach-horizon/x5/x5_board.c
```

- `Kconfig`          ：添加 `CONFIG_USB_UPDATE` 选项，以控制是否编译 U 盘升级功能。
- `Makefile`         ：添加编译 U 盘升级功能。
- `usb_autoupdate.c` ：实现了 U 盘升级功能的核心代码。
- `x5_board.c`       ：实现了开机启动时启用 U 盘升级功能。


### 代码集成

1. 复制核心代码：将 `usb_autoupdate.c` 文件复制到 ./uboot/cmd/ 目录下。
2. 修改 `Makefile` 文件：在 `Makefile` 文件中，添加 `usb_autoupdate.o` 到 `obj-$(CONFIG_USB_UPDATE)` 变量中。

    ![Makefile.png](./_static/_images/42-Auto_update_system_by_USB_storage/Makefile.png)

3. 修改 `x5_board.c` 文件：在 `x5_board.c` 文件中，添加 `usbupdate` 命令，并通过 `CONFIG_USB_UPDATE` 宏来控制是否编译 U 盘升级功能。

    ![x5_board.png](./_static/_images/42-Auto_update_system_by_USB_storage/x5_board.png)

4. 修改 `Kconfig` 文件：在 `Kconfig` 文件中，添加 `CONFIG_USB_UPDATE` 选项。

    ![Kconfig.png](./_static/_images/42-Auto_update_system_by_USB_storage/Kconfig.png)

5. Uboot 需配置相应参数，以支持 U 盘自动升级功能, 请执行以下命令以打开 Uboot 图形化配置界面：

    ```bash
    ./bd.sh uboot menuconfig
    ```

    命令执行成功后，将弹出 Uboot 的图形配置界面，您可以在此界面中设置 U 盘自动升级功能。

   - 进入到 `Update support` 菜单，并勾选 `Auto update by USB storage devices` 选项以启用 U 盘自动升级功能：

   ![uboot_menuconfig.png](./_static/_images/42-Auto_update_system_by_USB_storage/uboot_menuconfig.png)

   ![uboot_menuconfig_2.png](./_static/_images/42-Auto_update_system_by_USB_storage/uboot_menuconfig_2.png)

   - 保存并退出 Uboot 配置界面，编译并烧写 Uboot 镜像到设备中。

### 升级流程图：

![bringup.png](./_static/_images/42-Auto_update_system_by_USB_storage/bringup.png)


## 常见问题

### 如何判断设备是否支持 U 盘自动升级功能？

可以通过查看 Uboot 命令行界面是否有 `usbupdate` 命令，如果有，则表示设备支持 U 盘自动升级功能。

### 检查升级结果

升级完成后，您可以通过以下方式检查升级结果：

- 通过串口查看设备日志，确认升级是否成功。
- 通过 `df -h` 命令查看 U 盘挂载情况。
- 通过 `cat /proc/version` 命令查看系统版本。

### 升级失败

如果升级失败，请检查：
- U 盘是否正确放置镜像文件（ 确保在 update_img 目录下）。
- 通过串口查看设备日志是否有相关错误信息。
- 确保 Uboot 能够正常启动，以支持系统顺利升级。
- 确保设备在插入 U 盘后，需通过冷启动方式，才能进入升级模式。
- 如果是 eMMC 设备，确保升级前分区状态是正常的，系统能够正常运行。