From d9d128ee5b4adb3e06634cad12948dc50b928816 Mon Sep 17 00:00:00 2001 From: LeeJc02 <129182487+LeeJc02@users.noreply.github.com> Date: Sun, 26 Oct 2025 18:26:28 +0800 Subject: [PATCH 1/3] supplementary model --- docs/npu/lpi4a/object-detection/yolov5.mdx | 217 ++++++++ docs/npu/lpi4a/object-detection/yolox.mdx | 114 ++++ docs/typical-applications/bert-on-npu.md | 204 ------- .../mobilenetv2-image-classification.md | 330 ------------ docs/typical-applications/yolox-deployment.md | 205 ------- .../current/Installation/intro.mdx | 40 +- .../Installation/licheepi4a-windows.mdx | 334 +++++++----- .../current/Installation/licheepi4a.mdx | 500 +++++++++++------- .../current/Installation/milkv-meles.mdx | 359 +++++-------- .../current/Installation/milkv-pioneer.mdx | 146 +++-- .../current/intro.mdx | 24 +- .../current/issue.md | 13 +- .../current/npu/lpi4a/env.mdx | 117 ++-- .../npu/lpi4a/object-detection/yolov5.mdx | 215 ++++++++ .../npu/lpi4a/object-detection/yolox.mdx | 111 ++++ .../typical-applications/bert-on-npu.md | 202 ------- .../mobilenetv2-image-classification.md | 249 --------- .../typical-applications/yolox-deployment.md | 204 ------- static/img/image-for-flash/yolov5.png | Bin 0 -> 163692 bytes static/img/image-for-flash/yolov5_2.png | Bin 0 -> 59312 bytes 20 files changed, 1452 insertions(+), 2132 deletions(-) create mode 100644 docs/npu/lpi4a/object-detection/yolov5.mdx create mode 100644 docs/npu/lpi4a/object-detection/yolox.mdx delete mode 100644 docs/typical-applications/bert-on-npu.md delete mode 100644 docs/typical-applications/mobilenetv2-image-classification.md delete mode 100644 docs/typical-applications/yolox-deployment.md create mode 100644 i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolov5.mdx create mode 100644 i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolox.mdx delete mode 100644 i18n/en/docusaurus-plugin-content-docs/current/typical-applications/bert-on-npu.md delete mode 100644 i18n/en/docusaurus-plugin-content-docs/current/typical-applications/mobilenetv2-image-classification.md delete mode 100644 i18n/en/docusaurus-plugin-content-docs/current/typical-applications/yolox-deployment.md create mode 100644 static/img/image-for-flash/yolov5.png create mode 100644 static/img/image-for-flash/yolov5_2.png diff --git a/docs/npu/lpi4a/object-detection/yolov5.mdx b/docs/npu/lpi4a/object-detection/yolov5.mdx new file mode 100644 index 00000000..b3913926 --- /dev/null +++ b/docs/npu/lpi4a/object-detection/yolov5.mdx @@ -0,0 +1,217 @@ +--- +title: YOLOv5 +description: 在 RevyOS 系统上部署和运行 YOLOv5 模型的教程 +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## YOLOv5 + +本教程将引导你如何通过 CPU 或 NPU 在 RevyOS 系统上运行 YOLOv5 模型。 + +:::info[初始环境配置] +在按照本教程操作前,请确保你已经完成了[环境配置](../../env)部分的内容。 +::: + +## 示例代码获取 + +本教程配套的示例代码已更新到 [Github](https://github.com/zhangwm-pt/lpi4a-example) 中,使用 `git` 命令将其克隆到本地。 + +```shell-session +$ git clone https://github.com/zhangwm-pt/lpi4a-example.git +``` + +适用于本教程的代码位于 `detection/yolov5` 目录下。 + +## 模型获取 + +本教程中使用的模型来自 yolov5 模型仓库,可通过其 `export.py` 脚本导出。 +```python +$ git clone https://github.com/ultralytics/yolov5.git +$ cd yolov5 +$ pip3 install ultralytics +$ python3 export.py --weights yolov5n.pt --include onnx --imgsz 384 640 +``` + +:::note[关于 Github 的网络代理] +如果你在中国大陆访问 GitHub 时遇到网络问题,可以考虑使用网络代理工具来加速访问。 +::: + + +## 转换和编译模型 + +环境配置完成后,即可使用 HHB 编译模型为 c920 上的可执行程序。 + +本教程中使用的检测模型是 yolov5n,针对 yolov5n,hhb 命令中截取到最后的卷积层为止,卷积层之后的后处理,交由示例中已准备好的 yolov5n.c 文件处理。 + +进入 `detection/yolov5` 目录,执行以下命令: + + + +```shell-session +$ hhb -D --model-file yolov5n.onnx --data-scale-div 255 \ + --board c920 --input-name "images" --output-name \ + "/model.24/m.0/Conv_output_0;/model.24/m.1/Conv_output_0;/model.24/m.2/Conv_output_0" \ + --input-shape "1 3 384 640" --quantization-scheme float16 +``` + + +```shell-session +$ hhb -D --model-file yolov5n.onnx --data-scale-div 255 \ + --board th1520 --input-name "images" --output-name \ + "/model.24/m.0/Conv_output_0;/model.24/m.1/Conv_output_0;/model.24/m.2/Conv_output_0" \ + --input-shape "1 3 384 640" --calibrate-dataset kite.jpg \ + --quantization-scheme "int8_asym" +``` + + + +:::info[关于参数] +- `-D`:指定 HHB 流程执行到生成可执行文件的阶段为止 +- `--model-file`:指定输入模型文件 +- `--data-mean`:指定均值 +- `--data-scale`:指定缩放值 +- `--board`:指定目标平台为 C920(CPU) 或 TH1520(NPU) +- `--input-name`: 模型的输入 tensor 名 +- `--output-name`:模型的输出 tensor 名 +- `--input-shape`:模型的输入 tensor 形状 +- `--postprocess`:指定 HHB 生成的胶水代码的后处理行为。`save_and_top5` 表示保存输出结果,并且打印 top5 结果 +- `--quantization-scheme`:指定量化类型 + +你可以通过运行 `hhb --help` 查看所有可用的参数和选项。 +::: + +:::info[关于 HHB 生成的文件] +命令执行完成后,会在当前目录生成 hhb_out 子目录,里面的包括了 `hhb_runtime` `model.c` 等多个文件: + +- `hhb.bm`:HHB 的模型文件,包括了量化后的权重数据等信息 +- `hhb_runtime`:适用于开发板的可执行文件,由目录中的C文件编译而成 +- `main.c`:HHB 生成的示例程序的参考入口 +- `model.c`:HHB 模型结构表示文件,与模型结构相关 +- `model.params`:模型权重文件 +- `io.c`:HHB 生成的示例程序,包含读写文件的辅助函数 +- `io.h`:HHB 生成的示例程序,包含读写文件的辅助函数声明 +- `process.c`:HHB 生成的示例程序,包含图像预处理函数 +- `process.h`:HHB 生成的示例程序,包含图像预处理函数声明 +::: + +### gcc 编译后处理 + +本教程中,使用了 c 代码实现模型的后半部分和 NMS,后处理输出图片对应的检测结果。 +```C +$ riscv64-unknown-linux-gnu-gcc yolov5n.c -o yolov5n_example hhb_out/io.c \ + hhb_out/model.c -Wl,--gc-sections -O2 -g -mabi=lp64d -I hhb_out/ -L \ + /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/lib/ \ + -lshl -L /usr/local/lib/python3.8/dist-packages/hhb/prebuilt/decode/install/lib/rv \ + -L /usr/local/lib/python3.8/dist-packages/hhb/prebuilt/runtime/riscv_linux \ + -lprebuilt_runtime -ljpeg -lpng -lz -lstdc++ -lm -I \ + /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/include/ -mabi=lp64d \ + -march=rv64gcv0p7_zfh_xtheadc -Wl,-unresolved-symbols=ignore-in-shared-libs -I \ + /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/include/shl_public/ \ + -I /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/include/csinn/ +``` + +本教程的示例代码中链接了 shl 库,比如 shl 的安装目录在 `/usr/local/lib/python3.8/dist-packages/shl`。 + +:::info[选项说明] +- `-Ihhb_out -I/usr/local/lib/python3.8/dist-packages/shl/install_nn2/c920/include/`:头文件的搜索路径,指定到 shl 的头文件路径 +- `-L/usr/local/lib/python3.8/dist-packages/shl/install_nn2/c920/lib`:库的搜索路径,指定到预编译好的 shl 的二进制库路径 +- `-static`:指定为静态链接 +- `-o yolov5n_example`:指定生成名为 yolov5n_example 的可执行文件 +::: + +编译命令正确执行完成后会在示例目录生成 yolov5n_example 文件。 + +## 执行 + +交叉编译完成后,即可将程序执行所需的文件复制到开发板的目录中。 + +以开发板 ip 为 10.63.x.x,使用 /demo 目录为例,主机上将示例程序的目录通过 scp 复制到目录中: + +```bash +scp -r yolov5n th1520@10.63.x.x:/demo/ +``` + +linux 命令行执行时,开发板的命令行终端上,到示例目录执行命令。执行完成后,会在终端上提示执行到的各个阶段: +1. 预处理:将原图填充缩放到 384 * 640 的大小 +2. 模型执行和后处理:执行模型推理,并做 nms 等后处理 +3. 画框:将检测结果画在 384 * 640 尺寸的图上,并输出新图片 + +:::info[执行需要的文件] +- `kite.jpg`:输入图片 +- `image_preprocessed.bin`:预处理阶段,根据输入图片生成的中间结果 +- `yolov5n_example`:模型执行阶段使用的文件,由x86主机上 gcc 编译生成 +- `hhb_out/hhb.bm`:模型执行阶段使用的文件,由x86主机上 HHB 生成 +- `detect.txt`:后处理阶段的输出文件,包括了图片中检测出来的 4 个目标 +- `kite_result.jpg`:输出图片,将检测框加入到输入图上的结果 +::: + +## 参考结果 + +本教程中输入如下图,是一个一家三口放风筝的图片,预期 yolov5 的检测结果是检测到三个人和一个风筝。 +![输入图像](/img/image-for-flash/yolov5.png) +![检测图像](/img/image-for-flash/yolov5_2.png) + +示例正常执行时,会有类似如下打印: + + + +```shell-session +$ .python3 inference.py + ********** preprocess image ********** + ******* run yolov5 and postprocess ******* +Run graph execution time: 401.13336ms, FPS=2.49 +detect num: 4 +id: label score x1 y1 x2 y2 +[0]: 0 0.899609 274.486389 158.510849 359.157715 332.118591 +[1]: 0 0.880201 80.017410 184.470093 190.141861 349.840637 +[2]: 0 0.844358 219.474869 221.711838 283.615723 333.643250 +[3]: 33 0.667759 67.194008 174.118088 203.020660 220.667618 + ********** draw bbox ********** +[274.486389, 158.510849, 359.157715, 332.118591, 0.899609, 0] +[80.01741, 184.470093, 190.141861, 349.840637, 0.880201, 0] +[219.474869, 221.711838, 283.615723, 333.64325, 0.844358, 0] +[67.194008, 174.118088, 203.02066, 220.667618, 0.667759, 33] +``` + + +```shell-session +$ python3 inference.py + ********** preprocess image ********** + ******* run yolov5 and postprocess ******* +INFO: NNA clock:1001624 [kHz] +INFO: Heap :anonymous (0x2) +INFO: Heap :dmabuf (0x2) +INFO: Heap :unified (0x5) +WARNING: Mapping to the on chip ram failed (128 > 0), continuing... +FATAL: Importing 737280 bytes of CPU memory has failed (Invalid argument) +Run graph execution time: 11.96299ms, FPS=83.59 +detect num: 4 +id: label score x1 y1 x2 y2 +[0]: 0 0.895277 273.492188 161.245056 359.559814 330.644257 +[1]: 0 0.887368 79.860062 179.181244 190.755692 354.304474 +[2]: 0 0.815214 222.054565 224.477600 279.828979 333.717285 +[3]: 33 0.563324 67.625580 173.948883 201.687988 219.065765 + ********** draw bbox ********** +[273.492188, 161.245056, 359.559814, 330.644257, 0.895277, 0] +[79.860062, 179.181244, 190.755692, 354.304474, 0.887368, 0] +[222.054565, 224.4776, 279.828979, 333.717285, 0.815214, 0] +[67.62558, 173.948883, 201.687988, 219.065765, 0.563324, 33] +``` + + + diff --git a/docs/npu/lpi4a/object-detection/yolox.mdx b/docs/npu/lpi4a/object-detection/yolox.mdx new file mode 100644 index 00000000..422943bc --- /dev/null +++ b/docs/npu/lpi4a/object-detection/yolox.mdx @@ -0,0 +1,114 @@ +--- +title: YOLOX +description: 在 RevyOS 系统上运行 YOLOX 模型的教程 +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + +## YOLOX + +本教程介绍如何在 **LicheePi 4A** 上部署 YOLOX 目标检测模型,并使用 **HHB-onnxruntime** 实现高效推理。 + + +:::info[初始环境配置] +在按照本教程操作前,请确保你已经完成了[环境配置](../../env)部分的内容。 +::: + +## 示例代码获取 + +本教程配套的示例代码已更新到 [Github](https://github.com/zhangwm-pt/lpi4a-example) 中,使用 `git` 命令将其克隆到本地。 + +```shell-session +$ git clone https://github.com/zhangwm-pt/lpi4a-example.git +``` +适用于本教程的代码位于 `detection/yolox` 目录下。 + +## 模型获取 + +我们使用的模型来自 [Megvii-BaseDetection/YOLOX](https://github.com/Megvii-BaseDetection/YOLOX),可以通过以下命令下载 YOLOX 模型: + +```shell-session +$ git clone https://github.com/Megvii-BaseDetection/YOLOX.git +$ cd YOLOX/demo/ONNXRuntime +$ wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.onnx +``` + +:::note[关于 Github 的网络代理] +如果你在中国大陆访问 GitHub 时遇到网络问题,可以考虑使用网络代理工具来加速访问。 +::: + +## 修改源码 +修改文件 demo/ONNXRuntime/onnx_inference.py 的开头,新增如下所示的第四和第五行代码 +```python +#!/usr/bin/env python3 +# Copyright (c) Megvii, Inc. and its affiliates. + ++import sys ++sys.path.insert(0, "../../") + +import argparse +import os +``` +代码中使用 sys.path.insert 指定搜索路径,以此免去从源码中安装 YOLOX 的安装包的操作。 + +## 环境准备 + +本教程中的 YOLOX 示例依赖了较多的 python 包,下载预编译好的 python 包 +```shell-session +$ git clone -b python3.11 https://github.com/zhangwm-pt/prebuilt_whl.git +$ cd prebuilt_whl +``` + +或者也可以通过手动下载进行处理 +``` +$ pip3 install numpy-1.25.0-cp311-cp311-linux_riscv64.whl +$ pip3 install opencv_python-4.5.4+4cd224d-cp311-cp311-linux_riscv64.whl +$ pip3 install kiwisolver-1.4.4-cp311-cp311-linux_riscv64.whl +$ pip3 install Pillow-9.5.0-cp311-cp311-linux_riscv64.whl +$ pip3 install matplotlib-3.7.2.dev0+gb3bd929cf0.d20230630-cp311-cp311-linux_riscv64.whl +$ pip3 install pycocotools-2.0.6-cp311-cp311-linux_riscv64.whl +$ pip3 install loguru-0.7.0-py3-none-any.whl +$ pip3 install MarkupSafe-2.1.3-cp311-cp311-linux_riscv64.whl +$ pip3 install torch-2.0.0a0+gitc263bd4-cp311-cp311-linux_riscv64.whl +$ pip3 install torchvision-0.15.1a0-cp311-cp311-linux_riscv64.whl +$ pip3 install psutil-5.9.5-cp311-abi3-linux_riscv64.whl +$ pip3 install tqdm-4.65.0-py3-none-any.whl +$ pip3 install tabulate-0.9.0-py3-none-any.whl +``` +安装过程中会涉及到其他纯 python 依赖包,pip 会自动从官方源下载。 + + +## 推理执行 + +在示例目录中执行 onnx_inference.py 示例 + +```bash +$ python3 onnx_inference.py -m yolox_s.onnx -i ../../assets/dog.jpg -o outdir -s 0.7 --input_shape 640,640 +``` + +:::info[关于参数] + +- `-m`:指定模型文件 +- `-i`:输入图片路径 +- `-o`:输出结果目录 +- `-s`:检测阈值 +- `--input_shape`:输入图像尺寸 +::: + +## 参考结果 + +本教程中输入如下图,0.7的阈值下,预期 YOLOX 的检测结果如下。 + + +![输入图像](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_input.jpg) + +示例正常执行后,会在 outdir 目录下生成结果图片 dog.jpg。图片中会用框画出检测到的目标,并标注概率,效果如下图: + +![检测结果](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_output.jpg) + +检测到两个人和一个足球。 + + diff --git a/docs/typical-applications/bert-on-npu.md b/docs/typical-applications/bert-on-npu.md deleted file mode 100644 index a05f9206..00000000 --- a/docs/typical-applications/bert-on-npu.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Licheepi 4A TH1520 NPU 上运行 BERT 模型(HHB 量化 & 推理) -sidebar_position: 3 ---- - -# Licheepi 4A TH1520 NPU 上运行 BERT 模型(HHB 量化 & 推理) - -本文详细介绍如何在 LicheePi 4A 的 TH1520 NPU 上部署和运行 BERT 模型,包括使用 HHB 工具进行量化和推理的完整流程。 - -## BERT模型简介 - -BERT (Bidirectional Encoder Representations from Transformers) 是一种预训练语言模型,在自然语言处理领域有广泛应用。 - -本教程介绍如何在 **Licheepi 4A TH1520 开发板** 上使用 **HHB(Heterogeneous Hybrid Binary)** 工具链,编译并运行 **BERT 模型**,实现阅读理解任务的推理。 - ------- - -## **1. 环境准备** - -### **1.1. 确保已安装 HHB** - -参考[文档](https://github.com/jason-hue/plct/blob/main/%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3/LIcheepi%204A%E9%83%A8%E7%BD%B2%20mobilenetv2%20%E6%A8%A1%E5%9E%8B%E5%AE%8C%E6%88%90%E5%9B%BE%E5%83%8F%E5%88%86%E7%B1%BB%E7%9A%84%E7%A4%BA%E4%BE%8B.md)搭建好 NPU 使用相关环境后,进入到 HHB 环境的 Docker 镜像中。 - -### **1.2. 下载 BERT 模型和示例代码** - -首先获取模型,本教程中使用的模型来自 google bert 仓库,已转换成 onnx 版本的 BERT 模型,可以用如下命令下载到 `/home/example/c920/bert_small` 目录下: - -```bash -cd /home/example/c920/bert_small - -wget https://github.com/zhangwm-pt/bert/releases/download/onnx/bert_small_int32_input.onnx -``` - ------- - -## **2. 使用 HHB 编译 BERT 模型** - -将 ONNX 模型交叉编译成 NPU 上可执行的程序,需要使用 hhb 命令。注意,NPU 上仅支持8位或者16位定点运算,本示例中指定为 int8 非对称量化。编译时需要先进入到示例所在目录 - -### **2.1. 进入 BERT 目录** - -```bash -cd /home/example/c920/bert_small -``` - -### **2.2. 运行 HHB 编译** - -注意必须要使用这这里的工具链,否则编译出的二进制文件无法在 LicheePi 4A 上运行。 - -```bash -export PATH=/tools/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1-light.1/bin/:$PATH -``` - -```bash -hhb --model-file bert_small_int32_input.onnx --input-name "input_ids;input_mask;segment_ids" --input-shape '1 384;1 384;1 384' --output-name "output_start_logits;output_end_logits" --board c920 --quantization-scheme "float16" --postprocess save_and_top5 -D --without-preprocess - -``` - -### **2.3. 选项说明** - -| 选项 | 说明 | -| ----------------------- | ------------------------ | -| `-D` | 生成可执行文件 | -| `--model-file` | 指定 ONNX BERT 模型 | -| `--input-name` | 模型输入名 | -| `--output-name` | 模型输出名 | -| `--input-shape` | 输入数据形状 | -| `--board` | 指定目标平台(TH1520) | -| `--quantization-scheme` | 量化方式(int8/float16) | -| `--postprocess` | 输出结果并打印 top5 | - ------- - -## **3. 生成的文件** - -HHB 运行后,在当前目录生成 `hhb_out/` 目录,其中包括: - -``` -hhb_out/ -├── hhb.bm # 量化后模型文件 -├── hhb_runtime # 可执行推理程序 -├── main.c # 参考示例入口 -├── model.c # 模型结构代码 -├── model.params # 量化后的权重数据 -├── io.c / io.h # 读写文件辅助代码 -├── process.c / process.h # 预处理函数 -``` - ------- - -## **4. 传输到开发板** - -将编译好的模型和文件拷贝到宿主机: - -```bash -docker cp 65f872394fa5837ef2c24ade731b152da074ac6091f0766c04ac54092ff32780:/home/example/c920/bert_ -small C:\Users\knifefire\Downloads\ -``` - -然后上传到开发板后,在开发板上: - -```bash -cd ~/bert_small -chmod +x hhb_out/hhb_runtime # 赋予执行权限 -``` - ------- - -## **5. 运行推理** - -```bash -python3 inference.py -``` - ------- - -## **6. 预期输出** - -BERT 处理 SQuAD 数据集的问题: - -本示例中的参考输入来自 SQuAD 数据集,SQuAD 是一个阅读理解数据集,由一组维基百科文章提出的问题组成,其中每个问题的答案都是来自相应阅读文章或问题的一段文本。 -本示例的输入如下,文章内容描述了一次橄榄球比赛的赛况,提出的问题是谁参加了比赛。 - -```bash -[Context]: Super Bowl 50 was an American football game... -[Question]: Which NFL team represented the AFC at Super Bowl 50? -``` - -**BERT 输出答案** - -根据阅读理解的结果,预期输出将是 Denver Broncos - -``` -[Answer]: Denver Broncos -``` - -**运行时间** - -``` -Run graph execution time: 1713.15491ms, FPS=0.58 -``` - -##### 参考输出: - -```bash -# python3 inference.py - ********** preprocess test ********** -[Context]: Super Bowl 50 was an American football game to determine the champion of the National Football League (N -FL) for the 2015 season. The American Football Conference (AFC) champion Denver Broncos defeated the National Footba -ll Conference (NFC) champion Carolina Panthers 24–10 to earn their third Super Bowl title. The game was played on Fe -bruary 7, 2016, at Levi's Stadium in the San Francisco Bay Area at Santa Clara, California. As this was the 50th Sup -er Bowl, the league emphasized the "golden anniversary" with various gold-themed initiatives, as well as temporarily - suspending the tradition of naming each Super Bowl game with Roman numerals (under which the game would have been k -nown as "Super Bowl L"), so that the logo could prominently feature the Arabic numerals 50. -[Question]: Which NFL team represented the AFC at Super Bowl 50? - ******* run bert ******* -Run graph execution time: 1713.15491ms, FPS=0.58 - -=== tensor info === -shape: 1 384 -data pointer: 0x183d60 - -=== tensor info === -shape: 1 384 -data pointer: 0x185380 - -=== tensor info === -shape: 1 384 -data pointer: 0x1869a0 - -=== tensor info === -shape: 1 384 -data pointer: 0x2a8610 -The max_value of output: 3.826172 -The min_value of output: -9.968750 -The mean_value of output: -8.412353 -The std_value of output: 5.128320 - ============ top5: =========== - 46: 3.826172 - 57: 3.142578 - 39: 1.303711 - 38: 1.179688 - 27: 0.624512 - -=== tensor info === -shape: 1 384 -data pointer: 0x2a8300 -The max_value of output: 3.617188 -The min_value of output: -9.625000 -The mean_value of output: -7.798176 -The std_value of output: 4.820137 - ============ top5: =========== - 47: 3.617188 - 58: 3.482422 - 32: 2.523438 - 29: 1.541992 - 41: 1.473633 - ********** postprocess ********** -[Answer]: Denver Broncos -``` - -这样,你就成功在 **Licheepi4A 开发板** 上运行了 **BERT 量化推理**!🚀 - -参考文档:https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/8_application.html \ No newline at end of file diff --git a/docs/typical-applications/mobilenetv2-image-classification.md b/docs/typical-applications/mobilenetv2-image-classification.md deleted file mode 100644 index ed4bcb10..00000000 --- a/docs/typical-applications/mobilenetv2-image-classification.md +++ /dev/null @@ -1,330 +0,0 @@ ---- -title: LIcheepi 4A部署 mobilenetv2 模型完成图像分类的示例 -sidebar_position: 2 ---- - -# LIcheepi 4A部署 mobilenetv2 模型完成图像分类的示例 - -本文将介绍如何在Licheepi 4A上部署MobileNetV2模型进行图像分类任务。 - -## 前提条件 - -- Licheepi 4A硬件设备 -- RevyOS操作系统 -- 基本的机器学习知识 - -## 模型介绍 - -MobileNetV2是一个轻量级深度学习模型,专为移动和边缘设备设计,具有高效率和良好的性能表现。 - -本教程是一个如何在 LicheePi4A 平台上部署 mobilenetv2 模型完成图像分类的示例。 - -教程中包括了: - -- 使用 HHB 编译 onnx 模型为 LicheePi4A 上可用的二进制 -- 在 LicheePi4A 上使用 opencv c++ 版本做 mobilenetv2 模型的预处理 -- 在 LicheePi4A 上使用 CPU 和 NPU 的差异 - - - -### NPU环境配置 - -需要先安装 python 虚拟环境,再使用 pip3 安装 python 包。 -使用如下命令,安装 venv 包,用于创建python虚拟环境(以在 root 目录中创建 python 虚拟环境为例): - -```bash -sudo apt install python3.11-venv -python3 -m venv venv -source venv/bin/activate -``` - -#### SHL 库安装 - -使用 pip 安装 - -```bash -pip3 install shl-python -``` - -安装后,使用 --whereis 查看安装位置 - -```bash -python3 -m shl --whereis th1520 -# 若使用纯 CPU 推理,则替换为 python3 -m shl --whereis c920 -``` - -根据打印的位置,将目录中的动态库复制到 /usr/lib 目录中,比如,打印的是: - -```bash -/home/sipeed/ort/lib/python3.11/site-packages/shl/install_nn2/th1520 -``` - -可以使用复制命令: - -```bash -sudo cp -r /home/sipeed/ort/lib/python3.11/site-packages/shl/install_nn2/th1520/lib/* /usr/lib/ -``` - -#### HHB-onnxruntime 安装 - -HHB-onnxuruntime 是移植了 SHL 后端(execution providers),让 onnxruntime 能复用到 SHL 中针对玄铁 CPU 的高性能优化代码。 - -CPU 版本 - -```bash -wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl_v2.6.0/hhb_onnxruntime_c920-2.6.0-cp311-cp311-linux_riscv64.whl -pip install hhb_onnxruntime_c920-2.6.0-cp311-cp311-linux_riscv64.whl -``` - -NPU 版本 - -```bash -wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl_v2.6.0/hhb_onnxruntime_th1520-2.6.0-cp311-cp311-linux_riscv64.whl -pip install hhb_onnxruntime_th1520-2.6.0-cp311-cp311-linux_riscv64.whl -``` - -#### **x86主机配置** - -安装好docker后,在docker应用中打开terminal输入: - -```bash -docker pull hhb4tools/hhb:2.4.5 -``` - -拉取镜像完毕后,使用下面的命令进入 Docker 镜像: - -```bash -docker run -itd --name=your.hhb2.4 -p 22 "hhb4tools/hhb:2.4.5" -docker exec -it your.hhb2.4 /bin/bash -``` - -进入 Docker 镜像后,可使用下面的命令确认 HHB 版本: - -```bash -hhb --version -``` - -进入 Docker 镜像中后,还需要配置交叉编译环境。注意必须要使用这这里的工具链,否则编译出的二进制文件无法在 LicheePi4A 上运行。 - -```bash -export PATH=/tools/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1-light.1/bin/:$PATH -``` - -![image-20250227142739955](https://raw.githubusercontent.com/jason-hue/plct/main/image-20250227142739955.png) - -至此,HHB 环境初步搭建完成。 - -### 部署MobilenetV2 - -进入docker中 - -首先获取本节教程的模型,下载到示例目录 `/home/example/th1520_npu/onnx_mobilenetv2_c++` 下: -[mobilenetv2-12.onnx](https://github.com/onnx/models/raw/main/validated/vision/classification/mobilenet/model/mobilenetv2-12.onnx) - -并获取本次教程所使用的优化版本 opencv 所需的库文件,前往 [github仓库下载](https://xuantie.t-head.cn/community/download?id=4112956065753141248)下载到上一级目录 `/home/example/th1520_npu/` 下。 - -```bash -cd /home/example/th1520_npu/ -git clone https://github.com/zhangwm-pt/prebuilt_opencv.git -``` - -#### 编译 - -**HHB 编译模型:** -将 ONNX 模型交叉编译成 NPU 上可执行的程序,需要使用 hhb 命令。注意,NPU 上仅支持8位或者16位定点运算,本示例中指定为 int8 非对称量化。编译时需要先进入到示例所在目录 `/home/example/th1520_npu/onnx_mobilenetv2_c++`: - -```bash -cd /home/example/th1520_npu/onnx_mobilenetv2_c++ -hhb -D --model-file mobilenetv2-12.onnx --data-scale 0.017 --data-mean "124 117 104" --board th1520 --postprocess save_and_top5 --input-name "input" --output-name "output" --input-shape "1 3 224 224" --calibrate-dataset persian_cat.jpg --quantization-scheme "int8_asym" -``` - -选项说明: - -- -D :指定 HHB 流程执行到生成可执行文件的阶段为止 -- --model-file :指定当前目录中已经下载好的 mobilenet 模型 -- --data-mean :指定均值 -- --data-scale :指定缩放值 -- --board :指定目标平台为 th1520 -- --input-name: 模型的输入名 -- --output-name:模型的输出名 -- --input-shape:模型的输入大小 -- --postprocess:保存输出结果,并且打印 top5 结果 -- --calibrate-dataset:指定量化时所需的校准图片 -- --quantization-scheme:指定量化方式为 int8 非对称 - -命令执行完成后,会在当前目录生成 hhb_out 子目录,里面的包括了 hhb_runtime,model.c 等多个文件: - -- hhb.bm:HHB 的模型文件,包括了量化后的权重数据等信息 -- hhb_runtime:th1520 平台上的可执行文件,由目录中的c文件编译而成 -- main.c:临时文件,示例程序的参考入口 -- model.c:临时文件,模型结构文件,与模型结构相关 -- model.params:临时文件,权重数值 -- io.c:临时文件,读写文件的辅助函数 -- io.h:临时文件,读写文件的辅助函数声明 -- process.c:临时文件,图像预处理函数 -- process.h:临时文件,图像预处理函数声明 - -更详细的 HHB 选项说明可以参考 [HHB用户手册](https://www.yuque.com/za4k4z/oxlbxl/keyg70qggt5n3fpa)中的命令行选项说明。 - -**g++编译示例:** - -```bash -riscv64-unknown-linux-gnu-g++ main.cpp -I../prebuilt_opencv/include/opencv4 -L../prebuilt_opencv/lib -lopencv_imgproc -lopencv_imgcodecs -L../prebuilt_opencv/lib/opencv4/3rdparty/ -llibjpeg-turbo -llibwebp -llibpng -llibtiff -llibopenjp2 -lopencv_core -ldl -lpthread -lrt -lzlib -lcsi_cv -latomic -static -o mobilenetv2_example -``` - -编译命令正确执行完成后会在示例目录生成 mobilenetv2_example 文件。 - -#### 执行 - -交叉编译完成后,即可将程序执行所需的文件复制到开发板的目录中。 - -将docker中的文件夹传输到宿主机: - -```bash -docker cp 65f872394fa5837ef2c24ade731b152da074ac6091f0766c04ac54092ff32780:/home/example/th1520_npu/onnx_mobilenetv2_c++ C:\Users\knifefire\Downloads\ -``` - -然后上传到开发板即可。 - -先确认开发板中驱动是否加载: - -```shell -lsmod -``` - -若在输出中有 `img_mem`,`vha` 和 `vha_info` 这三个模块,NPU驱动即加载成功。 - -手动加载NPU驱动: - -```bash -sudo insmod /lib/modules/5.10.113-th1520/kernel/drivers/nna/img_mem/img_mem.ko - -sudo modprobe vha onchipmem_phys_start=0xffe0000000 onchipmem_size=0x100000 freq_khz=792000 - -sudo insmod /lib/modules/5.10.113-th1520/kernel/drivers/nna/vha/vha_info.ko - -sudo chmod a+rw /dev/vha0 -``` - -参考 [YOLOX章节](https://github.com/jason-hue/plct/blob/main/%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3/%E5%9C%A8%20LicheePi%204A%20%E4%B8%8A%E9%83%A8%E7%BD%B2%20YOLOX%20%E5%B9%B6%E4%BD%BF%E7%94%A8%20HHB-onnxruntime%20%E8%BF%9B%E8%A1%8C%E6%8E%A8%E7%90%86.md) 安装并配置好 python 虚拟环境 - -在开发板相应目录下运行刚刚编译好的示例: - -```bash -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/th1520/lib -./mobilenetv2_example -``` - -执行完成后,会在终端上提示执行到的各个阶段: - -1. 预处理 -2. 模型执行 -3. 后处理 - -mobilenetv2_example 执行会使用到的文件: - -- persian_cat.jpg:输入图片 -- input_img.bin:预处理阶段,根据输入图片生成的中间结果 -- hhb_out/hhb_runtime:模型执行阶段使用的文件,由x86主机上 HHB 生成 -- hhb_out/hhb.bm:模型执行阶段使用的文件,由x86主机上 HHB 生成 -- input_img.bin_output0_1_1000.txt:模型执行阶段的输出文件,包括了模型执行输出的 1000 个结果数值 - -#### 参考结果: - -```bash -(venv) sipeed@revyos-lpi4a:~/onnx_mobilenetv2_c++$ ./mobilenetv2_example - ********** preprocess image ********** - ********** run mobilenetv2 ********** -INFO: NNA clock:792000 [kHz] -INFO: Heap :ocm (0x18) -INFO: Heap :anonymous (0x2) -INFO: Heap :dmabuf (0x2) -INFO: Heap :unified (0x5) -FATAL: Importing 150528 bytes of CPU memory has failed (wrong memory alignment) -Run graph execution time: 15.03903ms, FPS=66.49 - -=== tensor info === -shape: 1 3 224 224 -data pointer: 0x2b4aca0 - -=== tensor info === -shape: 1 1000 -data pointer: 0x3fdd40b000 -The max_value of output: 16.053827 -The min_value of output: -8.026914 -The mean_value of output: -0.001889 -The std_value of output: 9.203342 - ============ top5: =========== -283: 16.053827 -281: 14.165141 -287: 11.709850 -285: 11.615416 -282: 11.332113 -free(): invalid pointer -Aborted - ********** postprocess result ********** - ********** probability top5: ********** -n02123394 Persian cat -n02123045 tabby, tabby cat -n02127052 lynx, catamount -n02124075 Egyptian cat -n02123159 tiger cat -``` - - - -### CPU - -将上述 NPU 步骤中的 HHB 编译命令替换为: - -```bash -hhb -D --model-file mobilenetv2-12.onnx --data-scale 0.017 --data-mean "124 117 104" --board c920 --postprocess save_and_top5 --input-name "input" --output-name "output" --input-shape "1 3 224 224" -``` - -g++ 编译后处理命令替换为: - -```bash -riscv64-unknown-linux-gnu-g++ main.cpp -I../prebuilt_opencv/include/opencv4 -L../prebuilt_opencv/lib -lopencv_imgproc -lopencv_imgcodecs -L../prebuilt_opencv/lib/opencv4/3rdparty/ -llibjpeg-turbo -llibwebp -llibpng -llibtiff -llibopenjp2 -lopencv_core -ldl -lpthread -lrt -lzlib -lcsi_cv -latomic -static -o mobilenetv2_example -``` - -再将编译的到的二进制文件发送到开发板上运行即可。参考结果如下: - -```bash -(ort) root@lpi4a:/home/sipeed/onnx_mobilenetv2_c++# ./mobilenetv2_example - ********** preprocess image ********** - ********** run mobilenetv2 ********** -Run graph execution time: 79.77252ms, FPS=12.54 - -=== tensor info === -shape: 1 3 224 224 -data pointer: 0x259240 - -=== tensor info === -shape: 1 1000 -data pointer: 0x1c5200 -The max_value of output: 16.843750 -The min_value of output: -7.414062 -The mean_value of output: 0.001131 -The std_value of output: 9.056762 - ============ top5: =========== -283: 16.843750 -281: 13.789062 -287: 12.257812 -282: 10.898438 -285: 10.765625 - ********** postprocess result ********** - ********** probability top5: ********** -n02123394 Persian cat -n02123045 tabby, tabby cat -n02127052 lynx, catamount -n02123159 tiger cat -n02124075 Egyptian cat -``` - - - -参考文档: - -https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/8_application.html#MobilenertV2 - -https://blog.csdn.net/weixin_44404482/article/details/134118924 \ No newline at end of file diff --git a/docs/typical-applications/yolox-deployment.md b/docs/typical-applications/yolox-deployment.md deleted file mode 100644 index ece28e6f..00000000 --- a/docs/typical-applications/yolox-deployment.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: 在 LicheePi 4A 上部署 YOLOX 并使用 HHB-onnxruntime 进行推理 -sidebar_position: 5 ---- - -# 在 LicheePi 4A 上部署 YOLOX 并使用 HHB-onnxruntime 进行推理 - -本文详细介绍如何在 LicheePi 4A 上部署 YOLOX 目标检测模型,并使用 HHB-onnxruntime 进行高效推理。 - -## YOLOX简介 - -YOLOX 是一种高效的目标检测算法,在保持高精度的同时提供了出色的速度表现,非常适合边缘设备部署。 - -## 1. 环境准备 - -### 1.1 硬件准备 - -- LicheePi 4A(LPi4A)开发板 -- MicroSD 卡(用于存储系统) -- 电源适配器 -- USB 串口调试工具(可选) - -### 1.2 软件准备 - -- LicheePi 4A 官方 Linux 系统 -- Python 3.11 -- pip 及必备依赖项 -- ONNX 运行时(onnxruntime) -- HHB 工具(可用于模型转换) -- YOLOX 模型及其 ONNX 版本 - -```sh -# 更新系统 -sudo apt update && sudo apt upgrade -y -``` - -安装一些软件,用于示例中后续使用 - -```bash -sudo apt install wget git vim -``` - -安装 SHL 库 - -```bash -wget https://github.com/T-head-Semi/csi-nn2/releases/download/v2.4-beta.1/c920.tar.gz - -tar xf c920.tar.gz - -cp c920/lib/* /usr/lib/riscv64-linux-gnu/ -rf -``` - -**Python 环境配置** -LPi4A 烧录的系统中已默认安装 python 3.11 版本。可以使用如下命令确认 - -```bash -python3 --version -``` - -后续均以 python3.11 版本为例,其他版本在安装依赖时需要修改到对应版本的命令。 -各种 python 程序软件依赖的软件包大多可通过 pip 安装,可以使用如下命令安装 pip - -```bash -apt install python3-pip -``` - -安装其他python包之前,先安装 venv 包,用于创建python虚拟环境 - -```bash -apt install python3.11-venv -``` - -创建 python虚拟环境,并激活 - -```bash -cd /root -python3 -m venv ort -source /root/ort/bin/activate -``` - -至此,基本 python 环境已经创建完成,与其他体系结构类似,可以直接通过 pip install 安装纯 python 包。 - -##### 安装opencv - -```shell -sudo apt install python3 python3-pip -sudo apt install python3-opencv -sudo apt install libqt5gui5-gles -``` - -## 2. 获取并转换 YOLOX 模型 - -在 LPi4A 上执行以下步骤: - -```sh -# 克隆 YOLOX 仓库 -git clone https://github.com/Megvii-BaseDetection/YOLOX.git - -cd YOLOX/demo/ONNXRuntime - -wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.onnx - -``` - -**修改源码** - -本教程将使用 HHB-onnxruntime 执行模型,因此切换到。在源码中的 onnxruntime 示例目录,修改文件 demo/ONNXRuntime/onnx_inference.py 的开头新增两行代码 - -```bash -#!/usr/bin/env python3 -# Copyright (c) Megvii, Inc. and its affiliates. - -+import sys -+sys.path.insert(0, "../../") - -import argparse -import os -``` - -代码中使用 sys.path.insert 指定搜索路径,以此免去从源码中安装 YOLOX 的安装包的操作。 - -**安装依赖包** - -RISC-V 体系结构的 python 生态还有欠缺,未来完善之后,YOLOX 中依赖的包可以通过 [requirements.txt](https://github.com/Megvii-BaseDetection/YOLOX/blob/main/requirements.txt) 文件直接安装。 -本教程中的 YOLOX 示例依赖了较多的 python 包,下载预编译好的 python 包 - -```bash -git clone -b python3.11 https://github.com/zhangwm-pt/prebuilt_whl.git -cd prebuilt_whl -``` - -可以按照以下顺序,手工处理。 - -```bash -pip install numpy-1.25.0-cp311-cp311-linux_riscv64.whl - -pip install opencv_python-4.5.4+4cd224d-cp311-cp311-linux_riscv64.whl - -pip install kiwisolver-1.4.4-cp311-cp311-linux_riscv64.whl - -pip install Pillow-9.5.0-cp311-cp311-linux_riscv64.whl - -pip install matplotlib-3.7.2.dev0+gb3bd929cf0.d20230630-cp311-cp311-linux_riscv64.whl - -pip install pycocotools-2.0.6-cp311-cp311-linux_riscv64.whl - -pip3 install loguru-0.7.0-py3-none-any.whl - -pip3 install torch-2.0.0a0+gitc263bd4-cp311-cp311-linux_riscv64.whl - -pip3 install MarkupSafe-2.1.3-cp311-cp311-linux_riscv64.whl - -pip3 install torchvision-0.15.1a0-cp311-cp311-linux_riscv64.whl - -pip3 install psutil-5.9.5-cp311-abi3-linux_riscv64.whl - -pip3 install tqdm-4.65.0-py3-none-any.whl - -pip3 install tabulate-0.9.0-py3-none-any.whl -``` - -安装过程中会涉及到其他纯 python 依赖包,pip 会自动从官方源下载。 - -**安装 HHB-onnxruntime** - -HHB-onnxuruntime 是移植了 SHL 后端(execution providers),让 onnxruntime 能复用到 SHL 中针对玄铁 CPU 的高性能优化代码。 - -```bash -wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl/onnxruntime-1.14.1-cp311-cp311-linux_riscv64.whl -pip install onnxruntime-1.14.1-cp311-cp311-linux_riscv64.whl -``` - -**执行** - -在示例目录中执行 onnx_inference.py 示例 - -```bash -export PYTHONPATH=$PYTHONPATH:/root/YOLOX - -python3 onnx_inference.py -m yolox_s.onnx -i soccer.png -o outdir -s 0.3 --input_shape 640,640 -``` - -参数说明: - -- -m:指定模型 -- -i:指定图片 -- -o:指定输出目录 -- -s:指定检测的阈值 -- --input_shape:指定检测时使用的图片尺寸 - -**参考结果** - -本教程中输入如下图,是运动员踢足球的图片,预期的检测结果是检测到两个人和一个足球。 - -> 图片来源于网络 - -![yolox_detection_soccer_input.jpg](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_input.jpg) - -示例正常执行后,会在 outdir 目录下生成结果图片 soccer.png。图片中会用框画出检测到的目标,并标注概率,效果如下图: - -![yolox_detection_soccer_output.jpg](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_output.jpg) - -参考文档: - -https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/8_application.html \ No newline at end of file diff --git a/i18n/en/docusaurus-plugin-content-docs/current/Installation/intro.mdx b/i18n/en/docusaurus-plugin-content-docs/current/Installation/intro.mdx index 17ca02c0..499d7a82 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/Installation/intro.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/Installation/intro.mdx @@ -2,23 +2,35 @@ sidebar_position: 1 --- -# Installation Instructions Overview +# Image Flashing Notes -RevyOS currently supports multiple devices. The table below provides the status of installation guides for each supported device. Please click the relevant link as needed. Some guides are still in progress and will be completed in the future. +RevyOS currently supports multiple devices. The table below summarises which flashing guides are available for each device; follow the link that matches your needs. Some guides are still being compiled and will be added later. -## Installation Guide Availability +:::warning +**If you are upgrading from an image dated `20240720` or earlier, you must reset the U-Boot environment variables.** + +To reset: +Connect to the board via the serial console, power it on, press Enter when U-Boot starts to interrupt the boot sequence, and run the following commands at the U-Boot prompt: + +```bash +env default -a -f; env save; reset +``` + +This resets all U-Boot environment variables and reboots the board. +::: + +## Flashing Guide Availability import { DownloadLink } from "@site/src/components/ImageLinks"; import { RedirectBasedOnUA } from "@site/src/components/RedirectBasedOnUA"; -| Supported Device | Image Download (Latest Version) | Installation Guide | -| ------------------ | ---------------------------------------------------- | ---------------------------------------------- | -| Lichee Pi 4A | {} | { } | -| Milk-V Meles | {} | [Official Milk-V Installation Guide](https://milkv.io/docs/meles/installation) | -| Milk-V Pioneer | {} | [Installation Guide](../milkv-pioneer/) | -| Lichee Cluster 4A | {} | In Progress | -| Lichee Console 4A | {} | In Progress | -| Lichee Book 4A | {} | In Progress | -| Beagle-Ahead | {} | In Progress | -| Huiwei book | {} | In Progress | - +| Supported Device | Image Download (Latest Version) | Flashing Guide | +| ------------------ | ------------------------------- | -------------- | +| Lichee Pi 4A | {} | { } | +| Milk-V Meles | {} | [Milk-V official flashing guide](https://milkv.io/zh/docs/meles/installation) | +| Milk-V Pioneer | {} | [Flashing Guide](../milkv-pioneer/) | +| Lichee Cluster 4A | {} | In progress | +| Lichee Console 4A | {} | In progress | +| Lichee Book 4A | {} | In progress | +| Beagle-Ahead | {} | In progress | +| Huiwei book | {} | In progress | diff --git a/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a-windows.mdx b/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a-windows.mdx index b6a18d5d..2f222f4a 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a-windows.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a-windows.mdx @@ -4,259 +4,343 @@ sidebar_position: 4 import { DownloadLink } from "@site/src/components/ImageLinks"; -# Installing RevyOS on the LicheePi 4A (Windows) +# Lichee Pi 4A Image Flashing Guide (Windows) -This page provides a tutorial for flashing the LicheePi 4A image on Windows. -If you want to flash the image on a Linux, or view other image flashing tutorials, please view the links in the table below. +This document describes how to flash Lichee Pi 4A images on Windows. +For the Linux workflow or other device guides, use the links below. -| Other Flashing Tutorial | Link | -| ----------------- | -------------- | -| LicheePi4A (Installing using Linux)| [Installation guilde for Linux](../licheepi4a/) | -| Milk-V Pioneer | [Flashing Tutorial](./milkv-pioneer.mdx) | +| Other Flashing Tutorials | Link | +| -------------------------------- | ---- | +| Lichee Pi 4A (Linux) | [Linux flashing guide](../licheepi4a/) | +| Milk-V Pioneer | [Flashing guide](../milkv-pioneer/) | +| Milk-V Meles | [Flashing guide](../milkv-meles/) | -## Attention! +:::warning +Before following the instructions, **compare your board with the reference image below**. Proceed only after confirming that the hardware matches. -Before following this tutorial, please compare your board with the image below to ensure it matches. Only proceed with the tutorial after confirming the match. - -![LicheePi4A Example Image](/img/image-for-flash/lpi4a.png) +![Lichee Pi 4A reference](/img/image-for-flash/lpi4a.png) +::: ## Demonstration Environment -All image flashing operations in this tutorial use the following environment: +All steps in this tutorial were validated in the following environment: -- Operating System: Windows 11 24H2 OS Build 26100.3194 +- Operating system: Windows 11 24H2 (OS build 26100.3194) - Architecture: x86_64 -- LicheePi4A Board Specifications: 16G RAM + 128G eMMC +- Lichee Pi 4A configuration: 16 GB RAM + 128 GB eMMC + +:::note +Every procedure documented here is reproducible in this environment. If you encounter any issues during flashing, please refer to [issue submission](../../issue/). +::: -All operations in this tutorial are reproducible in this environment. If you encounter any issues while flashing the image in this environment, please refer to [this page](../issue.md) to submit an issue. +## Boot Options -## Boot Methods Introduction +Lichee Pi 4A supports two boot modes: [boot from an SD card](#boot-from-sd-card) and [boot from eMMC](#boot-from-emmc). Select the mode that fits your scenario. -LicheePi4A currently supports two boot methods: [Booting from SD card](#booting-from-sd-card) and [Booting from eMMC](#booting-from-emmc). This tutorial provides instructions for both methods. Please click to jump to the section that matches your desired flashing method. +:::warning +Flashing an image erases all existing data. **Back up important information before you start.** +::: -Please note that regardless of the flashing method used, existing user data will be lost. Make sure to back up your data before proceeding with the flashing process! +## Boot from SD Card -## Booting from SD card +:::warning +**DIP switch reminder** -Note: Booting from an SD card does not require changing the DIP switch! Set the DIP switch to eMMC boot! +Booting from SD card does not require changing the DIP switch; keep it in the eMMC position. -![DIP Switch Example](/img/image-for-flash/Switch.png) +![DIP switch reference](/img/image-for-flash/Switch.png) -The DIP switch is located on the bottom of the carrier board and can only be seen after removing the LM4A SoM. The correct setting should be `BOOT_SEL[1:0]=0 0`, i.e. `SW1=SW2=off`. +The DIP switch is located on the underside of the board and becomes visible after removing the core board. Both toggles should point downward. -**Note!** Some early versions of LicheePi4A boards do not have a DIP switch. +**Note:** Early revisions of the Lichee Pi 4A board may not include a DIP switch. +::: -Additionally, SD cards may have compatibility issues. Please check the [LicheePi 4A SD Card Compatibility List](../../miscellaneous/lpi4a-sdcard-list/) to see if your SD card has any known compatibility issues. +:::warning +**SD card compatibility** + +Some SD cards may not work reliably. Check the [Lichee Pi 4A SD card compatibility list](../../miscellaneous/lpi4a-sdcard-list/) to confirm whether your card has known issues. +::: ### Preparation -#### Obtaining the SD card image +:::warning +**Upgrading from images dated `20240720` or earlier requires resetting the U-Boot environment variables.** -Download the LicheePi4A SD card boot system image with the prefix `sdcard-` from the following links: +Reset procedure: +Connect to the board over the serial console, power it on, interrupt U-Boot by pressing Enter, and run: -- [RevyOS20240720 (5.10 kernel)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20240720/) +```bash +env default -a -f; env save; reset +``` -- [RevyOS20250123 (6.6 kernel)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250123/) +This restores all U-Boot environment variables and reboots the board. +::: -- Latest version: {} +#### Obtain the SD Card Image -The 20240720 image uses the 5.10 kernel, which is currently in a more mature state and performs more stably in video encoding/decoding and various applications. +Download the Lichee Pi 4A system image that starts with `sdcard-` from the following locations: -The 20250123 image uses the 6.6 kernel, which may have some unknown issues. Known issues include video stuttering and USB power loss, which are currently being fixed. +- [RevyOS 20240720 (Kernel 5.10)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20240720/) +- Latest release (Kernel 6.6): {} -Please choose the appropriate image based on your needs after reading the above information. +:::note +**About kernel versions** -Using the 20250123 image as an example: +The 20240720 image uses Kernel 5.10, which is stable for multimedia and general workloads. -There are two ways to download the image: +The latest image uses Kernel 6.6. It may still contain unresolved issues—video stutter and USB power loss have been observed and are being fixed. +::: -- Through a web browser. Simply click the link to download. +The example below uses the 20250123 image. -![Download image through web](/img/image-for-flash/web-download-windows-en.png) +Two download methods are available: -- Through command line. Open PowerShell and run the following command: +- **Browser download:** click the link to start downloading. + +![Browser download](/img/image-for-flash/web-download-windows.png) + +- **Command-line download:** open PowerShell and run: ```powershell curl.exe -OL https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250123/sdcard-lpi4a-20250123_195216.img.zst ``` -> **Note**: `curl.exe` is [shipped in Windows as a default component since Windows 10](https://curl.se/windows/microsoft.html). If `curl.exe` isn't working, use web browser. +:::note +`curl.exe` [has shipped with Windows since Windows 10](https://curl.se/windows/microsoft.html). If it is unavailable, use the browser download method instead. +::: -Wait for the progress to reach 100% to complete the download. +Wait until the progress reaches 100%; the download then completes. -![Download image through command line](/img/image-for-flash/download-image-command-line-windows.png) +![Command-line download](/img/image-for-flash/download-image-command-line-windows.png) -Both methods will result in a compressed image file named `sdcard-lpi4a-20250123_195216.img.zst`. Due to the possibility of transmission errors during download, it is recommended to perform a hash verification step to verify the accuracy of the image. +Regardless of the method, the result is the compressed archive `sdcard-lpi4a-20250123_195216.img.zst`. Because transmission errors can occur, verifying the download with a checksum is recommended. -#### Image Verification (Optional, Recommended) +#### Verify the Image (Optional but Recommended) -Open File Explorer, navigate to the folder containing the image file, right-click and select "Open in terminal" +Open File Explorer, navigate to the folder containing the image, right-click, and choose **Open in Terminal**. -![Select "Open in terminal" from the context menu](/img/image-for-flash/context_menu_terminal_open_windows-en.png) +![Open in Terminal](/img/image-for-flash/context_menu_terminal_open_windows.png) -Click to open the PowerShell terminal. Enter the following command to get the `md5sum.txt` checksum from the mirror site: +In the PowerShell window, fetch the reference checksums from the mirror: ```powershell curl.exe -L https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250123/md5sum.txt ``` -This should display the checksums for various image files. Run the following command to calculate the local image checksum: +Then compute the checksum for the local file: ```powershell Get-FileHash -Algorithm MD5 .\sdcard-lpi4a-20250123_195216.img.zst ``` -![Verify image file checksum](/img/image-for-flash/checksum-verification-image.png) +![Checksum verification](/img/image-for-flash/checksum-verification-image.png) + +Compare the two values. If they differ, re-download the image. -Compare the two checksums, they should match. If not, you need to re-download the image. +#### Extract the Image -#### Extracting the Image +The image is compressed with `zstd`. Use an archive tool that supports `.zst`, such as [PeaZip](https://peazip.github.io/) or [7-Zip (Zstd build)](https://github.com/mcmilk/7-Zip-zstd). -The image is compressed with `zstd`, you can use compression tools like [PeaZip](https://peazip.github.io/) or [7-zip Zstd version](https://github.com/mcmilk/7-Zip-zstd) to extract it. +![Extract with PeaZip](/img/image-for-flash/peazip_extraction_illustration.png) -**Note**: After extraction, the image itself and the compressed file will occupy about **10.2GB** of space, please ensure you have enough space! +:::warning +**Extraction size reminder** + +The extracted file is about **10.2 GB**. Ensure sufficient disk space before unpacking. +::: #### Hardware Preparation -Prepare a MicroSD card reader and a MicroSD card. There are currently compatibility issues with MicroSD cards. RevyOS provides a [list of tested MicroSD cards](https://github.com/revyos/revyos/blob/main/Installation/card%20list.md). +Prepare a MicroSD card reader and a MicroSD card. Because of compatibility concerns, consult the [tested card list](https://github.com/revyos/revyos/blob/main/Installation/card%20list.md). + +:::note +If your card is not on the list and you experience flashing or boot failures, submit an issue via [this page](../../issue/) and consider using the [eMMC flashing method](#boot-from-emmc) instead. +::: -If your MicroSD card is not on the known working list and you encounter issues with flashing the image or booting after flashing, please refer to [this page](../issue.md) to submit an issue, and try following the [Booting from eMMC](#booting-from-emmc) image flashing tutorial. +#### Write the Image with BalenaEtcher -#### Using BalenaEtcher to Write the Image to MicroSD Card +Download BalenaEtcher from [https://etcher.balena.io/](https://etcher.balena.io/). Select [Etcher for Windows](https://github.com/balena-io/etcher/releases/download/v1.19.25/balenaEtcher-1.19.25.Setup.exe) and install it. -Download the flashing tool BalenaEtcher from the official website [https://etcher.balena.io/](https://etcher.balena.io/). When downloading, please choose the file according to your machine's specifications. Choose [Etcher for Windows](https://github.com/balena-io/etcher/releases/download/v1.19.25/balenaEtcher-1.19.25.Setup.exe) to download and install. +![BalenaEtcher version selection](/img/image-for-flash/balenaetcher-version-selection.png) -![BalenaEtcher Version Selection](/img/image-for-flash/balenaetcher-version-selection.png) +1. Insert the SD card into the reader and connect it to the PC. +2. Launch BalenaEtcher. +3. Click **Flash from file** and choose the image. +4. Select the target device. +5. Click **Flash** to start writing. +6. Wait for the success message. -1. Insert the SD card into the card reader and plug it into your computer. -2. Run BalenaEtcher to write the image to the SD card. -3. In the BalenaEtcher window, first click "Flash from file" to select the image file. -4. After selecting the image file, choose the device to write to in the second column. -5. After selecting both items, click "Flash" to write the image. -6. After waiting for a while, it will show that the flashing is complete. +![BalenaEtcher flashing flow](/img/image-for-flash/balenaetcher-flashing-guide.png) -![BalenaEtcher Flashing Process](/img/image-for-flash/balenaetcher-flashing-guide-en.png) +:::warning +**Safe removal reminder** -### Booting the System from SD Card +Before removing the SD card, ensure BalenaEtcher reports completion, the SD card LED has stopped blinking, and eject the card via the system tray. Otherwise, the card or data may be corrupted. +::: -After writing the image, insert the SD card into the slot shown in the image. +### Boot the System via SD Card + +After flashing, insert the SD card into the slot shown below. ![](/img/image-for-flash/lpi4a5.png) -First connect the HDMI cable (if you need an external display), then connect the USB-C end of the USB-A to USB-C data cable (included in the box) to the development board, and the other end to a USB power supply with at least 5V2A output to start. +Connect an HDMI cable if a monitor is required. Use the supplied USB-A-to-USB-C cable: plug the USB-C end into the board and the USB-A end into a power source that can supply at least 5 V / 2 A to power on the system. -## Booting from eMMC +## Boot from eMMC -When booting the image from eMMC, there are two ways to flash the image: with or without connecting to a serial port. Considering that connecting to a serial port is not necessary, the default method is flashing without connecting to a serial port. If you have a serial cable, you can also choose to refer to the section on flashing with a serial connection. There are some differences in the operations involved. If you want to flash with a serial cable connected, please refer to the relevant section in the [Linux Flashing Tutorial](./licheepi4a.mdx). +You can flash the eMMC image with or without a serial cable. Because a serial cable is optional, the default workflow below assumes no serial connection. If you plan to use a serial console, refer to the relevant sections in the [Linux flashing guide](./licheepi4a.mdx). -**Please note**: Remove the SD Card before booting from eMMC! +:::warning +Remove the SD card before booting from eMMC. +::: ### Preparation -#### Installing the Image Flashing Tool +:::warning +**Upgrading from images dated `20240720` or earlier requires resetting the U-Boot environment variables.** + +Reset procedure: +Connect to the board via serial, power it on, interrupt U-Boot, and run: + +```bash +env default -a -f; env save; reset +``` + +This restores all U-Boot environment variables and reboots the board. +::: -Booting from eMMC requires flashing u-boot files, boot files, and root files into eMMC using the fastboot tool, so you need to first confirm whether fastboot is installed. +#### Install the Flashing Tools -You can use an indexing tool like Everything to search for `fastboot.exe` on your computer. If you don't have it, please download the [Android SDK Platform Tools](https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn#downloads) and extract it to an appropriate location. +Flashing eMMC requires writing the `u-boot`, `boot`, and `root` images with `fastboot`. Determine whether `fastboot.exe` is installed. If it is missing or older than version 34, install the latest Platform Tools: -Open PowerShell in the folder containing `fastboot.exe`, run `.\fastboot.exe --version` to determine if `fastboot.exe` can run normally. +```powershell +winget install google.platformtools +``` + +(Older `fastboot` releases fail when flashing recent images.) + +Open PowerShell in the folder containing `fastboot.exe` and verify it runs: + +```powershell +.\fastboot.exe --version +``` -![Fastboot Tool Detection](/img/image-for-flash/fastboot_tool_detection.png) +![Fastboot tool detection](/img/image-for-flash/fastboot_tool_detection.png) -If it can display the version number normally as shown above, it proves the installation was successful. +A version string indicates that `fastboot` is ready. -#### Obtaining the Image +#### Obtain the Images -Download the LicheePi4A system image through the above links. +Download the Lichee Pi 4A system images from: -**Note**: The uboot files for different memory versions of LicheePi4A are not interchangeable. Please choose the corresponding image according to your LiChee Pi4A SoM version. +- [RevyOS 20240720 (Kernel 5.10)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20240720/) +- Latest release (Kernel 6.6): {} -|Memory Storage Combination|Corresponding uboot Image| -|---|---| -|8G RAM + 8G eMMC|u-boot-with-spl-lpi4a-main_8gemmc.bin| -|8G RAM + 32G eMMC|u-boot-with-spl-lpi4a-main.bin| -|16G RAM|u-boot-with-spl-lpi4a-16g-main.bin| +:::note +**About kernel versions** -If you can't confirm the specifications of the Lichee Pi4A SoM, you can scan the QR code on the SoM to check. When LicheePi4A boards are sold, there will be a QR code sticker on both the SoM and the motherboard. After scanning the QR code sticker on the SoM/motherboard, it will display the memory and storage configuration of the SoM. +The 20240720 image (Kernel 5.10) is stable for multimedia workloads. -For example, on a 16G RAM + 128G SoM, the sticker is in the part shown in the image +The latest image (Kernel 6.6) may still expose issues such as video stutter or USB power loss; fixes are underway. +::: + +:::warning +**Selecting the correct U-Boot image** + +Different memory configurations require different U-Boot binaries. Match your core board to the table below: + +| Memory and storage | U-Boot image | +| --- | --- | +| 8 GB RAM + 8 GB eMMC | u-boot-with-spl-lpi4a-main_8gemmc.bin | +| 8 GB RAM + 32 GB eMMC | u-boot-with-spl-lpi4a-main.bin | +| 16 GB RAM | u-boot-with-spl-lpi4a-16g-main.bin | + +If you cannot confirm the configuration, scan the QR code sticker on the core board. Each shipped board includes stickers on both the core and base boards. Scanning the core board sticker reveals the RAM and storage combination. + +Example for a 16 GB RAM + 128 GB eMMC board: ![core-card](/img/image-for-flash/core-card.png) -The display after scanning the QR code is as follows +The scanned result looks like this: ![Core board-info](/img/image-for-flash/card-info.png) -In the result after scanning, the second part of the number is the memory + storage configuration of the SoM. +The second line specifies the RAM plus storage configuration. +::: + +After identifying the correct build, download, verify, and extract the `uboot`, `boot`, and `root` images (the U-Boot binary does not require extraction) as described in the SD card section. -After confirming the board specifications, download, verify, and extract the corresponding uboot, boot, and root files (the uboot file does not need to be extracted). This part can refer to the "Booting from SD Card" section above. +![Downloaded images](/img/image-for-flash/downloaded_image.png) -![Downloaded image files](/img/image-for-flash/downloaded_image.png) +#### Connect the Board and Install Drivers -#### Connecting the Board and Installing the Driver +Press and hold the BOOT button, then connect the Type-C port nearest the BOOT button to the PC. The board enters flashing mode. -While holding down the BOOT button on the board, connect the Type-C port near the BOOT button to the computer. The board will enter flashing mode. +Open **Device Manager**. If you see `USB download gadget` under **Other devices**, the device is detected but lacks a driver. -Right-click on the Windows logo, open Device Manager. If you see "USB download gadget" under "Other devices", it means the device has been correctly recognized. However, the driver is not installed. +Download the [Google USB Driver](https://dl.google.com/android/repository/usb_driver_r13-windows.zip) (a proxy may be required), extract it, and install it: -To install the fastboot driver, you need to download the [Google USB Driver (proxy required)](https://dl.google.com/android/repository/usb_driver_r13-windows.zip), download and extract it to a location. +1. Right-click `USB download gadget` and choose **Update driver**. +2. Select **Browse my computer for drivers**. +![Driver update step 2](/img/image-for-flash/driver-update-step2.png) +3. Choose **Let me pick from a list of available drivers on my computer**. +4. Select **Show All Devices**, then click **Next**. +![Driver update step 4](/img/image-for-flash/driver-update-step-4.png) +5. Click **Have Disk**. +6. Click **Browse**, select the `.inf` file inside the Google USB Driver folder, and confirm. +![Driver update step 6](/img/image-for-flash/driver-update-step-6.png) +7. Choose **Android Bootloader Interface**, click **Next**, approve the prompts, and select **Install** when Windows Security asks for confirmation. +![Driver update step 7](/img/image-for-flash/driver-update-step7.png) +8. The fastboot driver finishes installing. +![Driver update step 8](/img/image-for-flash/driver_update_step8.png) -1. Right-click on "USB download gadget" in Device Manager, click "Update driver" -2. Choose "Browse my computer for drivers" -![Driver Update Step 2](/img/image-for-flash/driver-update-step2-en.png) -3. Select "Let me pick from a list of available drivers on my computer" -4. Select "Show All Devices" and click "Next" -![Driver Update Step 4](/img/image-for-flash/driver-update-step-4-en.png) -5. Click "Have Disk" -6. Click "Browse", select the inf file under the Google USB Driver, click OK -![Driver Update Step 6](/img/image-for-flash/driver-update-step-6-en.png) -7. Select "Android Bootloader Interface", click "Next", click "Yes" in the pop-up dialog, click "Install" in the Windows Security Center dialog that pops up -![Driver Update Step 7](/img/image-for-flash/driver-update-step7-en.png) -8. Successfully installed the fastboot driver -![Driver Update Step 8](/img/image-for-flash/driver_update_step8-en.png) +If installation fails, uninstall the device from Device Manager, reconnect the board, and repeat the steps. -If there are problems with the above steps, please go back to Device Manager, find the device, click "Uninstall driver", then unplug and replug the development board and try again. +### Flash the Images -Return to the PowerShell terminal containing `fastboot.exe`, enter the following command, the program should output one line of information indicating that one device is connected. +Back in the PowerShell window that contains `fastboot.exe`, verify the device connection: ```powershell .\fastboot.exe devices ``` -![Fastboot Device Detection](/img/image-for-flash/fastboot_device_detection.png) +![Fastboot device detection](/img/image-for-flash/fastboot_device_detection.png) + +Flash a temporary U-Boot to RAM and reboot: ```powershell -.\fastboot.exe flash ram .\u-boot-with-spl-lpi4a-16g.bin # Replace with the path to the uboot file corresponding to your board specifications, you can drag and drop the file in File Explorer to the terminal to quickly input the file path -.\fastboot reboot +.\fastboot.exe flash ram .\u-boot-with-spl-lpi4a-16g.bin # Replace with the path to the U-Boot image for your configuration +.\fastboot.exe reboot ``` -![Flash uboot into memory](/img/image-for-flash/uboot_memory_flash.png) +![Flash U-Boot to RAM](/img/image-for-flash/uboot_memory_flash.png) -Then proceed with flashing the image files +After the board restarts, Windows may again report an unknown `USB download gadget`. Install the driver once more if needed. -**Note**: After the development board restarts, the computer may again detect an unknown device named "USB download gadget". Please follow the driver installation tutorial above to reinstall the driver for this device before continuing with the steps below. +Then flash the persistent images (drag-and-drop files into PowerShell to insert their paths quickly): ```powershell -# Replace the following three lines with the paths to the uboot, boot, root files corresponding to your board specifications, you can drag and drop the files in File Explorer to the terminal to quickly input the file paths .\fastboot.exe flash uboot u-boot-with-spl-lpi4a-16g.bin .\fastboot.exe flash boot boot-lpi4a-20240720_171951.ext4 .\fastboot.exe flash root root-lpi4a-20240720_171951.ext4 ``` -![Fastboot System Installation Guide](/img/image-for-flash/fastboot_installation_guide.png) +![Fastboot flashing](/img/image-for-flash/fastboot_installation_guide.png) -The uboot file and boot file flash quickly, while the root file takes about 5 minutes to complete. If when flashing the root file, it's not 30+ data blocks but 2000+ or 3000+(shown below), it indicates that the previous flashing operation was incorrect. In this case, the image will not boot after writing is complete. Please perform the flashing operation again. +:::warning +**Progress and timing note** -![](/img/image-for-flash/bad-fastboot-flash.png) +Flashing `uboot` and `boot` completes quickly. Writing `root` takes roughly five minutes. If `fastboot` shows an unusually small number of data blocks (e.g. only a few thousand), the earlier steps likely failed—repeat the flashing procedure. -At this point, the image flashing is complete, and you can start the system by unplugging and plugging in the power cord. +![Incorrect fastboot flashing](/img/image-for-flash/bad-fastboot-flash.png) +::: -### User Login +Once flashing finishes, power-cycle the board to boot from eMMC. -Below are the default system account and password +## User Credentials -- Login account: debian -- Account password: debian +Default login credentials: -You can use the above user password to log in when first booting the image. +- Username: `debian` +- Password: `debian` -**For security reasons, please be sure to change the password after the first login to avoid problems.** +Use these for the first boot and change the password immediately for security. diff --git a/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a.mdx b/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a.mdx index 4d3e9a32..7cf95e98 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/Installation/licheepi4a.mdx @@ -3,191 +3,248 @@ sidebar_position: 2 --- import { DownloadLink } from "@site/src/components/ImageLinks"; -import LocaleImage from "@site/src/components/LocaleImage"; +# Lichee Pi 4A Image Flashing Guide (Linux) -# Installing RevyOS on the LicheePi 4A +This page provides the Linux workflow for flashing the Lichee Pi 4A images. +If you need the Windows procedure or flashing guides for other devices, use the links in the table below. -This page provides a tutorial for flashing the LicheePi 4A image on Linux. -If you want to flash the image on a Windows, or view other image flashing tutorials, please view the links in the table below. +| Other Flashing Tutorials | Link | +| ----------------------- | ---- | +| Lichee Pi 4A (Windows) | [Windows flashing guide](../licheepi4a-windows/) | +| Milk-V Pioneer | [Flashing guide](../milkv-pioneer/) | +| Milk-V Meles | [Flashing guide](../milkv-meles/) | -| Other Flashing Tutorial | Link | -| ----------------- | -------------- | -| LicheePi4A (Installing using Windows)| [Installation guilde for Windows](../licheepi4a-windows/) | -| Milk-V Pioneer | [Flashing Tutorial](./milkv-pioneer.mdx) | +:::warning +Before you begin, **compare your board with the image below and confirm they match**. Proceed only after verifying the hardware. -## Important! - -Before proceeding, compare your board with the image below to ensure they match. Continue only if the boards are identical. - -![LicheePi4A Example](/img/image-for-flash/lpi4a.png) +![LicheePi4A reference](/img/image-for-flash/lpi4a.png) +::: ## Demonstration Environment -All installation operations in this tutorial are demonstrated using the following environment: +All operations in this tutorial were performed under the following environment: -- **System and Version**: Ubuntu 22.04.5 LTS -- **Architecture**: x86_64 -- **LicheePi4A Specs**: 16GB RAM + 128GB eMMC +- Operating system: Ubuntu 22.04.5 LTS +- Architecture: x86_64 +- Lichee Pi 4A configuration: 16 GB RAM + 128 GB eMMC -For unofficial environments that might be used, refer to [this page](../../issue/) for submitting issues. +:::note +Every step described here is reproducible in the environment above. If you encounter issues during flashing, please refer to [issue submission](../../issue/). +::: -## Boot Methods Overview +## Tooling -LicheePi4A supports two boot methods: [SD Card Boot](#sd-card-boot) and [eMMC Boot](#booting-from-emmc). Follow the relevant section based on your needs. +This section covers the software required for downloading and flashing images. Install the tools first before proceeding with the flashing workflow. -## SD Card Boot +### File Download Utility -**Attention!** No need to change the DIP switch to boot from the SD card! Set the DIP switch as per the eMMC configuration. +In a graphical environment you can download images directly through a browser. To download from the command line, tools such as `wget` or `curl` are available; this guide uses `wget`. -![Example of DIP switch](/img/image-for-flash/Switch.png) +In the [demonstration environment](#demonstration-environment), `wget` is typically pre-installed. Run the following command to check its version: -The DIP switch is located on the underside of the board. You need to remove the board to access it. The correct configuration is with both switches set to the downward position. +```bash +wget --version +``` -**Note!** Some early versions of the LicheePi4A board do not have a DIP switch. +If `wget` is not installed, install it with: -Additionally, SD cards may have compatibility issues. Please check the [LicheePi 4A SD Card Compatibility List](../../miscellaneous/lpi4a-sdcard-list/) to see if your SD card has any known compatibility issues. +```bash +sudo apt install wget +``` +![wget-install](/img/image-for-flash/wget-install.png) -### Preparation +> Executing commands with `sudo` prompts for your password. Ensure you know the password before running the command; this will not be repeated later in the document. -#### Obtain SD card images +### Archive Extraction Utility -Download the LicheePi4A SD card boot system image with the `sdcard-` prefix from the following links: +The `.zst` archives can be extracted using tools such as `zstd`, `tar`, or `7z`. This tutorial demonstrates extraction with the `zstd` command-line tool. Install the `zstd` package first, then extract the image. -- [RevyOS20240720 (Kernel version 5.10)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20240720/) +To check whether `zstd` is already installed, run: -- [RevyOS20250110 (Kernel version 6.6)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/) +```bash +zstd --version +``` -The 20240720 image uses Kernel 5.10, which is relatively mature and performs more stably in video encoding/decoding and various applications. +![zstd-version](/img/image-for-flash/zstd-version.png) -The 20250110 image uses Kernel 6.6, which may have some unknown issues. Known issues include video stuttering and USB power loss. These problems are currently being addressed. +If a version string similar to the following is printed, `zstd` is installed: -Please choose the appropriate image based on your needs after reading the above description. +```bash +*** zstd command line interface 64-bits v1.4.8, by Yann Collet *** +``` -The following demonstrates the process using the 20250110 image as an example: +If no version information appears, install `zstd` with: -**Note:** The downloaded `.zst` compressed file is approximately 1.4GB. Ensure that you have at least 12GB of free space on your device to avoid running out of space during the download and extraction process. +```bash +sudo apt update +sudo apt install zstd +``` + +![zstd-install](/img/image-for-flash/zstd-install.png) -![image-size](/img/image-for-flash/sdcard-image-size.png) +## Boot Methods -If downloading via a web browser, click the link to start the download. Your browser will automatically handle the file download. Confirm the download and ensure the file is saved locally. +Lichee Pi 4A currently supports two boot options: [booting from an SD card](#boot-from-sd-card) and [booting from eMMC](#boot-from-emmc). Choose the section corresponding to your use case. -![web-download](/img/image-for-flash/web-download.png) +:::warning +Flashing an image erases all existing data regardless of the method. **Back up important data beforehand.** +::: -If you prefer to download via the command line, tools like `wget` and `curl` can be used. In this guide, we use `wget` as the download tool. +:::warning +**Upgrading from images dated `20240720` or earlier requires resetting the U-Boot environment variables.** -In most [demonstration environments](#demonstration-environment), `wget` is pre-installed. If `wget` is not installed, use the following command to install it: +Reset procedure: +Connect to the board over the serial console, power it on, interrupt U-Boot by pressing Enter, and run the following commands: ```bash -sudo apt install wget -``` +env default -a -f; env save; reset +``` -![wget-install](/img/image-for-flash/wget-install.png) +This restores all U-Boot environment variables to their defaults and reboots the board. +::: -**Note:** The `sudo` command requires a password for execution. Ensure you know the password before proceeding. This will not be repeated in subsequent steps. +## Boot from SD Card -Once installed, use the following command to download the image archive: +:::warning +**DIP switch reminder** -```bash -wget https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/sdcard-lpi4a-20250110_151339.img.zst -``` +No switch changes are required for SD card boot; keep the DIP switches in the eMMC position. -![image-download](/img/image-for-flash/wget-download-sd.png) +![DIP switch reference](/img/image-for-flash/Switch.png) -After downloading, you will obtain a file named [sdcard-lpi4a-20250110_151339.img.zst](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/sdcard-lpi4a-20250110_151339.img.zst). This is not the final image file but a compressed archive. You need to extract the compressed file `sdcard-lpi4a-20250110_151339.img.zst` to obtain the final image file `sdcard-lpi4a-20250110_151339.img`. +The DIP switch is located on the underside of the board and is accessible after removing the baseboard. Set both toggles to the downward position. -In the [demonstration environment](#Demonstratio- Environment) mentioned earlier, `.zst` files can be extracted using various tools such as `zstd`, `tar`, or `7z`. This guide demonstrates one method using the `zstd` tool via the command line. First, you need to install the `zstd` package on your system before extracting the file. +**Note:** Some early Lichee Pi 4A revisions do not provide a DIP switch. +::: -If you are unsure whether `zstd` is already installed on your system, execute the following command to check the version of `zstd`. If a version is displayed, it indicates that `zstd` is installed. +:::warning +**SD card compatibility** -```bash -zstd --version -``` +Certain SD cards may exhibit compatibility issues. Consult the [Lichee Pi 4A SD card compatibility list](../../miscellaneous/lpi4a-sdcard-list/) to confirm whether your card is known to work. +::: -![zstd-version](/img/image-for-flash/zstd-version.png) +### Preparation -If the version is displayed, like the example below, you have `zstd` is already installed. +#### Obtain the SD Card Image -```bash -*** zstd command line interface 64-bits v1.4.8, by Yann Collet *** -``` +Download the Lichee Pi 4A system image that has the `sdcard-` prefix from the following locations: + +- [RevyOS 20240720 (Kernel 5.10)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20240720/) +- Latest release (Kernel 6.6): {} + +:::note +**About kernel versions** + +The 20240720 image uses Kernel 5.10, which is mature and offers stable performance for multimedia and general applications. + +The latest image uses Kernel 6.6. It may still contain unresolved issues; known ones include video stutter and USB power loss. Fixes are in progress. +::: + +The example below uses the 20250110 image. + +> The downloaded `.zst` archive is approximately 1.4 GB. Ensure you have at least 12 GB of free space to avoid running out of storage during download or extraction. + +![image-size](/img/image-for-flash/sdcard-image-size.png) + +Two download methods are available: + +- **Browser download:** click the link; the browser starts downloading automatically. Confirm that the file is saved locally. + +![web-download](/img/image-for-flash/web-download.png) + +- **Command-line download:** use `wget` as shown below. -If no version information is displayed, install `zstd` using the following commands: ```bash -sudo apt update -sudo apt install zstd -``` +wget https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/sdcard-lpi4a-20250110_151339.img.zst +``` + +![image-download](/img/image-for-flash/wget-download-sd.png) -![zstd-install](/img/image-for-flash/zstd-install.png) +After downloading, you obtain `sdcard-lpi4a-20250110_151339.img.zst`. This is a compressed archive rather than the final image. Extract `sdcard-lpi4a-20250110_151339.img.zst` to obtain `sdcard-lpi4a-20250110_151339.img`. -After installing `zstd`, you can extract the image file. **Note:** The extracted file will be approximately **10.2GB** in size. Ensure you have enough local storage space before proceeding with the extraction! +With `zstd` installed, extract the archive: + +:::warning +**Extraction size reminder** + +The extracted image is roughly **10.2 GB**. Verify that you have sufficient disk space before running the extraction. +::: ```bash sudo unzstd sdcard-lpi4a-20250110_151339.img.zst -``` +``` -Once the extraction is complete, you will have the file `sdcard-lpi4a-20250110_151339.img`. At this point, the image file has been successfully obtained in the demonstration environment. +After extraction you will have `sdcard-lpi4a-20250110_151339.img` and the image acquisition step is complete. -![imgsize](/img/image-for-flash/sdcard-image.png) +![unzstd-sdcard](/img/image-for-flash/unzstd.png) -#### Hardware preparation +#### Hardware Preparation -Prepare a MicroSD card reader and a MicroSD card. Note that there are compatibility issues with MicroSD cards. RevyOS provides a list of [tested MicroSD cards](https://github.com/revyos/revyos/blob/main/Installation/card%20list.md). +Prepare a MicroSD card reader and a MicroSD card. Compatibility issues with SD cards are known; refer to the [tested card list](https://github.com/revyos/revyos/blob/main/Installation/card%20list.md). -If your MicroSD card is not on the list of known compatible cards and you encounter issues such as failure to write the image or failure to boot after writing, refer to [this page](../../issue/) to submit an issue. You can also try the [eMMC boot guide](#booting-from-emmc) for writing the image. +:::note +If your MicroSD card is not listed and you encounter flashing or boot failures, submit an issue via [this page](../../issue/) and consider following the [eMMC boot](#boot-from-emmc) instructions instead. +::: -### Image Writing Methods +### Writing the SD Card Image -If you choose to boot from an SD card, there are two methods to write the image to the MicroSD card:[Using a graphical interface tool](#writing-the-image-with-balenaetcher) like BalenaEtcher, or [Using the `dd` command in the command line](#writing-the-image-with-dd). +Two methods are available for writing an SD card image: using a [graphical tool](#writing-with-balenaetcher) such as BalenaEtcher, or the [command-line `dd` utility](#writing-with-dd). -#### Writing the Image with BalenaEtcher +#### Writing with BalenaEtcher -Download the BalenaEtcher tool from its official website: [https://etcher.balena.io/](https://etcher.balena.io/). Select the appropriate file for your system. For the [demonstration environment](#Demonstratio- Environment), download and extract [Etcher for Linux x64 (64-bit) (zip)](https://github.com/balena-io/etcher/releases/download/v1.19.25/balenaEtcher-linux-x64-1.19.25.zip). +Download BalenaEtcher from the official site: [https://etcher.balena.io/](https://etcher.balena.io/). Choose the build that matches your host. In the [demonstration environment](#demonstration-environment), download and extract [Etcher for Linux x64 (64-bit) (zip)](https://github.com/balena-io/etcher/releases/download/v1.19.25/balenaEtcher-linux-x64-1.19.25.zip). -![BE-version](/img/image-for-flash/BE-version.png) +![BE-version](/img/image-for-flash/BE-version.png) -Insert the SD card into the card reader and connect it to your computer. +Insert the SD card into the reader and connect it to the computer. -Run BalenaEtcher to write the image to the SD card. -In the BalenaEtcher window, click **"Flash from file"** to select the image file. -{} -After selecting the image file, choose the target device in the second field. -{} -Once both options are selected, click **"Flash"** to write the image. -{} -After some time, a message will indicate that the writing process is complete. -{} +Launch BalenaEtcher and follow the prompts to write the image: +- Click **Flash from file** and select the image file. +![](/img/image-for-flash/BE1.png) +- In the second column, choose the target device. +![](/img/image-for-flash/BE2.png) +- Click **Flash** to start writing. +![](/img/image-for-flash/BE3.png) +- Wait until the completion dialog appears. +![](/img/image-for-flash/BE4.png) -#### Writing the Image with `dd` +:::warning +**Safe removal reminder** -`dd` is a powerful command-line tool in Linux and Unix-like systems, used to copy files or data with specified sizes and formats. It is usually pre-installed. +Ensure the BalenaEtcher process has finished and the SD card activity LED has stopped blinking before removing the card. Interrupting power early may corrupt the card or the image. +::: -Follow these steps to write the image using `dd`: +#### Writing with `dd` -First, check the list of devices by running the following command before and after inserting the SD card to identify the corresponding device name of the SD card: +`dd` is a powerful command-line utility for copying data with explicit control over block size and format. It is usually pre-installed on Linux systems. + +Follow the steps below to write the image with `dd`. + +1. Inspect the device list before and after inserting the SD card to determine the device node: ```bash lsblk ``` -The device name for the SD card might be `/dev/sda` or `/dev/mmcblk0`. In the demonstration environment, the SD card partition is identified as `/dev/sda` after executing `lsblk`. +Typical SD card devices include `/dev/sda` or `/dev/mmcblk0`. In this tutorial the SD card appears as `/dev/sda`. ![lsblk](/img/image-for-flash/lsblk.png) -Before writing the image, unmount any mounted partitions of the SD card. If there are multiple partitions, unmount each one: +2. Unmount any mounted partitions before writing. If multiple partitions exist, unmount each one: ```bash sudo umount /dev/sdX1 ``` -If no partitions are mounted, the `umount` command will display `not mounted`, and no further action is needed. +If nothing is mounted, `umount` reports `not mounted`; no further action is required. -After unmounting the partitions, it is recommended to run the `sudo sync` command to ensure all data is synchronized. +3. Run `sudo sync` to flush pending IO: ![sync](/img/image-for-flash/sync.png) -After completing the above steps, you can proceed with writing the image. Before writing, ensure that the correct device is set in the `of=` parameter. In the demonstration environment, the SD card is recognized as `sda`. Replace `of=` with your device's partition accordingly. +4. Write the image. Confirm that the `of=` argument references the correct device (replace `sdX` with the appropriate value from `lsblk`). In this example the device is `sda`: ```bash sudo dd if=./sdcard-lpi4a-20250110_151339.img of=/dev/sdX bs=4M status=progress @@ -195,32 +252,32 @@ sudo dd if=./sdcard-lpi4a-20250110_151339.img of=/dev/sdX bs=4M status=progress ![dd](/img/image-for-flash/dd.png) -After the writing process is complete, run the `sudo sync` command again to ensure data synchronization. Then confirm that the SD card is in an unmounted state before safely removing it and inserting it into the development board. +:::warning +**Caution when using `dd`** + +Always double-check the target device (e.g. `/dev/sdX`) before executing `dd`. Selecting the wrong disk—such as your system drive—will cause irreversible data loss. Use `lsblk` or `fdisk -l` to verify the device path. After writing, run `sudo sync`, unmount the SD card, and only then remove it and insert it into the development board. +::: -### Booting the System via SD Card +### Booting the System -After writing the image, insert the SD card into the slot shown below. +After writing the image, insert the SD card into the slot shown below. ![](/img/image-for-flash/lpi4a5.png) -First, connect the HDMI cable (if an external display is needed). Then, use the USB-A to USB-C cable included in the package: connect the USB-C end to the development board and the USB-A end to a USB power source with at least 5V2A output to boot the system. +Connect an HDMI cable if you require an external display. Use the supplied USB-A-to-USB-C cable: connect the USB-C end to the board, the USB-A end to a power supply that can provide at least 5 V / 2 A, and the system will boot. -## Booting from eMMC +## Boot from eMMC -When booting the image from eMMC, there are two methods for writing the image: with or without a serial connection. The operations differ slightly, and both methods are introduced below. +Two procedures are available for flashing the eMMC image: one without a serial console and one with it. Since a serial cable is optional, the default workflow assumes no serial connection, while the serial procedure is provided for users who have a cable. -**Note!** When booting from eMMC, remove the SD card first! +:::warning +Remove the SD card before booting from eMMC. +::: ### Preparation -#### Hardware Preparation - - - -#### Installing the Image Writing Tool +#### Install the Flashing Toolchain -To boot from eMMC, you need to write the `u-boot`, `boot`, and `root` files into the eMMC using the `fastboot` tool. First, confirm whether `fastboot` is installed. - -If you are unsure whether `fastboot` is installed, run the following command. This command checks the version of `fastboot`, and the output will indicate whether the `fastboot` package is pre-installed. +Flashing the eMMC requires writing the `u-boot`, `boot`, and `root` images via the `fastboot` utility. Verify that `fastboot` is installed: ```bash fastboot --version @@ -228,184 +285,237 @@ fastboot --version ![fastboot-version](/img/image-for-flash/fastboot-version.png) -If the version is displayed correctly, it means `fastboot` is successfully installed. For example, the following output indicates that `fastboot` is installed: +If output similar to the following appears, `fastboot` is installed: ```bash fastboot version 28.0.2-debian Installed as /usr/lib/android-sdk/platform-tools/fastboot ``` -If no version is displayed, please install `fastboot` in your command line +If no version info is printed, install `fastboot`: ```bash sudo apt install fastboot ``` -![fastboot-install](/img/image-for-flash/zstd-install.png) - -```bash -sudo apt install fastboot -``` - -#### Install Serial Console Tool +![fastboot-install](/img/image-for-flash/fastboot-install.png) -When using a serial connection, a serial console tool is required for monitoring. There are many serial console tools available, such as `minicom`, `screen`, and `picocom`. In this guide, we will use `minicom` for demonstration. +#### Obtain the Images -```bash -sudo apt install minicom -``` +Download the Lichee Pi 4A system images from the following locations: -After installation, you can confirm if `minicom` was successfully installed by checking its version: +- [RevyOS 20240720 (Kernel 5.10)](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20240720/) +- Latest release (Kernel 6.6): {} -```bash -minicom -version -``` +:::note +**About kernel versions** -#### Obtain the Image +The 20240720 image uses Kernel 5.10, which is stable for video codecs and general workloads. -Download the system image for LicheePi4A from the following links: +The latest image uses Kernel 6.6. It may encounter unresolved issues, such as video stutter or USB power loss. Fixes are actively being developed. +::: -- [RevyOS20240720](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20240720/) -- [RevyOS20250110](https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/) +:::warning +**Choosing the correct U-Boot firmware** -**Note!** +Different memory configurations require different U-Boot binaries. Use the table below to match your core board configuration: -The u-boot images for different memory configurations of LicheePi4A are not interchangeable. Please select the appropriate image based on the version of your core board. +| Memory and storage | U-Boot image | +| --- | --- | +| 8 GB RAM + 8 GB eMMC | u-boot-with-spl-lpi4a-main_8gemmc.bin | +| 8 GB RAM + 32 GB eMMC | u-boot-with-spl-lpi4a-main.bin | +| 16 GB RAM | u-boot-with-spl-lpi4a-16g-main.bin | -| Memory and Storage Combination | Corresponding u-boot Image | -|--------------------------------|----------------------------| -| 8G RAM + 8G eMMC | u-boot-with-spl-lpi4a-main_8gemmc.bin | -| 8G RAM + 32G eMMC | u-boot-with-spl-lpi4a-main.bin | -| 16G RAM | u-boot-with-spl-lpi4a-16g-main.bin | +If you are unsure about the configuration, scan the QR code sticker on the core board. When the board ships, stickers are attached to both the core board and the baseboard. Scanning the core board sticker reveals the RAM and storage specification. -If you are unsure about the specifications of your core board, you can scan the QR code on the core board to check. When LicheePi4A is shipped, a QR code sticker is attached to the core board. Scanning it will display the memory and storage configuration of the core board. - -For example, for a 16G RAM + 128G eMMC configuration, you can find the QR code sticker here: +Example for a 16 GB RAM + 128 GB eMMC configuration: ![core-card](/img/image-for-flash/core-card.png) -Scanning the QR code will display the following: +Scanning the QR code yields: ![Core board-info](/img/image-for-flash/card-info.png) -After confirming the board specifications, use `wget` to download the u-boot, boot, and root files: +The second line lists the RAM plus storage configuration. +::: + +After confirming the board specification, download the U-Boot, boot, and root images with `wget`: ```bash -sudo wget u-boot-with-spl-lpi4a-16g-main.bin -sudo wget boot-lpi4a-20250110_151339.ext4.zst -sudo wget root-lpi4a-20250110_151339.ext4.zst +sudo wget https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/u-boot-with-spl-lpi4a-16g-main.bin +sudo wget https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/boot-lpi4a-20250110_151339.ext4.zst +sudo wget https://mirror.iscas.ac.cn/revyos/extra/images/lpi4a/20250110/root-lpi4a-20250110_151339.ext4.zst ``` ![emmc-download](/img/image-for-flash/wget-download.png) -After downloading, use the `unzstd` command to decompress the root and boot files: +Extract the boot and root archives with `unzstd`: ```bash unzstd boot-lpi4a-20250110_151339.ext4.zst unzstd root-lpi4a-20250110_151339.ext4.zst ``` -Once decompression is complete, you will have the files required for writing the eMMC image. +After extraction, the required files for flashing the eMMC are ready. ![file](/img/image-for-flash/unzstd-bootandroot.png) -### Writing the Image to eMMC (Without Serial Connection) +### Writing the eMMC Image (No Serial Console) -Press and hold the BOOT button on the board, then connect it to your computer. The board will enter flashing mode. +Press and hold the BOOT button on the board and connect it to the computer. The board enters flashing mode. -### Writing the Image to eMMC (With Serial Connection) +Use `lsusb` to verify the connection: -#### Using `minicom` +![lsusb](/img/image-for-flash/lsusb.png) + +A successful connection appears as `ID 2345:7654 T-HEAD USB download gadget`. -First, open `minicom` from the terminal to access the serial console: +After confirming the connection, flash a temporary U-Boot to RAM and reboot: ```bash -sudo minicom +fastboot flash ram u-boot-with-spl-lpi4a-16g.bin # Replace with the U-Boot image for your configuration +fastboot reboot +sleep 1 ``` -If you need to specify the serial device (e.g., the commonly used USB-to-serial device `ttyUSB0`), you can use: +![flash-ram](/img/image-for-flash/flash-ram.png) + +Next, flash the persistent images: + +```bash +fastboot flash uboot u-boot-with-spl-lpi4a-16g.bin +fastboot flash boot boot-lpi4a-20240720_171951.ext4 +fastboot flash root root-lpi4a-20240720_171951.ext4 +``` + +![flash-ubootandboot](/img/image-for-flash/flash-ubootandboot.png) + +:::warning +**Progress and timing note** + +Flashing `uboot` and `boot` completes quickly. Writing `root` requires roughly five minutes. If the number of data blocks reported during the `root` flash is unexpectedly small (e.g. only in the low thousands), earlier steps likely failed—repeat the flashing process. +::: + +![flash-root](/img/image-for-flash/flash-root.png) + +Flashing is now complete. Power-cycle the board to boot into the system. + +### Writing the eMMC Image (With Serial Console) + +#### Install a Serial Console Tool + +When using a serial connection, a terminal program is required for monitoring. Tools such as `minicom`, `screen`, and `picocom` are suitable; this guide uses `minicom`. ```bash -sudo minicom -D /dev/ttyUSB0 +sudo apt install minicom ``` -#### Using `screen` -Open `screen` from the terminal. Replace `/dev/ttyUSB0` with your device, and `115200` with the baud rate: +![minicom-install](/img/image-for-flash/minicom-install.png) + +Verify the installation by checking its version: ```bash -sudo screen /dev/ttyUSB0 115200 +minicom -version ``` -As shown in the diagram, connect the serial port to the board. The USB end connects to the computer, while the Type-C port on the board connects to the computer using a USB-Type-C cable. +![minicom-version](/img/image-for-flash/minicom-version.png) + +#### Using `minicom` + +Wire the serial adapter to the board as illustrated below. Connect the USB side to the host computer. The board’s USB Type-C port is connected by a USB Type-C cable. -For the serial connection, the red circle (first row, second pin from the left) is GND, the yellow circle (first row, fifth pin) is TX, and the green circle (second row, fifth pin) is RX. The connection to the host should follow TX to RX, RX to TX, and GND to GND. +GND corresponds to the red circle (first row, second pin from the left), TX to the yellow circle (first row, fifth pin), and RX to the green circle (second row, fifth pin). Connect TX to RX, RX to TX, and GND to GND. ![](/img/image-for-flash/lpi4a6.png) -After connecting, press any key in the serial console to interrupt the auto-start process. You will see the following u-boot command line (see the last line): +Determine the serial device by listing `/dev/tty*` before and after plugging in the adapter: -![](/img/image-for-flash/image-start.png) +```bash +ls /dev/tty* +``` -In the serial console window, enter: +After connecting the adapter, an additional entry such as `/dev/ttyUSB0` appears. + +![lstty](/img/image-for-flash/lstty.png) + +Start `minicom`, specifying the device and baud rate (115200 in this example): + +```bash +sudo minicom -D /dev/ttyUSB0 -b 115200 +``` + +![minicom-start](/img/image-for-flash/minicom-start.png) + +#### Enter Fastboot + +Once `minicom` is running, connect the USB Type-C cable to power the board. On the serial console, interrupt the boot process when `Hit any key to stop autoboot` appears (the countdown lasts about three seconds). The U-Boot command line is then presented. + +![start](/img/image-for-flash/image-start.png) + +Enter the following command in the serial console: ```bash fastboot usb 0 ``` -The output will show: +You should see output similar to: + ```bash Light LPI4A 16G# fastboot usb 0 dwc3_gadget_start maximum_speed:5 revision:0x5533330b dwc3_gadget_start DWC3_DCFG:0x80804 +dwc3_gadget_start_conndone_interrupt speed:0 dwc3_dsts:0x20000 +dwc3_gadget_start_conndone_interrupt speed:0 dwc3_dsts:0x2f938 ``` -This indicates that `fastboot` can be used for flashing. Open another terminal window to proceed with image flashing. +![usb0](/img/image-for-flash/fastboot-usb0.png) -### Flashing the Image -All commands below should be executed in the directory where the image files are located. Pay attention to the file paths and names. +This indicates that `fastboot` is ready. Open another terminal to execute the flashing commands. -#### Put the Device into U-Boot Fastboot Mode -If the `lsusb` result is not `ID 1234:8888 Brain Actuated Technologies USB download gadget`, run the following commands: -```bash -fastboot flash ram u-boot-with-spl-lpi4a-16g.bin # Replace with the u-boot image for your specific model -fastboot reboot -sleep 1 -``` +#### Flash the Images + +Run the following commands in the directory where the image files were downloaded. If you execute them elsewhere, adjust the file paths accordingly. -#### Flash the Image ```bash fastboot flash uboot u-boot-with-spl-lpi4a-16g.bin fastboot flash boot boot-lpi4a-20240720_171951.ext4 fastboot flash root root-lpi4a-20240720_171951.ext4 ``` -`fastboot` will display the flashing progress. If a serial connection is established, you can view the detailed progress in the serial console (the example below shows flashing `boot`, with a size of 92,886,476 bytes. You can see the flashed content at `cmd_parameter: boot, imagesize: 92886476`). +`fastboot` reports progress. If the serial console is connected, detailed logs are visible there—for example, when flashing `boot` (92,886,476 bytes), the log shows `cmd_parameter: boot, imagesize: 92886476`. -![](/img/image-for-flash/flash-root-minicom.png) +![flash-boot](/img/image-for-flash/flash-root-minicom.png) -Once flashing is complete, disconnect the USB-Type-C cable from the computer and the board, connect the power cable, and the system will boot up. +After flashing, disconnect the USB Type-C cable linking the board and the host, connect a power cable, and the system will boot automatically. +## Troubleshooting -### Potential Issues +### Linux: `< waiting for any device >` -#### Linux only: stuck at < waiting for any device > +If `lsusb` lists the download gadget but `fastboot` remains at `< waiting for any device >`, rerun the command with `sudo`. -If the `lsusb` output shows a download device but the `fastboot` command remains stuck at `< waiting for any device >`, try running the `fastboot` command with `sudo`. +![waiting](/img/image-for-flash/waiting.png) -#### Issues After Major Version Upgrade +### Issues After Major Upgrades -If you **use a serial connection to enter U-Boot** and start fastboot flashing (see [here](#writing-the-image-to-emmc-with-serial-connection)), the issue might be caused by U-Boot retaining old environment variables. Please enter the following command in the U-Boot serial console: +If problems occur after a major upgrade, the U-Boot environment may need to be reset. -``` -env default -a -f; env save; reset -``` +Reset procedure: +Connect to the board via serial, power it on, interrupt U-Boot, and run: -If this version includes partition table changes, additionally run: -``` -run gpt_partition +```bash +env default -a -f; env save; reset ``` -### User Login +This resets all environment variables and reboots the board. + +If the partition layout differs from the previous image, additionally run `run gpt_partition`. + +## User Credentials + +Default login credentials are: + +- Username: `debian` +- Password: `debian` -- Login account: `debian` -- Password: `debian` \ No newline at end of file +Use these for first boot. For security, change the password immediately after logging in. diff --git a/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-meles.mdx b/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-meles.mdx index 8131f860..9a8aa7c8 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-meles.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-meles.mdx @@ -6,53 +6,48 @@ import { DownloadLink } from "@site/src/components/ImageLinks"; # Milk-V Meles Image Flashing Guide -This page provides a tutorial for flashing images to the Milk-V Meles, specifically for Linux. +This page describes the Linux workflow for flashing images to Milk-V Meles. Use the links below for other devices or operating systems. -To view image flashing tutorials for other operating systems, please click the links in the table below: +| Other Flashing Tutorials | Link | +| --- | --- | +| Lichee Pi 4A (Linux) | [Linux flashing guide](../licheepi4a/) | +| Lichee Pi 4A (Windows) | [Windows flashing guide](../licheepi4a-windows/) | +| Milk-V Pioneer | [Flashing guide](../milkv-pioneer/) | -| Other Flashing Tutorials | Link | -| ------------------------ | -------------------------------------------- | -| LicheePi4A | [Linux Flashing Tutorial](../licheepi4a/) | -| LicheePi4A | [Windows Flashing Tutorial](../licheepi4a-windows/) | -| Milk-V Pioneer | [Flashing Tutorial](../milkv-pioneer/) | - -:::note - -Before proceeding with this tutorial, please ensure that the board you have matches the image below. Only continue if they are identical. +:::warning +Before you proceed, compare your board against the reference image and make sure the hardware matches. -![Milk-V Meles Broad Example](/img/image-for-flash/meles.png) +![Milk-V Meles reference](/img/image-for-flash/meles.png) ::: -## Introduction to the Demonstration Environment +## Demonstration Environment -All image flashing operations in this tutorial are performed using the following environment: +All steps were validated under the following environment: -- System and Version: Ubuntu 22.04.5 LTS +- Operating system: Ubuntu 22.04.5 LTS - Architecture: x86_64 -- Board Specifications: 8GB RAM -- Python Version: 3.10.12 +- Milk-V Meles configuration: 8 GB RAM +- Python version: 3.10.12 -All operations in this tutorial are reproducible in this environment. If you encounter any issues during image flashing in this environment, please refer to [this page](../../issue/) to submit an issue. +If you follow this procedure in the same environment and encounter issues, submit an issue via [the support page](../../issue/). -:::note -Using a Python version higher than 3.12 may cause the the procedure of writing bootloader to SPI Nor Flash to fail. Please use a Python version prior to 3.12. +:::warning +Python versions newer than 3.12 may fail when writing the bootloader to SPI NOR flash. Use Python 3.11 or earlier. ::: ## Tool Installation -This section introduces the software packages and tools required for downloading and flashing the image. Please download and install them before proceeding with the subsequent image flashing operations. - -### File Download Tool +The following packages are required for downloading and flashing images. Install them before continuing. -When using a graphical interface, you can download images from the image repository by directly clicking the download link. If you want to download via the command line, there are many ways, such as wget and curl. Here, we choose wget as the download tool. +### Download Utility -In the [demonstration environment](#introduction-to-the-demonstration-environment), wget is usually pre-installed. You can check whether wget is installed by querying the wget version in the command line. +In a desktop environment you can download images from the mirror via a browser. For command-line downloads we use `wget`. ```bash wget --version ``` -If wget is not installed, please use the following command to install it: +If `wget` is missing, install it: ```bash sudo apt install wget @@ -60,15 +55,11 @@ sudo apt install wget ![wget-install](/img/image-for-flash/wget-install.png) -:::note -The sudo command requires the user to enter a password for confirmation before execution. Please ensure that you know the password before executing this command. This will not be repeated later. -::: +> `sudo` prompts for your password. Ensure you know it; this reminder will not be repeated later. -### File Unzipping Tool +### Archive Utility -In the above [demonstration environment](#introduction-to-the-demonstration-environment), there are several ways to decompress zst file compression packages, such as zstd, tar, and 7z. This tutorial only lists one of them. Use the zstd tool to decompress via the command line. This method requires us to install the zstd software package in the system before decompressing. - -If you do not know whether ztsd has been installed in the system, please execute the following command. This command is used to view the zstd version. You can determine whether the system has pre-installed the ztsd software package through the echo. +`.zst` archives can be unpacked with `zstd`, `tar`, or `7z`. This tutorial demonstrates the `zstd` command-line tool. Confirm whether it is installed: ```bash zstd --version @@ -76,13 +67,7 @@ zstd --version ![zstd-version](/img/image-for-flash/zstd-version.png) -If the version number is displayed normally, it proves that the installation has been successful. For example, the following echo indicates that zstd has been installed: - -```bash -*** zstd command line interface 64-bits v1.4.8, by Yann Collet *** -``` - -If no version number is displayed, please install zstd via the command line: +If no version is shown, install `zstd`: ```bash sudo apt update @@ -91,33 +76,31 @@ sudo apt install zstd ![zstd-install](/img/image-for-flash/zstd-version.png) -## Introduction to Broad's Boot Methods +## Boot Options -Milk-V Meles currently supports two boot methods: [Booting from SD card](#booting-from-sd-card) and [Booting from eMMC](#booting-from-emmc). This tutorial provides instructions for both boot methods. Please click to jump to the instructions according to the flashing method you need. +Milk-V Meles supports two boot paths: [booting from an SD card](#boot-from-sd-card) and [booting from eMMC](#boot-from-emmc). Choose the method that fits your scenario. :::warning -Regardless of which flashing method is used, the original user data will be lost, so be sure to back up your data before flashing! +Flashing erases existing data. Back up important files before you begin. ::: -Before introducing the two flashing methods, it should be noted that regardless of which flashing method is used, you must ensure that the correct firmware is flashed into the SPI Nor Flash. Next, we will introduce how to flash the SPI Nor Flash firmware. +Before tackling either boot mode, ensure that the SPI NOR flash holds the correct firmware. The next section explains how to program it. -## Flashing SPI Nor Flash Firmware +## Flash the SPI NOR Firmware -The Milk-V Meles development board has a SPI nor Flash. It is used to store the Bootloader to implement system startup and SoC download mode. The Soc itself does not support booting from Micro SD card or USB or other storage media. +Milk-V Meles relies on its SPI NOR flash to store the bootloader that brings up the system and exposes the SoC download mode. The SoC cannot boot directly from MicroSD or USB. -When you replace a brand new SPI Nor Flash or the firmware is damaged, you may need to burn an image to it. At this time, you need to use a serial port connection to burn it. - -For how to connect the serial port, please refer to the official [hardware introduction](https://milkv.io/zh/docs/meles/hardware/meles-main-board). The connection with the host should follow the TX to RX, RX to TX, and GND to GND wiring. +If you replace the SPI NOR device or the firmware becomes corrupted, reflash the bootloader via a serial connection. Wiring instructions are available in the official [hardware documentation](https://milkv.io/zh/docs/meles/hardware/meles-main-board); connect TX ↔ RX and GND ↔ GND between the board and host. ### Preparation -First, you need to install yoctools to the local device. In the demonstration environment, you can directly install it through the pip command: +Install Yoctools: ```bash sudo pip install yoctools -U ``` -If the pip command cannot be executed, please install pip first if pip is not installed: +If `pip` is unavailable, install it first: ```bash sudo apt install python3-pip @@ -125,262 +108,178 @@ sudo apt install python3-pip ![pip-install](/img/image-for-flash/pip-install.png) -After yoctools is installed, you can check whether the installation is successful by checking the version. If the version number is successfully echoed, it means the installation is successful. +Verify the installation: ```bash yoc --version -2.1.11 ``` ![yoc-version](/img/image-for-flash/yoc-version.png) -Secondly, you need to download the image burning software: +Download the image writer utility: ```bash wget https://github.com/milkv-meles/thead-bin/raw/main/image-writer/iw-single-line.bin ``` -Finally, you need to download the U-Boot file of the board. Please select the U-Boot file corresponding to your board in the download link. If your development board is the 8GB version, you need to download ```u-boot-with-spl-meles.bin```. If your development board is the 16GB version, download ```u-boot-with-spl-meles-16g.bin```. The 8GB version of the board is used in this demonstration environment, so ```u-boot-with-spl-meles.bin``` is downloaded. +Download the U-Boot binary that matches your board: + +- 8 GB model: `u-boot-with-spl-meles.bin` +- 16 GB model: `u-boot-with-spl-meles-16g.bin` + +Example (8 GB board): ```bash wget https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250323/u-boot-with-spl-meles.bin ``` -After the above preparations are completed, you can perform the operation of flashing the SPI Nor Flash firmware. +### Write the Bootloader to SPI NOR Flash -### Write Bootloader to SPI Nor Flash - -First you need to use the cct tool to check for available devices. - -Before this, we need to confirm the address of the serial port device. `/dev/ttyUSB0` is usually the first serial port device name assigned by the system when you plug in the first USB to serial port adapter or some devices with built-in USB to serial port functions. We run the following command in the terminal: +1. Determine the serial port device (commonly `/dev/ttyUSB0`). +2. List available devices with `cct`: ```bash sudo cct list -u /dev/ttyUSB0 -Wait .............. ``` -![cct-list](/img/image-for-flash/cct-list.png) - -The log "Wait ......" output here means that the cct program is waiting for Meles to respond. If the serial port is not connected, it will continue to wait until the serial port is connected before continuing to execute. So it is a normal phenomenon, just continue to perform the operation according to the steps below. - -If it is not connected for too long, the terminal will display the following text: - -![timeout](/img/image-for-flash/timeout.png) - -- First connect the USB to TTL serial port module to the Meles debugging interface - - Connect TXD to RXD - - Connect RXD to TXD - - Connect GND to GND -- Then press and hold the download button -- Connect the power supply to power on Meles -- Release the download button - -At this time, the terminal will print the storage list, as shown below: +The program waits for the board to respond. Connect the USB-to-TTL adapter, wire TX ↔ RX and GND ↔ GND, press and hold the download button, power the board via USB Type-C, then release the button. The storage list should appear: ```bash -sudo cct list -u /dev/ttyUSB0 -Wait ............................ Memory device list: dev = ram0 , size = 1.1MB dev = qspi0 , size = 16.0MB ``` -![cct-list1](/img/image-for-flash/cct-list1.png) - -Then we download the image burning software to SRAM: +3. Load the image writer into SRAM: ```bash sudo cct download -u /dev/ttyUSB0 -d ram0 -f iw-single-line.bin -v checksum -r ``` -After executing this command, there will be a percentage progress bar. Please wait for about 30 seconds. - -![cct-download](/img/image-for-flash/cct-download.png) +Wait for the transfer and checksum to complete. -Then the download is complete: - -```bash -sudo cct download -u /dev/ttyUSB0 -d ram0 -f iw-single-line.bin -v checksum -r -Wait -Send file 'iw-single-line.bin' to 2:0 ... -File iw-single-line.bin download success. -Start to verify data with method:[checksum] -checksum value is: 0x880572 -读出并校验成功! -Start to run image... -``` - -![cct-download1](/img/image-for-flash/cct-download1.png) - -Finally, download the Bootloader to SPI Nor Flash. Before this step, please confirm again whether the board specifications and the downloaded ```.bin``` file correspond. The demonstration uses the 8GB version of the board, so ```u-boot-with-spl-meles.bin``` is downloaded. Please replace the file name yourself when copying the command. - -At the same time, please pay attention to the file directory. The demonstration file is in the current directory. If it is not in the current directory, please replace the file path yourself. - -```bash -$ sudo cct download -u /dev/ttyUSB0 -d qspi0 -f u-boot-with-spl-meles.bin -v checksum -r -t 1200 -``` - -![cct-download2](/img/image-for-flash/cct-download2.png) - -After executing this command, there will also be a percentage progress bar. Please wait for about one minute. - -Then the download is complete: +4. Flash the U-Boot binary to SPI NOR (adjust the file name if you use the 16 GB image): ```bash sudo cct download -u /dev/ttyUSB0 -d qspi0 -f u-boot-with-spl-meles.bin -v checksum -r -t 1200 -Wait -Send file 'u-boot-with-spl-meles.bin' to 23:0 ... -File u-boot-with-spl-meles.bin download success. -Start to verify data with method:[checksum] -checksum value is: 0x43bce40 -读出并校验成功! -Start to run image... ``` -![cct-download3](/img/image-for-flash/cct-download3.png) +A progress indicator appears; the operation typically finishes within a minute. After the checksum passes, the SPI NOR flash is updated. -So far, the flashing is complete. Subsequent boot methods are divided into [Booting from SD card](#booting-from-sd-card) and [Booting from eMMC](#booting-from-emmc). Please select and flash according to your needs. +You can now proceed with either boot method. -## Booting from SD card +## Boot from SD Card ### Hardware Preparation -Prepare a MicroSD card reader and a MicroSD card. Currently, there are compatibility issues with MicroSD cards. RevyOS provides a [MicroSD card list(Chinese only)](https://github.com/revyos/revyos/blob/main/Installation/card%20list.md) that has been tested. +Prepare a MicroSD card reader and a MicroSD card. Because compatibility varies, refer to the [tested card list](https://github.com/revyos/revyos/blob/main/Installation/card%20list.md). -If the MicroSD card you are using is not on the list of known available cards, and you encounter problems such as being unable to flash the image correctly or being unable to start the image after flashing, please refer to [this page](../../issue/) to submit an issue, and try referring to the [Booting from eMMC](#booting-from-emmc) image flashing tutorial to flash the image. +If flashing or booting fails with an unlisted card, submit an [issue](../../issue/) and consider using the eMMC method instead. -### SD Card Image Preparation +### Obtain the SD Card Image -The latest version of the SD card image is 20250323, which can be downloaded via the following command: +Download the SD card image (prefixed with `sdcard-meles-`) from: -```bash -wget https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250323/sdcard-meles-20250323_154525.img.zst -``` +- [RevyOS 20240720 (Kernel 5.10)](https://mirror.iscas.ac.cn/revyos/extra/images/meles/20240720/) +- Latest release (Kernel 6.6): {} -This file is a .zst compressed package, which needs to be decompressed after downloading. You can use the zstd tool to decompress it. +Example for RevyOS 20250323: ```bash +wget https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250323/sdcard-meles-20250323_154525.img.zst unzstd sdcard-meles-20250323_154525.img.zst ``` -After decompression, an image file named `sdcard-meles-20250323_154525.img` will be generated. +The extraction generates `sdcard-meles-20250323_154525.img`. -### Introduction to Burning Methods +### Writing Options -If you choose to boot from SD card, you can choose to burn the image to the MicroSD card in two different ways. One is to use [graphical interface software to burn](#writing-the-image-to-the-microsd-card-using-balenaetcher), and the other is to use the dd command [to burn in the command line](#writing-the-image-using-dd-command). -Here we will introduce the operation steps of the two burning methods, you can choose one of them according to your needs. +Choose one of the following methods to write the image to the SD card: -#### Writing the image to the MicroSD card using BalenaEtcher +#### BalenaEtcher -Get the burning tool BalenaEtcher from the official website [https://etcher.balena.io/](https://etcher.balena.io/). When downloading, please select the file to download according to your machine's situation. According to the description in [Demonstration Environment](#introduction-to-the-demonstration-environment), select [Etcher for Linux x64 (64-bit) (zip)](https://github.com/balena-io/etcher/releases/download/v1.19.25/balenaEtcher-linux-x64-1.19.25.zip) to download, decompress and install. +Download BalenaEtcher from [https://etcher.balena.io/](https://etcher.balena.io/) and install the Linux x64 build. ![BE-version](/img/image-for-flash/BE-version.png) -Insert the SD card into the card reader and insert it into the computer. - -Run BalenaEtcher to write the image to the SD card. - -In the BalenaEtcher window, first click "Flash from file" to select the image file. +1. Insert the SD card. +2. Launch BalenaEtcher. +3. Click **Flash from file** and select the image. +4. Select the target device. +5. Click **Flash** and wait for completion. ![BE5](/img/image-for-flash/BE5.png) - -After selecting the image file, select the device to be written in the second column. - ![BE6](/img/image-for-flash/BE6.png) - -After selecting both items, click "Flash" to write the image. - -After waiting for a while, it will show that the burning is complete. - ![BE7](/img/image-for-flash/BE7.png) -#### Writing the image using dd command - -dd is a powerful command line tool in Linux and Unix-like systems, mainly used to copy files or data according to the specified size and format, and is generally pre-installed in the system. +#### `dd` -Writing an image using the dd command requires following these steps: - -First, you need to view the device list. Run the following command before and after inserting the SD card to find the device name corresponding to the SD card: +1. Identify the device node (`/dev/sdX` or `/dev/mmcblk0`) using `lsblk`. +2. Unmount any mounted partitions: ```bash -lsblk +sudo umount /dev/sdX1 ``` -The device name of the SD card may be /dev/sda or /dev/mmcblk0. In the demonstration environment, after executing `lsblk`, confirm that the sd card partition is `/dev/sda`. +3. Flush pending writes: -![lsblk-meles](/img/image-for-flash/lsblk-meles.png) +```bash +sudo sync +``` -Before writing the image, you need to unmount the mounted partition of the SD card. If there are multiple partitions, please unmount them one by one: +4. Write the image (replace `sdX` with the correct device): ```bash -sudo umount /dev/sdX1 +sudo dd if=sdcard-meles-20250323_154525.img of=/dev/sdX bs=4M status=progress +sudo sync ``` -If no partition is mounted, the umount command will display `not mounted`, then no further action is required. - -After unmounting the partition, it is recommended to run the `sudo sync` command to ensure that all data has been synchronized. +![dd-meles](/img/image-for-flash/dd-meles.png) -![sync-meles](/img/image-for-flash/sync-meles.png) +Ensure the card is unmounted before removing it. -After performing the above steps, you can start flashing. Before flashing, please ensure that you have set the correct device in `of=`. In the demonstration environment, the sd card is identified as sda. Please fill in the partition according to your own device after `of=`. +### Boot from SD Card -```bash -sudo dd if=./sdcard-meles-20250323_154525.img of=/dev/sdX bs=4M status=progress -``` +Insert the SD card into the slot shown below and power on the board. -![dd-meles](/img/image-for-flash/dd-meles.png) +![SD slot](/img/image-for-flash/sd-card-slot.png) -After the flashing is completed, please also execute the `sudo sync` command to ensure that the data has been synchronized. Then you need to confirm that the sd card is in an unmounted state. Only after these two points are executed can you remove the sd card and insert it into the development board. +## Boot from eMMC -#### Booting the system via SD card +Ensure the eMMC module is installed on the back of the board before flashing. -After writing the image, insert the SD card into the card slot shown in the figure. +### Obtain the eMMC Images -![SDCard slot](/img/image-for-flash/sd-card-slot.png) +Download the following files: -## Booting from eMMC +- [RevyOS 20240720 (Kernel 5.10)](https://mirror.iscas.ac.cn/revyos/extra/images/meles/20240720/) +- Latest release (Kernel 6.6): {} -Before flashing, make sure that the eMMC module has been successfully installed on the back of the development board. +Required files: -### eMMC Image Preparation +- `u-boot-with-spl-meles*.bin` — U-Boot binary +- `boot-meles-*.ext4.zst` — boot partition +- `root-meles-*.ext4.zst` — root partition -The latest version of the eMMC image is 20250323, which can be downloaded via the following command: +Example (20250323): ```bash wget https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250323/u-boot-with-spl-meles.bin wget https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250323/boot-meles-20250323_154525.ext4.zst wget https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250323/root-meles-20250323_154525.ext4.zst -``` - -The three files are the u-boot boot file, the boot partition and the root partition image files, respectively. After downloading, you need to decompress them. You can use the zstd tool to decompress them. - -```bash unzstd boot-meles-20250323_154525.ext4.zst unzstd root-meles-20250323_154525.ext4.zst ``` -After decompression, two image files named `boot-meles-20250323_154525.ext4` and `root-meles-20250323_154525.ext4` will be generated. - -### Burning Tool Preparation - -To boot from eMMC, you need to flash the u-boot file, boot file, and root file into the eMMC through the fastboot tool, so you need to confirm whether fastboot has been installed first. +### Install Fastboot -If you do not know whether fastboot has been installed in the system, please execute the following command. This command is used to view the fastboot version. You can determine whether the system has pre-installed the fastboot software package through the echo. +Check whether `fastboot` is available: ```bash fastboot --version ``` -![fastboot-version](/img/image-for-flash/fastboot-version.png) - -If the version number is displayed normally, it proves that the installation has been successful. For example, the following echo indicates that fastboot has been installed: - -```bash -fastboot version 28.0.2-debian -Installed as /usr/lib/android-sdk/platform-tools/fastboot -``` - -If no version number is displayed, please install fastboot via the command line: +If not, install it: ```bash sudo apt install fastboot @@ -388,66 +287,50 @@ sudo apt install fastboot ![fastboot-install](/img/image-for-flash/fastboot-install.png) -#### Writing the image to eMMC - -First, you need to put the board into burning mode. Please perform the following operations in order: +### Flash the eMMC -- Press and hold the Meles download button -- Insert the Type-C data cable into the power port once, and connect the other end of the data cable to the host -- Release the download button - -At this time, you can judge whether the device is connected normally according to the output content in `lsusb`. - -![lsusb-meles](/img/image-for-flash/lsusb-meles.png) - -After a normal connection, the following device `ID 2345:7654 T-HEAD USB download gadget` will be displayed under the `lsusb` command. +1. Enter download mode: + - Hold the download button on the board. + - Connect a USB Type-C cable from the power port to the host. + - Release the button. +2. Confirm that `lsusb` lists `ID 2345:7654 T-HEAD USB download gadget`. +3. Flash the images: ```bash fastboot flash ram u-boot-with-spl-meles.bin fastboot reboot -# Pause here for 3-5 seconds to wait for Meles to restart +sleep 3 fastboot flash boot boot-meles-20250323_154525.ext4 fastboot flash root root-meles-20250323_154525.ext4 ``` ![fastboot-meles](/img/image-for-flash/fastboot-meles.png) -After the flashing is completed, it can be started normally. - - -### Potential Issues +After flashing, reboot to start from eMMC. -#### weak Wi-Fi signal / using external antenna by default +## Troubleshooting -On `Milk-V Meles` with the [latest kernel](https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250729/) (6.6.82 by the time writing this), the board is using the external antenna by default, rather than the on board ceramic/chip antenna. +### Weak Wi-Fi Signal on the Latest Kernel -As a result, the Wi-Fi signal is very weak without external antenna connected to the coax/ipex connector.Or not picking up any Wi-Fi signal at all. +When using the [latest RevyOS kernel](https://fast-mirror.isrc.ac.cn/revyos/extra/images/meles/20250729/) (6.6.82 at the time of writing), the board defaults to an external antenna. Without an antenna connected to the IPEX connector, Wi-Fi performance degrades significantly. +Use `gpiod` to switch to the onboard antenna: -You can try using 'sudo' to execute the 'GPIO' command to manually switch to the on-board antenna. - -``` +```bash sudo apt update && sudo apt upgrade -y -sudo apt install -y gpiod # Install the gpiod tool. -sudo gpioset 5 24=1 # Set pin 24 of chip 5 to high level. +sudo apt install -y gpiod +sudo gpioset 5 24=1 ``` :::warning - -You need to re-execute after reboot! - +Reapply the GPIO setting after each reboot. ::: +## User Credentials -### User Login +Default login credentials: -- Login account: `debian` +- Username: `debian` - Password: `debian` -When starting the image for the first time, you can log in with the above user password. - -For security reasons, please be sure to change your password after your first login to avoid any problems. - - - - +Change the password immediately after the first login for security. diff --git a/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx b/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx index 4a80dbb2..a30a6856 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx @@ -4,135 +4,123 @@ sidebar_position: 3 import { DownloadLink } from "@site/src/components/ImageLinks"; - -# Installing RevyOS on the Milk-V Pioneer +# Installing RevyOS on Milk-V Pioneer ## Preparation -### Required Tools - -- microSD card -- microSD card reader -- NVMe SSD adaptor - -### Downloading the Image - -RevyOS image directory: [Download Link](https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/) - -Latest image version: {} - -Example directory for the 20241230 image: - -![Image Directory](/img/image-for-flash/pioneer-image-dir.png) +### Required Hardware -RevyOS requires flashing both firmware and system files, as listed below. +- MicroSD card +- MicroSD card reader +- NVMe SSD enclosure -There are two separate firmware, one include `zsbl`, `linuxboot`, device trees and more, which handles the system boot process. +### Download the Image -This part of firmware can be flashed to either the SPI Flash or microSD card: +RevyOS images are hosted at [ISCAS mirror](https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/). +The latest release for Milk-V Pioneer is {}. -- **Firmware files**: - - `firmware_single_sg2042-v6.6-lts-v0p7.bin` (for SPI Flash) - - `firmware_single_sg2042-v6.6-lts-v0p7.img` (for SD card) +The following example uses the `20241230` directory: -The other part is the MCU firmware. Newer versions of MCU firmware has fixed some known issues, an upgrade is recommended, after completing the system installation. +![](/img/image-for-flash/pioneer-image-dir.png) -- https://github.com/sophgo/mcu/releases +RevyOS flashing consists of a firmware component and the system image itself. The relevant files are: -And also the system image itself which needs to be flashed to M.2 NVMe SSD: - -- `revyos-pioneer-20241230-212249.img.zst` - ---- +- **Firmware (boot chain)** — contains `zsbl`, `linuxboot`, device trees, and other boot assets. It can reside either on SPI flash or on an SD card: + - `firmware_single_sg2042-v6.6-lts-v0p7.bin` – for SPI flash + - `firmware_single_sg2042-v6.6-lts-v0p7.img` – for SD card +- **MCU firmware** — addresses known issues and should be updated after installing the system: +- **System image** — flashes to an M.2 NVMe SSD: + - `revyos-pioneer-20241230-212249.img.zst` ## Flashing the Firmware -### Flashing Firmware to SD Card +Depending on the storage target, choose one of the following procedures. + +### Flash the Firmware to an SD Card -**Operating System**: Ubuntu 22.04 +*Host environment: Ubuntu 22.04* #### Using BalenaEtcher -1. Select the file `firmware_single_sg2042-v6.6-lts-v0p7.img`. +1. Select `firmware_single_sg2042-v6.6-lts-v0p7.img`. 2. Choose the target SD card. -3. Click "Flash" to start the process. +3. Click **Flash**. -#### Using Command Line +#### Using the Command Line -Insert the SD card into a reader connected to your computer, then verify the device path. - -Navigate to the directory with `firmware_single_sg2042-v6.6-lts-v0p7.img` and flash it with the following command: +Insert the SD card, confirm its device path, and run: ```shell sudo dd if=firmware_single_sg2042-v6.6-lts-v0p7.img of=/dev/sdX bs=4M status=progress ``` -Replace `of=/dev/sdX` with your specific device path if different. - -After flashing, use `sync` to ensure data is fully written to the SD card. - -### Flashing Firmware to SPI Flash +Replace `/dev/sdX` with the actual device node. After flashing, execute `sync` to flush the write cache. -**Operating System**: RevyOS 20241230 +### Flash the Firmware to SPI Flash -> **Note**: For first-time installation, using an SD card to store the firmware is recommended. +*Host environment: RevyOS 20241230* -#### Using Command Line +:::note +For the first installation we recommend storing the firmware on the SD card. +::: -Flashing to the SPI Flash requires installing utilities and loading the `mtd` module. +Install the required utilities and load the kernel module: -Install necessary packages: +```shell +sudo apt install mtd-utils +sudo modprobe mtdblock +``` - ```bash - sudo apt install mtd-utils - sudo modprobe mtdblock - ``` +Download the firmware: -Download the firmware file: +```shell +wget https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/20241230/firmware_single_sg2042-v6.6-lts-v0p7.bin +``` - ```bash - wget https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/20241230/firmware_single_sg2042-v6.6-lts-v0p7.bin - ``` +Then flash it into `/dev/mtd1`: -Navigate to the directory where `firmware_single_sg2042-v6.6-lts-v0p7.bin` was downloaded and run: +```shell +sudo flashcp -v firmware_single_sg2042-v6.6-lts-v0p7.bin /dev/mtd1 +``` - ```bash - sudo flashcp -v firmware_single_sg2042-v6.6-lts-v0p7.bin /dev/mtd1 - ``` +The SPI flash update is now complete. -Flashing to SPI Flash is now complete. +## Flashing the System Image ---- +*Host environment: Ubuntu 22.04* -## 3. Flashing the RevyOS Image +First decompress the archived image: -**Operating System**: Ubuntu 22.04 - -### Using Command Line +```shell +unzstd revyos-pioneer-20241230-212249.img.zst +``` -1. Decompress the `revyos-pioneer-20241230-212249.img.zst` file using `unzstd revyos-pioneer-20241230-212249.img.zst`. This produces the `revyos-pioneer-20241230-212249.img` file. +This produces `revyos-pioneer-20241230-212249.img`. -2. Insert the NVMe SSD into the reader and connect it to your computer, then confirm the device path. +Insert the NVMe SSD into the enclosure, connect it to the host, confirm the device path, and write the image: -3. In the directory containing `revyos-pioneer-20241230-212249.img`, flash the image to the NVMe SSD with dd command: `sudo dd if=revyos-pioneer-20241230-212249.img of=/dev/nvme0n1 bs=4M status=progress`. Replace `of=/dev/nvme0n1` with the correct device path if different. +```shell +sudo dd if=revyos-pioneer-20241230-212249.img of=/dev/nvme0n1 bs=4M status=progress +``` -4. After flashing, use `sync` to ensure the data is fully written to the NVMe SSD. +Adjust `/dev/nvme0n1` to match your environment. Run `sync` when the transfer finishes to ensure the data is fully written. -## MCU Firmware upgrade +## Updating the MCU Firmware -After you finished system installation process and successfully booted into the system, open up a terminal or connect via SSH. +After flashing the system and booting into RevyOS, update the MCU firmware. -First, install `wget`, download the MCU firmware and `mcu-util`. +Install prerequisites, create a working directory, and download the utility and firmware: ```shell -sudo apt update; sudo apt install -y wget +sudo apt update +sudo apt install -y wget mkdir mcu && cd mcu wget https://github.com/sophgo/mcu/releases/download/2025.01.20/mcu-util-riscv64 -# Use the file below for Milk-V Pioneer; for other boards please choose accordingly at the GitHub Release page. +# For Milk-V Pioneer; choose the correct binary for other boards from the release page. wget https://github.com/sophgo/mcu/releases/download/2025.01.20/sg2042evb-mcu-v8-2025-01-20-10-21-22.bin ``` -Then load `i2c-dev` kernel module and start flashing: +Load the `i2c-dev` kernel module and perform the upgrade: ```shell sudo modprobe i2c-dev @@ -140,7 +128,7 @@ chmod +x mcu-util-riscv64 sudo ./mcu-util-riscv64 upgrade-full 1 0x17 sg2042evb-mcu-v8-2025-01-20-10-21-22.bin ``` -If everything goes fine then you should get log like this: +Typical output appears as: ```log erase page 0000e000 @@ -149,6 +137,4 @@ read flash 00010000 100% verify flash data ok ``` -After finishing the flashing process, please power off the board and cut off the AC power entirely. - -It is recommended to wait for around 1~5 minutes before plugging in and power on the board. \ No newline at end of file +After the upgrade, power the machine off and disconnect it from mains power. Leave it off for one to five minutes before powering on again. diff --git a/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx b/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx index f9194696..3cb8fd8d 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx @@ -9,23 +9,21 @@ import { DownloadLink } from "@site/src/components/ImageLinks"; ## Introduction -[RevyOS](https://github.com/revyos) is a Debian based custom distribution developed and maintained by the RevyOS team under RuyiSDK, specifically optimized for the XuanTie chip ecosystem. +[RevyOS](https://github.com/orgs/revyos/repositories) is a Debian-based customised distribution developed and maintained by the RevyOS squad of the RuyiSDK team for the XuanTie chip ecosystem. -RevyOS is part of [RuyiSDK](https://github.com/ruyisdk), an open-source project initiated by PLCT Lab, aimed at providing a convenient and comprehensive development environment for RISC-V developers. It offers the latest hardware information and software support, such as details about supported hardware devices and software components like OS images (e.g., RevyOS), toolchains, and package managers. +RevyOS is part of [RuyiSDK](https://ruyisdk.org/), an open-source project initiated by [PLCT Lab](https://plctlab.org/zh/). The goal of RuyiSDK is to provide a convenient and comprehensive development environment for RISC-V developers. It delivers up-to-date hardware information and software support, including details on supported devices as well as software components such as images (e.g. RevyOS), toolchains, and package managers. -__RevyOS__ provides complete and thorough support for XuanTie chips including XuanTie C906, C910, C920, C908, with default integration of the XuanTie extended instruction sets and the GCC toolchain supporting RVV 1.0. It also features Glibc and Kernel optimized with RVV 1.0 instruction set. +__RevyOS__ offers comprehensive adaptation and optimisation for XuanTie C906, C910, C920, C908 and other processors. It ships with a GCC toolchain that supports the XuanTie extension instruction set and RVV 1.0 by default, together with Glibc and the kernel that are tuned for RVV 1.0. -Currently, __RevyOS__ meets basic user needs in office work, web browsing, and video watching. +At present, __RevyOS__ already satisfies day-to-day needs in office work, web browsing, and video playback. -Based on these customizations and optimizations, __RevyOS__ delivers excellent performance and a great experience on hardware platforms like Lichee Pi 4A, BeagleV-Ahead, and Milk-V Pioneer. +Thanks to these customisations and optimisations, __RevyOS__ delivers excellent performance and user experience on hardware platforms such as Milk-V Meles and Lichee Pi 4A. -## Image Download and Installation +## Image Download -The user version images of __RevyOS__ are currently updated on the [ISCAS (Institute of Software, Chinese Academy of Sciences)](https://mirror.iscas.ac.cn/revyos) / [Felix Finland Source](https://mirrors.felixc.at/revyos/) open-source mirror sites. +The user-edition images of __RevyOS__ are currently updated on the [ISCAS mirror](https://mirror.iscas.ac.cn/revyos/extra/images/). To obtain the latest image, visit the [download directory](https://mirror.iscas.ac.cn/revyos/extra/images/) and select the files that correspond to your device. After downloading, follow the [image flashing instructions](../Installation/intro/) for your board. -If you want to obtain the latest version of __RevyOS__, please select the corresponding device to download the appropriate U-Boot, boot partition, and root partition files. After downloading, please visit [Installation](../Installation/intro/) for the installation guide for your device. - -| Supported Devices | Image Download (Latest Version) | SD Card Support | +| Supported Devices | Image Download (Latest Version) | SD Card Support | | ---------------------------------- | -------------------------------------------------------------------------------- | --------- | | Lichee Pi 4A | {} | Supported | | Milk-V Meles | {} | Supported | @@ -43,9 +41,7 @@ If you want to obtain the latest version of __RevyOS__, please select the corres ~~For more details, see this document: [How to Enable Optimized GCC](../build/debian/enable_optimization_gcc/).~~ :::warning -When the toolchain of RevyOS is upgraded to gcc14, this repository is abandoned. -There will be a replacement for c910v repo later. Please wait for further updates. -([Issue Track #124](https://github.com/revyos/revyos/issues/124)) +Since the RevyOS toolchain has been upgraded to GCC 14, the `c910v` repository used by the T-Head optimised GCC is deprecated. Please wait for subsequent updates. ([Tracking issue #124](https://github.com/revyos/revyos/issues/124)) ::: ## Changelog @@ -66,4 +62,4 @@ RevyOS has its own Telegram group: [Invitation Link](https://t.me/+Pi6px22-OsUxM ## Internship Recruitment -We are currently recruiting test interns. For more information, visit: [RevyOS Team Test Intern Recruitment](https://github.com/plctlab/weloveinterns/blob/master/open-internships.md#j143-revyos%E5%B0%8F%E9%98%9F%E6%B5%8B%E8%AF%95%E5%AE%9E%E4%B9%A0%E7%94%9F20241111%E5%BC%80%E6%94%BE100%E5%90%8D) (Chinese only) +We are currently recruiting testing interns. For details, please see [RevyOS Team Testing Intern Recruitment](https://github.com/plctlab/weloveinterns/blob/master/open-internships.md#j143-revyos%E5%B0%8F%E9%98%9F%E6%B5%8B%E8%AF%95%E5%AE%9E%E4%B9%A0%E7%94%9F20241111%E5%BC%80%E6%94%BE100%E5%90%8D). diff --git a/i18n/en/docusaurus-plugin-content-docs/current/issue.md b/i18n/en/docusaurus-plugin-content-docs/current/issue.md index b2c2ede0..bbd62236 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/issue.md +++ b/i18n/en/docusaurus-plugin-content-docs/current/issue.md @@ -1,6 +1,6 @@ # Submitting Issues and Known Issues -Thank you for using RevyOS! If you encounter any problems or discover bugs during use, please follow these steps: +Thank you for using RevyOS! If you run into problems, discover bugs, have feature requests, or simply want to make a wish, please refer to the information below. ## Submitting a New Issue @@ -19,20 +19,17 @@ Thank you for using RevyOS! If you encounter any problems or discover bugs durin Before submitting a new issue, we recommend checking our record of known issues: - Visit the Discussions page: [Known Compatibility Issues](https://github.com/orgs/revyos/discussions/83) -- Check if someone has already reported the same or a similar issue. If the issue already exists, you can: -- Add a comment to the corresponding issue or discussion to provide more information. +- Add a comment to the corresponding issue or discussion to provide further information so the testing team can follow up. ## Tips -- Ensure your issue has not been submitted previously. -- Providing detailed and complete information will help us resolve the issue faster. +- Provide complete and detailed information so the testing team can reproduce the issue quickly and help you resolve it sooner. ## Contact Us -If you would like to discuss any issues encountered during use, you can reach us through the following channels: +If you would like to discuss issues encountered during use, contact us via: -- Join the Telegram group: [Invitation Link](https://t.me/+Pi6px22-OsUxM2M1) -- Send an email to: [support@revyos](mailto:chenglongcan@iscas.ac.cn) +- Join the Telegram group: [Invitation Link](https://t.me/+Pi6px22-OsUxM2M1) diff --git a/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/env.mdx b/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/env.mdx index bfff665c..f4bed073 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/env.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/env.mdx @@ -8,73 +8,63 @@ import TabItem from '@theme/TabItem'; # Basic Environment Setup -This section describes how to **set up an x86 computer and a LicheePi development board** to prepare for running models on the NPU or CPU of the board. +This guide configures **an x86 computer and a Lichee Pi development board** so that models can run on the board's NPU or CPU. -:::info[Why is an x86 machine required?] +:::info[Why do I still need an x86 machine?] +Before a model can run on the development board, you must use an x86 machine to convert generic models such as ONNX into computation graphs and glue code that are executable on the board's CPU/NPU via the `hhb` tool. The glue code and related application code must then be cross-compiled into binaries for the board. -To run models on the development board, it is first necessary to use the hhb tool on an x86 machine to convert general models such as ONNX into computation graphs and glue code executable by the board's CPU/NPU. The glue code and related application code must then be cross-compiled into binaries that can run on the board. - -Since x86 machines generally offer higher performance and the hhb tool only supports the x86 architecture, an additional x86 computer is required for model conversion. +Because x86 machines generally offer higher performance—and because the `hhb` tool only supports the x86 architecture—an additional x86 computer is required to complete the model conversion workflow. ::: ## Development Board Setup -Lichee Pi 4A is a development board launched by Sipeed based on the TH1520 chip. For basic out-of-the-box configuration, refer to the [official hardware documentation](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/2_unbox.html). The recommended operating system is [RevyOS version 20250729](https://fast-mirror.isrc.ac.cn/revyos/extra/images/lpi4a/20250729/). For instructions on flashing RevyOS, see the [installation guide](../../../Installation/intro). +Lichee Pi 4A is a development board produced by Sipeed that features the TH1520 SoC. For the basic out-of-the-box setup, consult the [official hardware guide](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/2_unbox.html). Flash [RevyOS version 20250729](https://fast-mirror.isrc.ac.cn/revyos/extra/images/lpi4a/20250729/) onto the board. See the [image flashing guide](../../../Installation/intro) for details. ### Installing Basic Tools -RevyOS does not include `pip` and other basic tools by default. Install them as follows: +By default, RevyOS does not include `pip` and several other fundamental tools, so install them first: ```shell-session debian@revyos-lpi4a:~$ sudo apt install python3-pip python3-venv wget curl git # Install required packages -debian@revyos-lpi4a:~$ mkdir npu # Create a Python virtual environment +debian@revyos-lpi4a:~$ mkdir npu # Create a directory for the Python virtual environment debian@revyos-lpi4a:~$ cd npu debian@revyos-lpi4a:~/npu$ python3 -m venv .venv debian@revyos-lpi4a:~/npu$ . .venv/bin/activate # Activate the virtual environment -(.venv) debian@revyos-lpi4a:~/npu$ # Now inside the virtual environment +(.venv) debian@revyos-lpi4a:~/npu$ # Prompt shows the active virtual environment ``` -If the installation and activation are successful, the command prompt should be prefixed with `(.venv)`, indicating the active virtual environment. +After activation, the shell prompt should display `(.venv)` to indicate the current virtual environment. -:::info[Why use a virtual environment?] -Unlike the [original Yuque documentation](https://www.yuque.com/za4k4z/yp3bry/tx9hcuw35s9x24po#Cv3Tw), this guide adds a section on creating a virtual environment. In the original, packages such as `shl-python` are installed system-wide, which may conflict with system Python packages managed by `apt` (e.g., `python3-*`). Using a virtual environment isolates packages installed via `pip` and prevents conflicts with `apt`. For details, see [PEP 668](https://peps.python.org/pep-0668/). +:::info[Why create a virtual environment?] +Unlike the [original Yuque article](https://www.yuque.com/za4k4z/yp3bry/tx9hcuw35s9x24po#Cv3Tw), this document adds a dedicated section for virtual environments. The original guide installs packages such as `shl-python` system-wide, which conflicts with the system Python packages managed by `apt` (e.g. `python3-*`). Using a virtual environment isolates packages installed via `pip` and avoids clashes with `apt`. See [PEP 668](https://peps.python.org/pep-0668/) for details. ::: ### Installing the SHL Library -:::note[About SHL] - -SHL (Structure of Heterogeneous Library) is a high-performance heterogeneous computing library provided by T-Head. Its main function interfaces use the CSI-NN2 API for the C-SKY CPU platform and provide a series of optimized binary libraries. [User Manual](https://www.xrvm.cn/document?temp=standard&slug=shl-user-manual) -::: - -Install the SHL library using `pip` within the virtual environment: - -:::caution[Version Compatibility] -The `shl-python` package is updated frequently, and the latest version may not be compatible with all boards or example code. -**It is important to install a version of `shl-python` that matches your board and the examples you are following.** -For example, for the LPI4A board, version `2.6.17` is known to be compatible with most provided examples. -Check your board documentation or example requirements for the recommended version. -::: - -To install a specific compatible version (e.g., `2.6.17`): - +:::note[What is SHL?] +SHL (Structure of Heterogeneous Library) is a high-performance heterogeneous computing library provided by T-Head. Its main function interfaces adopt the CSI-NN2 API for the XuanTie CPU platform and come with a collection of optimised binary libraries. Refer to the [user manual](https://www.xrvm.cn/document?temp=standard&slug=shl-user-manual) for more information. ::: -To install a specific compatible version (e.g., `2.6.17`): +Install SHL within the virtual environment using `pip`: +```shell-session +(.venv) debian@revyos-lpi4a:~/npu$ pip3 install shl-python -i https://pypi.tuna.tsinghua.edu.cn/simple +... +Successfully installed shl-python-3.2.2 +``` -:::note[Setting a PyPI Mirror] -The default PyPI server is located overseas, which may cause network issues in mainland China. Use the `-i` option to specify a temporary PyPI mirror. For more information, refer to [Tsinghua University PyPI Mirror Usage Guide](https://mirrors.tuna.tsinghua.edu.cn/help/pypi/) +:::note[Configure a PyPI mirror] +The default PyPI infrastructure is hosted overseas, which can lead to connectivity issues in mainland China. The `-i` argument lets you select an alternative mirror. For more instructions, see the [Tsinghua University PyPI mirror guide](https://mirrors.tuna.tsinghua.edu.cn/help/pypi/). ::: -After installation, use the SHL module's `--whereis` command to check the installation path. +After installation, query SHL's location with the `--whereis` option: ```shell-session {2} @@ -90,45 +80,43 @@ After installation, use the SHL module's `--whereis` command to check the instal -Based on the output path (as highlighted above), set the `LD_LIBRARY_PATH` environment variable to specify the dynamic library search path. For example: +Based on the reported path (highlighted above), set the `LD_LIBRARY_PATH` so the dynamic linker can find SHL's libraries: ```shell-session -$ export SHL_PATH=/home/debian/npu/.venv/lib/python3.11/site-packages/shl/install_nn2/th1520/lib # Use the path from above +$ export SHL_PATH=/home/debian/npu/.venv/lib/python3.11/site-packages/shl/install_nn2/th1520/lib # Use the path printed above ``` ```shell-session -$ export SHL_PATH=/home/debian/npu/.venv/lib/python3.11/site-packages/shl/install_nn2/c920/lib # Use the path from above +$ export SHL_PATH=/home/debian/npu/.venv/lib/python3.11/site-packages/shl/install_nn2/c920/lib # Use the path printed above ``` -Add it to the environment variables: - ```shell-session $ export LD_LIBRARY_PATH=$SHL_PATH:$LD_LIBRARY_PATH ``` -To make this setting persistent, add the above `export` command to your `~/.bashrc` or `~/.profile`. +Append the `export` command to `~/.bashrc` or `~/.profile` if you need the setting to persist. ### Installing HHB-onnxruntime -HHB-onnxruntime integrates the SHL backend (execution providers), enabling onnxruntime to utilize SHL's high-performance code optimized for C-SKY CPUs. +HHB-onnxruntime integrates the SHL backend (execution providers), allowing onnxruntime to reuse SHL's high-performance kernels tuned for XuanTie CPUs. ```shell-session @@ -146,13 +134,13 @@ $ pip install numpy-1.25.0-cp311-cp311-linux_riscv64.whl hhb_onnxruntime_c920-2. -:::note[About Github Network Proxy] -If you experience network issues accessing GitHub from mainland China, consider using a network proxy tool to accelerate access. +:::note[About GitHub network proxies] +If accessing GitHub from mainland China is slow or unreliable, consider enabling a network proxy to improve connectivity. ::: ### NPU Driver Configuration -Compared to CPU execution, NPU inference requires the NPU driver module `vha` to be loaded. Use `lsmod` to list loaded drivers: +Compared with CPU execution, NPU inference requires that the `vha` kernel module be loaded. Check the loaded modules with: ```shell-session {2-3} $ lsmod | grep vha @@ -160,35 +148,35 @@ vha 970752 0 img_mem 827392 1 vha ``` -If the `vha` module (highlighted above) is not listed, load it manually: +If `vha` (highlighted above) is absent, load it manually: ```shell-session $ sudo modprobe vha vha_info img_mem ``` -:::info[User-space NPU Driver Configuration] -In addition to the kernel driver, user-space drivers are also required for NPU execution. Check the `/usr/lib` directory for the following libraries: +:::info[NPU user-space driver configuration] +Besides the kernel driver, user-space components are required. Verify that `/usr/lib` already contains the following libraries: - `libimgdnn.so` - `libnnasession.so` - `libimgdnn_execute.so` -These libraries are pre-installed in RevyOS and generally do not require manual installation. +These libraries are preinstalled in RevyOS, so manual installation is normally unnecessary. ::: ### NPU Device Permission Configuration -After loading the NPU driver, the device `/dev/vha0` may require permission adjustment for user access. For convenience, set the device permission to 0666 (read/write for all users): +After the driver is loaded, you might need to adjust the permissions on `/dev/vha0` so regular users can access the device. For convenience, grant read/write access to all users: ```shell-session -$ sudo chmod 0666 /dev/vha0 # Set device permission to 0666 +$ sudo chmod 0666 /dev/vha0 # Set the device permission to 0666 ``` -For security, it is recommended to configure `udev` rules for device management. Consult AI or documentation for `udev` configuration. +For better security, configure `udev` rules to manage the device permissions; you can ask an AI assistant how to write the rules. ## x86 Machine Setup -Unlike the [original Yuque documentation](https://www.yuque.com/za4k4z/yp3bry/tx9hcuw35s9x24po#rVPRY), this guide uses a pre-built Docker image for installation. Please ensure Docker is installed on your computer. +Unlike the [original Yuque tutorial](https://www.yuque.com/za4k4z/yp3bry/tx9hcuw35s9x24po#rVPRY), this guide relies on a pre-built Docker image. Make sure Docker is installed on your x86 machine. ### Obtaining and Running the HHB Image @@ -197,21 +185,21 @@ $ docker pull hhb4tools/hhb:2.6.17 # Pull the HHB image $ docker run --rm -it hhb4tools/hhb:2.6.17 bash # Start a temporary HHB container ``` -:::warning[HHB Image Size] -The HHB image is large (~7GB). Downloading may take some time. Please ensure sufficient disk space. +:::warning[HHB image size] +The HHB image is large (about 7 GB). Downloading it may take time, so please wait patiently and confirm that you have sufficient disk space. ::: -After running the above commands, the container will start and you can operate within it. +After running the commands above, the container starts and you can work inside it. -:::warning[Container Filesystem] -The container filesystem is temporary. All files created inside the container will be deleted upon exit. It is recommended to copy generated files to the host or use a persistent container. +:::warning[Container filesystem] +The container filesystem is ephemeral. All files created inside the container are removed when it exits. Therefore, copy the generated files back to the host after you finish, or run a persistent container if required. -For more information, refer to the [Docker Official Documentation](https://docs.docker.com/get-started/overview/) or consult AI. +For more information about Docker, see the [official documentation](https://docs.docker.com/get-started/overview/) or consult an AI assistant. ::: ### Obtaining Example Code {#example-code} -The example code for this tutorial is available on [Github](https://github.com/zhangwm-pt/hhb-examples). Clone it locally using: +The example code accompanying this tutorial is hosted on [GitHub](https://github.com/zhangwm-pt/hhb-examples). Clone it locally: ```shell-session $ git clone https://github.com/zhangwm-pt/lpi4a-example.git @@ -219,10 +207,11 @@ $ git clone https://github.com/zhangwm-pt/lpi4a-example.git ### Obtaining OpenCV -This tutorial uses OpenCV 4.5, optimized for the C920 RISC-V vector spec 0.7.1. Precompiled binaries are available, and the source code can be downloaded from the [OCC download page](https://occ.t-head.cn/community/download?id=4112956065753141248). +This tutorial uses OpenCV 4.5, which has been tuned for the C920 processor and RISC-V vector specification 0.7.1. Prebuilt binaries are supplied, and the source code can be downloaded from the [OCC download page](https://occ.t-head.cn/community/download?id=4112956065753141248). -The precompiled C++ binaries are hosted on [Github](https://github.com/zhangwm-pt/prebuilt_opencv). To update the submodule in the [example program](#example-code), run: +The precompiled C++ binaries are stored on [GitHub](https://github.com/zhangwm-pt/prebuilt_opencv). To update the submodule in the [example program](#example-code), run: ```shell-session -$ # Assuming you are in the repository root -$ git submodule update --init -- \ No newline at end of file +$ # Assume you are in the repository root +$ git submodule update --init --recursive +``` diff --git a/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolov5.mdx b/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolov5.mdx new file mode 100644 index 00000000..710f6683 --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolov5.mdx @@ -0,0 +1,215 @@ +--- +title: YOLOv5 +description: Tutorial for Running the YOLOv5 Model on the RevyOS System +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## YOLOv5 + +This tutorial explains how to run the YOLOv5 model on the RevyOS system using either the CPU or the NPU. + +:::info[Initial Environment Configuration] +Before proceeding with this tutorial, please ensure you have completed the [Environment Configuration](../../env) section. +::: + +## Obtaining Example Code + +The example code accompanying this tutorial is available on [GitHub](https://github.com/zhangwm-pt/lpi4a-example). Clone it to your local machine using the `git` command. + +```shell-session +$ git clone https://github.com/zhangwm-pt/lpi4a-example.git +``` + +The code relevant to this tutorial is located in the `detection/yolov5` directory. + +## Model Acquisition + +The model used in this tutorial originates from the YOLOv5 repository and can be exported via its `export.py` script. +```python +$ git clone https://github.com/ultralytics/yolov5.git +$ cd yolov5 +$ pip3 install ultralytics +$ python3 export.py --weights yolov5n.pt --include onnx --imgsz 384 640 +``` + +:::note[About Github Network Proxy] +If you experience network issues when accessing GitHub from mainland China, consider using a network proxy tool to accelerate access. +::: + +## Model Conversion and Compilation + +After completing the environment configuration, you can use HHB to compile the model into an executable program for the C920. + +This tutorial uses the YOLOv5n detection model. For YOLOv5n, the HHB command truncates the graph at the final convolutional layer, and the subsequent post-processing is delegated to the provided `yolov5n.c` file. + +Navigate to the `detection/yolov5` directory and execute the following command: + + + +```shell-session +$ hhb -D --model-file yolov5n.onnx --data-scale-div 255 \ + --board c920 --input-name "images" --output-name \ + "/model.24/m.0/Conv_output_0;/model.24/m.1/Conv_output_0;/model.24/m.2/Conv_output_0" \ + --input-shape "1 3 384 640" --quantization-scheme float16 +``` + + +```shell-session +$ hhb -D --model-file yolov5n.onnx --data-scale-div 255 \ + --board th1520 --input-name "images" --output-name \ + "/model.24/m.0/Conv_output_0;/model.24/m.1/Conv_output_0;/model.24/m.2/Conv_output_0" \ + --input-shape "1 3 384 640" --calibrate-dataset kite.jpg \ + --quantization-scheme "int8_asym" +``` + + + +:::info[About Parameters] +- `-D`: Directs HHB to stop after generating the executable file +- `--model-file`: Specifies the input model file +- `--data-mean`: Specifies the mean value +- `--data-scale`: Specifies the scaling value +- `--board`: Specifies the target platform as C920 (CPU) or TH1520 (NPU) +- `--input-name`: Names the model input tensor +- `--output-name`: Names the model output tensor +- `--input-shape`: Specifies the model input tensor shape +- `--postprocess`: Configures the post-processing behavior for HHB-generated glue code; `save_and_top5` saves the outputs and prints the top-5 results +- `--quantization-scheme`: Specifies the quantization type + +You can run `hhb --help` to view all available parameters and options. +::: + +:::info[About HHB Generated Files] +After the command finishes, the current directory contains a newly created `hhb_out` subdirectory with files such as: + +- `hhb.bm`: HHB model file containing quantized weight data +- `hhb_runtime`: Executable file for the development board, compiled from the C sources in this directory +- `main.c`: Reference entry point for the HHB-generated example program +- `model.c`: HHB model structure representation file +- `model.params`: Model weight file +- `io.c`: HHB-generated example program providing file I/O helper functions +- `io.h`: HHB-generated example program providing file I/O function declarations +- `process.c`: HHB-generated example program providing image preprocessing functions +- `process.h`: HHB-generated example program providing image preprocessing function declarations +::: + +### GCC Post-processing Compilation + +This tutorial implements the latter portion of the model and NMS in C so that post-processing yields detection results for the output image. +```C +$ riscv64-unknown-linux-gnu-gcc yolov5n.c -o yolov5n_example hhb_out/io.c \ + hhb_out/model.c -Wl,--gc-sections -O2 -g -mabi=lp64d -I hhb_out/ -L \ + /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/lib/ \ + -lshl -L /usr/local/lib/python3.8/dist-packages/hhb/prebuilt/decode/install/lib/rv \ + -L /usr/local/lib/python3.8/dist-packages/hhb/prebuilt/runtime/riscv_linux \ + -lprebuilt_runtime -ljpeg -lpng -lz -lstdc++ -lm -I \ + /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/include/ -mabi=lp64d \ + -march=rv64gcv0p7_zfh_xtheadc -Wl,-unresolved-symbols=ignore-in-shared-libs -I \ + /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/include/shl_public/ \ + -I /usr/local/lib/python3.8/dist-packages/hhb/install_nn2/th1520/include/csinn/ +``` + +In the example code, the SHL library is linked; for example, its installation directory can be `/usr/local/lib/python3.8/dist-packages/shl`. + +:::info[Option Descriptions] +- `-Ihhb_out -I/usr/local/lib/python3.8/dist-packages/shl/install_nn2/c920/include/`: Header search paths that include the SHL headers +- `-L/usr/local/lib/python3.8/dist-packages/shl/install_nn2/c920/lib`: Library search path that points to the precompiled SHL binaries +- `-static`: Enables static linking +- `-o yolov5n_example`: Specifies the name of the generated executable +::: + +After successful compilation, a `yolov5n_example` file will be generated in the example directory. + +## Execution + +After cross-compilation, copy the required files to the development board directory. + +For example, with board IP 10.63.x.x using /demo directory, copy the example program directory using scp: + +```bash +scp -r yolov5n th1520@10.63.x.x:/demo/ +``` + +When executing from the Linux command line on the board's terminal, the terminal output reports the following stages: +1. Preprocessing: Scale and pad the original image to 384 × 640 +2. Model execution and post-processing: Perform model inference and apply NMS +3. Bounding box drawing: Render the detection results on the 384 × 640 image + +:::info[Required Execution Files] +- `kite.jpg`: Input image +- `image_preprocessed.bin`: Preprocessing intermediate result +- `yolov5n_example`: Model execution file compiled on the x86 host with GCC +- `hhb_out/hhb.bm`: Model execution file generated on the x86 host by HHB +- `detect.txt`: Post-processing output file containing 4 detected objects +- `kite_result.jpg`: Output image with detection boxes added +::: + +## Reference Results + +The input image shows a family of three flying a kite. YOLOv5 is expected to detect three people and one kite. +![Input Image](/img/image-for-flash/yolov5.png) +![Detection Image](/img/image-for-flash/yolov5_2.png) + +When the example runs successfully, the terminal prints output similar to the following: + + + +```shell-session +$ .python3 inference.py + ********** preprocess image ********** + ******* run yolov5 and postprocess ******* +Run graph execution time: 401.13336ms, FPS=2.49 +detect num: 4 +id: label score x1 y1 x2 y2 +[0]: 0 0.899609 274.486389 158.510849 359.157715 332.118591 +[1]: 0 0.880201 80.017410 184.470093 190.141861 349.840637 +[2]: 0 0.844358 219.474869 221.711838 283.615723 333.643250 +[3]: 33 0.667759 67.194008 174.118088 203.020660 220.667618 + ********** draw bbox ********** +[274.486389, 158.510849, 359.157715, 332.118591, 0.899609, 0] +[80.01741, 184.470093, 190.141861, 349.840637, 0.880201, 0] +[219.474869, 221.711838, 283.615723, 333.64325, 0.844358, 0] +[67.194008, 174.118088, 203.02066, 220.667618, 0.667759, 33] +``` + + +```shell-session +$ python3 inference.py + ********** preprocess image ********** + ******* run yolov5 and postprocess ******* +INFO: NNA clock:1001624 [kHz] +INFO: Heap :anonymous (0x2) +INFO: Heap :dmabuf (0x2) +INFO: Heap :unified (0x5) +WARNING: Mapping to the on chip ram failed (128 > 0), continuing... +FATAL: Importing 737280 bytes of CPU memory has failed (Invalid argument) +Run graph execution time: 11.96299ms, FPS=83.59 +detect num: 4 +id: label score x1 y1 x2 y2 +[0]: 0 0.895277 273.492188 161.245056 359.559814 330.644257 +[1]: 0 0.887368 79.860062 179.181244 190.755692 354.304474 +[2]: 0 0.815214 222.054565 224.477600 279.828979 333.717285 +[3]: 33 0.563324 67.625580 173.948883 201.687988 219.065765 + ********** draw bbox ********** +[273.492188, 161.245056, 359.559814, 330.644257, 0.895277, 0] +[79.860062, 179.181244, 190.755692, 354.304474, 0.887368, 0] +[222.054565, 224.4776, 279.828979, 333.717285, 0.815214, 0] +[67.62558, 173.948883, 201.687988, 219.065765, 0.563324, 33] +``` + + diff --git a/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolox.mdx b/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolox.mdx new file mode 100644 index 00000000..2ee1438c --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-docs/current/npu/lpi4a/object-detection/yolox.mdx @@ -0,0 +1,111 @@ +--- +title: YOLOX +description: Tutorial for Running the YOLOX Model on the RevyOS System +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + +## YOLOX + +This tutorial demonstrates how to deploy the YOLOX object detection model on the **LicheePi 4A** and implement efficient inference using **HHB-onnxruntime**. + + +:::info[Initial Environment Configuration] +Before proceeding with this tutorial, please ensure you have completed the [Environment Configuration](../../env) section. +::: + +## Obtaining Example Code + +The example code accompanying this tutorial is available on [GitHub](https://github.com/zhangwm-pt/lpi4a-example). Clone it to your local machine using the `git` command. + +```shell-session +$ git clone https://github.com/zhangwm-pt/lpi4a-example.git +``` +The code relevant to this tutorial is located in the `detection/yolox` directory. + +## Model Acquisition + +The model we use is from [Megvii-BaseDetection/YOLOX](https://github.com/Megvii-BaseDetection/YOLOX). You can download the YOLOX model using the following commands: + +```shell-session +$ git clone https://github.com/Megvii-BaseDetection/YOLOX.git +$ cd YOLOX/demo/ONNXRuntime +$ wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.onnx +``` + +:::note[About Github Network Proxy] +If you experience network issues when accessing GitHub from mainland China, consider using a network proxy tool to accelerate access. +::: + +## Source Code Modification +Modify the beginning of the file demo/ONNXRuntime/onnx_inference.py by adding lines four and five as shown below: +```python +#!/usr/bin/env python3 +# Copyright (c) Megvii, Inc. and its affiliates. + ++import sys ++sys.path.insert(0, "../../") + +import argparse +import os +``` +The code uses sys.path.insert to specify the search path, thereby eliminating the need to install the YOLOX package from source. + +## Environment Preparation + +The YOLOX example in this tutorial depends on multiple Python packages. Download the pre-compiled Python packages: +```shell-session +$ git clone -b python3.11 https://github.com/zhangwm-pt/prebuilt_whl.git +$ cd prebuilt_whl +``` + +Alternatively, manually download and install the packages using: +``` +$ pip3 install numpy-1.25.0-cp311-cp311-linux_riscv64.whl +$ pip3 install opencv_python-4.5.4+4cd224d-cp311-cp311-linux_riscv64.whl +$ pip3 install kiwisolver-1.4.4-cp311-cp311-linux_riscv64.whl +$ pip3 install Pillow-9.5.0-cp311-cp311-linux_riscv64.whl +$ pip3 install matplotlib-3.7.2.dev0+gb3bd929cf0.d20230630-cp311-cp311-linux_riscv64.whl +$ pip3 install pycocotools-2.0.6-cp311-cp311-linux_riscv64.whl +$ pip3 install loguru-0.7.0-py3-none-any.whl +$ pip3 install MarkupSafe-2.1.3-cp311-cp311-linux_riscv64.whl +$ pip3 install torch-2.0.0a0+gitc263bd4-cp311-cp311-linux_riscv64.whl +$ pip3 install torchvision-0.15.1a0-cp311-cp311-linux_riscv64.whl +$ pip3 install psutil-5.9.5-cp311-abi3-linux_riscv64.whl +$ pip3 install tqdm-4.65.0-py3-none-any.whl +$ pip3 install tabulate-0.9.0-py3-none-any.whl +``` +During installation, pip automatically resolves any additional pure Python dependencies from the official source. + + +## Inference Execution + +Within the example directory, run the `onnx_inference.py` sample: + +```bash +$ python3 onnx_inference.py -m yolox_s.onnx -i ../../assets/dog.jpg -o outdir -s 0.7 --input_shape 640,640 +``` + +:::info[About Parameters] + +- `-m`: Specifies the model file +- `-i`: Specifies the input image path +- `-o`: Specifies the output directory +- `-s`: Sets the detection threshold +- `--input_shape`: Specifies the input image dimensions +::: + +## Reference Results + +In this tutorial, the input is as shown in the following figure. Under a threshold of 0.7, the expected detection results of YOLOX are as follows. + +![Input Image](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_input.jpg) + +After normal execution of the example, a result image dog.jpg will be generated in the outdir directory. The image will show detected objects with bounding boxes and probability annotations, as shown in the image below: + +![Detection Results](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_output.jpg) + +The detection identifies two people and one soccer ball. diff --git a/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/bert-on-npu.md b/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/bert-on-npu.md deleted file mode 100644 index 876c8486..00000000 --- a/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/bert-on-npu.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: Running BERT Model on LicheePi 4A TH1520 NPU (HHB Quantization & Inference) -sidebar_position: 3 ---- - -# Running BERT Model on LicheePi 4A TH1520 NPU (HHB Quantization & Inference) - -This article details how to deploy and run the BERT model on the TH1520 NPU of Licheepi 4A, including the complete process of quantization and inference using the HHB tool. - -## BERT Model Introduction - -BERT (Bidirectional Encoder Representations from Transformers) is a pre-trained language model widely used in natural language processing. - -This tutorial introduces how to use the **HHB (Heterogeneous Hybrid Binary)** toolchain on the **Licheepi 4A TH1520 development board** to compile and run the **BERT model** for reading comprehension inference tasks. - ------- - -## **1. Environment Preparation** - -### **1.1. Ensure HHB is Installed** - -After setting up the NPU-related environment according to the [documentation](https://github.com/jason-hue/plct/blob/main/%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3/LIcheepi%204A%E9%83%A8%E7%BD%B2%20mobilenetv2%20%E6%A8%A1%E5%9E%8B%E5%AE%8C%E6%88%90%E5%9B%BE%E5%83%8F%E5%88%86%E7%B1%BB%E7%9A%84%E7%A4%BA%E4%BE%8B.md), enter the Docker image of the HHB environment. - -### **1.2. Download the BERT Model and Sample Code** - -First, obtain the model. The model used in this tutorial is from the Google BERT repository, converted to an ONNX version of the BERT model. It can be downloaded to the `/home/example/c920/bert_small` directory using the following command: - -```bash -cd /home/example/c920/bert_small - -wget https://github.com/zhangwm-pt/bert/releases/download/onnx/bert_small_int32_input.onnx -``` - ------- - -## **2. Compile the BERT Model Using HHB** - -To cross-compile the ONNX model into an executable program for NPU, you need to use the hhb command. Note that NPU only supports 8-bit or 16-bit fixed-point operations; this example specifies int8 asymmetric quantization. When compiling, you need to first enter the example directory. - -### **2.1. Enter the BERT Directory** - -```bash -cd /home/example/c920/bert_small -``` - -### **2.2. Run HHB Compilation** - -Note that you must use the toolchain here, otherwise the compiled binary file will not run on LicheePi4A. - -```bash -export PATH=/tools/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1-light.1/bin/:$PATH -``` - -```bash -hhb --model-file bert_small_int32_input.onnx --input-name "input_ids;input_mask;segment_ids" --input-shape '1 384;1 384;1 384' --output-name "output_start_logits;output_end_logits" --board c920 --quantization-scheme "float16" --postprocess save_and_top5 -D --without-preprocess -``` - -### **2.3. Option Descriptions** - -| Option | Description | -| ----------------------- | ---------------------------------- | -| `-D` | Generate executable file | -| `--model-file` | Specify ONNX BERT model | -| `--input-name` | Model input name | -| `--output-name` | Model output name | -| `--input-shape` | Input data shape | -| `--board` | Specify target platform (TH1520) | -| `--quantization-scheme` | Quantization method (int8/float16) | -| `--postprocess` | Output results and print top5 | - ------- - -## **3. Generated Files** - -After HHB runs, a `hhb_out/` directory is generated in the current directory, containing: - -``` -hhb_out/ -├── hhb.bm # Quantized model file -├── hhb_runtime # Executable inference program -├── main.c # Reference example entry point -├── model.c # Model structure code -├── model.params # Quantized weight data -├── io.c / io.h # File I/O helper code -├── process.c / process.h # Preprocessing functions -``` - ------- - -## **4. Transfer to the Development Board** - -Copy the compiled model and files to the host machine: - -```bash -docker cp 65f872394fa5837ef2c24ade731b152da074ac6091f0766c04ac54092ff32780:/home/example/c920/bert_small C:\Users\knifefire\Downloads\ -``` - -Then upload to the development board, and on the development board: - -```bash -cd ~/bert_small -chmod +x hhb_out/hhb_runtime # Grant execution permission -``` - ------- - -## **5. Run Inference** - -```bash -python3 inference.py -``` - ------- - -## **6. Expected Output** - -BERT processing questions from the SQuAD dataset: - -The reference input in this example comes from the SQuAD dataset, which is a reading comprehension dataset consisting of questions posed on a set of Wikipedia articles, where the answer to each question is a segment of text from the corresponding reading passage or the question. -The input for this example is as follows, where the article content describes a football game, and the question is about who participated in the game. - -```bash -[Context]: Super Bowl 50 was an American football game... -[Question]: Which NFL team represented the AFC at Super Bowl 50? -``` - -**BERT Output Answer** - -Based on the reading comprehension result, the expected output will be Denver Broncos - -``` -[Answer]: Denver Broncos -``` - -**Execution Time** - -``` -Run graph execution time: 1713.15491ms, FPS=0.58 -``` - -##### Reference Output: - -```bash -# python3 inference.py - ********** preprocess test ********** -[Context]: Super Bowl 50 was an American football game to determine the champion of the National Football League (N -FL) for the 2015 season. The American Football Conference (AFC) champion Denver Broncos defeated the National Footba -ll Conference (NFC) champion Carolina Panthers 24–10 to earn their third Super Bowl title. The game was played on Fe -bruary 7, 2016, at Levi's Stadium in the San Francisco Bay Area at Santa Clara, California. As this was the 50th Sup -er Bowl, the league emphasized the "golden anniversary" with various gold-themed initiatives, as well as temporarily - suspending the tradition of naming each Super Bowl game with Roman numerals (under which the game would have been k -nown as "Super Bowl L"), so that the logo could prominently feature the Arabic numerals 50. -[Question]: Which NFL team represented the AFC at Super Bowl 50? - ******* run bert ******* -Run graph execution time: 1713.15491ms, FPS=0.58 - -=== tensor info === -shape: 1 384 -data pointer: 0x183d60 - -=== tensor info === -shape: 1 384 -data pointer: 0x185380 - -=== tensor info === -shape: 1 384 -data pointer: 0x1869a0 - -=== tensor info === -shape: 1 384 -data pointer: 0x2a8610 -The max_value of output: 3.826172 -The min_value of output: -9.968750 -The mean_value of output: -8.412353 -The std_value of output: 5.128320 - ============ top5: =========== - 46: 3.826172 - 57: 3.142578 - 39: 1.303711 - 38: 1.179688 - 27: 0.624512 - -=== tensor info === -shape: 1 384 -data pointer: 0x2a8300 -The max_value of output: 3.617188 -The min_value of output: -9.625000 -The mean_value of output: -7.798176 -The std_value of output: 4.820137 - ============ top5: =========== - 47: 3.617188 - 58: 3.482422 - 32: 2.523438 - 29: 1.541992 - 41: 1.473633 - ********** postprocess ********** -[Answer]: Denver Broncos -``` - -With this, you have successfully run **BERT quantized inference** on the **Licheepi4A development board**! 🚀 - -Reference document: https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/8_application.html \ No newline at end of file diff --git a/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/mobilenetv2-image-classification.md b/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/mobilenetv2-image-classification.md deleted file mode 100644 index 381564ee..00000000 --- a/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/mobilenetv2-image-classification.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: Deploying MobileNetV2 Model on LicheePi 4A for Image Classification -sidebar_position: 2 ---- - -# Deploying MobileNetV2 Model on LicheePi 4A for Image Classification - -This article will introduce how to deploy the MobileNetV2 model on Licheepi 4A for image classification tasks. - -## Prerequisites - -- Licheepi 4A hardware device -- RevyOS operating system -- Basic machine learning knowledge - -## Model Introduction - -MobileNetV2 is a lightweight deep learning model designed for mobile and edge devices, offering high efficiency and good performance. - -This tutorial demonstrates how to deploy the mobilenetv2 model on the LicheePi4A platform for image classification. - -The tutorial includes: - -- Using HHB to compile onnx models into binaries usable on LicheePi4A -- Using the C++ version of OpenCV on LicheePi4A for preprocessing the mobilenetv2 model -- Differences between using CPU and NPU on LicheePi4A - -### NPU Environment Configuration - -First, you need to install a Python virtual environment, then use pip3 to install Python packages. -Use the following commands to install the venv package for creating a Python virtual environment (using the root directory as an example): - -```bash -sudo apt install python3.11-venv -python3 -m venv venv -source venv/bin/activate -``` - -#### SHL Library Installation - -Install using pip - -```bash -pip3 install shl-python -``` - -After installation, use --whereis to check the installation location - -```bash -python3 -m shl --whereis th1520 -# If using pure CPU inference, replace with python3 -m shl --whereis c920 -``` - -Based on the printed location, copy the dynamic libraries in the directory to the /usr/lib directory. For example, if it prints: - -```bash -/home/sipeed/ort/lib/python3.11/site-packages/shl/install_nn2/th1520 -``` - -You can use the copy command: - -```bash -sudo cp -r /home/sipeed/ort/lib/python3.11/site-packages/shl/install_nn2/th1520/lib/* /usr/lib/ -``` - -#### HHB-onnxruntime Installation - -HHB-onnxuruntime is ported with the SHL backend (execution providers), allowing onnxruntime to reuse the high-performance optimization code for T-Head CPU in SHL. - -CPU version - -```bash -wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl_v2.6.0/hhb_onnxruntime_c920-2.6.0-cp311-cp311-linux_riscv64.whl -pip install hhb_onnxruntime_c920-2.6.0-cp311-cp311-linux_riscv64.whl -``` - -NPU version - -```bash -wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl_v2.6.0/hhb_onnxruntime_th1520-2.6.0-cp311-cp311-linux_riscv64.whl -pip install hhb_onnxruntime_th1520-2.6.0-cp311-cp311-linux_riscv64.whl -``` - -#### **x86 Host Configuration** - -After installing Docker, open the terminal in the Docker application and enter: - -```bash -docker pull hhb4tools/hhb:2.4.5 -``` - -After pulling the image, use the following commands to enter the Docker image: - -```bash -docker run -itd --name=your.hhb2.4 -p 22 "hhb4tools/hhb:2.4.5" -docker exec -it your.hhb2.4 /bin/bash -``` - -After entering the Docker image, you can use the following command to confirm the HHB version: - -```bash -hhb --version -``` - -After entering the Docker image, you also need to configure the cross-compilation environment. Note that you must use the toolchain here, otherwise the compiled binary file will not run on LicheePi4A. - -```bash -export PATH=/tools/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1-light.1/bin/:$PATH -``` - -![image-20250227142739955](https://raw.githubusercontent.com/jason-hue/plct/main/image-20250227142739955.png) - -At this point, the HHB environment setup is initially complete. - -### Deploying MobileNetV2 - -Enter the docker container - -First, get the model for this tutorial, download it to the example directory `/home/example/th1520_npu/onnx_mobilenetv2_c++`: -[mobilenetv2-12.onnx](https://github.com/onnx/models/raw/main/validated/vision/classification/mobilenet/model/mobilenetv2-12.onnx) - -And get the library files needed for the optimized version of OpenCV used in this tutorial, go to [github repository download](https://xuantie.t-head.cn/community/download?id=4112956065753141248) and download to the parent directory `/home/example/th1520_npu/`. - -```bash -cd /home/example/th1520_npu/ -git clone https://github.com/zhangwm-pt/prebuilt_opencv.git -``` - -#### Compilation - -**HHB model compilation:** -To cross-compile the ONNX model into an executable program for NPU, you need to use the hhb command. Note that NPU only supports 8-bit or 16-bit fixed-point operations; this example specifies int8 asymmetric quantization. When compiling, you need to first enter the example directory `/home/example/th1520_npu/onnx_mobilenetv2_c++`: - -```bash -cd /home/example/th1520_npu/onnx_mobilenetv2_c++ -hhb -D --model-file mobilenetv2-12.onnx --data-scale 0.017 --data-mean "124 117 104" --board th1520 --postprocess save_and_top5 --input-name "input" --output-name "output" --input-shape "1 3 224 224" --calibrate-dataset persian_cat.jpg --quantization-scheme "int8_asym" -``` - -Option descriptions: - -- -D: Specify that the HHB process executes until the executable file is generated -- --model-file: Specify the mobilenet model already downloaded in the current directory -- --data-mean: Specify mean values -- --data-scale: Specify scaling value -- --board: Specify the target platform as th1520 -- --input-name: Model input name -- --output-name: Model output name -- --input-shape: Model input size -- --postprocess: Save output results and print top5 results -- --calibrate-dataset: Specify the calibration image needed for quantization -- --quantization-scheme: Specify the quantization method as int8 asymmetric - -After the command is executed, a hhb_out subdirectory will be generated in the current directory, containing hhb_runtime, model.c, and other files: - -- hhb.bm: HHB model file, including quantized weight data and other information -- hhb_runtime: Executable file for the th1520 platform, compiled from C files in the directory -- main.c: Temporary file, reference entry point for the example program -- model.c: Temporary file, model structure file, related to the model structure -- model.params: Temporary file, weight values -- io.c: Temporary file, auxiliary functions for reading and writing files -- io.h: Temporary file, declarations of auxiliary functions for reading and writing files -- process.c: Temporary file, image preprocessing functions -- process.h: Temporary file, declarations of image preprocessing functions - -For more detailed HHB option descriptions, refer to the command line option description in the [HHB User Manual](https://www.yuque.com/za4k4z/oxlbxl/keyg70qggt5n3fpa). - -**g++ example compilation:** - -```bash -riscv64-unknown-linux-gnu-g++ main.cpp -I../prebuilt_opencv/include/opencv4 -L../prebuilt_opencv/lib -lopencv_imgproc -lopencv_imgcodecs -L../prebuilt_opencv/lib/opencv4/3rdparty/ -llibjpeg-turbo -llibwebp -llibpng -llibtiff -llibopenjp2 -lopencv_core -ldl -lpthread -lrt -lzlib -lcsi_cv -latomic -static -o mobilenetv2_example -``` - -After the compilation command is executed correctly, a mobilenetv2_example file will be generated in the example directory. - -#### Execution - -After cross-compilation is complete, you can copy the files needed for program execution to the directory on the development board. - -Transfer the folder from docker to the host machine: - -```bash -docker cp 65f872394fa5837ef2c24ade731b152da074ac6091f0766c04ac54092ff32780:/home/example/th1520_npu/onnx_mobilenetv2_c++ C:\Users\knifefire\Downloads\ -``` - -Then upload it to the development board. - -First, check if the driver is loaded on the development board: - -```shell -lsmod -``` - -If the output includes the three modules `img_mem`, `vha`, and `vha_info`, the NPU driver is successfully loaded. - -Manually load the NPU driver: - -```bash -sudo insmod /lib/modules/5.10.113-th1520/kernel/drivers/nna/img_mem/img_mem.ko - -sudo modprobe vha onchipmem_phys_start=0xffe0000000 onchipmem_size=0x100000 freq_khz=792000 - -sudo insmod /lib/modules/5.10.113-th1520/kernel/drivers/nna/vha/vha_info.ko - -sudo chmod a+rw /dev/vha0 -``` - -Refer to the [YOLOX section](https://github.com/jason-hue/plct/blob/main/%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3/%E5%9C%A8%20LicheePi%204A%20%E4%B8%8A%E9%83%A8%E7%BD%B2%20YOLOX%20%E5%B9%B6%E4%BD%BF%E7%94%A8%20HHB-onnxruntime%20%E8%BF%9B%E8%A1%8C%E6%8E%A8%E7%90%86.md) to install and configure the Python virtual environment - -Run the compiled example in the corresponding directory on the development board: - -```bash -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/th1520/lib -./mobilenetv2_example -``` - -After execution, the terminal will prompt the stages being executed: - -1. Preprocessing -2. Model execution -3. Post-processing - -Files used by mobilenetv2_example: - -- persian_cat.jpg: Input image -- input_img.bin: Intermediate result generated from the input image during the preprocessing stage -- hhb_out/hhb_runtime: File used during model execution, generated by HHB on the x86 host -- hhb_out/hhb.bm: File used during model execution, generated by HHB on the x86 host -- input_img.bin_output0_1_1000.txt: Output file from the model execution stage, including 1000 result values output by the model execution - -#### Reference Results: - -```bash -(venv) sipeed@revyos-lpi4a:~/onnx_mobilenetv2_c++$ ./mobilenetv2_example - ********** preprocess image ********** - ********** run mobilenetv2 ********** -INFO: NNA clock:792000 [kHz] -INFO: Heap :ocm (0x18) -INFO: Heap :anonymous (0x2) -INFO: Heap :dmabuf (0x2) -INFO: Heap :unified (0x5) -FATAL: Importing 150528 bytes of CPU memory has failed (wrong memory alignment) -Run graph execution time: 15.03903ms, FPS=66.49 - -=== tensor info === -shape: 1 3 224 224 -data pointer: 0x2b4aca0 - -=== tensor info === -``` diff --git a/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/yolox-deployment.md b/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/yolox-deployment.md deleted file mode 100644 index 55bdd2a7..00000000 --- a/i18n/en/docusaurus-plugin-content-docs/current/typical-applications/yolox-deployment.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Deploying YOLOX on LicheePi 4A and Inference Using HHB-onnxruntime -sidebar_position: 5 ---- - -# Deploying YOLOX on LicheePi 4A and Inference Using HHB-onnxruntime - -This article provides a detailed guide on how to deploy the YOLOX object detection model on LicheePi 4A and perform efficient inference using HHB-onnxruntime. - -## YOLOX Introduction - -YOLOX is an efficient object detection algorithm that offers excellent speed performance while maintaining high accuracy, making it very suitable for deployment on edge devices. - -## 1. Environment Preparation - -### 1.1 Hardware Preparation - -- LicheePi 4A (LPi4A) development board -- MicroSD card (for storing the system) -- Power adapter -- USB serial debug tool (optional) - -### 1.2 Software Preparation - -- LicheePi 4A official Linux system -- Python 3.11 -- pip and necessary dependencies -- ONNX runtime (onnxruntime) -- HHB tools (can be used for model conversion) -- YOLOX model and its ONNX version - -```sh -# Update system -sudo apt update && sudo apt upgrade -y -``` - -Install some software for later use in the example - -```bash -sudo apt install wget git vim -``` - -Install SHL library - -```bash -wget https://github.com/T-head-Semi/csi-nn2/releases/download/v2.4-beta.1/c920.tar.gz - -tar xf c920.tar.gz - -cp c920/lib/* /usr/lib/riscv64-linux-gnu/ -rf -``` - -**Python Environment Configuration** -The LPi4A system comes with Python 3.11 pre-installed. You can confirm this with the following command - -```bash -python3 --version -``` - -The following examples all use Python 3.11. If you're using a different version, you'll need to modify the commands accordingly when installing dependencies. -Most Python dependencies can be installed using pip. You can install pip with the following command - -```bash -apt install python3-pip -``` - -Before installing other Python packages, first install the venv package to create a Python virtual environment - -```bash -apt install python3.11-venv -``` - -Create and activate a Python virtual environment - -```bash -cd /root -python3 -m venv ort -source /root/ort/bin/activate -``` - -At this point, the basic Python environment has been set up. Similar to other architectures, you can directly install pure Python packages via pip install. - -##### Install OpenCV - -```shell -sudo apt install python3 python3-pip -sudo apt install python3-opencv -sudo apt install libqt5gui5-gles -``` - -## 2. Obtain and Convert the YOLOX Model - -Execute the following steps on LPi4A: - -```sh -# Clone the YOLOX repository -git clone https://github.com/Megvii-BaseDetection/YOLOX.git - -cd YOLOX/demo/ONNXRuntime - -wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.onnx -``` - -**Modify the Source Code** - -This tutorial will use HHB-onnxruntime to execute the model. In the onnxruntime example directory of the source code, modify the file demo/ONNXRuntime/onnx_inference.py by adding two lines at the beginning - -```bash -#!/usr/bin/env python3 -# Copyright (c) Megvii, Inc. and its affiliates. - -+import sys -+sys.path.insert(0, "../../") - -import argparse -import os -``` - -The code uses sys.path.insert to specify the search path, thus avoiding the need to install the YOLOX package from the source code. - -**Install Dependency Packages** - -The Python ecosystem for the RISC-V architecture is still lacking. In the future, when it's more complete, the dependencies in YOLOX can be installed directly through the [requirements.txt](https://github.com/Megvii-BaseDetection/YOLOX/blob/main/requirements.txt) file. -The YOLOX example in this tutorial depends on many Python packages. Download the pre-compiled Python packages - -```bash -git clone -b python3.11 https://github.com/zhangwm-pt/prebuilt_whl.git -cd prebuilt_whl -``` - -You can process them manually in the following order. - -```bash -pip install numpy-1.25.0-cp311-cp311-linux_riscv64.whl - -pip install opencv_python-4.5.4+4cd224d-cp311-cp311-linux_riscv64.whl - -pip install kiwisolver-1.4.4-cp311-cp311-linux_riscv64.whl - -pip install Pillow-9.5.0-cp311-cp311-linux_riscv64.whl - -pip install matplotlib-3.7.2.dev0+gb3bd929cf0.d20230630-cp311-cp311-linux_riscv64.whl - -pip install pycocotools-2.0.6-cp311-cp311-linux_riscv64.whl - -pip3 install loguru-0.7.0-py3-none-any.whl - -pip3 install torch-2.0.0a0+gitc263bd4-cp311-cp311-linux_riscv64.whl - -pip3 install MarkupSafe-2.1.3-cp311-cp311-linux_riscv64.whl - -pip3 install torchvision-0.15.1a0-cp311-cp311-linux_riscv64.whl - -pip3 install psutil-5.9.5-cp311-abi3-linux_riscv64.whl - -pip3 install tqdm-4.65.0-py3-none-any.whl - -pip3 install tabulate-0.9.0-py3-none-any.whl -``` - -During the installation process, other pure Python dependency packages will be involved, which pip will automatically download from the official source. - -**Install HHB-onnxruntime** - -HHB-onnxruntime has ported the SHL backend (execution providers), allowing onnxruntime to reuse the high-performance optimization code for T-Head CPU in SHL. - -```bash -wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl/onnxruntime-1.14.1-cp311-cp311-linux_riscv64.whl -pip install onnxruntime-1.14.1-cp311-cp311-linux_riscv64.whl -``` - -**Execution** - -Execute the onnx_inference.py example in the example directory - -```bash -export PYTHONPATH=$PYTHONPATH:/root/YOLOX - -python3 onnx_inference.py -m yolox_s.onnx -i soccer.png -o outdir -s 0.3 --input_shape 640,640 -``` - -Parameter description: - -- -m: Specify the model -- -i: Specify the image -- -o: Specify the output directory -- -s: Specify the detection threshold -- --input_shape: Specify the image size used for detection - -**Reference Results** - -The input image in this tutorial, shown below, is a picture of players kicking a soccer ball. The expected detection result is two people and one soccer ball. - -> Image source: from the internet - -![yolox_detection_soccer_input.jpg](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_input.jpg) - -After the example is executed normally, a result image soccer.png will be generated in the outdir directory. The image will draw a box around the detected targets and label them with probabilities, as shown in the following image: - -![yolox_detection_soccer_output.jpg](https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/assets/application/yolox_detection_soccer_output.jpg) - -Reference document: - -https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/8_application.html \ No newline at end of file diff --git a/static/img/image-for-flash/yolov5.png b/static/img/image-for-flash/yolov5.png new file mode 100644 index 0000000000000000000000000000000000000000..1360eb697f0e0c3cbfa2b6d072f8e5f318dcc33f GIT binary patch literal 163692 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̽x`rLv39Ko!#U($YaaNa28tpq{R7uaLDJ`b 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 F002&5UD5ym literal 0 HcmV?d00001 From dac589315fdfcd0c415553bc5d0b99dc724e6d79 Mon Sep 17 00:00:00 2001 From: LeeJc02 <129182487+LeeJc02@users.noreply.github.com> Date: Sun, 26 Oct 2025 18:34:49 +0800 Subject: [PATCH 2/3] fix docs --- .../current/Installation/milkv-pioneer.mdx | 146 ++++++++++-------- 1 file changed, 80 insertions(+), 66 deletions(-) diff --git a/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx b/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx index a30a6856..4a80dbb2 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/Installation/milkv-pioneer.mdx @@ -4,123 +4,135 @@ sidebar_position: 3 import { DownloadLink } from "@site/src/components/ImageLinks"; -# Installing RevyOS on Milk-V Pioneer + +# Installing RevyOS on the Milk-V Pioneer ## Preparation -### Required Hardware +### Required Tools -- MicroSD card -- MicroSD card reader -- NVMe SSD enclosure +- microSD card +- microSD card reader +- NVMe SSD adaptor -### Download the Image +### Downloading the Image -RevyOS images are hosted at [ISCAS mirror](https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/). -The latest release for Milk-V Pioneer is {}. +RevyOS image directory: [Download Link](https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/) -The following example uses the `20241230` directory: +Latest image version: {} -![](/img/image-for-flash/pioneer-image-dir.png) +Example directory for the 20241230 image: -RevyOS flashing consists of a firmware component and the system image itself. The relevant files are: +![Image Directory](/img/image-for-flash/pioneer-image-dir.png) -- **Firmware (boot chain)** — contains `zsbl`, `linuxboot`, device trees, and other boot assets. It can reside either on SPI flash or on an SD card: - - `firmware_single_sg2042-v6.6-lts-v0p7.bin` – for SPI flash - - `firmware_single_sg2042-v6.6-lts-v0p7.img` – for SD card -- **MCU firmware** — addresses known issues and should be updated after installing the system: -- **System image** — flashes to an M.2 NVMe SSD: - - `revyos-pioneer-20241230-212249.img.zst` +RevyOS requires flashing both firmware and system files, as listed below. -## Flashing the Firmware +There are two separate firmware, one include `zsbl`, `linuxboot`, device trees and more, which handles the system boot process. + +This part of firmware can be flashed to either the SPI Flash or microSD card: + +- **Firmware files**: + - `firmware_single_sg2042-v6.6-lts-v0p7.bin` (for SPI Flash) + - `firmware_single_sg2042-v6.6-lts-v0p7.img` (for SD card) + +The other part is the MCU firmware. Newer versions of MCU firmware has fixed some known issues, an upgrade is recommended, after completing the system installation. + +- https://github.com/sophgo/mcu/releases + +And also the system image itself which needs to be flashed to M.2 NVMe SSD: -Depending on the storage target, choose one of the following procedures. +- `revyos-pioneer-20241230-212249.img.zst` -### Flash the Firmware to an SD Card +--- + +## Flashing the Firmware + +### Flashing Firmware to SD Card -*Host environment: Ubuntu 22.04* +**Operating System**: Ubuntu 22.04 #### Using BalenaEtcher -1. Select `firmware_single_sg2042-v6.6-lts-v0p7.img`. +1. Select the file `firmware_single_sg2042-v6.6-lts-v0p7.img`. 2. Choose the target SD card. -3. Click **Flash**. +3. Click "Flash" to start the process. -#### Using the Command Line +#### Using Command Line -Insert the SD card, confirm its device path, and run: +Insert the SD card into a reader connected to your computer, then verify the device path. + +Navigate to the directory with `firmware_single_sg2042-v6.6-lts-v0p7.img` and flash it with the following command: ```shell sudo dd if=firmware_single_sg2042-v6.6-lts-v0p7.img of=/dev/sdX bs=4M status=progress ``` -Replace `/dev/sdX` with the actual device node. After flashing, execute `sync` to flush the write cache. +Replace `of=/dev/sdX` with your specific device path if different. -### Flash the Firmware to SPI Flash +After flashing, use `sync` to ensure data is fully written to the SD card. -*Host environment: RevyOS 20241230* +### Flashing Firmware to SPI Flash -:::note -For the first installation we recommend storing the firmware on the SD card. -::: +**Operating System**: RevyOS 20241230 -Install the required utilities and load the kernel module: +> **Note**: For first-time installation, using an SD card to store the firmware is recommended. -```shell -sudo apt install mtd-utils -sudo modprobe mtdblock -``` +#### Using Command Line -Download the firmware: +Flashing to the SPI Flash requires installing utilities and loading the `mtd` module. -```shell -wget https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/20241230/firmware_single_sg2042-v6.6-lts-v0p7.bin -``` +Install necessary packages: -Then flash it into `/dev/mtd1`: + ```bash + sudo apt install mtd-utils + sudo modprobe mtdblock + ``` -```shell -sudo flashcp -v firmware_single_sg2042-v6.6-lts-v0p7.bin /dev/mtd1 -``` +Download the firmware file: -The SPI flash update is now complete. + ```bash + wget https://mirror.iscas.ac.cn/revyos/extra/images/sg2042/20241230/firmware_single_sg2042-v6.6-lts-v0p7.bin + ``` -## Flashing the System Image +Navigate to the directory where `firmware_single_sg2042-v6.6-lts-v0p7.bin` was downloaded and run: -*Host environment: Ubuntu 22.04* + ```bash + sudo flashcp -v firmware_single_sg2042-v6.6-lts-v0p7.bin /dev/mtd1 + ``` -First decompress the archived image: +Flashing to SPI Flash is now complete. -```shell -unzstd revyos-pioneer-20241230-212249.img.zst -``` +--- -This produces `revyos-pioneer-20241230-212249.img`. +## 3. Flashing the RevyOS Image -Insert the NVMe SSD into the enclosure, connect it to the host, confirm the device path, and write the image: +**Operating System**: Ubuntu 22.04 -```shell -sudo dd if=revyos-pioneer-20241230-212249.img of=/dev/nvme0n1 bs=4M status=progress -``` +### Using Command Line + +1. Decompress the `revyos-pioneer-20241230-212249.img.zst` file using `unzstd revyos-pioneer-20241230-212249.img.zst`. This produces the `revyos-pioneer-20241230-212249.img` file. -Adjust `/dev/nvme0n1` to match your environment. Run `sync` when the transfer finishes to ensure the data is fully written. +2. Insert the NVMe SSD into the reader and connect it to your computer, then confirm the device path. -## Updating the MCU Firmware +3. In the directory containing `revyos-pioneer-20241230-212249.img`, flash the image to the NVMe SSD with dd command: `sudo dd if=revyos-pioneer-20241230-212249.img of=/dev/nvme0n1 bs=4M status=progress`. Replace `of=/dev/nvme0n1` with the correct device path if different. -After flashing the system and booting into RevyOS, update the MCU firmware. +4. After flashing, use `sync` to ensure the data is fully written to the NVMe SSD. -Install prerequisites, create a working directory, and download the utility and firmware: +## MCU Firmware upgrade + +After you finished system installation process and successfully booted into the system, open up a terminal or connect via SSH. + +First, install `wget`, download the MCU firmware and `mcu-util`. ```shell -sudo apt update -sudo apt install -y wget +sudo apt update; sudo apt install -y wget mkdir mcu && cd mcu wget https://github.com/sophgo/mcu/releases/download/2025.01.20/mcu-util-riscv64 -# For Milk-V Pioneer; choose the correct binary for other boards from the release page. +# Use the file below for Milk-V Pioneer; for other boards please choose accordingly at the GitHub Release page. wget https://github.com/sophgo/mcu/releases/download/2025.01.20/sg2042evb-mcu-v8-2025-01-20-10-21-22.bin ``` -Load the `i2c-dev` kernel module and perform the upgrade: +Then load `i2c-dev` kernel module and start flashing: ```shell sudo modprobe i2c-dev @@ -128,7 +140,7 @@ chmod +x mcu-util-riscv64 sudo ./mcu-util-riscv64 upgrade-full 1 0x17 sg2042evb-mcu-v8-2025-01-20-10-21-22.bin ``` -Typical output appears as: +If everything goes fine then you should get log like this: ```log erase page 0000e000 @@ -137,4 +149,6 @@ read flash 00010000 100% verify flash data ok ``` -After the upgrade, power the machine off and disconnect it from mains power. Leave it off for one to five minutes before powering on again. +After finishing the flashing process, please power off the board and cut off the AC power entirely. + +It is recommended to wait for around 1~5 minutes before plugging in and power on the board. \ No newline at end of file From 1c2ddf8609ac93809cdc5a70bd061bb06916fa8d Mon Sep 17 00:00:00 2001 From: LeeJc02 <129182487+LeeJc02@users.noreply.github.com> Date: Mon, 3 Nov 2025 15:57:11 +0800 Subject: [PATCH 3/3] fix docs --- build.txt | 22 +++++++++++++++++++ docs/intro.mdx | 3 --- .../current/intro.mdx | 3 --- 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 build.txt diff --git a/build.txt b/build.txt new file mode 100644 index 00000000..830c3e32 --- /dev/null +++ b/build.txt @@ -0,0 +1,22 @@ +. +├── ./CMakeLists.txt +├── ./data +│   └── ./data/edges_readable.csv +├── ./output +│   ├── ./output/kruskal +│   │   ├── ./output/kruskal/mst.svg +│   │   ├── ./output/kruskal/route.txt +│   │   └── ./output/kruskal/steps.txt +│   ├── ./output/prim +│   │   ├── ./output/prim/mst.svg +│   │   ├── ./output/prim/route.txt +│   │   └── ./output/prim/steps.txt +│   └── ./output/shared +│   └── ./output/shared/adjacency_matrix.csv +├── ./README.md +└── ./src + ├── ./src/kruskal_algo.cpp + ├── ./src/main.cpp + └── ./src/prim_algo.cpp + +7 directories, 13 files diff --git a/docs/intro.mdx b/docs/intro.mdx index afaf24fc..d60044af 100644 --- a/docs/intro.mdx +++ b/docs/intro.mdx @@ -62,6 +62,3 @@ __RevyOS__ 的用户版镜像目前在 ISCAS(中国科学院软件研究所) RevyOS 有自己的 Telegram 群组:[邀请链接](https://t.me/+Pi6px22-OsUxM2M1) -## 实习生招聘 - -现在正在招聘测试实习生,详情请看:[RevyOS 小队测试实习生招聘](https://github.com/plctlab/weloveinterns/blob/master/open-internships.md#j143-revyos%E5%B0%8F%E9%98%9F%E6%B5%8B%E8%AF%95%E5%AE%9E%E4%B9%A0%E7%94%9F20241111%E5%BC%80%E6%94%BE100%E5%90%8D) diff --git a/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx b/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx index 3cb8fd8d..42f6dfdf 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx +++ b/i18n/en/docusaurus-plugin-content-docs/current/intro.mdx @@ -60,6 +60,3 @@ In this documentation, we provide guides for reference on building, adapting, an RevyOS has its own Telegram group: [Invitation Link](https://t.me/+Pi6px22-OsUxM2M1) -## Internship Recruitment - -We are currently recruiting testing interns. For details, please see [RevyOS Team Testing Intern Recruitment](https://github.com/plctlab/weloveinterns/blob/master/open-internships.md#j143-revyos%E5%B0%8F%E9%98%9F%E6%B5%8B%E8%AF%95%E5%AE%9E%E4%B9%A0%E7%94%9F20241111%E5%BC%80%E6%94%BE100%E5%90%8D).