From 573a8e2f4a895870e0fe13a14e3c3db9f32d4581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Sat, 15 Oct 2022 16:53:24 +0200 Subject: [PATCH] Add initial FanControl --- FanControl/FanControl.csproj | 22 ++++++++++ FanControl/InpOut.cs | 55 +++++++++++++++++++++++ FanControl/Program.cs | 82 +++++++++++++++++++++++++++++++++++ FanControl/Vlv0100.cs | 66 ++++++++++++++++++++++++++++ FanControl/inpoutx64.dll | Bin 0 -> 98304 bytes SteamDeckTools.sln | 25 +++++++++++ 6 files changed, 250 insertions(+) create mode 100644 FanControl/FanControl.csproj create mode 100644 FanControl/InpOut.cs create mode 100644 FanControl/Program.cs create mode 100644 FanControl/Vlv0100.cs create mode 100644 FanControl/inpoutx64.dll create mode 100644 SteamDeckTools.sln diff --git a/FanControl/FanControl.csproj b/FanControl/FanControl.csproj new file mode 100644 index 0000000..1b245fc --- /dev/null +++ b/FanControl/FanControl.csproj @@ -0,0 +1,22 @@ + + + + Exe + net6.0-windows + enable + enable + True + FanControl.Program + + + + + + + + + PreserveNewest + + + + diff --git a/FanControl/InpOut.cs b/FanControl/InpOut.cs new file mode 100644 index 0000000..87275b8 --- /dev/null +++ b/FanControl/InpOut.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace FanControl +{ + internal class InpOut + { + [DllImport("inpoutx64.dll", EntryPoint = "MapPhysToLin", CallingConvention = CallingConvention.StdCall)] + public static extern IntPtr MapPhysToLin(IntPtr pbPhysAddr, uint dwPhysSize, out IntPtr pPhysicalMemoryHandle); + + [DllImport("inpoutx64.dll", EntryPoint = "UnmapPhysicalMemory", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, IntPtr pbLinAddr); + + [DllImport("inpoutx64.dll", EntryPoint = "DlPortReadPortUchar", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.U1)] + public static extern byte DlPortReadPortUchar(ushort port); + + [DllImport("inpoutx64.dll", EntryPoint = "DlPortWritePortUchar", CallingConvention = CallingConvention.StdCall)] + public static extern byte DlPortWritePortUchar(ushort port, byte vlaue); + + public static byte[] ReadMemory(IntPtr baseAddress, uint size) + { + IntPtr pdwLinAddr = MapPhysToLin(baseAddress, size, out IntPtr pPhysicalMemoryHandle); + if (pdwLinAddr != IntPtr.Zero) + { + byte[] bytes = new byte[size]; + Marshal.Copy(pdwLinAddr, bytes, 0, bytes.Length); + UnmapPhysicalMemory(pPhysicalMemoryHandle, pdwLinAddr); + + return bytes; + } + + return null; + } + + public static bool WriteMemory(IntPtr baseAddress, byte[] data) + { + IntPtr pdwLinAddr = MapPhysToLin(baseAddress, (uint)data.Length, out IntPtr pPhysicalMemoryHandle); + if (pdwLinAddr != IntPtr.Zero) + { + Marshal.Copy(data, 0, pdwLinAddr, data.Length); + UnmapPhysicalMemory(pPhysicalMemoryHandle, pdwLinAddr); + + return true; + } + + return false; + } + } +} diff --git a/FanControl/Program.cs b/FanControl/Program.cs new file mode 100644 index 0000000..3886619 --- /dev/null +++ b/FanControl/Program.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using LibreHardwareMonitor.Hardware; + +namespace FanControl +{ + internal class Program + { + public class UpdateVisitor : IVisitor + { + public void VisitComputer(IComputer computer) + { + computer.Traverse(this); + } + public void VisitHardware(IHardware hardware) + { + hardware.Update(); + foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this); + } + public void VisitSensor(ISensor sensor) { } + public void VisitParameter(IParameter parameter) { } + } + + public static void Monitor() + { + Computer computer = new Computer + { + IsCpuEnabled = true, + IsGpuEnabled = true, + IsMemoryEnabled = true, + IsMotherboardEnabled = true, + IsControllerEnabled = true, + IsNetworkEnabled = true, + IsStorageEnabled = true + }; + + computer.Open(); + computer.Accept(new UpdateVisitor()); + + foreach (IHardware hardware in computer.Hardware) + { + Console.WriteLine("Hardware: {0}", hardware.Name); + + foreach (IHardware subhardware in hardware.SubHardware) + { + Console.WriteLine("\tSubhardware: {0}", subhardware.Name); + + foreach (ISensor sensor in subhardware.Sensors) + { + Console.WriteLine("\t\tSensor: {0}, value: {1}", sensor.Name, sensor.Value); + } + } + + foreach (ISensor sensor in hardware.Sensors) + { + Console.WriteLine("\tSensor: {0}, value: {1}", sensor.Name, sensor.Value); + } + } + + computer.Close(); + } + + static void Main(string[] args) + { + // Monitor(); + + while (true) + { + Thread.Sleep(300); + + Vlv0100.SetFanControl(false); + Vlv0100.SetFanDesiredRPM(6000); + + Console.WriteLine("Fan RPM: {0}", Vlv0100.GetFanRPM()); + Console.WriteLine("Fan Desired RPM: {0}", Vlv0100.GetFanDesiredRPM()); + } + } + } +} diff --git a/FanControl/Vlv0100.cs b/FanControl/Vlv0100.cs new file mode 100644 index 0000000..cc83939 --- /dev/null +++ b/FanControl/Vlv0100.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading.Tasks; + +namespace FanControl +{ + internal class Vlv0100 + { + // Those addresses are taken from DSDT for VLV0100 + // and might change at any time with a BIOS update + static IntPtr FSLO_FSHI = new IntPtr(0xFE700B00 + 0x92); + static IntPtr GNLO_GNHI = new IntPtr(0xFE700B00 + 0x95); + static IntPtr FRPR = new IntPtr(0xFE700B00 + 0x97); + static IntPtr FNRL_FNRH = new IntPtr(0xFE700300 + 0xB0); + static IntPtr FNCK = new IntPtr(0xFE700300 + 0x9F); + static ushort IO6C = 0x6C; + + public static ushort GetFanDesiredRPM() + { + byte[] data = InpOut.ReadMemory(FSLO_FSHI, 2); + return BitConverter.ToUInt16(data); + } + + public static ushort GetFanRPM() + { + byte[] data = InpOut.ReadMemory(FNRL_FNRH, 2); + return BitConverter.ToUInt16(data); + } + public static void SetFanControl(Boolean userControlled) + { + SetGain(10); + SetRampRate(userControlled ? (byte)10 : (byte)20); + + InpOut.DlPortWritePortUchar(IO6C, userControlled ? (byte)0xCC : (byte)0xCD); + } + + public static void SetFanDesiredRPM(ushort rpm) + { + if (rpm > 0x1C84) + rpm = 0x1C84; + + byte[] data = BitConverter.GetBytes(rpm); + InpOut.WriteMemory(FSLO_FSHI, data); + } + + public static bool GetFanCheck() + { + byte[] data = InpOut.ReadMemory(FNCK, 1); + return (data[0] & 0x1) != 0; + } + + private static void SetGain(ushort gain) + { + byte[] data = BitConverter.GetBytes(gain); + InpOut.WriteMemory(GNLO_GNHI, data); + } + private static void SetRampRate(byte rampRate) + { + byte[] data = BitConverter.GetBytes(rampRate); + InpOut.WriteMemory(FRPR, data); + } + } +} diff --git a/FanControl/inpoutx64.dll b/FanControl/inpoutx64.dll new file mode 100644 index 0000000000000000000000000000000000000000..82c343fe10de5d96cdc86082ca99db9b0be2aebc GIT binary patch literal 98304 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 LV>9qSnt`7HBkO?C literal 0 HcmV?d00001 diff --git a/SteamDeckTools.sln b/SteamDeckTools.sln new file mode 100644 index 0000000..5f8a00a --- /dev/null +++ b/SteamDeckTools.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32901.215 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FanControl", "FanControl\FanControl.csproj", "{A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FCAAD784-C54A-40A3-AE4A-ED9DD2299E6E} + EndGlobalSection +EndGlobal