请教嵌入式设备如何更新固件

62 views
Skip to first unread message

Yang Xu

unread,
Feb 13, 2011, 9:37:02 PM2/13/11
to linux-kernel
我已经知道如何开机时利用uboot更新固件,例如开机时自动检测u盘中是否有特定文件名的固件,如有就先进行擦写烧入新固件后再启动。
产品还在设计阶段,要求通过web管理的方式更新固件,这个我就没思路了。
此时应该是linux正在运行httpd,最多通过tftp把固件下载到内存或者某个flash分区中,然后该怎么做呢?
我想linux不能擦除正在使用的内核、根文件系统分区吧,linux自己顶多能更新uboot固件。也没有什么现成的机制让linux通知uboot来完成更新。

请教高手,你们的产品里如何通过web方式更新固件(即linux正在运行时)?固件形式是uboot、kernel、文件系统分开还是合在一起做一个bin?
_______________________________________________
Linux 内核开发中文邮件列表
Linux-...@zh-kernel.org
http://zh-kernel.org/mailman/listinfo/linux-kernel
Linux 内核开发中文社区: http://zh-kernel.org

曾笑

unread,
Feb 13, 2011, 11:10:19 PM2/13/11
to Yang Xu, linux-kernel
uboot、kernel、文件系统分开还是合在一起做一个bin,合在一起是多大,内存够不够用呢?
在没有网络的情况下你们是处理update 的。

Peter Chen

unread,
Feb 13, 2011, 11:42:21 PM2/13/11
to 曾笑, linux-kernel
2011/2/14 曾笑 <hawkw...@gmail.com>:

> uboot、kernel、文件系统分开还是合在一起做一个bin,合在一起是多大,内存够不够用呢?
> 在没有网络的情况下你们是处理update 的。
>
> 在 2011年2月14日 上午10:37,Yang Xu <kernel....@gmail.com>写道:
>
>> 我已经知道如何开机时利用uboot更新固件,例如开机时自动检测u盘中是否有特定文件名的固件,如有就先进行擦写烧入新固件后再启动。
>> 产品还在设计阶段,要求通过web管理的方式更新固件,这个我就没思路了。
>> 此时应该是linux正在运行httpd,最多通过tftp把固件下载到内存或者某个flash分区中,然后该怎么做呢?
>>
>> 我想linux不能擦除正在使用的内核、根文件系统分区吧,linux自己顶多能更新uboot固件。也没有什么现成的机制让linux通知uboot来完成更新。
>>
>> 请教高手,你们的产品里如何通过web方式更新固件(即linux正在运行时)?固件形式是uboot、kernel、文件系统分开还是合在一起做一个bin?
>> _
内核是放在固态存储设备里的,是可以直接更新的。至于根文件系统,可以做成一个ext3/ext4文件,然后放在usr分区里,比如fat32.
然后做一个initramfs的启动的系统,在init.rc里将根文件系统更新掉。
(sd的p1为根文件系统,p2为usr系统)
mount /dev/mmcblk0p2 /mnt/vfat
dd if=/mnt/vfat/rootfs.ext3 of=/dev/mmcblk0p1

______________________________________________
>> Linux 内核开发中文邮件列表
>> Linux-...@zh-kernel.org
>> http://zh-kernel.org/mailman/listinfo/linux-kernel
>> Linux 内核开发中文社区: http://zh-kernel.org
> _______________________________________________
> Linux 内核开发中文邮件列表
> Linux-...@zh-kernel.org
> http://zh-kernel.org/mailman/listinfo/linux-kernel
> Linux 内核开发中文社区: http://zh-kernel.org

--
BR,
Peter Chen

enzo fang

unread,
Feb 15, 2011, 1:17:36 AM2/15/11
to Yang Xu, linux-kernel
如何修改uboot使它可以通过u盘自动升级固件,
哪里有相关的资料?

2011/2/14 Yang Xu <kernel....@gmail.com>


--
Best Regards
enzofang

Yang Xu

