红联Linux门户
Linux帮助

嵌入式Linux固件升级

发布时间:2015-02-17 10:50:52来源:linux网站作者:jsfzdd

开发需求

基于TCP/IP完成驱动模块和应用程序的更新、升级

特殊声明

该文档中驱动程序和应用程序统称为“固件”。

主机:VMWare--Fedora 9

开发板:yc2440--64MB Nandflash;Kernel:2.6.24.4

编译器:arm-linux-gcc-4.0.0


设计原理图
嵌入式Linux固件升级

注:以上图片上传到红联Linux系统教程频道中。

说明:

开发板启动FileServer应用程序,作为TCP/IP的Server端,提供接收升级文件的服务。

当需要进行固件升级时,PC启动FileClient应用程序,作为TCP/IP的Client端,提供发送升级文件的服务。

Shell脚本文件StartShell判断是否有固件需要升级,如果有更新现有固件后,启动更新后的固件,如果没有,启动现有固件。
 

文件名称

所在目录

功能

FileClient

Linux PC下任意目录

PC机TCP/IP客户端,

向开发板发送升级固件。

FileServer

Linux开发板

/tmp/update/

开发板TCP/IP服务端,

接收客户端发送的升级固件。

StartShell

Linux开发板

/etc/init.d/

替换相应固件,

启动相应固件。 


实现步骤
1.配置启动文件(开发板:192.168.1.168)

在开发板中,编辑开机启动脚本/etc/init.d/rcS

#cp ~/StartShell /etc/init.d/

#vi /etc/init.d/rcS

在该文件的最后面,填写下面信息:

./StartShell

重新启动开发板。


2.发送更新文件文件(Linux PC:192.168.1.200)

#./fileclient ./AppMain 192.168.1.168

#./fileclient ./helloworld.ko 192.168.1.168

上述更新文件,被发送至开发板的/tmp/update/(FileServer所在的目录)目录中。

重新启动开发板,文件升级完成。

注:如果要动态加载驱动模块,首先必须在开发板上创建/lib/modules/2.6.24.4目录。

注:TCP/IP 服务尽量使用大端口号,如:50000,否则服务器端会有Bind失败的情况出现。

服务器端如果有防火墙,需要开放该端口号,否则客户端会有connect失败的情况出现。

StartShell脚本

#! /bin/sh

#判断是否有新的驱动文件,如果有进行替换

if [ -f /tmp/update/helloworld.ko ]

then
echo "it is a new ko file"
rm /lib/modules/helloworld.ko -f
cp /tmp/update/helloworld.ko /lib/modules/
rm /tmp/update/helloworld.ko -f
else
echo "it is not a new ko file"

fi
insmod helloworld

#判断是否有新的应用程序文件,如果有进行替换

if [ -f /tmp/update/AppMain ]
then
echo "it is a new app file"
rm /root/application/AppMain -f
cp /tmp/update/AppMain /root/application/
chmod 777 /tmp/update/AppMain
rm /tmp/update/AppMain -f
else
echo "it is not a new app file"
fi

#启动应用程序

cd /root/application/

./AppMain &

#启动TCP/IP服务程序

cd /tmp/update/

./FileServer &