1b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin#!/bin/bash
26ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# Copyright (C) 2016 The Android Open Source Project
36ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin#
46ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# Licensed under the Apache License, Version 2.0 (the "License");
56ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# you may not use this file except in compliance with the License.
66ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# You may obtain a copy of the License at
76ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin#
86ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin#      http://www.apache.org/licenses/LICENSE-2.0
96ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin#
106ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# Unless required by applicable law or agreed to in writing, software
116ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# distributed under the License is distributed on an "AS IS" BASIS,
126ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# See the License for the specific language governing permissions and
146ad4caae73191bdc2403185b6482969c17604c95SzuWei Lin# limitations under the License.
15b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
16b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei LinPROG_NAME=`basename $0`
17b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
1879ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin# Set to true to get more debug information
1979ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei LinDEBUG=false
2079ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin# Remove the comment to enable valgrind
2179ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin# Require build with $mmma external/valgrind
2279ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin#VALGRIND="valgrind --leak-check=yes --show-reachable=yes"
2379ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin
24b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Linfunction usage() {
25b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin  echo "Usage:"
262dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  echo "  $PROG_NAME (--fdt|--ufdt) (--remote) <Base DTS> <Overlay DTS> <Output DTS>"
27b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin}
28b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
29b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Linfunction on_exit() {
30b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin  rm -rf "$TEMP_DIR"
31b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin}
32b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
33b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin#
34b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin# Start
35b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin#
36b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
37f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin# Setup OVERLAY
38f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Linif [ "$1" == "--fdt" ]; then
39f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin  shift
40f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin  OVERLAY="fdt_apply_overlay"
41f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Linelif [ "$1" == "--ufdt" ]; then
42f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin  shift
43f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin  OVERLAY="ufdt_apply_overlay"
44f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Linelse
45f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin  usage
46f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin  exit 1
47f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Linfi
48f7403df4976562ecf2c1266e5f05f800037c8772SzuWei Lin
492dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin# --remote: run overlay on the device with adb
502dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Linif [ "$1" == "--remote" ]; then
512dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  shift
522dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  EXE_PATH="${ANDROID_PRODUCT_OUT}/obj/EXECUTABLES"
532dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  REMOTE_PATH="/data/local/tmp"
542dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  adb push "${EXE_PATH}/${OVERLAY}_intermediates/${OVERLAY}" \
552dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    "$REMOTE_PATH" > /dev/null
562dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Linfi
572dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin
58b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Linif [[ $# -lt 3 ]]; then
59b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin  usage
60b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin  exit 1
61b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Linfi
62b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
63b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei LinBASE_DTS=$1
64b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei LinOVERLAY_DTS=$2
65b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei LinOUT_DTS=$3
66b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
67b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei LinTEMP_DIR=`mktemp -d`
68b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin# The script will exit directly if any command fails.
69b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Linset -e
70b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lintrap on_exit EXIT
71b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
72b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin# Compile the *-base.dts to make *-base.dtb
73b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei LinBASE_DTS_NAME=`basename "$BASE_DTS"`
742dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei LinBASE_DTB_NAME="${BASE_DTS_NAME}-base.dtb"
752dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei LinBASE_DTB="${TEMP_DIR}/${BASE_DTB_NAME}"
7608dd727484a9f5619e0be18a1f601c21f371c5b7SzuWei Lindtc -@ -qq -O dtb -o "$BASE_DTB" "$BASE_DTS"
7779ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Linif $DEBUG; then
7879ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin  echo "[base.dts]"
7979ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin  dtc -O dts "$BASE_DTB"
8079ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Linfi
81b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
82b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin# Compile the *-overlay.dts to make *-overlay.dtb
83b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei LinOVERLAY_DTS_NAME=`basename "$OVERLAY_DTS"`
842dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei LinOVERLAY_DTB_NAME="${OVERLAY_DTS_NAME}-overlay.dtb"
852dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei LinOVERLAY_DTB="${TEMP_DIR}/${OVERLAY_DTB_NAME}"
8608dd727484a9f5619e0be18a1f601c21f371c5b7SzuWei Lindtc -@ -qq -O dtb -o "$OVERLAY_DTB" "$OVERLAY_DTS"
8779ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Linif $DEBUG; then
8879ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin  echo "[overlay.dts]"
8979ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin  dtc -O dts "$OVERLAY_DTB"
9079ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Linfi
91b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
92b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin# Run ufdt_apply_overlay to combine *-base.dtb and *-overlay.dtb
93b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin# into *-merged.dtb
942dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei LinMERGED_DTB_NAME="${BASE_DTS_NAME}-merged.dtb"
952dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei LinMERGED_DTB="${TEMP_DIR}/${MERGED_DTB_NAME}"
962dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Linif [ -z "$REMOTE_PATH" ]; then
9779ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin  $VALGRIND "$OVERLAY" "$BASE_DTB" "$OVERLAY_DTB" "$MERGED_DTB"
982dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Linelse
992dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  adb push "$BASE_DTB" "$REMOTE_PATH" > /dev/null
1002dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  adb push "$OVERLAY_DTB" "$REMOTE_PATH" > /dev/null
1012dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  adb shell "
1022dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    cd "$REMOTE_PATH" &&
1032dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    "./${OVERLAY}" "$BASE_DTB_NAME" "$OVERLAY_DTB_NAME" "$MERGED_DTB_NAME"
1042dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  "
1052dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  adb pull "${REMOTE_PATH}/${MERGED_DTB_NAME}" "$MERGED_DTB" > /dev/null
1062dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Linfi
1072dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin
1082dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Linif [ ! -z "$REMOTE_PATH" ]; then
1092dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  # clean up
1102dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  adb shell "
1112dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    cd "$REMOTE_PATH" &&
1122dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    rm -f "$OVERLAY" &&
1132dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    rm -f "$BASE_DTB_NAME" &&
1142dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    rm -f "$OVERLAY_DTB_NAME" &&
1152dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin    rm -f "$MERGED_DTB_NAME"
1162dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Lin  " > /dev/null
1172dcb17e2252b17f56e1793bcf6ac479dc6e48319SzuWei Linfi
118b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin
119b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lin# Dump
120b63f3b74cc6f87a1106e2afd49e82cac3538ef53SzuWei Lindtc -s -O dts -o "$OUT_DTS" "$MERGED_DTB"
12179ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Linif $DEBUG; then
12279ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin  echo "[merged.dts]"
12379ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Lin  cat $OUT_DTS
12479ba2aefbbc7fcf8f8b60b5efab417e5684b13b6SzuWei Linfi
125