Skip to content

Instantly share code, notes, and snippets.

@w568w
Last active August 13, 2026 10:22
Show Gist options
  • Select an option

  • Save w568w/b2fc5f9d1f4dff13efe751abec27b396 to your computer and use it in GitHub Desktop.

Select an option

Save w568w/b2fc5f9d1f4dff13efe751abec27b396 to your computer and use it in GitHub Desktop.
MECHREVO Wujie 14XA (Ryzen 7 8845HS) Reverse-engineering

MECHREVO Wujie 14XA (Ryzen 7 8845HS) Reverse-engineering

This log documents ACPI calls and driver calls found through reverse engineering the MECHREVO Wujie 14XA laptop (marketed as 机械革命无界 14X 暴风雪版, or Mechrevo Boundless 14X Blizzard Edition).

I am playing with:

  • BIOS version: N.1.14MRO17
  • AP (control center) version: 5.56.51.17

"How did you capture these calls?"

Windows comes with an ACPI debugger called AMLI.

  1. Booting a Windows 11 with debug mode on (you can execute bcdedit -debug on and reboot to toggle the debug mode);
  2. Install Sysinternals's DebugView to read the kernel logs, and WinDbg to issue debug commands;
  3. Open WinDbg, attach to the local kernel, execute !amli set traceon spewon to start tracing all ACPI events. If it complains about missing symbols (failed to to get the address of XXX), execute .reload to reload them;
  4. Open DebugView and enjoy your kernel logs.

"Any useful resourses?"

Read Current Battery Mode

Invocation: \_SB.INOU.ECRR(0x7a6)

Return: 0x8, 0x18 and 0x28 for different battery modes (respectively Long-lasting Mode, Balanced Mode, and Workstation Mode)

Raw procedure:

AMLI: FFFFC1839B9B3080: \_SB.INOU.ECRR(0x7a6)
ffffc1837ef8212a: {
ffffc1837ef8212a: | Add(0xfed50000,Arg0=0x7a6,Local0) = 0xfed507a6
ffffc1837ef82132: | Store(MMRW(Local0=0xfed507a6,Zero,Zero,Zero)
ffffc1837ef818b2: | {
ffffc1837ef818b2: | | Acquire(UWOL,0xffff) = 0x0
ffffc1837ef818ba: | | OperationRegion(MMNM,0x0,Arg0=0xfed507a6,0x4)
ffffc1837ef818c4: | | Field(MMNM,0x1)
ffffc1837ef818cc: | | {
ffffc1837ef818d1: | | | MM08,8
ffffc1837ef818d1: | | }
ffffc1837ef818d1: | | Field(MMNM,0x1)
ffffc1837ef818d9: | | {
ffffc1837ef818de: | | | MM16,16
ffffc1837ef818de: | | }
ffffc1837ef818de: | | Field(MMNM,0x1)
ffffc1837ef818e6: | | {
ffffc1837ef818eb: | | | MM32,32
ffffc1837ef818eb: | | }
ffffc1837ef818eb: | | Store(0xfffffffe,Local0) = 0xfffffffe
ffffc1837ef818f2: | | If(LEqual(Arg1=0x0,Zero) = 0xffffffffffffffff)
ffffc1837ef818f7: | | {
ffffc1837ef818f7: | | | If(LEqual(Arg2=0x0,Zero) = 0xffffffffffffffff)
ffffc1837ef818fc: | | | {
ffffc1837ef818fc: | | | | Store(MM08 = 0x28,Local0) = 0x28 // or Store(MM08 = 0x18,Local0) = 0x18 // or Store(MM08 = 0x8,Local0) = 0x8
ffffc1837ef81902: | | | }
ffffc1837ef8191d: | | }
ffffc1837ef8195a: | | Release(UWOL)
ffffc1837ef81960: | | Return(Local0=0x28)
ffffc1837ef81962: | },Local1) = 0x28
ffffc1837ef8213c: | Return(Local1=0x28)
ffffc1837ef8213e: }

Set Current Battery Mode

Invocation: \_SB.INOU.ECRW(0x7a6,0xffffc118) (where new_mode = argument_1 & 0xff)

Return: 0xfffffffe for success

Raw procedure:

