U-Boot 系统基础入门 - 第12章:脚本编程 (hush shell)

本章将介绍如何在U-Boot中使用hush shell编写自动化脚本,这是嵌入式系统开发和调试中非常重要的技能。

1. hush shell 简介

U-Boot使用hush shell作为其默认的命令解释器,它比传统的Bourne shell功能更简单,但足够满足U-Boot环境下的脚本编写需求。

hush shell 特点:

2. 基本脚本语法

2.1 脚本执行方式

在U-Boot中执行脚本有两种主要方式:

直接执行命令序列
U-Boot> echo hello; echo world
hello
world
执行脚本文件
U-Boot> source /boot/autoboot.scr

2.2 变量操作

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

3. 控制结构

3.1 条件判断 (if-then-else-fi)

hush shell支持基本的条件判断:

条件判断示例
U-Boot> if test $bootdelay -gt 0; then echo "Waiting..."; else echo "Booting now"; fi

3.2 循环结构 (for, while)

hush shell支持基本的循环结构:

for循环示例
U-Boot> for i in 1 2 3; do echo "Count: $i"; done
Count: 1
Count: 2
Count: 3
while循环示例
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有些差异,特别是在变量运算和条件测试方面。

4. 实用脚本示例

4.1 自动启动脚本

自动启动脚本 (autoboot.scr)
# 设置环境变量
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

4.2 固件更新脚本

固件更新脚本 (update.scr)
# 固件更新脚本
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

5. 脚本编译与部署

U-Boot脚本需要编译为二进制格式才能使用:

5.1 创建脚本文件

创建一个文本文件,例如myscript.txt,包含你的脚本命令。

5.2 编译脚本

使用U-Boot提供的mkimage工具编译脚本:

mkimage -T script -C none -n "My U-Boot Script" -d myscript.txt myscript.scr

5.3 部署脚本

将生成的.scr文件放入存储设备(如MMC、NAND等)的适当位置。

最佳实践: 将常用脚本放在存储设备的/boot目录下,并设置bootcmd环境变量来自动执行。

6. 调试技巧

hush shell虽然功能有限,但结合U-Boot的强大硬件操作能力,可以编写出非常实用的自动化脚本,大大简化嵌入式系统的开发和维护工作。