Skip to content

Releases: WOA-Project/SurfaceDuo-Releases

Version 2404.03C (Coconut Mall)

07 Apr 20:57
c9757e5
Compare
Choose a tag to compare

Surface Duo BSP - Version 2404.03C (Coconut Mall)

General information

**Released:** 04/07/2024 11:00 PM UTC+2

Quality: Preview

You can view compatibility for this release, along with important information and what works, and what doesn't at this link: https://github.com/WOA-Project/SurfaceDuo-Guides/blob/main/Status.md

Important information

- ⚠️ For users who are updating from an earlier release than version 2301.93, please reinstall.

  • ⚠️ If you need dual boot, you will have to make your own image. Please follow this guidance: https://github.com/WOA-Project/SurfaceDuo-Guides/blob/main/DualBoot.md

  • ⚠️ You need to backup your original boot image for OTAs to work with Android. When you get an OTA, you will want to revert your boot image for the update to work, or you'll have to use an official OTA recovery package.


▶️ Install Surface Duo (1st Gen) UEFI and Drivers for Windows from scratch (Clean Installation)

▶️ Install Surface Duo 2 UEFI and Drivers for Windows from scratch (Clean Installation)

▶️ Update from an older version of Surface Duo UEFI and Drivers (both got updated with v2404.03C)


Clean Installation & Update Files

These files are to be used when clean installing Windows on your Surface Duo or updating an existing installation

Drivers File UEFI File Target Device OS Version Notes

SurfaceDuo-Drivers-v2404.03C-Desktop-Epsilon.7z

Surface Duo (1st Gen) Windows 10 Version 2004 and higher

N/A

SurfaceDuo-Drivers-v2404.03C-Desktop-Zeta.7z

Surface Duo 2 Windows 11 Version 24H2 and higher

N/A

SurfaceDuo-Drivers-v2404.03C-Desktop-Epsilon.7z

Surface Duo (1st Gen) Windows 10 Version 1803 to Windows 10 Version 1909

N/A

If you are clean installing:

  • Download the Driver File onto your Computer
  • Extract it
  • Connect your Surface Duo to your computer in Mass Storage mode
  • Double Tap on the OfflineUpdater.cmd file
  • Enter the Drive Letter for the Surface Duo Windows Partition (See This PC for knowing this)
  • Wait til the processes finishes
  • Reboot your device
  • Boot the device using the new UEFI version linked alongside the Driver File above

If you are updating an existing installation:

  • Download the Driver File onto your Surface Duo
  • Extract it
  • Double Tap on the OnlineUpdater.cmd file
  • Wait til the processes finishes
  • Reboot your device
  • Boot the device using the new UEFI version linked alongside the Driver File above

In case you're having issues/troubles updating within the OS on the device, you can always put your phone into mass storage, and use OfflineUpdater.cmd to update the drivers this way, and then use the new UEFI version linked alongside the Driver File above.


Full Flash Update Files

We're now providing FFU files directly from the release page outside of Telegram. The FFU files are also still uploaded on Telegram FFU channel, and they match this very specific release.

Learn more about FFU files: FFU Flashing Guide

Surface Duo (1st Gen)

UEFI files:

FFU files:

FFU File OS Version Notes
For 128GB variants

OEMEP_128GB_HalfSplit.ffu

Size: 6779731968 bytes (6465 MiB)

SHA1: C57A2B011F57ECFE9F1E4237D2B7411FCCC13123

Windows 11 Version 24H2 (26100.1) (en-US)