AMLI: FFFFC1839B9B3080: \_SB.INOU.ECRW(0x7a6,0xffffc118)
{
	Add(0xfed50000,Arg0=0x7a6,Local0)=0xfed507a6
	MMRW(Local0=0xfed507a6,One,Zero,Arg1=0xffffc118)
	{
		Acquire(UWOL,0xffff) = 0x0
		OperationRegion(MMNM,0x0,Arg0=0xfed507a6,0x4)
		Field(MMNM,0x1)
		{
			MM08,8
		}
		Field(MMNM,0x1)
		{
			MM16,16
		}
		Field(MMNM,0x1)
		{
			MM32,32
		}
		Store(0xfffffffe,Local0) = 0xfffffffe
		If(LEqual(Arg1=0x1,Zero) = 0x0)
		{
			If(LEqual(Arg1=0x1,One) = 0xffffffffffffffff)
			{
				If(LEqual(Arg2=0x0,Zero) = 0xffffffffffffffff)
				{
					Store(And(Arg3=0xffffc118,0xff,)=0x18,MM08)=0x18 // 0x8, 0x28
				}
			}
		}
		Release(UWOL)
		Return(Local0=0xfffffffe)
	}
}

Read Keyboard Backlight Status

Invocation: \_SB.INOU.ECRR(0x78c)

Return: 0x1 for keyboard backlight on; 0x3 for off

Set Keyboard Backlight Status

Invocation: \_SB.INOU.ECRW(0x78c, 0xffffc101) (where keyboard status = argument_1 & 0xff)

Return: 0xfffffffe for success

About Keyboard Backlight Timeout

It appears that the backlight timeout is not controlled by ACPI calls. Maybe OEM Windows service-based?

About ACPI Platform Profile

Dozens of ACPI calls are issued during power mode changes. It's likely that some other mechanism (driver?) is actually the one doing most of the work.

See switch_balanced_to_quiet.log for an example.

Interestingly, I happened to check GCUService.exe, the main service process for the control center, and found that it's written in C# .NET and not obfuscated at all!

So, I decompiled it using dnSpy, and you can find all the logic related to the tray menu in MyControlCenter.TrayView:

private void item_OfficeMode_Click(object sender, EventArgs e)
{
	TrayView.m_MyFan.m_Manager.UserSet_Mode2();
	if (App.OsdOnly == 1)
	{
		App.m_Osd.ShowOSDByName(TrayView.m_MyFan.m_Manager.g_FanMode, "");
	}
	TrayView.m_MyFan.m_Manager.UpdateStatusToClient(1, 0, 0, true);
}

In short, on the 14XA, setting the ACPI Platform Profile (like Office, Gaming, or Turbo modes) primarily just changes the fan curve, CPU Boost, and some power-related logic (depending on charger status, etc.).

I won’t bore you with all the details here because the setup code is quite long and basically just a bunch of ACPI calls. The good news is, they're all in MyControlCenter.MyFanManager.setFanMode. So grab your decompiler and start testing! 😉

