147 lines
4.4 KiB
Bash
Executable File
147 lines
4.4 KiB
Bash
Executable File
#!/bin/bash
|
||
# OTA升级包制作脚本
|
||
# 用途: 自动收集编译输出的固件文件并打包成update.tar.gz
|
||
# 使用方法:UPDATE_VERSION=1.0.1 ./make_ota_package.sh
|
||
|
||
set -e
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m'
|
||
|
||
# 自动检测SDK根目录(脚本位于 sdk/X-AIOS-LT00-V1.0.4/tools/ 目录下)
|
||
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..."
|
||
lzma -c "${SYSTEM_SRC}" > "${UPDATE_DIR}/system.ubi.lzma"
|
||
echo -e "${GREEN}✓${NC} system.ubi.lzma ($(du -h ${UPDATE_DIR}/system.ubi.lzma | cut -f1))"
|
||
|
||
echo "压缩 rootfs.ubi..."
|
||
lzma -c "${ROOTFS_SRC}" > "${UPDATE_DIR}/rootfs.ubi.lzma"
|
||
echo -e "${GREEN}✓${NC} rootfs.ubi.lzma ($(du -h ${UPDATE_DIR}/rootfs.ubi.lzma | 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" <<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 "升级包大小: $(du -h ${OUTPUT_FILE} | cut -f1)"
|
||
echo ""
|
||
echo "升级包内容:"
|
||
tar -tzf "${OUTPUT_FILE}" | sed 's/^/ - /'
|
||
echo ""
|
||
|
||
# 清理临时目录
|
||
echo -e "${YELLOW}清理临时文件...${NC}"
|
||
rm -rf "${WORK_DIR}"
|
||
mv ${OUTPUT_FILE} ${SDK_ROOT}
|
||
echo "升级包位置: ${SDK_ROOT}"
|
||
|
||
echo -e "${GREEN}完成!${NC}"
|
||
echo ""
|
||
echo "测试方法:"
|
||
echo " 1. 将 update.tar.gz 复制到U盘"
|
||
echo " 2. 在目标板上运行: test_ota /tmp/udisk/update.tar.gz"
|
||
echo " 3. 系统会自动升级并重启"
|
||
echo ""
|