Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 在线升级uboot,内核和文件系统

在线升级uboot,内核和文件系统
fulinux
 下面我在fl2440开发板上运行正常的情况下实现更新或升级uboot,内核和文件系统的任务。 如下是一个在线升级的脚本:#!/bin/sh#This shell scripts used to update the u-boot linux kernel, root file system image when Linux running erase_cmd=flash_eraseallwrite_cmd=nandwritecu_version=`cat /proc/version`PROG_NAME=`basename $0`IMAGE_TYPE=ROOTFS_TYPE= usage(){ echo " Usage: $PROG_NAME -[f/k/u/h] [filename]" echo "Example: $PROG_NAME linuxrom-s3c2440.bin" echo " $PROG_NAME u-boot-s3c2440.bin" echo " $PROG_NAME rootfs.jffs2" echo " $PROG_NAME -u uboot.bin" echo " $PROG_NAME -k lin.bin" echo " $PROG_NAME -f fs.yaffs2" echo " $PROG_NAME -h"exit;} burn_image(){ partition=$1 file_name=$2  if ( ! $erase_cmd /dev/$partition) ; then echo "Erase /dev/$partition failure." exit fi if ( ! $write_cmd -p /dev/$partition $file_name) ; then echo "Write $file_name to /dev/$partition failure." exit fi}check_and_umount(){ MTD=$1 MTDBLOCK=mtdblock${MTD:3} MOUNT_BLOCK=`cat /proc/mounts | grep $MTDBLOCK|awk -F " " "{print $1}"`  if [ -n "$MOUNT_BLOCK" ] ; then umount /dev/$MTDBLOCK else echo "No need umount $MTDBLOCK" fi} check_image_type(){ IMAGE_NAME=$1 if echo $IMAGE_NAME | grep -E "boot|uboot|u-boot|bootloader" > /dev/null ; then IMAGE_TYPE=BOOTLOADER elif echo $IMAGE_NAME | grep -E "linux|kernel" > /dev/null ; then IMAGE_TYPE=KERNEL elif echo $IMAGE_NAME | grep -E "rootfs|jffs2|yaffs2|ubifs|cramfs|ramdisk" > /dev/null ; then IMAGE_TYPE=ROOTFS else IMAGE_TYPE=UNKNOW fi} up_bootloader(){ IMAGE_FILE=$1 echo "Upgrade bootloader image "$IMAGE_FILE""  #To-Do: Find the mtd here, only do upgrade if we can find it, or throw error and exit out #echo $mtd | grep -E "u-boot|uboot" | awk -F ":" "{print $1}"  partition=`cat /proc/mtd | grep -E "uboot|u-boot|U-boot|bootloader" | awk -F ":" "{print $1}"` if [ -z $partition ] ; then echo "Can not find the u-boot partition for update!" exit fi  #To-Do: Start to burn the image to corresponding partition here burn_image $partition $IMAGE_FILE} up_kernel(){ IMAGE_FILE=$1 echo "Upgrade linux kernel image "$IMAGE_FILE""  #To-Do: Find the mtd here, only do upgrade if we can find it, or throw error and exit out #echo $mtd | grep -E "linux|kernel" | awk -F ":" "{print $1}"  partition=`cat /proc/mtd | grep -E "linux|kernel" | awk -F ":" "{print $1}"`  if [ -z $partition ] ; then echo "Can not find the kernel partition for update!" exit fi  #To-Do: Start to burn the image to corresponding partition here burn_image $partition $IMAGE_FILE} up_rootfs(){ IMAGE_NAME=$1 ROOTFS_TYPE=${IMAGE_NAME##*.} VALID_ROOTFS_TYPE=0 echo $ROOTFS_TYPE  for i in jffs2 yaffs2 ubifs ramdisk cramfs ; do if [ "$i" = "$ROOTFS_TYPE" ] ; then VALID_ROOTFS_TYPE=1 break; fi done  if [ 0 == $VALID_ROOTFS_TYPE ] ; then echo "============================================================================================" echo "ERROR: Unknow rootfs image "$IMAGE_NAME", suffix/type: .$ROOTFS_TYPE" echo "The suffix of rootfs image file name should be: .ramdisk .yaffs2 .jffs2 .ubifs .cramfs" echo "============================================================================================" usage fi  echo "Upgrade $ROOTFS_TYPE rootfs image "$IMAGE_FILE""  #To-Do: Find the mtd here, only do upgrade if we can find it, or throw error and exit out MTD=`cat /proc/mtd | grep -E "$ROOTFS_TYPE" | awk -F ":" "{print $1}"`  #To-Do: Check this partition already mounted or not, if mounted then umount it first here check_and_umount $MTD  #To-Do: Start to burn the image to corresponding partition hereburn_image $MTD $IMAGE_FILE}  while getopts "afku" optdo case $opt in a) IMAGE_TYPE=APPS shift 1 break; ;;  k) IMAGE_TYPE=KERNEL shift 1 break; ;;  f) IMAGE_TYPE=ROOTFS shift 1 break; ;;  u) IMAGE_TYPE=BOOTLOADER shift 1 break; ;;  h) usage ;;  ?) usage ;; esacdone IMAGE_FILE=$1if [ ! -n "$IMAGE_FILE" ] ; then usagefi if [ ! -n "$IMAGE_TYPE" ] ; then check_image_type $IMAGE_FILEfi if [ $IMAGE_TYPE == BOOTLOADER ] ; then up_bootloader $IMAGE_FILEelif [ $IMAGE_TYPE == KERNEL ] ; then up_kernel $IMAGE_FILEelif [ $IMAGE_TYPE == ROOTFS ] ; then echo "$IMAGE_FILE ***************" up_rootfs $IMAGE_FILEelse echo "============================================================================================" echo "ERROR: Unknow image type: "$IMAGE_NAME"" echo "============================================================================================" usagefi 文件系统如下:[lingyun@localhost fulinux]$ lskernel rootfs systools u-boot[lingyun@localhost fulinux]$ cd rootfs/[lingyun@localhost rootfs]$ lsramdisk-s3c2440.gz rootfs rootfs_tree.tar.bz2 tools[lingyun@localhost rootfs]$ cd rootfs[lingyun@localhost rootfs]$ pwd/home/lingyun/fulinux/rootfs/rootfs[lingyun@localhost rootfs]$  因为上面的shell脚本需要用到两个应用程序flash_eraseall和nandwrite所以需要在上面的文件系统里有这两个程序。如果没有添加方式如下:[lingyun@localhost fulinux]$ lskernel rootfs systools u-boot[lingyun@localhost fulinux]$ cd systools/[lingyun@localhost systools]$ lsbusybox[lingyun@localhost systools]$ cd busybox/[lingyun@localhost busybox]$ lsbuild.sh busybox-1.20.2 busybox-1.20.2.tar.bz2 patch[lingyun@localhost busybox]$ cd busybox-1.20.2[lingyun@localhost busybox-1.20.2]$ [lingyun@localhost busybox]$ lsbuild.sh busybox-1.20.2 busybox-1.20.2.tar.bz2 patch[lingyun@localhost busybox]$ cd busybox-1.20.2[lingyun@localhost busybox-1.20.2]$ vt100[lingyun@localhost busybox-1.20.2]$ make menuconfig主目录:Busybox Settings --->。。。Installation Options ("make install" behavior) --->What kind of applet links to install (as soft-links) --->指定文件系统的目录位置:(/home/lingyun/fulinux/systools/busybox/../../rootfs/rootfs) BusyBox installation prefix。。。回到主目录:Miscellaneous Utilities ---> 选择如下的两个程序:。。。[*] nandwrite。。。[*] flash_eraseall。。。保存退出。