Version 2309.80 - Monza
Surface Duo Drivers BSP - Version 2309.80 (Monza)
General information
**Released:** 09/24/2023 11:00 PM UTC+1
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 follow the following migration guidance: https://github.com/WOA-Project/SurfaceDuo-Guides/blob/main/Update/MigrationGuidanceForSecureBoot.md and please download the latest DriverUpdater release as well: https://github.com/WOA-Project/DriverUpdater/releases/tag/v1.9.0.0 -
⚠️ 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.
⚠️ An issue was found where some people may be getting a bugcheck during clean installations/new installations at the end of the first phase of setup with the following code (BOUND_IMAGE_UNSUPPORTED
) and if you are using a Windows build that does not come from the Canary Channel at the moment.
For best results, please either use a Canary Channel Windows insider build, or, please edit the epsilon.txt file located under \definitions\Desktop\ARM64\epsilon.txt
, remove the line with \components\QC8150\Device\DEVICE.SOC_QC8150.EPSILON_BATTERY
, save the file; Use this newly edited file to install drivers using driverupdater on a build of your choice that is not a canary channel insider build. Once you configured your device and are on the desktop, you will notice the battery is not detected. Please then reboot your device into mass storage, as if you were following the update guide, and then rerun driverupdater, but with the original \definitions\Desktop\ARM64\epsilon.txt
file (the one with the line containing \components\QC8150\Device\DEVICE.SOC_QC8150.EPSILON_BATTERY
).
We are sorry for the inconvenience caused by this uncaught issue and hope to provide a fix on the weekend within reasonable delays.
Release notes
Surface Duo 1
What's new?
-
Charging. (That's all)
-
The Surface App now comes preinstalled
-
The Surface App now displays the correct image for Surface Duo and provides options for eSIM, regulator, and pen pressure calibration options
-
Updates the following drivers to version 1.0.2000.0:
- Qualcomm Audio Miniport Driver for OEMB1 devices
- Qualcomm Audio Sound Listening Model for Voice Activation System Service for OEMB1 devices
- Qualcomm Audio System Configuration Package for OEMB1 devices
- Qualcomm Audio Miniport Configuration Package for OEMB1 devices
- Qualcomm Sensor Configuration Package for OEMB1 devices
- Qualcomm Modem Configuration Package for OEMB1 devices
- Qualcomm Audio DSP Extension Package for OEMB1 devices
- Qualcomm Compute DSP Extension Package for OEMB1 devices
- Qualcomm Modem DSP Extension Package for OEMB1 devices
- Qualcomm Sensor DSP Extension Package for OEMB1 devices
- Qualcomm Trusted Runtime Environment Driver for OEMB1 devices
- Qualcomm Adreno 640 Driver for OEMB1 devices (Desktop & WCOS)
- Qualcomm JPEG Encoder Driver
- Qualcomm Subsystem Manager Driver
- Qualcomm IOMMU Bridge for Microsoft Hyper-V Hypervisor Platform Driver
-
General system stability improvements to enhance the user's experience.
Important! New definition files are present, here's a summary of how to proceed:
- I am running a build < 17763, you are unsupported.
-
I am running a build < 18362, use Driver Updater with
\definitions\Desktop\ARM64\epsilon_rs5.txt
-
I am running a build < 19041, use Driver Updater with
\definitions\Desktop\ARM64\epsilon_ti.txt
-
I am running a build < 25905, use Driver Updater with
\definitions\Desktop\ARM64\epsilon.txt
-
I am running a build >= 25905, use Driver Updater with
\definitions\Desktop\ARM64\epsilon_ga.txt
Known issues
- Sensors are temporarily unavailable on Windows 11 Canary Channel Insider Builds (Gallium)
-
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.
-
Battery charging remains unstable and not recommended.
-
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, however, is not smooth.
-
Charging remains unavailable in Windows. Please charge in Android.
-
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.
Surface Duo 2
What's new?
- Nothing New. Surface Duo 2 is still a Proof of Concept (PoC), don't expect much.
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&, TwoPanelHingedDevicePostureReadingChangedEventArgs const& args)
{
try {
printf("Posture sensor state changed.\n");
PrintDetails(args.Reading());
}
catch (...) {}
}
VOID OnSensorReadingChanged(FlipSensor const&, FlipSensorReadingChangedEventArgs const& args)
{
try {
printf("Flip sensor state changed.\n");
switch (args.Reading().GestureState())
{
case GestureState::Started:
std::cout << "Flip started\n" << std::endl;
break;
case GestureState::Completed:
std::cout << "Flip stopped\n" << std::endl;
break;
case GestureState::Cancelled:
std::cout << "Flip cancelled\n" << std::endl;
break;
case GestureState::Unknown:
std::cout << "Flip unknown\n" << std::endl;
break;
}
}
catch (...) {}
}
int main()
{
init_apartment();
printf("Trying to get flip sensor.\n");
try {
FlipSensor flip = FlipSensor::GetDefaultAsync().get();
if (flip == nullptr)
{
printf("Flip sensor not found.\n");
}
else
{
printf("Starting listening session for flip sensor.\n");
flip.ReadingChanged(OnSensorReadingChanged);
}
printf("Press any key to stop\n");
std::cin.get();
}
catch (...) {}
printf("Trying to get posture sensor.\n");
try {
TwoPanelHingedDevicePosture Posture = TwoPanelHingedDevicePosture::GetDefaultAsync().get();
if (Posture == nullptr)
{
printf("Posture sensor not found.\n");
}
else
{
auto curpst = Posture.GetCurrentPostureAsync().get();
if (curpst != nullptr)
{
PrintDetails(curpst);
}
printf("Starting listening session for Posture sensor.\n");
Posture.PostureChanged(OnPostureChanged);
}
printf("Press any key to stop\n");
std::cin.get();
}
catch (...) {}
printf("Trying to get fold sensor.\n");
try {
FoldSensor fold = FoldSensor::GetDefaultAsync().get();
if (fold == nullptr)
{
printf("Fold sensor not found.\n");
}
else
{
printf("Starting listening session for fold sensor.\n");
fold.ReadingChanged(OnFoldSensorReadingChanged);
}
printf("Press any key to stop\n");
std::cin.get();
}
catch (...) {}
}
How to offline update an existing Windows Desktop installation
- Switch the device into mass storage. - Take note of the drive letter the Windows partition is using, here we will assume it got mounted as I:
-
Download [SurfaceDuo-Drivers-Full.zip] from https://github.com/WOA-Project/SurfaceDuo-Drivers/releases/latest
-
Extract said zip file to a folder of your choice, we will assume here we extracted it to C:\UpdatedDrivers
-
Download the DriverUpdater utility from https://github.com/WOA-Project/DriverUpdater/releases/latest
-
Open a command prompt as administrator, where the driver utility got downloaded
-
Execute the following command:
DriverUpdater.exe -d C:\UpdatedDrivers\SurfaceDuo-Drivers-XXXX\definitions\Desktop\ARM64\Internal\epsilon.txt -r C:\UpdatedDrivers\SurfaceDuo-Drivers-XXXX\ -p I:\
-
Reboot the device, the device will now begin PnP setup once again, and hopefully you will be back soon enough to your desktop
How to install Windows Desktop on internal Storage
Please follow the steps detailed at https://github.com/WOA-Project/SurfaceDuo-Guides
Bug reporting
This release is a Preview release. Bug exists and may happen. If you notice a bug not present in the following bug list, please report them on our Telegram Group.
Seems Faster(TM)
-- The DuoWoA authors