00000036 0.00000510 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x744,0xffffc15f)
00000071 0.01432340 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x751,0xffffc1a0)
00000106 0.03026440 AMLI: FFFFC183A3489080: \_SB.INOU.ECRR(0x727)
00000139 0.04622660 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x727,0xffffc100)
00000174 0.06148090 AMLI: FFFFC183A3489080: \_SB.INOU.ECRR(0x726)
00000207 0.07745980 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x726,0xffffc100)
00000242 0.09461000 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x751,0xffffc1a0)
00000277 0.10852740 AMLI: FFFFC183A3489080: \_SB.INOU.ECRR(0x727)
00000310 0.12456160 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x727,0xffffc100)
00000345 0.14053030 AMLI: FFFFC183A3489080: \_SB.INOU.ECRR(0x726)
00000378 0.15601569 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x726,0xffffc100)
00000413 0.17155820 AMLI: FFFFC183A3489080: \_SB.INOU.ECRR(0x7a5)
00000446 0.18661080 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRR(0x7c6)
00000479 0.20255619 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x783,0xffffc100)
00000514 0.21855800 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0x7c6,0xffffc100)
00000549 0.23372900 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x784,0xffffc100)
00000584 0.24972050 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRR(0x7c5)
00000617 0.26571679 AMLI: FFFFC183A3489080: \_SB.INOU.ECRR(0x727)
00000650 0.28084320 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0x7c5,0xffffc100)
00000685 0.29703659 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x785,0xffffc100)
00000720 0.31278151 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf00,0xffffc104)
00000755 0.32876530 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x786,0xffffc100)
00000790 0.34392330 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf11,0xffffc1af)
00000825 0.35989061 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x787,0xffffc100)
00000860 0.37599701 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf20,0xffffc1f6)
00000895 0.39192191 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf01,0xffffc174)
00000930 0.40796569 AMLI: FFFFC183A3489080: \_SB.INOU.ECRR(0x743)
00000963 0.42304030 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf12,0xffffc13f)
00000998 0.43904111 AMLI: FFFFC183A3489080: \_SB.INOU.ECRW(0x743,0xffffc100)
00001033 0.45466590 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf21,0xffffc122)
00001068 0.47072801 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf02,0xffffc1c0)
00001103 0.48682401 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf13,0xffffc1ef)
00001138 0.50279158 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf22,0xffffc1ae)
00001173 0.51880050 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf03,0xffffc1f0)
00001208 0.53429359 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf14,0xffffc170)
00001243 0.55024391 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf23,0xffffc13e)
00001350 0.56631720 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf04,0xffffc17f)
00001385 0.58230281 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf15,0xffffc10c)
00001420 0.59753120 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf24,0xffffc1c2)
00001455 0.61352181 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf05,0xffffc105)
00001490 0.62971002 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf16,0xffffc1af)
00001525 0.64473581 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf25,0xffffc1ee)
00001560 0.66036379 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf06,0xffffc112)
00001595 0.67595130 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf17,0xffffc132)
00001630 0.69151968 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf26,0xffffc194)
00001665 0.70751858 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf07,0xffffc10f)
00001700 0.72309059 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf18,0xffffc1ef)
00001735 0.73909640 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf27,0xffffc108)
00001770 0.75504780 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf08,0xffffc11a)
00001805 0.77104461 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf19,0xffffc170)
00001840 0.78705209 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf28,0xffffc174)
00001875 0.80316877 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf09,0xffffc112)
00001910 0.81907678 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf1a,0xffffc107)
00001945 0.83516628 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf29,0xffffc180)
00001980 0.85111851 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf0a,0xffffc146)
00002015 0.86632133 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf1b,0xffffc178)
00002050 0.88241982 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf2a,0xffffc194)
00002085 0.89848948 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf0b,0xffffc18f)
00002120 0.91348863 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf1c,0xffffc1b2)
00002155 0.92906022 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf2b,0xffffc180)
00002190 0.94468540 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf0c,0xffffc1af)
00002225 0.96028233 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf1d,0xffffc1e6)
00002260 0.97579569 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf2c,0xffffc150)
00002295 0.99159741 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf0d,0xffffc132)
00002330 1.00694311 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf1e,0xffffc154)
00002365 1.02272415 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf2d,0xffffc110)
00002400 1.03770673 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf0e,0xffffc102)
00002435 1.05334628 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf1f,0xffffc1fb)
00002470 1.06878805 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf2e,0xffffc1ae)
00002505 1.08383656 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf0f,0xffffc1ff)
00002540 1.09945035 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf2f,0xffffc13e)
00002575 1.11502409 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf30,0xffffc100)
00002610 1.13048995 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf41,0xffffc100)
00002645 1.14575362 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf50,0xffffc100)
00002680 1.16078627 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf31,0xffffc100)
00002715 1.17629826 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf42,0xffffc100)
00002750 1.19279945 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf51,0xffffc100)
00002785 1.20795310 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf32,0xffffc100)
00002820 1.22382641 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf43,0xffffc100)
00002855 1.23971939 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf52,0xffffc100)
00002890 1.25603676 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf33,0xffffc100)
00002925 1.27175975 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf44,0xffffc100)
00002960 1.28742433 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf53,0xffffc100)
00002995 1.30333412 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf34,0xffffc100)
00003030 1.31849802 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf45,0xffffc100)
00003065 1.33446085 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf54,0xffffc100)
00003100 1.35044539 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf35,0xffffc100)
00003135 1.36646855 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf46,0xffffc100)
00003170 1.38177514 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf55,0xffffc100)
00003205 1.39749610 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf36,0xffffc100)
00003240 1.41335475 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf47,0xffffc100)
00003275 1.42940855 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf56,0xffffc100)
00003310 1.44501567 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf37,0xffffc100)
00003345 1.46065652 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf48,0xffffc100)
00003380 1.47636318 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf57,0xffffc100)
00003415 1.49191833 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf38,0xffffc100)
00003450 1.50749588 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf49,0xffff8700)
00003485 1.52255869 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf58,0xffffc100)
00003520 1.53414690 AMLI: FFFFF803C9DD0640: \_SB.PCI0.SBRG.EC0._Q89()
00003526 1.53441179 AMLI: FFFFC18382FF5040: \_SB.BAT0._STA()
00003608 1.53600812 AMLI: FFFFC18382FF5040: \_SB.BAT0._BTP(0x1435)
00003674 1.53841364 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf39,0xffffc100)
00003709 1.55442441 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf4a,0xffffc100)
00003744 1.56941175 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf59,0xffffc100)
00003779 1.58533347 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf3a,0xffffc100)
00003814 1.60076249 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf4b,0xffffc100)
00003849 1.61699629 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf5a,0xffffc100)
00003884 1.63299561 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf3b,0xffffc100)
00003919 1.64902079 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf4c,0xffffc100)
00003954 1.66453564 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf5b,0xffffc100)
00003989 1.67987084 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf3c,0xffffc100)
00004024 1.69488394 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf4d,0xffffc100)
00004059 1.71043682 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf5c,0xffffc100)
00004094 1.72608280 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf3d,0xffffc100)
00004129 1.74216723 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf4e,0xffffc100)
00004164 1.75799119 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf5d,0xffffc100)
00004199 1.77354038 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf3e,0xffffc100)
00004234 1.78942883 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf4f,0xffffc100)
00004269 1.80496681 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf5e,0xffffc100)
00004304 1.82056236 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf3f,0xffffc1ff)
00004339 1.83623695 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0xf5f,0xffffc100)
00004374 1.85213244 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRR(0xf00)
00004407 1.86785340 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRR(0xf01)
00004440 1.88386559 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRR(0x7c6)
00004473 1.89915085 AMLI: FFFFC183A37F6080: \_SB.INOU.ECRW(0x7c6,0xffffc104)
@Peter-Yung

