#!/bin/bash # # Author: Linaro Android Team # # 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] " 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 "$@"