nwztools: upgrade upgtools and add dumping script

Change-Id: I315d1010ce5477c0112f4a890156b360e8123e11
This commit is contained in:
Amaury Pouly 2016-08-17 21:26:12 +01:00
parent 3db0363b78
commit 9d121cfd51
4 changed files with 186 additions and 20 deletions

View file

@ -0,0 +1,40 @@
upgtool:="../upgtools/upgtool"
scsitool:="../scsitools/scsitool"
.SUFFIXES: # disable old suffix rules
all:
@echo "Please select an action:"
@echo "- update: uses script update.sh"
@echo "- dump_rootfs: dumps the root filesystem to rootfs.tgz"
@echo "- my_update: craft an arbitrary upgrade script found in my_update.sh"
@echo "- do_fw_upgrade: send a firmware upgrade to the device in NWZ_DEV"
@echo "- list_targets: produce of list of available targets"
my_update: my_update.upg
dump_rootfs: dump_rootfs.upg
%.upg: %.sh
ifndef NWZ_TARGET
@echo "Please set NWZ_TARGET to your target. For example:"
@echo "make $@ NWZ_TARGET=nwz-e463"
@echo "Run 'make list_targets' to get a list of all targets"
else
@echo "Target: $(NWZ_TARGET)"
$(upgtool) -c -m $(NWZ_TARGET) $@ $^
endif
clean:
rm -rf *.UPG
list_targets:
$(upgtool) -m ?; true # upgtool returns an error in this case, ignore it
do_fw_upgrade:
ifdef NWZ_DEV
@echo "Device: $(NWZ_DEV)"
$(scsitool) $(NWZ_DEV) do_fw_upgrade
else
@echo "Please set NWZ_DEV to your dev. For example:"
@echo "make do_fw_upgrade NWZ_DEV=/dev/sdx"
endif

View file

@ -0,0 +1,59 @@
This directory contains various scripts that can be used to help development
process on the Sony NWZ players. The proper way to use it is to use the Makefile.
In case of doubt, run
make
to get the up-to-date documentation.
*****************************
Performing a firmware upgrade
*****************************
To perform a firmware upgrade, first copy the firmware upgrade file to the root of
the device, and make sure its named
NW_WM_FW.UPG
Another other name WILL NOT WORK. You've been warned.
DO NOT FORGET TO UNMOUNT YOUR DEVICE PROPERLY BEFORE DOING WHAT FOLLOWS
Once once, you need to tell the device to reboot in firmware upgrade mode.
At the moment, we only support this operation in UMS/MSC (Mass Storage) mode. So if
your device appears as a MTP device, go to the preference settings of your device
and make sure your device is set to UMS/MSC or Auto.
You need to identify the linux device associated with your device. There are
plenty of tutorials on the net on how to do that, you can use mount or dmesg.
Assuming the linux device corresponding to your player is
/dev/sdx
run AS ROOT OR USING SUDO
make do_fw_upgrade NWZ_DEV=/dev/sdx
If everything goes well, the device should reboot and perform the firmware upgrade.
********************************
Building a firmware upgrade that
dumps important stuff
********************************
In early development stage, the most useful thing you can do is to dump important
stuff from your device:
- dmesg and mount output
- FU (firmware upgrade) initrd
- root FS (file system)
We carefully wrote a script that does the following. First make sure that your device
has enough free space (at least 300MB to be safe). You need to know the model of
your device to build this firmware upgrade. Once you known it, run
make list_targets
to list all available targets. For example if your targets is one of the
NWZ-E460 series, the corresponding target is nwz-e46x.
Once you have identified the target. Run
make dump_rootfs NWZ_TARGET=nwz-exyz
(replace nwz-exyz with your target)
This command will produce a firmware upgrade file called
dump_rootfs.upg
In order to run this firmware upgrade, you need to follows the instruction
on how to perform a firmware upgrade.
When performing the firmware upgrade, the script will perform various operation
and create several files. Once the "upgrade" is finish and the device has rebooted,
you should find the files in the dump_rootfs/ directory at the root of your device.

View file

