summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/imx31
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2018-01-14 08:23:48 -0500
committerMichael Sevakis <jethead71@rockbox.org>2018-01-14 08:23:48 -0500
commita1123de28f8b02cf7a15569ccd76c8e5a82ccb98 (patch)
treefa020d07d8884bcad19830c3fea5b12866f19d9d /firmware/target/arm/imx31
parent11437662c45e31a8822fae5e220f70edda85fff5 (diff)
downloadrockbox-a1123de28f8b02cf7a15569ccd76c8e5a82ccb98.tar.gz
rockbox-a1123de28f8b02cf7a15569ccd76c8e5a82ccb98.zip
Gigabeat S: Remove unwanted partitions on the fly
Windows now ignores the hidden flag, so just nullify the entries to hide depending upon whether or not bootloader install mode is activated. Change-Id: I00d0797e40ea3b5f5d5d8e1243b50cfcdd029bb4
Diffstat (limited to 'firmware/target/arm/imx31')
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c
index 71e8342595..737ee36e00 100644
--- a/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c
+++ b/firmware/target/arm/imx31/gigabeat-s/usb-gigabeat-s.c
@@ -147,9 +147,17 @@ void usb_drv_int_enable(bool enable)
void usb_fix_mbr(unsigned char *mbr)
{
unsigned char* p = mbr + 0x1be;
- char tmp[16];
- /* The Gigabeat S factory partition table contains invalid values for the
+ /* Windows ignores the partition flags and mounts the first partition it
+ sees when the device reports itself as removable. Swap the partitions
+ so the data partition appears to be partition 0. Mark the boot
+ partition 0 as hidden and make it partition 1.
+
+ Update 2018-01-14: Windows shows it if exists, so long as it can mount
+ it. Resort to not exposing entries that we want hidden.
+ */
+
+ /* The Gigabeat S factory partition table contains invalid values for the
"active" flag in the MBR. This prevents at least the Linux kernel
from accepting the partition table, so we fix it on-the-fly. */
p[0x00] &= 0x80;
@@ -158,18 +166,12 @@ void usb_fix_mbr(unsigned char *mbr)
p[0x30] &= 0x80;
if (bootloader_install_mode)
- return;
-
- /* Windows ignores the partition flags and mounts the first partition it
- sees when the device reports itself as removable. Swap the partitions
- so the data partition appears to be partition 0. Mark the boot
- partition 0 as hidden and make it partition 1. */
-
- /* Mark the first partition as hidden */
- p[0x04] |= 0x10;
-
- /* Swap first and second partitions */
- memcpy(tmp, &p[0x00], 16);
- memcpy(&p[0x00], &p[0x10], 16);
- memcpy(&p[0x10], tmp, 16);
+ {
+ memset(&p[0x10], 0x00, 0x30); /* Hide non-boot partitions */
+ }
+ else
+ {
+ memmove(&p[0x00], &p[0x10], 0x30); /* Hide boot partition */
+ memset(&p[0x30], 0x00, 0x10);
+ }
}