1#!/usr/bin/env bash
2###############################################################################
3#
4# Copyright (C) 2009-2013 Nintendo.  All rights reserved.
5#
6# These coded instructions, statements, and computer programs contain
7# proprietary information of Nintendo of America Inc. and/or Nintendo
8# Company Ltd., and are protected by Federal copyright law.  They may
9# not be disclosed to third parties or copied or duplicated in any form,
10# in whole or in part, without the prior written consent of Nintendo.
11#
12###############################################################################
13
14################################################################################
15# cafe_pcfs2nand
16# This script enables a CAT_DEV to boot from NAND. It must not be executed
17# directly from the bash command prompt. Instead, invoke this using:
18#   source update2nand
19################################################################################
20source cafe_utils
21
22###############################################################################
23# compute_flat_version
24###############################################################################
25
26compute_flat_version()
27{
28    IFS="."
29    local v=( $1 )
30    echo $((${v[0]} * 1000000 + ${v[1]} * 10000 + ${v[2]} * 1000 + ${v[3]}))
31}
32
33################################################################################
34# main
35################################################################################
36reflash=${1:-1}
37call_mionps=${2:-1}
38
39Bash_sourced_check 0 `basename "$BASH_SOURCE"` update2nand
40rval=$?
41
42if [ $rval == 0 ]; then
43    #------------------------------------------------------------------------------
44    #---- initialization
45    #------------------------------------------------------------------------------
46    SCRIPT_EXE_TIMESTAMP=`date +%m_%d_%Y_%H%M%S`
47    LOGDIR="$CAFE_ROOT/${SESSION_PATH_PREFIX}`basename "$0"`/${SCRIPT_EXE_TIMESTAMP}"
48    echo `basename "$0"`
49    echo log directory is $LOGDIR
50    mkdir -p "$LOGDIR"
51
52    # Cleanup any old logs
53    rm -f "$TMP/${SESSION_PATH_PREFIX}cafestop_mion.log"
54
55    CAFESTOP_STATUS=0
56    export _CCRSYSCFG1=     #disable
57    Initialize_serial_port_and_directory cafestop
58    #echo CAFE_CONSOLE=$CAFE_CONSOLE
59
60    #------------------------------------------------------------------------------
61    #---- cafestop
62    #------------------------------------------------------------------------------
63    echo Executing cafestop"..."
64    source cafestop 1> "$LOGDIR"/cafestop0.txt 2>&1
65    if [ -e "$TMP/${SESSION_PATH_PREFIX}cafestop_mion.log" ]; then
66        mv "$TMP/${SESSION_PATH_PREFIX}cafestop_mion.log" "${LOGDIR}/cafestop0_mion.log"
67    fi
68    if [ $CAFESTOP_STATUS -ne 0 ]; then
69        echo `basename "$0"`: cafestop failure.
70        exit 1
71    fi
72
73    #------------------------------------------------------------------------------
74    #---- cafeon
75    #------------------------------------------------------------------------------
76    source hostcheckversion
77    hb_ver_flat=$(compute_flat_version $CAFERUN_HOSTBRIDGE_VERSION)
78
79    echo Executing cafeon"..."
80    set -e
81    if [ $hb_ver_flat -lt $(compute_flat_version 3.2.4.1) ]
82    then
83        cafeon 1> "$LOGDIR"/cafeon.txt 2>&1
84    else
85        cafeon -e nomodecheck 1> "$LOGDIR"/cafeon.txt 2>&1
86    fi
87    if [ -e "$TMP/${SESSION_PATH_PREFIX}cafestop_mion.log" ]; then
88        mv "$TMP/${SESSION_PATH_PREFIX}cafestop_mion.log" "${LOGDIR}/cafeon_mion.log"
89    fi
90    set +e
91    Monitor_For_Output -k "source -p -q /vol/content" $MONITOR_DEFAULT_TIMEOUT "$LOGDIR"
92    if [ $? -ne 0 ]; then
93        echo `basename $0`: monitor failed waiting for cafeon success message.
94        exit 1
95    fi
96    # test to see if last boot was NAND or PCFS
97    was_pcfs_boot=`grep "BOOT1: Loaded firmware image from SDIO." "$LOGDIR"/* 2>/dev/null | wc -l`
98
99    #------------------------------------------------------------------------------
100    #---- recover command
101    #------------------------------------------------------------------------------
102    echo Executing devkitmsg recover -v"..."
103    set -e
104    devkitmsg recover -v -p $SESSION_LAUNCH_CTRL_PORT
105    set +e
106    Monitor_For_Output -K "WUD_BCMFWCheck" $MONITOR_DEFAULT_TIMEOUT "$LOGDIR" #note: need -K here, not -k
107    if [ $? -ne 0 ]; then
108        echo `basename "$0"`: monitor failed waiting for devkitmsg recover success message.
109        exit 1
110    fi
111
112    #------------------------------------------------------------------------------
113    #---- if last boot was NAND, first update BOOT1 to PCFS
114    #------------------------------------------------------------------------------
115    if [ $was_pcfs_boot -eq 0 ]; then
116        if [ ! -d "$CAFE_MLC_DIR/sys/update/bootloader/aaa-boot1-dual" ]; then
117            mkdir -p $CAFE_MLC_DIR/sys/update/bootloader
118            cp -rf $CAFE_MLC_DIR/sys/update/mixed/aaa-boot1-dual $CAFE_MLC_DIR/sys/update/bootloader
119        fi
120        echo `basename "$0"`: NAND boot detected, BOOT1 will be updated before updating to NAND
121        echo Executing devkitmsg \'update /vol/storage_hfiomlc01/sys/update/bootloader\' -v"..."
122        set -e
123        devkitmsg 'update /vol/storage_hfiomlc01/sys/update/bootloader' -v -p $SESSION_LAUNCH_CTRL_PORT
124        set +e
125        Monitor_For_Output -k "Update Done, err 0" $MONITOR_DEFAULT_TIMEOUT "$LOGDIR"
126        if [ $? -ne 0 ]; then
127            echo `basename "$0"`: monitor failed waiting for devkitmsg update success message.
128            exit 1
129        fi
130    else
131        echo `basename "$0"`: PCFS boot detected, no BOOT1 update needed
132    fi
133
134    #------------------------------------------------------------------------------
135    #---- update command
136    #------------------------------------------------------------------------------
137    if [ $reflash -eq 1 ]; then
138        echo Executing devkitmsg \'devkitmsg 'reflash /vol/storage_hfiomlc01/sys/update/nand'\' -v"..."
139        set -e
140        devkitmsg 'reflash /vol/storage_hfiomlc01/sys/update/nand' -v -p $SESSION_LAUNCH_CTRL_PORT
141        set +e
142        Monitor_For_Output -k "MCP: System update was successful" $MONITOR_DEFAULT_TIMEOUT "$LOGDIR"
143        if [ $? -ne 0 ]; then
144            echo `basename "$0"`: monitor failed waiting for devkitmsg reflash success message.
145            exit 1
146        fi
147    else # Update only. This will not reformat.
148        echo Executing devkitmsg \'update /vol/storage_hfiomlc01/sys/update/nand\' -v"..."
149        set -e
150        devkitmsg 'update /vol/storage_hfiomlc01/sys/update/nand' -v -p $SESSION_LAUNCH_CTRL_PORT
151        set +e
152        Monitor_For_Output -k "Update Done, err 0" $MONITOR_DEFAULT_TIMEOUT "$LOGDIR"
153        if [ $? -ne 0 ]; then
154            echo `basename "$0"`: monitor failed waiting for devkitmsg update success message.
155            exit 1
156        fi
157    fi
158
159    if [ $call_mionps -eq 1 ]
160    then
161        "$CAFE_ROOT\system\bin\tool\mionps" $BRIDGE_CURRENT_IP_ADDRESS 2 -s 1
162    fi
163
164    #------------------------------------------------------------------------------
165    #---- set default boot mode to development
166    #------------------------------------------------------------------------------
167    devkitmsg 'sys_mode 1' -v -p $SESSION_LAUNCH_CTRL_PORT
168
169    if [ ! -z $CAFE_TEST_SELF_REFRESH ]
170	then
171	    devkitmsg 'standby_en 1' -v -p $SESSION_LAUNCH_CTRL_PORT
172	fi
173
174    #------------------------------------------------------------------------------
175    #---- cafestop
176    #------------------------------------------------------------------------------
177    echo Executing cafestop"..."
178    source cafestop 1> "$LOGDIR"/cafestop1.txt 2>&1
179    if [ -e "$TMP/${SESSION_PATH_PREFIX}cafestop_mion.log" ]; then
180        mv "$TMP/${SESSION_PATH_PREFIX}cafestop_mion.log" "${LOGDIR}/cafestop1_mion.log"
181    fi
182    if [ $CAFESTOP_STATUS -ne 0 ]; then
183        echo `basename $0`: cafestop failure.
184        exit 1
185    fi
186
187    #------------------------------------------------------------------------------
188    #---- success!
189    #------------------------------------------------------------------------------
190    echo Removing log directory $LOGDIR"..."
191    rm -rf "$LOGDIR"
192    echo `basename "$0"` complete. Exiting with code 0.
193    exit 0
194else
195    echo `basename "$BASH_SOURCE"` error: Format deprecated. Instead, use \"source setbootmode NAND\". >/dev/stderr
196fi
197unset SCRIPT_IS_SOURCED
198