unread,
Feb 15, 2011, 3:18:55 AM2/15/11
to enzo fang, linux-kernel
我是用uboot脚本实现。 说是脚本倒不合适,就是uboot自定义环境变量罢了,时间隔得远了,忘得差不多了。
关键点是run 自定义命令时,如果执行自定义命令过程中出错,uboot将停止继续这个run。
uboot命令都生疏了,用伪代码解释下,不要笑话哦
假设要实现uboot启动完成后,引导kernel前执行如下功能:

if(SD卡中有xx.bin)
{
初始化u盘
拷贝 xx.bin 到内存地址a
擦除 flash 地址b ,长度c
从内存 a 拷贝到 flash b ,长度为c
正常启动
}
else
{
正常启动
}

那么uboot环境变量设置为

setenv update 初始化u盘\;*拷贝 xx.bin 到内存地址a*\;擦除 flash 地址b ,长度c\;从内存 a 拷贝到
flash b ,长度为c;
setenv bootcmd run update\;正常启动;

大概就是这样,执行bootcmd时跳到“子函数”update里,如果黑体那段错误,也就是没有那个文件,则“子函数返回”,不会继续擦写flash了
不要耻笑哦,好久没用nand和u盘了,还是nor flash爽

在 2011年2月15日 下午2:17,enzo fang <feixian...@gmail.com>写道:

> 如何修改uboot使它可以通过u盘自动升级固件,
> 哪里有相关的资料?

yanlong.zhang

unread,
Feb 15, 2011, 3:22:51 AM2/15/11
to Yang Xu, linux-kernel
我觉的逻辑上有点儿问题:
应该要首先初始化u盘才能知道sd卡中是否有xx.bin

Yang Xu

unread,
Feb 15, 2011, 3:27:38 AM2/15/11
to yanlong.zhang, linux-kernel
那个sd卡是打错了,抱歉

网上找了一句例子 bootcmd="usb start \; fatload usb 0:4 0x30008000 zImage\;bootm
usb start \; 就是所谓的初始化

yanlong.zhang

unread,
Feb 15, 2011, 3:30:22 AM2/15/11
to Yang Xu, linux-kernel
usb start 初始化那是人家在uboot里边加了usb driver,如果想读sd卡的内容还
需要fat的filesystem才可以

Yang Xu

unread,
Feb 15, 2011, 3:34:55 AM2/15/11
to yanlong.zhang, linux-kernel
是的,我打错了,应该是
if(u盘中有xx.bin)

{
初始化u盘
拷贝 xx.bin 到内存地址a
擦除 flash 地址b ,长度c
从内存 a 拷贝到 flash b ,长度为c
正常启动
}
else
{
正常启动
}

这里是用伪代码表达从u盘更新的流程,sd卡打错了,应该是u盘。这个if看起来也会让人误解,因为boot命令里没有逻辑判断
这个意思我没找到更好的表达方式

在 2011年2月15日 下午4:30,yanlong.zhang <yanlon...@mstarsemi.com>写道:

> usb start 初始化那是人家在uboot里边加了usb driver,如果想读sd卡的内容还
> 需要fat的filesystem才可以
>
>

yanlong.zhang

unread,
Feb 15, 2011, 3:38:51 AM2/15/11
to Yang Xu, linux-kernel
你说的这个方案我很早就设计过,而且一直在用,主要是usb driver &fat
filesystem,
其他的很简单。

Yang Xu

unread,
Feb 15, 2011, 3:42:50 AM2/15/11
to yanlong.zhang, linux-kernel
膜拜高手。这个是我培训班的时候学的

在 2011年2月15日 下午4:38,yanlong.zhang <yanlon...@mstarsemi.com>写道:

> 你说的这个方案我很早就设计过,而且一直在用,主要是usb driver &fat
> filesystem,
> 其他的很简单。
>
>

enzo fang

unread,
Feb 15, 2011, 7:32:17 AM2/15/11
to Yang Xu, linux-kernel
2011/2/15 Yang Xu <kernel....@gmail.com>

