Files
open-xiaoai/packages/flash-tool/flash
T

150 lines
3.3 KiB
Bash
Executable File

#!/usr/bin/env bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
CYAN='\033[0;36m'
RESET='\033[m'
UPDATE_BIN="macos/update"
# 检查运行环境
if [ "$(uname -s)" != "Darwin" ]; then
echo "❌ 该脚本只支持 macOS 运行"
exit 1
fi
# 检查 update 工具是否存在
if [ ! -f "$UPDATE_BIN" ]; then
echo "❌ 找不到刷机工具: $UPDATE_BIN"
exit 1
fi
# 运行 update 命令
run_update() {
local cmd="$UPDATE_BIN 2>/dev/null"
local need_spaces=0
if [[ "$1" == "bulkcmd" ]]; then
need_spaces=1
fi
cmd+=" $1"
shift 1
for arg in "$@"; do
if [[ $need_spaces == 1 ]]; then
cmd+=" \" $arg\""
else
cmd+=" $arg"
fi
done
echo -e "${CYAN}执行: $cmd${RESET}"
local result=$(eval "$cmd")
echo -e "${YELLOW}$result${RESET}"
if echo "$result" | grep -q "ERR"; then
echo -e "${RED}命令执行失败${RESET}"
return 1
fi
return 0
}
# 显示帮助信息
show_help() {
echo ""
echo "小爱音箱刷机工具 v1.0.0 by https://del.wang"
echo ""
echo "使用方法:"
echo " ./flash connect # 连接设备"
echo " ./flash delay <秒数> # 设置启动延时,如 5 秒"
echo " ./flash switch <boot分区> # 设置启动分区,如 boot0"
echo " ./flash system <分区> <固件路径> # 把固件刷到指定分区,如 system0"
}
# 连接设备
cmd_connect() {
echo "🔌 请先拔掉设备电源,然后重新插上电源"
echo "💡 如果长时间未连接,请拔插电源后重试..."
while true; do
run_update identify 7
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 设备已连接${RESET}"
return 0
fi
echo "⏳ 等待设备连接..."
sleep 1
done
}
# 设置启动分区
cmd_switch() {
if [ -z "$1" ]; then
echo "❌ 请指定启动分区名称,如: ./flash switch boot0"
return 1
fi
echo "📋 设置启动分区为: $1"
run_update bulkcmd "setenv boot_part $1"
run_update bulkcmd "saveenv"
echo -e "${GREEN}✅ 设置成功${RESET}"
}
# 设置启动延时
cmd_delay() {
if [ -z "$1" ]; then
echo "❌ 请指定启动延时(秒),如: ./flash delay 15"
return 1
fi
echo "⏱️ 设置启动延时为: $1 秒"
run_update bulkcmd "setenv bootdelay $1"
run_update bulkcmd "saveenv"
echo -e "${GREEN}✅ 设置成功${RESET}"
}
# 刷入分区
cmd_system() {
if [ -z "$1" ] || [ -z "$2" ]; then
echo "❌ 请指定分区名称和文件,如: ./flash system system0 root.squashfs"
return 1
fi
if [ ! -f "$2" ]; then
echo "❌ 文件不存在: $2"
return 1
fi
echo "💾 正在刷入 $2$1 分区..."
run_update partition "$1" "$2"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 刷入成功${RESET}"
else
echo -e "${RED}❌ 刷入失败${RESET}"
return 1
fi
}
# 主命令处理
case "$1" in
connect)
cmd_connect
;;
switch)
cmd_switch "$2"
;;
delay)
cmd_delay "$2"
;;
system)
cmd_system "$2" "$3"
;;
*)
show_help
;;
esac