blob: f6cef0ecb270934e647b984b5efc6212751848dd [file] [log] [blame]
#!/bin/bash
#
# Author: Linaro Android Team <linaro-dev@lists.linaro.org>
#
# These files are Copyright (C) 2012 Linaro Limited and they
# are licensed under the Apache License, Version 2.0.
# You may obtain a copy of this license at
# http://www.apache.org/licenses/LICENSE-2.0
function show_usage() {
echo "Usage:"
echo -e "\t`basename $0` [--serial|-s serial] [--partition|-p boot-partition] <boot.tar.bz2|uImage|board.dtb|...>"
echo -e "\t\tUpdate the kernel files in the boot partition of the specified"
echo -e "\t\tandroid device with the specified boot.tar.bz2 file"
echo ""
echo -e "\t`basename $0` [--serial|-s serial] kernel-source-directory"
echo -e "\t\tPush all the module files in the specified kernel dirctory"
echo -e "\t\tinto the /system/modules dirctory of the specified android device"
echo ""
echo -e "\t`basename $0` --help|-h"
echo -e "\t\tPrint out this help information"
}
function parse_argv() {
while test -n "$1"; do
case "$1" in
--help|-h)
show_usage
exit 0
;;
--serial|-s)
serial=$2;
shift 2
;;
--partition|-p)
boot_partition=$2;
shift 2
;;
*)
if [ -n "${file_path}" ]; then
show_usage
echo "Too many arguments, see --help for details"
exit 1
else
file_path="$1"
shift
fi
;;
esac
done
}
function check_parameters(){
if [ -n "${serial}" ]; then
export ANDROID_SERIAL=${serial}
else
serial=`adb get-serialno|sed 's/\r//g'`
if [ "X${serial}" == "Xunknown" ]; then
echo "Can not get the serial number autotically,"
echo "Please specify the serial number with the -s option"
exit 1
else
export ANDROID_SERIAL=${serial}
fi
fi
if [ -z "${file_path}" ]; then
echo "Please specify the path of the boot.tar.bz2 file or the directory"
echo "where all module files are stored"
exit 1
fi
if [ ! -e "${file_path}" ]; then
echo "The specified path(${file_path}) does not exist"
exit 1
fi
if [ ! -f "${file_path}" ] && [ ! -d "${file_path}" ]; then
echo "The specified path(${file_path}) is neither a file and nor a directory"
exit 1
fi
}
function check_device_status(){
status=`adb get-state|sed 's/\r//g'`
if [ "X${status}" != "Xdevice" ]; then
echo "The device is not on line,"
echo "Please check the device status"
exit 1
fi
}
function get_boot_partition(){
product_device=`adb shell getprop ro.product.device|sed 's/\r//g'`
case "X${product_device}Y" in
"XY" )
echo "Failed to get the value of ro.build.product property"
exit 1
;;
"XpandaboardY" )
boot_partition="mmcblk0p1"
;;
"XorigenY" )
boot_partition="mmcblk0p2"
;;
"Xvexpress_a9Y" )
boot_partition="mmcblk0p1"
;;
"XvexpressY" )
boot_partition="mmcblk0p1"
;;
* )
echo "The product device(${product_device}) is not supported!"
exit 1
;;
esac
adb shell ls "/dev/block/${boot_partition}"|grep "/dev/block/${boot_partition}" >&/dev/null
if [ $? -ne 0 ]; then
echo "Failed to get the boot partition of your device."
echo "Please specify the boot partition with the -p option."
exit 1
fi
}
function verify_kernel(){
src_dir="${1}"
tgt_dir="${2}"
for f in `ls ${src_dir}`; do
verify_file "${src_dir}/${f}" "${tgt_dir}"
if [ $? -ne 0 ]; then
return 1
fi
done
return 0
}
function verify_file(){
src_file="${0}"
tgt_dir="${1}"
src_name=`basename ${src_file}`
src_md5sum=`md5sum ${src_file}|cut -d \ -f 1`
tgt_md5sum=`adb shell md5sum ${tgt_dir}/${src_name}|cut -d \ -f 1`
if [ "X${md5sum_src}" != "X${md5sum_tgt}" ];then
echo "File ${src_file} is not the same in the device with the source"
return 1
fi
return 0
}
function set_func_value(){
if [ -f ${file_path} ]; then
func_value='kernel'
elif [ -d ${file_path} ]; then
func_value='modules'
fi
}
function update_modules(){
tgt_dir='/system/modules/'
modules_org=`mktemp -u -d /tmp/modules.XXX`
echo "Pull the original module files for backup in ${modules_org}"
adb pull ${tgt_dir} ${modules_org} &>/dev/null
if [ $? -ne 0 ]; then
echo "Failed to pull the original module file from /system/modules of device($ANDROID_SERIAL)"
exit 1
fi
adb remount
if [ $? -ne 0 ]; then
echo "Faile to run [adb remount] for the device($ANDROID_SERIAL)."
exit 1
fi
all_modules=`find ${file_path}/ -type f -name '*.ko'`
OLD_LFS="${LFS}"
IFS=$'\n'
for f_module in ${all_modules}; do
echo "Pushing file: ${f_module}"
adb push "${f_module}" "${tgt_dir}" &>/dev/null
if [ $? -ne 0 ]; then
echo "Failed to push file: ${f_module}"
exit 1
fi
verify_file "${f_module}" "${tgt_dir}"
if [ $? -ne 0 ]; then
echo "Please to use the files in ${modules_org} to revovery manually"
exit 1
fi
done
LFS=${OLD_LFS}
rm -fr "${modules_org}"
echo "Updated module files successfully"
}
function update_kernel(){
if [ -z "${boot_partition}" ]; then
get_boot_partition
fi
adb shell mount -t vfat /dev/block/${boot_partition} ${mountpoint}
adb shell mount|grep "/dev/block/${boot_partition}" >&/dev/null
if [ $? -ne 0 ]; then
echo "Failed to mount the boot partion /dev/block/${boot_partition}"
exit 1
fi
kernel_org=`mktemp -u -d /tmp/boot.XXX`
echo "Pull the original kernel files for backup in ${kernel_org}"
adb pull ${mountpoint} ${kernel_org} &>/dev/null
file_basenmae=`basename ${file_path}`
if [ "X${file_basenmae}" == "Xboot.tar.bz2" ]; then
kernel_dir=`mktemp -d /tmp/boot.XXX`
tar jxf ${file_path} -C ${kernel_dir}
if [ $? -ne 0 ]; then
echo "Failed to uncompress the boot file: ${file_path}"
exit 1
fi
echo "Push the new kernel files to boot partition ${boot_partition}"
adb push ${kernel_dir}/boot ${mountpoint} &>/dev/null
if [ $? -ne 0 ]; then
echo "Failed to push the kernel files"
rm -fr ${kernel_dir}
exit 1
fi
verify_kernel ${kernel_dir}/boot ${mountpoint}
if [ $? -ne 0 ]; then
echo "Failed the update the kernel files."
echo "Please use the original files in ${kernel_org} to recovery manually"
rm -fr ${kernel_dir}
exit 1
fi
else
adb push "${file_path}" "${mountpoint}/${file_basenmae}"
verify_file "$file_path" "${mountpoint}"
if [ $? -ne 0 ]; then
echo "Failed the update the file: ${file_path}"
echo "Please use the original files in ${kernel_org} to recovery manually"
exit 1
fi
fi
adb shell sync
adb shell umount ${mountpoint}
rm -fr ${kernel_dir} ${kernel_org}
echo "Kernel updated successfully"
}
function main(){
file_path=""
serial=''
mountpoint="/data/local/tmp"
func_value=''
parse_argv "$@"
check_parameters
check_device_status
set_func_value
update_${func_value}
}
main "$@"