Copy link
Copy Markdown

I had been to official Mechrevo official Simplified Chinese website, using following URL below and request real person customer service. Then, he/she asked me to provide QR code printed under the laptop case after scanned by my phone. Finally, he/she send me I think should be the most updated BIOS version of WUJIE14XA : N.1.14MRO50 https://800.mechrevo.com/visitors-ui/h5?channelId=1&channelName=H5

I have installed on my machine after boot back to Windows 11 and here is the evidence after I reboot to CachyOS Linux:
hardinfo2_systemdmi_20260513

I hope this could give you guys some new information for your backward engineering work. I am a newbies in tech so I really don't understand all what you guys conversations. However, I hope you guys and crack the patch out and share in the community. The reason why I have found here because I am looking for controling my WUJIE14XA battery threadshold in CachyOS Linux to control the maximum charge of battery around 80% to increase the life-span.

@LongSang01

LongSang01 commented May 13, 2026

Copy link
Copy Markdown

I had been to official Mechrevo official Simplified Chinese website, using following URL below and request real person customer service. Then, he/she asked me to provide QR code printed under the laptop case after scanned by my phone. Finally, he/she send me I think should be the most updated BIOS version of WUJIE14XA : N.1.14MRO50 https://800.mechrevo.com/visitors-ui/h5?channelId=1&channelName=H5

Customer service give me the latest link: https://driver.mechrevo.com/d.mechrevo.com/driver/MECHREVO2024/WJ14X8845HS/GXxHXxxN114MRO50_CAP.EXE

@LongSang01

Copy link
Copy Markdown

Customer service give me the latest link: https://driver.mechrevo.com/d.mechrevo.com/driver/MECHREVO2024/WJ14X8845HS/GXxHXxxN114MRO50_CAP.EXE I haven't had much time lately, I hope this can help

I took some time last night to update the BIOS. Did a quick test today, but it seems that the battery mode still doesn’t take effect.

[nihao@01-Arch ~]$ sudo dmidecode -s bios-version                 
N.1.14MRO50
[nihao@01-Arch ~]$ cat /sys/class/power_supply/BAT0/capacity && cat /sys/class/power_supply/BAT0/current_now
94
1156000

@minortex

minortex commented Jun 11, 2026

Copy link
Copy Markdown

@LongSang01 According to your charging log, the voltage of battery finally on 16349mV, I search the 80Wh battery on taobao, it shows that the limited charge voltage is 17.6v and the nominal voltage is 15.4v, meaning that 4 ternary lithium batteries are in series. I'm in school now without necessary tools to disassemble my computer, so can you confirm that?
图片

If the battery model is correct, it means Mechrevo limited our charging voltage to 16.4v (per 4.1v), result in 15-20% capacity loss, instead of charging it to full causing calender aging. Is there any way to test if battery can deliver a total of almost 80Wh?

@LongSang01

LongSang01 commented Jun 12, 2026

Copy link
Copy Markdown

@minortex u can search teardown videos. This battery only big 80 Wh logo and barcode

https://www.bilibili.com/video/BV1s7421Z7BX/?t=214

@minortex

minortex commented Jun 12, 2026

Copy link
Copy Markdown

@minortex u can search teardown videos. This battery only big 80 Wh logo and barcode

https://www.bilibili.com/video/BV1s7421Z7BX/?t=214

The details may on the other side.
I have another laptop with charging limitation function, when it's on, my capacity is limit to 80%, and the voltage info is below:

❯ cat /sys/class/power_supply/BAT1/voltage_min_design
15400000
❯ cat /sys/class/power_supply/BAT1/voltage_now
15913000
❯ cat /sys/class/power_supply/BAT1/capacity
80

# charge to 84
❯ cat /sys/class/power_supply/BAT1/capacity
84
❯ cat /sys/class/power_supply/BAT1/voltage_now
16915000

