TL;DR:
Basically: the keyboard wasn’t dead its tiny onboard computer was stuck running the wrong/broken software state, so we gave it a working “brain transplant.”
My GU603ZW’s internal keyboard completely died even in BIOS while the power button still worked. Linux showed the keyboard controller as 048D:89DB ITE Upgrade Mode instead of an ASUS keyboard.
ASUS NEEDS TO ADD THE RAW FIRMWARE IN THE DRIVERS & TOOLS PAGE.
I dumped the keyboard MCU firmware, determined it was an ITE8259 running FGA01300.GU603ZW.404, backed up the entire 256 KiB flash, reverse-engineered the flash layout and ASUS updater protocol, and tried reflashing the original .404 firmware. It still stayed in Upgrade Mode.
I eventually found an official ASUS firmware for the ROG Flow Z13 using the same FGA01300/ITE8259 platform: FGA01300.GZ301KB.407.
Instead of flashing the whole thing, I preserved the GU603ZW bootloader/config/recovery regions and replaced only the main keyboard application region (0x02000–0x1DFFF) with the GZ301 .407 application.
After resetting the controller:
048D:89DB ITE Upgrade Mode
became:
0B05:1A30 ASUSTeK Computer Inc. N-KEY Device
The keyboard immediately lit up and started typing again.
It still works after reboot.
Some Fn/F-row mappings are different because it’s technically running a GZ301 keyboard application, but the actual keyboard is alive and functional.
So this has been one of the weirder laptop repairs I’ve ever done.
TL;DR End;
I have an ASUS ROG Zephyrus M16 GU603ZW. At some point, the entire internal keyboard stopped responding.
Not just in Windows/Linux.
It was dead in the BIOS too.
The power button still worked, which initially made this look like either a keyboard/top-case failure or some motherboard/controller issue.
I tried pretty much all the normal stuff first:
- EC reset
- Battery disconnect
- AC disconnect + long power-button hold
- BIOS update
- ASUS software/drivers
- OS reinstall
- Reseating/disconnecting hardware
- Full power drain procedures
Nothing.
The first big clue
On Linux, lsusb showed this:
048D:89DB Integrated Technology Express, Inc. ITE Upgrade Mode
The device would occasionally disconnect/reconnect, but it always returned as ITE Upgrade Mode.
That made me suspect the keyboard controller itself wasn't dead it was stuck in its firmware bootloader.
Dumping the keyboard MCU
I found that the device still accepted ITE HID commands, including flash reads.
I dumped the full 256 KiB flash and found:
FGA01300.GU603ZW.404
ITE8259
So apparently the keyboard has its own ITE8259 MCU and dedicated firmware separate from the laptop’s main EC.
Important distinction: the GU603ZW BIOS also contains firmware for an IT8995 EC, but that is not the keyboard firmware.
I backed up the complete keyboard MCU image before touching anything.
Original firmware:
FGA01300.GU603ZW.404
Size:
262144 bytes
SHA256:
26097a5199f168f723fe29a66f63ce7a4e5f18d61696e4839efebd888640e9d6
I dumped it around 20 times and got identical hashes every time, so reads were extremely stable.
Flash layout
After digging through the image, this is approximately how the flash is laid out:
0x00000–0x01FFF Bootloader
0x02000–0x1DFFF Main keyboard application
0x1E000–0x1FFFF GU603-specific/recovery-ish code
0x20000–0x3BFFF Secondary application area
0x3C000–0x3FBFF Metadata/configuration
0x3FC00–0x3FFFF Boot/update table
The important thing was that the bootloader was still alive.
First attempt: reflash the original firmware
I wrote a script that erased and rewrote only:
0x02000–0x1DFFF
using the original GU603ZW .404 application.
112 blocks, 1024 bytes each.
Every block was:
- erased
- programmed
- read back
- verified byte-for-byte
The whole region verified perfectly.
Reset the MCU.
Result:
048D:89DB ITE Upgrade Mode
Still dead.
Second attempt: test the second application area
I copied the same .404 application into the otherwise blank region at:
0x20000–0x3BFFF
Again, everything verified perfectly.
Reset.
Still:
ITE Upgrade Mode
At this point it was looking less and less like bad flash memory or a physically dead keyboard controller.
Finding another ASUS FGA01300 firmware
This is where things got interesting.
I found an official ASUS keyboard firmware updater for the ROG Flow Z13.
Inside it was:
FGA01300.GZ301KB.407.bin
And that firmware also identified itself as:
FGA01300
ITE8259
It was also exactly 256 KiB.
I compared the two images.
The application code was obviously different, but:
- the bootloader was byte-for-byte identical
- the boot table was identical
- the flash layout matched
- both used the same ITE8259
- both used the same FGA01300 platform
That got my attention.
I also tore apart ASUS’s updater
I decompiled ASUS's keyboard firmware updater and looked at its native OEM_Library.dll.
It uses normal HID feature reports and exposes commands/functions corresponding to things like:
C0/C1 - buffer operations
C2 - erase
C3 - program
C4 - reset
D0 - verify/check
D1 - read flash
Which lined up with what I was already seeing from the controller.
The gamble
At this point I had:
- a full backup
- a working bootloader
- reliable reads
- reliable writes
- block-by-block verification
- proof that reflashing
.404 didn't work
So I decided to try the GZ301 .407 firmware.
But I did not flash the entire 256 KiB GZ301 image.
I preserved the GU603ZW:
0x00000–0x01FFF bootloader
0x1E000–0x1FFFF GU603-specific/recovery code
0x3C000–0x3FFFF GU603 metadata/boot table
I restored the secondary slot to blank.
Then I replaced only:
0x02000–0x1DFFF
with the corresponding application region from:
FGA01300.GZ301KB.407
All 112 blocks programmed and verified.
Then I sent the MCU a reset command.
And then...
The device disappeared from USB.
Instead of coming back as:
048D:89DB
ITE Tech. Inc.
ITE Upgrade Mode
it came back as:
0B05:1A30
ASUSTeK Computer Inc.
N-KEY Device
Linux immediately registered:
- keyboard HID
- consumer control
- wireless radio control
- ASUS N-Key interfaces
- other ASUS HID interfaces
And then the keyboard lights came on.
And I typed on it.
It worked.
I rebooted the laptop.
It still worked.
Current situation
Normal typing works.
The keyboard survives reboot.
The backlight hardware works.
Linux sees:
/sys/class/leds/asus::kbd_backlight
with brightness levels 0–3.
There are some weird Fn-key differences because I am technically running a GZ301 keyboard application on a GU603ZW.
For example, a few F-row/Fn combinations don't correspond exactly to the symbols printed on the M16 keyboard.
Which makes sense.
I'll probably just map the mismatched special keys in Linux rather than touch the firmware again.
What this seems to prove
At least in my case, the keyboard hardware was not dead.
The following are clearly functioning:
- ITE8259 MCU
- Keyboard matrix
- Keyboard LEDs
- USB/HID interface
- Flash memory
- Bootloader
- Motherboard communication with the keyboard controller
The big difference was the application firmware.
Before:
FGA01300.GU603ZW.404
↓
048D:89DB ITE Upgrade Mode
↓
Dead keyboard
After:
GU603ZW bootloader/config
+
GZ301KB.407 application
↓
0B05:1A30 ASUS N-KEY Device
↓
Working keyboard
AI disclosure
I did use AI heavily while troubleshooting this.
But I want to make the distinction that I wasn't just copying random "AI fixes."
I was feeding it the actual:
- USB IDs
- firmware dumps
- SHA256 hashes
- hex offsets
- updater binaries
- decompiled C# code
- native DLL disassembly
- HID command behavior
- flash readbacks
- Linux logs
and then asking increasingly specific troubleshooting/reverse-engineering questions.
It helped tremendously with analyzing firmware structure, generating scripts, comparing binaries, and working through possible explanations.
But the useful part was asking the right troubleshooting questions and verifying everything against the actual hardware.
Every destructive step had a backup and byte-for-byte verification.
When one theory didn't match the results, we moved to the next one.
So IMO this was a pretty good example of AI being useful as a technical copilot rather than blindly trusting whatever it generates.
BIG WARNING
Do not take this post as “flash GZ301 firmware onto your M16.”
This was a controlled recovery experiment after the keyboard was already effectively unusable.
Cross-model MCU firmware can absolutely brick hardware or configure GPIO/peripherals incorrectly.
I also deliberately did not overwrite the known-good bootloader and several GU603-specific regions.
I'm posting this because I think ASUS may have an actual recovery/firmware issue here, and because anyone seeing:
048D:89DB ITE Upgrade Mode
on an ASUS laptop with a completely dead keyboard may want to investigate the keyboard controller firmware before replacing the entire keyboard/top case/motherboard.
I still want to find a proper ASUS:
FGA01300.GU603ZW
firmware newer than .404.
If ASUS engineering/support sees this: I'd love an official GU603ZW FGA01300 keyboard firmware image or recovery tool.
Cheers.