From 141822dc2cf596849557afa4779ee23b314c7e02 Mon Sep 17 00:00:00 2001 From: hyx Date: Fri, 3 Apr 2026 09:16:39 +0800 Subject: [PATCH] add system OTA process and change the version number to 1.0.0 --- .../uboot/uboot/common/quaming/udisk_flash.c | 35 ++-- .../rootfs_overlay/etc/init.d/S99ota_check | 75 ++++++++ .../rootfs_overlay/etc/tniuds/system_info | 13 +- .../tools/libhardware/include/hardware_ota.h | 31 ++++ .../tools/libhardware/lib/libhardware.a | Bin 0 -> 10574 bytes .../tools/make_ota_package.sh | 162 ++++++++++++++++++ 6 files changed, 294 insertions(+), 22 deletions(-) create mode 100755 sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/init.d/S99ota_check create mode 100644 sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/include/hardware_ota.h create mode 100644 sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/lib/libhardware.a create mode 100755 sdk/X-AIOS-LT00-V1.0.4/tools/make_ota_package.sh diff --git a/sdk/X-AIOS-LT00-V1.0.4/base/soc/qm10xd/linux/bsp/uboot/uboot/common/quaming/udisk_flash.c b/sdk/X-AIOS-LT00-V1.0.4/base/soc/qm10xd/linux/bsp/uboot/uboot/common/quaming/udisk_flash.c index f628338e9..a299dbe8f 100644 --- a/sdk/X-AIOS-LT00-V1.0.4/base/soc/qm10xd/linux/bsp/uboot/uboot/common/quaming/udisk_flash.c +++ b/sdk/X-AIOS-LT00-V1.0.4/base/soc/qm10xd/linux/bsp/uboot/uboot/common/quaming/udisk_flash.c @@ -488,16 +488,27 @@ int bootup_commands(void) char * skipupdate_env; int skipupdate = 0; -#if defined(CONFIG_OTA_SCRIPT_CMD) && !defined(CONFIG_FLASH_FW_ON_KEY_PRESS) - printf("judeg misc command to flashing"); - return 0; -#endif + // 首先检查misc分区的OTA升级命令 + printf("Checking OTA commands from misc partition...\n"); + ret = ota_commands(); + if (ret == 0) { + // ota_commands成功执行了升级,不应该返回到这里 + // 如果返回了,说明没有OTA升级命令,继续检查USB升级 + printf("No OTA upgrade command found, checking USB upgrade...\n"); + } + +// OTA升级功能:移除错误的早期返回逻辑 +// #if defined(CONFIG_OTA_SCRIPT_CMD) && !defined(CONFIG_FLASH_FW_ON_KEY_PRESS) +// printf("judeg misc command to flashing"); +// return 0; +// #endif //printf("#####bootup_commands:\n"); + // OTA升级功能始终启用,忽略skipupdate环境变量 skipupdate_env = env_get("skipupdate"); if (skipupdate_env){ skipupdate = simple_strtol(skipupdate_env, NULL, 0); - printf("skip update fw... %d \n", skipupdate); - return 0; + printf("skipupdate env = %d (ignored for OTA support)\n", skipupdate); + // return 0; // 注释掉,不再跳过升级检查 } @@ -675,7 +686,7 @@ int write_misc(char boot_success,char tries_remaining,char *command) memcpy(bcb.command,command,sizeof(bcb.command)); memset(script_cmd,0,sizeof(script_cmd)); - sprintf(script_cmd,"sf erase 0x%lx 0x%x",(long)MISC_OFFSET,sizeof(bcb)); + sprintf(script_cmd,ERASE_CMD " 0x%lx 0x%x",(long)MISC_OFFSET,sizeof(bcb)); ret = run_command(script_cmd, 0); printf("ret=%d run command:%s\n",ret,script_cmd); if (ret){ @@ -683,7 +694,7 @@ int write_misc(char boot_success,char tries_remaining,char *command) } memset(script_cmd,0,sizeof(script_cmd)); memcpy((char *)UBOOT_DOWN_ADDR,&bcb,sizeof(bcb)); - sprintf(script_cmd,"sf write 0x%lx 0x%lx 0x%x",(long)UBOOT_DOWN_ADDR,(long)MISC_OFFSET,sizeof(bcb)); + sprintf(script_cmd,WRITE_CMD " 0x%lx 0x%lx 0x%x",(long)UBOOT_DOWN_ADDR,(long)MISC_OFFSET,sizeof(bcb)); ret = run_command(script_cmd, 0); printf("ret=%d run command:%s\n",ret,script_cmd); if (ret){ @@ -708,13 +719,13 @@ int ota_commands(void) memset((char *)UBOOT_DOWN_ADDR,0,0x2000); memset(script_cmd,0,sizeof(script_cmd)); - sprintf(script_cmd,"sf read 0x%lx 0x%lx 0x%x",(long)UBOOT_DOWN_ADDR,(long)MISC_OFFSET,sizeof(bcb)); + sprintf(script_cmd,READ_CMD " 0x%lx 0x%lx 0x%x",(long)UBOOT_DOWN_ADDR,(long)MISC_OFFSET,sizeof(bcb)); ret = run_command(script_cmd, 0); printf("ret=%d run command:%s\n",ret,script_cmd); if (ret){ ret = -1; memset(script_cmd,0,sizeof(script_cmd)); - sprintf(script_cmd,"sf erase 0x%lx 0x%x",\ + sprintf(script_cmd,ERASE_CMD " 0x%lx 0x%x",\ (long)MISC_OFFSET,sizeof(bcb)); ret = run_command(script_cmd, 0); printf("ret=%d run command:%s\n",ret,script_cmd); @@ -743,7 +754,7 @@ int ota_commands(void) printf("ret=%d run command:%s\n",ret,script_cmd); //---- to clear misc---------------------- memset(script_cmd,0,sizeof(script_cmd)); - sprintf(script_cmd,"sf erase 0x%lx 0x%x",\ + sprintf(script_cmd,ERASE_CMD " 0x%lx 0x%x",\ (long)MISC_OFFSET,sizeof(bcb)); ret = run_command(script_cmd, 0); printf("ret=%d run command:%s\n",ret,script_cmd); @@ -758,7 +769,7 @@ int ota_commands(void) printf("ret=%d run command:%s\n",ret,script_cmd); //---- to clear misc---------------------- memset(script_cmd,0,sizeof(script_cmd)); - sprintf(script_cmd,"sf erase 0x%lx 0x%x",\ + sprintf(script_cmd,ERASE_CMD " 0x%lx 0x%x",\ (long)MISC_OFFSET,sizeof(bcb)); ret = run_command(script_cmd, 0); printf("ret=%d run command:%s\n",ret,script_cmd); diff --git a/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/init.d/S99ota_check b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/init.d/S99ota_check new file mode 100755 index 000000000..615c4dd1f --- /dev/null +++ b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/init.d/S99ota_check @@ -0,0 +1,75 @@ +#!/bin/sh +# +# OTA升级结果检查脚本 +# 在系统启动时检查OTA升级是否成功 +# + +TAG="S99ota_check:" + +# 版本比较函数 +version_compare() { + local ver1=$1 + local ver2=$2 + + # 简单的版本号比较(假设格式为 x.y.z) + if [ "$ver1" = "$ver2" ]; then + return 0 # 版本相同,升级成功 + else + return 1 # 版本不同,升级失败 + fi +} + +ota_check() { + # 检查是否存在升级信息文件 + if [ ! -f "/data/update/.update_info.txt" ]; then + return 0 # 没有升级信息,跳过检查 + fi + + echo "${TAG} 检查OTA升级结果..." + + # 读取升级包版本号 + if [ -f "/data/update/.update_info.txt" ]; then + version_update=$(grep "update_version" /data/update/.update_info.txt | cut -d'=' -f2) + else + echo "${TAG} 找不到升级包版本信息" + return 1 + fi + + # 读取系统当前版本号 + if [ -f "/etc/tniuds/system_info" ]; then + version_sys=$(grep -E "^v|fw_version" /etc/tniuds/system_info | head -n1 | sed 's/fw_version=v//;s/^v//') + else + echo "${TAG} 找不到系统版本信息" + return 1 + fi + + echo "${TAG} 升级包版本: ${version_update}" + echo "${TAG} 系统版本: ${version_sys}" + + # 比较版本号 + if version_compare "${version_update}" "${version_sys}"; then + echo "${TAG} OTA升级成功!版本匹配: ${version_sys}" + # 清理升级临时文件 + rm -rf /data/update + rm -f /data/update.tar.gz + rm -f /data/script-ota.ini + echo "${TAG} 已清理升级临时文件" + else + echo "${TAG} OTA升级失败!版本不匹配" + echo "${TAG} 期望版本: ${version_update}, 实际版本: ${version_sys}" + # 保留升级文件用于调试 + echo "${TAG} 保留 /data/update 目录用于调试" + fi +} + +case "$1" in + start|"") + ota_check + ;; + *) + echo "Usage: $0 {start}" + exit 1 + ;; +esac + +exit 0 diff --git a/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/tniuds/system_info b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/tniuds/system_info index f92344eed..70b98ff2b 100644 --- a/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/tniuds/system_info +++ b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/tniuds/system_info @@ -1,11 +1,4 @@ - -project_id=0004001 - -fw_user=bbq -fw_time=20260330_100355 +fw_version=v1.0.0 +fw_time=20260402_000000 fw_variant=user -fw_version=v5.0.2.3 - -launcher_name=eplayer_single -launcher_start_cmd=eplayer_single - +project_id=demo_ld diff --git a/sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/include/hardware_ota.h b/sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/include/hardware_ota.h new file mode 100644 index 000000000..571b7f55e --- /dev/null +++ b/sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/include/hardware_ota.h @@ -0,0 +1,31 @@ +#ifndef _HARDWARE_OTA_H_ +#define _HARDWARE_OTA_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief OTA系统升级函数 + * + * 该函数执行完整的OTA升级流程: + * 1. 解压升级包到/data/update目录 + * 2. 写入misc分区设置bootonce-bootloader标志 + * 3. 重启系统进入uboot执行升级脚本 + * + * @param ota_path 升级包的完整路径 (例如: "/tmp/udisk/update.tar.gz") + * + * @return 0: 成功 + * -1: 参数错误 + * -2: 挂载失败 + * -3: 解压失败 + * -4: misc分区写入失败 + * -5: 重启失败 + */ +extern int update_system(const char *ota_path); + +#ifdef __cplusplus +} +#endif + +#endif /* _HARDWARE_OTA_H_ */ diff --git a/sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/lib/libhardware.a b/sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/lib/libhardware.a new file mode 100644 index 0000000000000000000000000000000000000000..a6638a44ae1b99ab4d5f7b29c9ada945799b168d GIT binary patch literal 10574 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 literal 0 HcmV?d00001 diff --git a/sdk/X-AIOS-LT00-V1.0.4/tools/make_ota_package.sh b/sdk/X-AIOS-LT00-V1.0.4/tools/make_ota_package.sh new file mode 100755 index 000000000..b4c2a4296 --- /dev/null +++ b/sdk/X-AIOS-LT00-V1.0.4/tools/make_ota_package.sh @@ -0,0 +1,162 @@ +#!/bin/bash +# OTA升级包制作脚本 +# 用途: 自动收集编译输出的固件文件并打包成update.tar.gz + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +# 项目根目录 +SDK_ROOT="/home/hyx/work/linuxOS_MC3302/sdk/X-AIOS-LT00-V1.0.4" +OUT_DIR="${SDK_ROOT}/out/qm10xd_linux/qmimages" + +# 临时工作目录 +WORK_DIR="/tmp/ota_package_$(date +%Y%m%d_%H%M%S)" +UPDATE_DIR="${WORK_DIR}/update" + +# 输出目录 +OUTPUT_DIR="${1:-/tmp}" +OUTPUT_FILE="${OUTPUT_DIR}/update.tar.gz" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN} OTA升级包制作工具${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 检查源文件是否存在 +check_file() { + if [ ! -f "$1" ]; then + echo -e "${RED}错误: 文件不存在: $1${NC}" + return 1 + fi + echo -e "${GREEN}✓${NC} 找到: $(basename $1)" + return 0 +} + +# 创建工作目录 +echo -e "${YELLOW}[1/5] 创建工作目录...${NC}" +mkdir -p "${UPDATE_DIR}" +echo "工作目录: ${WORK_DIR}" +echo "" + +# 检查并复制文件 +echo -e "${YELLOW}[2/5] 检查源文件...${NC}" + +UBOOT_SRC="${OUT_DIR}/u-boot.bin" +KERNEL_SRC="${OUT_DIR}/zImage-dtb" +SYSTEM_SRC="${OUT_DIR}/system.ubi" +ROOTFS_SRC="${OUT_DIR}/rootfs.ubi" +LOGO_SRC="${OUT_DIR}/logo.img" + +check_file "${UBOOT_SRC}" || exit 1 +check_file "${KERNEL_SRC}" || exit 1 +check_file "${SYSTEM_SRC}" || exit 1 +check_file "${ROOTFS_SRC}" || exit 1 +check_file "${LOGO_SRC}" || exit 1 + +echo "" +echo -e "${YELLOW}[3/5] 压缩固件文件...${NC}" + +# 压缩uboot +echo "压缩 u-boot.bin..." +lzma -c "${UBOOT_SRC}" > "${UPDATE_DIR}/u-boot.bin.lzma" +echo -e "${GREEN}✓${NC} u-boot.bin.lzma ($(du -h ${UPDATE_DIR}/u-boot.bin.lzma | cut -f1))" + +# 压缩kernel +echo "压缩 zImage-dtb..." +lzma -c "${KERNEL_SRC}" > "${UPDATE_DIR}/zImage-dtb.lzma" +echo -e "${GREEN}✓${NC} zImage-dtb.lzma ($(du -h ${UPDATE_DIR}/zImage-dtb.lzma | cut -f1))" + +# 压缩logo +echo "压缩 logo.img..." +lzma -c "${LOGO_SRC}" > "${UPDATE_DIR}/logo.img.lzma" +echo -e "${GREEN}✓${NC} logo.img.lzma ($(du -h ${UPDATE_DIR}/logo.img.lzma | cut -f1))" + +# 复制ubi镜像 +echo "复制 system.ubi..." +cp "${SYSTEM_SRC}" "${UPDATE_DIR}/system_2KB_128KB_24MB.ubi" +echo -e "${GREEN}✓${NC} system_2KB_128KB_24MB.ubi ($(du -h ${UPDATE_DIR}/system_2KB_128KB_24MB.ubi | cut -f1))" + +echo "复制 rootfs.ubi..." +cp "${ROOTFS_SRC}" "${UPDATE_DIR}/rootfs_2KB_128KB_10MB.ubi" +echo -e "${GREEN}✓${NC} rootfs_2KB_128KB_10MB.ubi ($(du -h ${UPDATE_DIR}/rootfs_2KB_128KB_10MB.ubi | cut -f1))" + +echo "" +echo -e "${YELLOW}[4/5] 添加升级进度图片和脚本...${NC}" + +# 从SDK中复制进度图片 +LOGO_SRC_DIR="${SDK_ROOT}/tools/ubuntu/logotool/logopart/meisite" +if [ -d "${LOGO_SRC_DIR}" ]; then + echo "复制SDK中的进度图片..." + if [ -f "${LOGO_SRC_DIR}/logo_update_0.jpg" ]; then + cp "${LOGO_SRC_DIR}/logo_update_0.jpg" "${UPDATE_DIR}/logo_update.jpg" + echo -e "${GREEN}✓${NC} logo_update.jpg" + fi + for i in {1..5}; do + if [ -f "${LOGO_SRC_DIR}/logo_update_${i}.jpg" ]; then + cp "${LOGO_SRC_DIR}/logo_update_${i}.jpg" "${UPDATE_DIR}/" + echo -e "${GREEN}✓${NC} logo_update_${i}.jpg" + else + echo -e "${RED}✗${NC} 警告: 找不到 logo_update_${i}.jpg" + fi + done +else + echo -e "${RED}✗${NC} 错误: 找不到进度图片目录: ${LOGO_SRC_DIR}" + exit 1 +fi + +# 添加uboot升级脚本 +SCRIPT_OTA="${SDK_ROOT}/tools/partition/qm10xd/los_spi-nand/demo_ld_nand/script-ota.ini" +if [ -f "${SCRIPT_OTA}" ]; then + echo "复制 script-ota.ini..." + cp "${SCRIPT_OTA}" "${UPDATE_DIR}/" + echo -e "${GREEN}✓${NC} script-ota.ini" +else + echo -e "${RED}✗${NC} 错误: 找不到 script-ota.ini" + exit 1 +fi + +# 生成版本信息文件 +echo "生成版本信息文件..." +UPDATE_VERSION="${UPDATE_VERSION:-1.0.0}" +cat > "${UPDATE_DIR}/.update_info.txt" < /dev/null 2>&1 + +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN} 升级包制作完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo "升级包位置: ${OUTPUT_FILE}" +echo "升级包大小: $(du -h ${OUTPUT_FILE} | cut -f1)" +echo "" +echo "升级包内容:" +tar -tzf "${OUTPUT_FILE}" | sed 's/^/ - /' +echo "" + +# 清理临时目录 +echo -e "${YELLOW}清理临时文件...${NC}" +rm -rf "${WORK_DIR}" + +echo -e "${GREEN}完成!${NC}" +echo "" +echo "使用方法:" +echo " 1. 将 ${OUTPUT_FILE} 复制到U盘" +echo " 2. 在目标板上运行: test_ota /tmp/udisk/update.tar.gz" +echo " 3. 系统会自动升级并重启" +echo ""