add system OTA process and change the version number to 1.0.0

This commit is contained in:
hyx 2026-04-03 09:16:39 +08:00
parent 1ec442c549
commit 141822dc2c
6 changed files with 294 additions and 22 deletions

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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_ */

View File

@ -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" <<EOF
update_version=${UPDATE_VERSION}
update_time=$(date +%Y%m%d_%H%M%S)
update_desc=OTA upgrade package
EOF
echo -e "${GREEN}${NC} .update_info.txt (version: ${UPDATE_VERSION})"
echo ""
echo -e "${YELLOW}[5/5] 打包升级文件...${NC}"
# 进入update目录打包
cd "${UPDATE_DIR}"
tar -czvf "${OUTPUT_FILE}" .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 ""