> 那个sd卡是打错了,抱歉
>
> 网上找了一句例子 bootcmd="usb start \; fatload usb 0:4 0x30008000 zImage\;bootm
> usb start \; 就是所谓的初始化
>

我都不知道uboot有usb相关命令,看来先要看看这方面的代码了


--
Best Regards
enzofang

Peter Chen

unread,
Feb 15, 2011, 8:21:21 PM2/15/11
to enzo fang, linux-kernel
2011/2/15 enzo fang <feixian...@gmail.com>:

> 2011/2/15 Yang Xu <kernel....@gmail.com>
>
>> 那个sd卡是打错了,抱歉
>>
>> 网上找了一句例子 bootcmd="usb start \; fatload usb 0:4 0x30008000 zImage\;bootm
>> usb start \; 就是所谓的初始化
>>
>
> 我都不知道uboot有usb相关命令,看来先要看看这方面的代码了
首先要看你的u-boot支不支持usb,命令很简单,都是可以直接定义的, 在common目录下面有很多。
如果你的板子有sd card,用sd card升级比较简单。

--
BR,
Peter Chen

enzo fang

unread,
Feb 15, 2011, 8:45:48 PM2/15/11
to Peter Chen, linux-kernel
为什么你说sd卡比较简单呢,和U盘升级有什么区别?

BTW:
我的uboot版本应该是支持usb的
我在common/cmd_usb.c中找到如下命令定义

#ifdef CONFIG_USB_STORAGE
U_BOOT_CMD(
usb, 5, 1, do_usb,
"USB sub-system",
"reset - reset (rescan) USB controller\n"
"usb stop [f] - stop USB [f]=force stop\n"
"usb tree - show USB device tree\n"
"usb info [dev] - show available USB devices\n"
"usb storage - show details of USB storage devices\n"
"usb dev [dev] - show or set current USB storage device\n"
"usb part [dev] - print partition table of one or all USB storage"
" devices\n"
"usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"
" to memory address `addr'"
);


U_BOOT_CMD(
usbboot, 3, 1, do_usbboot,
"boot from USB device",
"loadAddr dev:part"
);

2011/2/16 Peter Chen <hzpet...@gmail.com>

Cao Abraham (曹振江 BXC)

unread,
Feb 15, 2011, 8:50:02 PM2/15/11
to enzo fang, Peter Chen, linux-kernel
USB 协议比较难。

Peter Chen

unread,
Feb 16, 2011, 8:53:49 PM2/16/11
to enzo fang, linux-kernel
2011/2/16 enzo fang <feixian...@gmail.com>:

> 为什么你说sd卡比较简单呢,和U盘升级有什么区别?
>
> BTW:
> 我的uboot版本应该是支持usb的
> 我在common/cmd_usb.c中找到如下命令定义
>
> #ifdef CONFIG_USB_STORAGE
> U_BOOT_CMD(
> usb, 5, 1, do_usb,
> "USB sub-system",
> "reset - reset (rescan) USB controller\n"
> "usb stop [f] - stop USB [f]=force stop\n"
> "usb tree - show USB device tree\n"
> "usb info [dev] - show available USB devices\n"
> "usb storage - show details of USB storage devices\n"
> "usb dev [dev] - show or set current USB storage device\n"
> "usb part [dev] - print partition table of one or all USB storage"
> " devices\n"
> "usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"
> " to memory address `addr'"
> );
>
>
> U_BOOT_CMD(
> usbboot, 3, 1, do_usbboot,
> "boot from USB device",
> "loadAddr dev:part"
> );
>
这是usb上层的命令,uboot里有你的板子的usb host driver的驱动吗?
用u盘升级,要u-boot支持usb host dirver, usb mass storage driver, and filesystem support
sd/mmc只需要: sd/mmc driver and filesystem support
sd/mmc经常用来启动, 如果你是sd/mmc启动,那就意味着你的 sd/mmc driver已经有了。
嵌入式设备里有usb host port的设备要远少于有sd slot的设备。
u-boot里usb host controller的driver的数量应该要少于mmc的driver。

--
BR,
Peter Chen

Reply all
Reply to author
Forward
0 new messages