@ -0,0 +1,83 @@
#!/bin/sh
# The updater script on the NWZ has a major bug/feature:
# it does NOT clear the update flag if the update scrit fails
# thus causing a update/reboot loop and a bricked device
# always clear to make sure we don't end up being screwed
nvpflag fup 0xFFFFFFFF
#
# This script dumps the root filesystem of the device and saves the resulting
# in rootfs.tgz in the user partition.
#
# 1) First we need to detect what is the user (aka contents) device. It is mounted
# read-only at /contents during upgrade and the device is usually /dev/contents_part
# The output of mount will look like this:
# /dev/contents_part on /contents type ....
CONTENTS="/contents"
CONTENTS_PART=`mount | grep contents | awk '{ print $1 }'`
DUMP_DIR="$CONTENTS/dump_rootfs"
lcdmsg -c -f /usr/local/bin/font_08x12.bmp -l 0,3 "Contents partition:\n$CONTENTS_PART"
# 2) We need to remount the contents partition in read-write mode be able to
# write something on it
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,6 "Remount $CONTENTS rw"
if ! mount -o remount,rw $CONTENTS_PART $CONTENTS
then
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,7 "ERROR: remount failed"
sleep 10
exit 0
fi
# 3) Dump various files
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,8 "Dumping various files"
mkdir -p "$DUMP_DIR"
mount 2>&1 >$DUMP_DIR/mount.txt
dmesg 2>&1 >$DUMP_DIR/dmesg.txt
mmcinfo map 2>&1 >$DUMP_DIR/mmcinfo_map.txt
sysinfo 2>&1 >$DUMP_DIR/sysinfo.txt
# 4) Dump / (which is the FU initrd)
# Don't forget to exclude contents, that would be useless
# NOTE: this code assumes that CONTENTS is always at the root: /contents
# NOTE: also exclude /sys because it makes tar stop earlier
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,9 "Dumping FU initrd..."
LIST=""
for entry in /*
do
# exclude contents
if [ "$entry" != "$CONTENTS" -a "$entry" != "/sys" ]
then
LIST="$LIST $entry"
fi
done
tar -cf $DUMP_DIR/fu_initrd.tar $LIST
find / > $DUMP_DIR/fu_initrd.list
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,10 "Done."
# 5) Dump the root filesystem
# Mount the root filesystem read-only and dump it
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,12 "Dumping rootfs..."
ROOTFS_TMP_DIR=/tmp/rootfs
mkdir $ROOTFS_TMP_DIR
. /install_script/constant.txt
if ! mount -t ext2 -o ro $COMMON_ROOTFS_PARTITION $ROOTFS_TMP_DIR
then
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,13 "ERROR: cannot mount rootfs"
else
tar -cf $DUMP_DIR/rootfs.tar $ROOTFS_TMP_DIR
umount $ROOTFS_TMP_DIR
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,13 "Done."
fi
# 4) Success screen
lcdmsg -f /usr/local/bin/font_08x12.bmp -l 0,15 "Rebooting in 10 seconds."
sleep 10
sync
exit 0

View file

@ -58,24 +58,6 @@ enum keysig_search_method_t g_keysig_search = KEYSIG_SEARCH_NONE;
{ cprintf(RED, str_bad); let_the_force_flow(__LINE__); } \ { cprintf(RED, str_bad); let_the_force_flow(__LINE__); } \
else { cprintf(RED, str_ok); } else { cprintf(RED, str_ok); }
static void print_hex(void *p, int size, int unit)
{
uint8_t *p8 = p;
uint16_t *p16 = p;
uint32_t *p32 = p;
for(int i = 0; i < size; i += unit, p8++, p16++, p32++)
{
if(i != 0 && (i % 16) == 0)
printf("\n");
if(unit == 1)
printf(" %02x", *p8);
else if(unit == 2)
printf(" %04x", *p16);
else
printf(" %08x", *p32);
}
}
static void usage(void); static void usage(void);
/* key and signature */ /* key and signature */
@ -118,8 +100,10 @@ struct upg_entry_t
struct nwz_model_t g_model_list[] = struct nwz_model_t g_model_list[] =
{ {
{ "nwz-e463", HAS_KAS | HAS_KEY | HAS_SIG | CONFIRMED, {"89d813f8f966efdebd9c9e0ea98156d2"}, "eb4431eb", "4f1d9cac" }, { "nwz-e46x", HAS_KAS | HAS_KEY | HAS_SIG | CONFIRMED, {"89d813f8f966efdebd9c9e0ea98156d2"}, "eb4431eb", "4f1d9cac" },
{ "nwz-a86x", HAS_KEY | HAS_SIG, {""}, "c824e4e2", "7c262bb0" }, { "nwz-a86x", HAS_KAS | HAS_KEY | HAS_SIG | CONFIRMED, {"a7c4af6c28b8900a783f307c1ba538c5"}, "c824e4e2", "7c262bb0" },
/* The following keys were obtained by brute forcing firmware upgrades,
* someone with a device needs to confirm that they work */
{ "nw-a82x", HAS_KEY | HAS_SIG, {""}, "4df06482", "07fa0b6e" }, { "nw-a82x", HAS_KEY | HAS_SIG, {""}, "4df06482", "07fa0b6e" },
}; };