# charge to 94
❯ cat /sys/class/power_supply/BAT1/capacity
94
❯ cat /sys/class/power_supply/BAT1/voltage_now
17337000
# plug out charger
❯ cat /sys/class/power_supply/BAT1/voltage_now
16550000

So it's reasonable to doubt that due to the limitaion of battery voltage to 16.4v, wujie 14x isn't charged to full, maybe ~90% by default.


And some of I thought:

  1. the self-burning incident in Jan 2024, making mechrevo choose a conservative charging policy. Is mechrevo in 2026 still using this policy?
  2. It's said that ThinkBook 14+ offers 29.5% more battery life than the Mechrevo, actually, mech doen't reach 80Wh. this

@LongSang01

LongSang01 commented Jun 12, 2026

Copy link
Copy Markdown

the self-burning incident in Jan 2024, making mechrevo choose a conservative charging policy

I found a picture of the original battery in the Taobao comments. The info on the back matches what’s shown in your picture. In testing, changing the battery mode doesn’t affect the voltage. In the BIOS, it shows fully charged at 16.349 V, 4300 mAh—looks like a BMS limit. It’s possible Mechrevo deliberately caps the battery at the factory to cut after-sales costs and reduce fire risk, since many of their models use this 80 Wh battery

image

@LongSang01

LongSang01 commented Jun 12, 2026

Copy link
Copy Markdown

In the BIOS, it shows fully charged at 16.349 V, 4300 mAh

I just checked my BIOS, and it now only show 4000 mAh

image

@minortex

minortex commented Jun 12, 2026

Copy link
Copy Markdown

Strange, mine is 3900mAh, but sysfs reports 5200mAh in total.
When the capacity dropped to 87%, they reported different mAh:

❯ cat /sys/class/power_supply/BAT0/charge_now
4524000
❯ cat /sys/class/power_supply/BAT0/charge_full_design
5200000
图片

@LongSang01

Copy link
Copy Markdown

基于@tuncenator测试结论重新进行了充电测试
可以通过修改0x7B9的值来设置电池充电上限(精确到百分比),测试通过acpi_call可以正常读写,但是似乎还是没有生效
我可以确认无界14x的DSDT和示例相同

测试日志

@w568w

w568w commented Jul 2, 2026

Copy link
Copy Markdown
Author

重新进行了充电测试 可以通过修改0x7B9的值来设置电池充电上限(精确到百分比),测试通过acpi_call可以正常读写,但是似乎还是没有生效 我可以确认无界14x的DSDT和示例相同

测试日志

Thank you for the test report!

