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 000000000..a6638a44a Binary files /dev/null and b/sdk/X-AIOS-LT00-V1.0.4/tools/libhardware/lib/libhardware.a differ 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 ""