本章将介绍如何在U-Boot中使用hush shell编写自动化脚本,这是嵌入式系统开发和调试中非常重要的技能。
U-Boot使用hush shell作为其默认的命令解释器,它比传统的Bourne shell功能更简单,但足够满足U-Boot环境下的脚本编写需求。
在U-Boot中执行脚本有两种主要方式:
U-Boot> echo hello; echo world hello world
U-Boot> source /boot/autoboot.scr
hush shell支持环境变量和局部变量的操作:
| 命令 | 说明 |
|---|---|
setenv var value |
设置环境变量 |
printenv var |
打印环境变量 |
var=value |
设置局部变量 |
echo $var |
引用变量 |
U-Boot> setenv bootdelay 5 U-Boot> printenv bootdelay bootdelay=5 U-Boot> name=U-Boot U-Boot> echo $name U-Boot
hush shell支持基本的条件判断:
U-Boot> if test $bootdelay -gt 0; then echo "Waiting..."; else echo "Booting now"; fi
hush shell支持基本的循环结构:
U-Boot> for i in 1 2 3; do echo "Count: $i"; done Count: 1 Count: 2 Count: 3
U-Boot> i=1; while test $i -le 3; do echo "Count: $i"; i=$((i+1)); done Count: 1 Count: 2 Count: 3
注意: hush shell的语法与标准Bash有些差异,特别是在变量运算和条件测试方面。
# 设置环境变量
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rw
# 检查网络是否可用
if ping 192.168.1.1; then
echo "Network available, trying TFTP boot"
tftp 0x80000000 uImage
bootm 0x80000000
else
echo "Network unavailable, booting from MMC"
mmc dev 0
ext4load mmc 0:1 0x80000000 /boot/uImage
bootm 0x80000000
fi
# 固件更新脚本
echo "Starting firmware update..."
# 检查TFTP服务器
if ping 192.168.1.100; then
echo "TFTP server found"
# 下载新固件
tftp 0x80000000 new_firmware.bin
# 验证下载
if test $filesize -gt 0; then
echo "Downloaded $filesize bytes"
# 擦除Flash
flash erase 0x0 $filesize
# 写入新固件
flash write 0x80000000 0x0 $filesize
echo "Firmware update complete"
else
echo "Error: Empty file downloaded"
fi
else
echo "Error: TFTP server not found"
fi
U-Boot脚本需要编译为二进制格式才能使用:
创建一个文本文件,例如myscript.txt,包含你的脚本命令。
使用U-Boot提供的mkimage工具编译脚本:
mkimage -T script -C none -n "My U-Boot Script" -d myscript.txt myscript.scr
将生成的.scr文件放入存储设备(如MMC、NAND等)的适当位置。
最佳实践: 将常用脚本放在存储设备的/boot目录下,并设置bootcmd环境变量来自动执行。
echo命令输出调试信息setenv和printenv检查环境变量&&和||处理命令执行结果hush shell虽然功能有限,但结合U-Boot的强大硬件操作能力,可以编写出非常实用的自动化脚本,大大简化嵌入式系统的开发和维护工作。