So far, it has only worked for me a few times on Windows. And every time it did, it took a very long time to take effect after switching (sometimes it wouldn't even take effect until I had used it for another tens of minutes after a full charge)...

And the customer support is not helpful:

image

😅 Although we can confirm that the battery capacity percent is misleading...

@Wer-Wolf

Wer-Wolf commented Jul 2, 2026

Copy link
Copy Markdown

基于@tuncenator测试结论重新进行了充电测试 可以通过修改0x7B9的值来设置电池充电上限(精确到百分比),测试通过acpi_call可以正常读写,但是似乎还是没有生效 我可以确认无界14x的DSDT和示例相同

测试日志

Did you enable manual control mode using bit 0 inside register 0x0741?

@LongSang01

LongSang01 commented Jul 3, 2026

Copy link
Copy Markdown

Did you enable manual control mode using bit 0 inside register 0x0741?

I use a systemd service to automatically switch the battery mode and keyboard backlight, so manual mode is enabled automatically at boot.

After that, I also tried installing tuxedodriver-4.22.2 and modifying 0x7B9, but it still had no effect.

@LongSang01

Copy link
Copy Markdown

For reference, I have uploaded the DSDT file to repository.

sudo acpidump -b
iasl -d dsdt.dat

@minortex

minortex commented Jul 7, 2026

Copy link
Copy Markdown

@w568w
Can you share the control center again? The link was expired and I download the version 5.56.51.58, unfortunately there are functions with throw new Exception("Runtime exception"); everywhere, only some macros and strings are available. Thanks.

@Wer-Wolf

Wer-Wolf commented Jul 7, 2026

Copy link
Copy Markdown

Oh no, this means they used an obfuscator the the executable :/

@w568w

w568w commented Jul 7, 2026

Copy link
Copy Markdown
Author

Can you share the control center again? The link was expired and I download the version 5.56.51.58, unfortunately there are functions with throw new Exception("Runtime exception"); everywhere, only some macros and strings are available. Thanks.

@minortex Sure. Here you go: https://drive.google.com/drive/folders/1-fTOqdievXtOJAiHx_N7xQglbwJwINZt

I've also uploaded the decompiled source codes GCUService_decompiled.zip for your reference.

@minortex

minortex commented Jul 8, 2026

Copy link
Copy Markdown

Wow how did you do that?!! I use some tools and it told me that is virbox which make it hard to crack.
It'll be great of help for my try on controlling the fan. I got the username and password for MQTT to control the energy mode, look at this:

14:08:13 TOPIC=Fan/Status PAYLOAD={
    "IsAC": true,
    "OverClockingSwitch": "0",
    "OperatingMode": "1",
    "GamingProfileIndex": "0",
    "OfficeProfileIndex": "0",
    "TurboProfileIndex": "0",
    "CustomProfileIndex": "0",
    "FanBoostEnable": "0",
    "ProfileName": "Mode1_Profile1",
    "FAN_FanSwitchSpeedEnabled": "0",
    "FAN_FanSwitchSpeed": "300",
    "FAN_TableName": "M1T1",
    "FAN_SafetyProtectNotify": "0",
    "FAN_SafetyProtect": "0",
    "CPU_PL1": "45",
    "CPU_PL1Maximum": "60",
    "CPU_PL1Minimum": "10",
    "CPU_PL2": "45",
    "CPU_PL2Maximum": "65",
    "CPU_PL2Minimum": "10",
    "CPU_PL4": "50",
    "CPU_PL4Maximum": "65",
    "CPU_PL4Minimum": "10",
    "CPU_OffsetCoreVoltage": "0",
    "CPU_OffsetCoreVoltageOC": "0",
    "CPU_OffsetCoreVoltageMaximum": "0",
    "CPU_OffsetCoreVoltageMinimum": "0",
    "CPU_OffsetCoreVoltageSupport": "0",
    "CPU_TccOffsetSwitch": "0",
    "CPU_TccOffsetMaximum": "98",
    "CPU_TccOffset": "90",
    "GPU_CoreClockOffset": "0",
    "GPU_CoreClockOffsetOC": "0",
    "GPU_CoreClockOffsetMaximum": "250",
    "GPU_CoreClockOffsetMaximumHWOC": "250",
    "GPU_CoreClockOffsetMinimum": "0",
    "GPU_MemoryClockOffset": "0",
    "GPU_MemoryClockOffsetOC": "0",
    "GPU_MemoryClockOffsetMaximum": "1000",
    "GPU_MemoryClockOffsetMaximumHWOC": "1800",
    "GPU_MemoryClockOffsetMinimum": "-1000",
    "GPU_MemoryClockOffsetMinimumHWOC": "-1800",
    "GPU_TargetTemperature": "0",
    "GPU_TargetTemperatureMaximum": "0",
    "GPU_TargetTemperatureMinimum": "0",
    "GPU_ConfigurableTGPSwitch": "1",
    "GPU_ConfigurableTGPTarget": "0",
    "GPU_ConfigurableTGPMaximum": "0",
    "GPU_ConfigurableTGPMinimum": "0",
    "GPU_DynamicBoostSwitch": "0",
    "CustomTGPinGCUforGN21_Value": "100",
    "CustomTGPinGCUforGN21_Enable": "0",
    "CPU_PerformanceAndOverClockMenuSwitch": "255",
    "GPU_DynamicBoost": "0",
    "GPU_DynamicBoostMaximum": "0",
    "GPU_DynamicBoostMinimum": "5",
    "GPU_DynamicBoostTotalProcessingPowerTarget": "255",
    "GPU_WhisperModeSupport": false,
    "GPU_WhisperModeSwitch": "0",
    "GPU_WhisperModeSetting": "0",
    "GPU_WhisperModeMinFps_QUIETER": "30",
    "GPU_WhisperModeMinFps_QUIET": "40",
    "GPU_WhisperModeMinFps_BALANCED": "60",
    "GPU_WhisperModeMinFpsMaximum": "60",
    "GPU_WhisperModeMinFpsMinimum": "30",
    "CPU_AmdSPL": "45",
    "CPU_AmdSPPT": "45",
    "CPU_AmdFPPT": "50",
    "CPU_AmdTccTarget": "90",
    "CPU_AmdOverClockSupport": "0",
    "CPU_AmdCoreFreq": "0",
    "CPU_AmdCoreFreqOC": "0",
    "CPU_AmdCoreFreqMaximum": "0",
    "CPU_AmdCoreVoltage": "0",
    "CPU_AmdCoreVoltageOC": "0",
    "CPU_AmdCoreVoltageMaximum": "0",
    "MEM_MemoryOverClockSupport": "0",
    "MEM_MemoryOverClockSwitch": "0",
    "BSOD_DefaultNotify": "0",
    "BSOD_TimestampRestored": "2023-03-23 11:32:04",
    "OcSupport": true,
    "IsAMDPlatform": true,
    "IsNvGpu": false,
    "TurboModeOption": "1",
    "FanBoostBtnSupport": false,
    "PowerMode": "1",
    "CPU_PL4_Double_Flag": "0",
    "TjMax": "100",
    "Extreme": "0",
    "Silent": "0",
    "TurboGPUOCEnabled": false
}

And I'm able to switch to custom mode:
图片

For anyone interested, here is some scripts wrote by llm:
https://drive.google.com/drive/folders/1mXWfirJVsZklMjmwreU6UEvUeyoSrovw?usp=drive_link


update:

I found Drivers that the manufacturer place on D:\Driver. This version isn't obfuscated and can be installed on your windows, see the link above.

the whole kmod/userspace controller/modded ec have been upload to my repos, just get them from my github homepage.

@LongSang01

Copy link
Copy Markdown

I've also uploaded the decompiled source codes GCUService_decompiled.zip for your reference.

根据逆向的代码实现了一个简易的控制中心,可以修改性能模式(对应25w/45w/65w TDP),可以从EC内读取电池信息,更加确定了电池充电上限不可用 :(

@w568w

w568w commented Jul 8, 2026

Copy link
Copy Markdown
Author

Wow how did you do that?!! I use some tools and it told me that is virbox which make it hard to crack.

Have you tried dnSpy that was mentioned in the original doc? I just decompiled the GCUService.exe with it, and it worked out of box for me.

It'll be great of help for my try on controlling the fan. I got the username and password for MQTT to control the energy mode

根据逆向的代码实现了一个简易的控制中心,可以修改性能模式(对应25w/45w/65w TDP),可以从EC内读取电池信息

Interesting; thanks for your work! So the energy mode (or platform profile) is configuring through MQTT protocol? And there's an EC ctrl for TDP target?

Seems that there are still a lot to dig in… I may update the main doc with newer discoveries if having spare time.

@LongSang01

LongSang01 commented Jul 9, 2026

Copy link
Copy Markdown

And there's an EC ctrl for TDP target?

为了避免歧义我还是用中文回复好了

EC可以实现相当多的功能,包括但不限于调整PL1/PL2 TDP,风扇模式,3档键盘灯,获取设备信息,修改电池充电模式,电池百分比充电上限等
控制中心里的代码有多套机型的适配,所以很多功能实际上都不能用,我用webgl跑分简单测试了下调整PL1/PL2 TDP看起来没什么效果,所以最后没有添加这个功能

电源模式也就是3档TDP(25w/45w/65w)对应0x0751,通过bit4/bit70/1来调整

在控制中心里看起来是根据0x0751来调整风扇模式,代码里对应SetFanBoost()SetFanMode(),我没有仔细分析,所以这个描述可能有错误
实际使用时EC会根据cpu温度来调整风扇转速,所以大量的acpi call根本不用管,只要修改0x0751就行

在linux下fn+x功能时好时坏,装了TUXEDO Control Center后还会拦截fn+x,所以我加了3档TDP调整

目前已实现:调整3档TDP,3档键盘灯,获取电池信息,修改电池充电模式,百分比电池充电上限(这俩功能实际上不生效所以仅演示),具体的EC地址可以参考 https://github.com/LongSang01/wujie14X-Linux-Driver/blob/main/wujie14xCC.go#L15

@minortex

minortex commented Jul 9, 2026

Copy link
Copy Markdown

I have implemented some control functions without official console, and they work flawlessly when GCUService is stopped.
Now It works on both windows and linux, is it necessary to make it a kernel module?
https://github.com/minortex/mech-forza-control


update: all the functions controlled by EC has been added to my script, except charging control. Anybody who can test it out will be appreciated!

@minortex

minortex commented Jul 12, 2026

Copy link
Copy Markdown

I have almost figured out. one of three modes has there preset and can't be adjust except tctl, if you switch to custom mode, fan speed can be changed and 25/45/65w power mode is adjustable. Besides, you can manually adjust them to any value via ryzenadj. Detailed docs can be viewed in my repo in Chinese.

@minortex

minortex commented Jul 14, 2026

Copy link
Copy Markdown

@LongSang01
This post showed that turning off secure boot will make flexicharge menu show in the BIOS. Our models seem not to show that option.

Tried getting a BIOS from tuxedo, but the customer service said I had to provide a serial number or they won't provide it for me, it's a pity.

But I've collected some BIOSes and ECs from other brands, all of them are sharing the same model "GX4HRXL". To avoid violating copyright infringement due to redistribution, please use this

I've tried flashing XMG's BIOS, besides the function keys order is wrong, the BIOS show more customize options. You can try them if you feel free.

@minortex

minortex commented Jul 14, 2026

Copy link
Copy Markdown

Tried flashing SLIMBOOK.Evo_AMD8845HS_BIOS_N.1.14GOS05_EC_2.10.00.zip, first EC then BIOS.

What?! In the BIOS, battery limit occured!
图片

I set ~80%, rebooted into system, and drain my battery with s-tui, until the level was below 80%, started to charge. When the level reached 80%, charge stopped!!
And I set 81% it started to charge again, then stop right at 81%.

I thought we finally made it. Cheers!

This picture says it all:

Snipaste_2026-07-14_22-07-31

Anyway, the last thing: It's time to replace my battery.😂

@w568w

w568w commented Jul 14, 2026

Copy link
Copy Markdown
Author

@minortex Amazing! So it was due to the broken OEM BIOS firmware, right?

How did you find the BIOS firmware? I would like to compare it with the official Mechrevo ones for functional differences.

@minortex

Copy link
Copy Markdown

You can get it from the hyperlink to my repo above. I search "GX4HRXL" and related information, and found some slimbook users talk about it on reddit, and here is the official link: https://cloud.slimbook.net/s/download?dir=/Laptops/Evo-14/Ryzen-8845HS

@w568w

w568w commented Jul 14, 2026

Copy link
Copy Markdown
Author

@minortex Thanks! I've done the analysis with help of GPT-5.6 and Codex, and (possibly) identified a bug in the EC firmware:

The bug in EC 2.04 (fixed in EC 2.08)

In Mechrevo Firmware (EC Version 2.04), the code related to charge-decision is semantically:

static bool state_is(uint8_t value) {
    return xram[0x07C3] == value ||
           xram[0x0770] == value;
}

bool enable_limit_control = state_is(4) || state_is(5);

if (!enable_limit_control) {
    xram[CHARGE_LIMIT_GATE] &= (uint8_t)~LIMIT_GATE_BIT; // disables the charge-limit control path
    xram[LIVE_LIMIT] &= LIMIT_VALUE_MASK; // clear "limit reached" state
    return;
}

xram[CHARGE_LIMIT_GATE] |= LIMIT_GATE_BIT; // enable the limit
update_limit_latch_and_persistence(); // write the limit to store

While in EC Version 2.10, it becomes:

 static bool state_is(uint8_t value) {
     return xram[0x07C3] == value ||
            xram[0x0770] == value;
 }

 bool enable_limit_control = state_is(4) || state_is(5);

+if (!enable_limit_control) {
+    uint8_t stored_limit = xram[0x07B9] & LIMIT_VALUE_MASK; // read limit from store
+    enable_limit_control = stored_limit != 0 && stored_limit <= 100; // CRITIC: if limit is a valid number, still apply the battery limit
+}
+
 if (!enable_limit_control) {
     xram[CHARGE_LIMIT_GATE] &= (uint8_t)~LIMIT_GATE_BIT; // disables the charge-limit control path
     xram[LIVE_LIMIT] &= LIMIT_VALUE_MASK; // clear "limit reached" state
     return;
 }

 xram[CHARGE_LIMIT_GATE] |= LIMIT_GATE_BIT; // enable the limit
 update_limit_latch_and_persistence(); // write the limit to store

Besides, EC Version 2.10 also added logic to restore limit at boot time in its ec_init().


According to the code, the EC firmware bug path is possibly that:

  1. OS triggers the ACPI call.
  2. The EC runs its charge-limit update routine.
  3. But state_is(4) || state_is(5) is somehow always false at the moment;
  4. Thus it simply disables the charge limit and returns. Nothing is applied.

Edit: BUT it's NOT the only bug, otherwises MRO50 upgrades (with EC 2.12) should fix this completely. The truth is that, even writing to 0x07B9 on MRO50, the charging limit still doesn't take effect. There should be other reason for this… I am stuck here. Maybe dig it deeper when having more spare time.

@minortex

Copy link
Copy Markdown

@w568w
Actually the version of latest EC(bundled with BIOS N.1.14MRO50) from custom service is 2.12, but still reproduce this issue, why did this regression occurs?

So our best bet is calling Mechrevo to upgrade their EC firmware version as soon as possible.

I don't think they'll update it because it has been two years since the model launched.


I haven't encounter any side effects with Slimbook's BIOS so far, it might be a good choice. However, the charge minimum level doesn't take effect in this BIOS either. Compared with the charge maximum limit, I don't think that's a serious problem.

@w568w

w568w commented Jul 14, 2026

Copy link
Copy Markdown
Author

@minortex @LongSang01 Thanks for your research. I managed to analyze the firmwares and found the root cause (I thought so).

I can now control the charging limit without reflashing the firmware. Please check out my write-up: https://gist.github.com/w568w/957976b59906e0ce5d6c13ad342e1593

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment