#!/bin/bash # OTA升级包制作脚本 # 用途: 自动收集编译输出的固件文件并打包成update.tar.gz set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SDK_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" OUT_DIR="${SDK_ROOT}/out/qm10xd_linux/qmimages" echo "检测到SDK路径: ${SDK_ROOT}" # 临时工作目录 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.ubi" echo -e "${GREEN}✓${NC} system.ubi ($(du -h ${UPDATE_DIR}/system.ubi | cut -f1))" echo "复制 rootfs.ubi..." cp "${ROOTFS_SRC}" "${UPDATE_DIR}/rootfs.ubi" echo -e "${GREEN}✓${NC} rootfs.ubi ($(du -h ${UPDATE_DIR}/rootfs.ubi | cut -f1))" echo "" echo -e "${YELLOW}[4/5] 添加升级脚本...${NC}" # 添加uboot升级脚本(进度图片从logo分区读取,不需要打包) 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 ""