Assumed Compatibility with 256gb variants (may have issues but should work, if issues arise we're not responsible and you should be able to recover either way, the main issue is more the split being 64(Windows)/192(Android) than anything else!).

  1. After "Getting Ready" boot, on the second boot, the device may show a black screen, if this happens, press the power button once and it will continue to oobe after a minute. Be patient and don't press it more than once.
For 256GB variants

OEMEP_256GB_HalfSplit.ffu

Size: 6719864832 bytes (6408 MiB)

SHA1: DB3FE450EBD85575290EB9C8C40E67D74C8FEC00

Windows 11 Version 24H2 (26100.1) (en-US)

No Compatibility at all with 128GB, please do not flash on a 128GB Surface Duo!

  1. After "Getting Ready" boot, on the second boot, the device may show a black screen, if this happens, press the power button once and it will continue to oobe after a minute. Be patient and don't press it more than once.
4GB Android, everything else for Windows

OEMEP_MaximizedForWindows.ffu

Size: 6733119488 bytes (6421 MiB)

SHA1: 8B3332F95336B02A46DD674F9A28AB283DB907DC

Windows 11 Version 24H2 (26100.1) (en-US)

Official Variant: 4GB only for Android, everything else for Windows, 256GB users may have to expand the MainOS partition using Disk Management in windows by using the "Extend Partition" option.

  1. After "Getting Ready" boot, on the second boot, the device may show a black screen, if this happens, press the power button once and it will continue to oobe after a minute. Be patient and don't press it more than once.

Surface Duo 2

UEFI Files:

FFU Files

FFU File OS Version Notes
For 128GB variants

OEMZE_128GB_HalfSplit.ffu

Size: 6376570880 bytes (6081 MiB)

SHA1: 02BCC5F564237266E2A6E36C0C2CFD0A4ACB2A60

Windows 11 Version 24H2 (26100.1) (en-US)

Assumed Compatibility with 256gb and 512gb variants (may have issues but should work, if issues arise ...

Read more

Version 2404.03B (Coconut Mall)

06 Apr 22:03
c9757e5
Compare
Choose a tag to compare

Surface Duo UEFI BSP - Version 2404.03B (Coconut Mall)

General information

**Released:** 04/06/2024 11:00 PM UTC+2

Quality: Preview

You can view compatibility for this release, along with important information and what works, and what doesn't at this link: https://github.com/WOA-Project/SurfaceDuo-Guides/blob/main/Status.md

Important information

- ⚠️ For users who are updating from an earlier release than version 2301.93, please reinstall.

  • ⚠️ If you need dual boot, you will have to make your own image. Please follow this guidance: https://github.com/WOA-Project/SurfaceDuo-Guides/blob/main/DualBoot.md

  • ⚠️ You need to backup your original boot image for OTAs to work with Android. When you get an OTA, you will want to revert your boot image for the update to work, or you'll have to use an official OTA recovery package.


▶️ Install Surface Duo (1st Gen) UEFI and Drivers for Windows from scratch (Clean Installation)

▶️ Install Surface Duo 2 UEFI and Drivers for Windows from scratch (Clean Installation)

▶️ Update from an older version of Surface Duo UEFI and Drivers (both got updated with v2404.03B)


Release notes

Note

This release includes both UEFI packages and Driver packages

  • This update updates Driver Updater with a brand new user interface while installing drivers. More is to come in a future update

image

  • This update fixes an issue where upgrading from an older release would break touch.

Caution

Please note that if you already lost touch, there is no way to fix this other than reinstalling Windows. Sorry about this!

Please refer to the original 2404.03 changelog for what was new in the 2404.03 update originally. This is only a bug fix update.


  • Please download SurfaceDuo-Drivers-v2404.03B-Desktop-Epsilon.zip if you want drivers for Surface Duo 1

  • Please download SurfaceDuo-Drivers-v2404.03B-Desktop-Zeta.zip if you want drivers for Surface Duo 2


Known issues

- Installing Gallium Semester Insider builds may lead to a black screen on second boot of the OS, simply press the power button to continue.

  • Booting Windows 10 18362/18363 will lead to "static screen" effects on the right display, much like driver releases from last year did on any version of Windows. A fix is being worked on for the next release.

  • The TPM driver is not working for Windows 10 18362/18363. A fix is being worked on for the next release.

  • The Posture driver is not working for Windows 10 18362/18363. A fix is being worked on for the next release.

  • Enhanced auto rotation is not working for Windows 10 18362/18363. A fix is being worked on for the next release.

  • Brightness control is glitchy on both displays.

  • On device speakers are not functional.

  • Dongles are not detected correctly when plugged into the USB Type-C port.

  • Updating drivers may lead to weird configurations if done on old driver releases.

  • MAC addresses do not reflect the real addresses asigned to the device.

  • BitLocker drive encryption is not available.

  • USB dongles that are not externally powered may not currently work.

  • USB-C Billboard devices will not currently work.

  • External Display Stream support will not currently work.

  • Additional information provided by the posture sensor is currently not available for public consumption. This includes peek events.

  • Digitizers will not react to the device being folded over.

  • Displays will not react to the device being folded over most of the time.

  • Physical device data is incorrect.

  • Digitizers aren't calibrated correctly.

  • Flipping the device is not smooth.

  • Users upgrading from releases older than the January ones may want to clean install again.

  • Booting Windows 10 18362/18363 with Secure Boot enabled is not currently supported and will result in a broken installation.

  • In some cases, booting the UEFI image may lead to "static screen" effects on the left display. Please do not force reboot the device as it may interrupt the installation process, if ongoing, and instead please wait a few minutes.

  • Windows Recovery environment lacks drivers unless Windows has performed a Feature Update at least once.

  • sRGB is not available currently, and displays will not react to ICC profiles being applied.


Accessing Foldable Sensors from your applications

In order to currently access the sensor data given by the foldable sensors, you need to use the following apis:

  • Windows.Devices.Sensors.HingeAngleSensor*
  • Windows.Internal.Devices.Sensors.FlipSensor* (2)
  • Windows.Internal.System.TwoPanelHingePostureDevice* (2)

(2): These apis require the use of an externally sourced winmd available from https://github.com/ADeltaX/InternalWinMD/blob/master/%23winmd/Windows.Internal.Devices.Sensors.winmd

In the future, further apis will be functional (specifically under the Windows.System.Preview namespace). Consider this an early "thing".

The following API may be used to determine if your app is used on a dual screen device: https://docs.microsoft.com/en-us/uwp/api/windows.ui.windowmanagement.windowingenvironment.getdisplayregions?view=winrt-22621

The following API may be used to determine on which display region your app is currently being shown: https://docs.microsoft.com/en-us/uwp/api/windows.ui.windowmanagement.appwindow.getdisplayregions?view=winrt-22621

The following API may be used to move your application to the other display: https://docs.microsoft.com/en-us/uwp/api/windows.ui.windowmanagement.appwindow.requestmoverelativetodisplayregion?view=winrt-22621

THe following API may be used to move your application to a specific display: https://docs.microsoft.com/en-us/uwp/api/windows.ui.windowmanagement.appwindow.requestmovetodisplayregion?view=winrt-22621

The following API may be used for spanning purposes: https://docs.microsoft.com/en-us/uwp/api/windows.ui.windowmanagement.appwindow.requestsize?view=winrt-22621

The Windowing Environment for Windows Desktop editions (outside of tablet mode) is Overlapped. Tiled is used for Tablet Mode and Windows Core OS's ModernPC.

Code Samples

#include <iostream>
#include <windows.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Internal.Devices.Sensors.h>
#include <winrt/Windows.Internal.System.h>
#include <winrt/Windows.System.Preview.h>
#include <winrt/Windows.UI.WindowManagement.h>
#include <winrt/Windows.Foundation.Collections.h>

using namespace std;
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Internal::Devices::Sensors;
using namespace Windows::Internal::System;
using namespace Windows::System::Preview;
using namespace Windows::UI::WindowManagement;
using namespace Windows::Foundation::Collections;

VOID OnFoldSensorReadingChanged(FoldSensor const&, FoldSensorReadingChangedEventArgs const& args)
{
	try {
		printf("Fold sensor state changed.\n");
		switch (args.Reading().GestureState())
		{
		case GestureState::Started:
			std::cout << "Fold started\n" << std::endl;
			break;
		case GestureState::Completed:
			std::cout << "Fold stopped\n" << std::endl;
			break;
		case GestureState::Cancelled:
			std::cout << "Fold cancelled\n" << std::endl;
			break;
		case GestureState::Unknown:
			std::cout << "Fold unknown\n" << std::endl;
			break;
		}

		for (auto panel : args.Reading().ContributingPanel())
		{
			printf("Panel: %s\n", to_string(panel).c_str());
		}
		
		std::cout << "Initial angle " << args.Reading().InitialAngle() << std::endl;
		std::cout << "Final angle " << args.Reading().FinalAngle() << std::endl;
		
		switch (args.Reading().FoldType())
		{
		case FoldType::Closing:
			std::cout << "Fold Closing\n" << std::endl;
			break;
		case FoldType::Opening:
			std::cout << "Fold Opening\n" << std::endl;
			break;
		case FoldType::NotDetected:
			std::cout << "Fold NotDetected\n" << std::endl;
			break;
		}
	}
	catch (...) {}
}

VOID PrintDetails(TwoPanelHingedDevicePostureReading const& args)
{
	try {
		std::cout << "Panel1 " << args.Panel1Id().c_str() << "\n" << std::endl;
		std::cout << "Panel2 " << args.Panel2Id().c_str() << "\n" << std::endl;

		std::cout << "Panel1 Orientation " << (int)args.Panel1Orientation() << "\n" << std::endl;
		std::cout << "Panel2 Orientation " << (int)args.Panel2Orientation() << "\n" << std::endl;

		switch (args.HingeState())
		{
		case Windows::Internal::System::HingeState::Unknown:
			std::cout << "Hinge1State Unknown\n" << std::endl;
			break;
		case Windows::Internal::System::HingeState::Closed:
			std::cout << "Hinge1State Closed\n" << std::endl;
			break;
		case Windows::Internal::System::HingeState::Concave:
			std::cout << "Hinge1State Concave\n" << std::endl;
			break;
		case Windows::Internal::System::HingeState::Flat:
			std::cout << "Hinge1State Flat\n" << std::endl;
			break;
		case Windows::Internal::System::HingeState::Convex:
			std::cout << "Hinge1State Convex\n" << std::endl;
			break;
		case Windows::Internal::System::HingeState::Full:
			std::cout << "Hinge1State Full\n" << std::endl;
			break;
		}
	}
	catch (...) {}
}

VOID OnPostureChanged(TwoPanelHingedDevicePosture const&, TwoPanelHingedDevicePostureRe...
Read more