Issues flashing Asus CX34 Flip (MITHRAX) with CH341a programmer

Long story short, I picked up a bios-locked Asus CX34 Flip from an e-recycler. After many attempts and being unable to make contact with the original organization, I decided to pick up a CH341a and WSON-8 probe and flash the firmware manually.

First step was to modify the CH341a to 3.3v, as the bios chip (Winbond W25Q256JV_M) requires 2.7-3.6v and many CH341a’s are 5v by default. I followed the “unbricking” guide (very helpful!), read the old bios, made the appropriate backups, injected VPD and HWID into the new MITHRAX image, and attempted to flash. Below is the output I recevied when trying to flash:

macman1901@pop-os:~$ sudo flashrom -p ch341a_spi -w coreboot.rom --ifd -i bios
flashrom v1.2 on Linux 6.6.6-76060606-generic (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip "W25Q256JV_M" (32768 kB, SPI) on ch341a_spi.
Reading ich descriptor... done.

The firmware descriptor looks like a Skylake/Sunrise Point descriptor.
However, the read frequency isn't set to 17MHz (the only valid value).
Please report this message, the output of `ich_descriptors_tool` for
your descriptor and the output of `lspci -nn` to [email protected]

Invalid region specified: "bios".

Now after doing some research, the first error is related to the SPI clock read frequency. The CH341a can only do 2 MHz according to the flashrom manual. So, would I need to use a different flashing device, i.e. a bus pirate or raspberry pi? Doesn’t make sense to me as I was able to read the bios chip perfectly fine.

The second error “invalid region specified: ‘bios’” appears to be specific to running the command for Intel devices (which this is). The only other thread on this site that had this issue was here, where someone was using a 1.8v adapter instead of 3.3v for Kabylake.

I do have some Pi’s laying around I could test with, I would just like some recommendations before I start chasing this down further.

the error is telling you flashrom is detecting an invalid configuration in the flash descriptor, has nothing to do with the speed at which you are reading/writing the chip

this, coupled with the above error, means that flashrom can’t parse the flash descriptor. It’s unlikely the FD is corrupted or the device wouldn’t boot. So the alternative is that you are not getting a proper read of the chip. I’d guess that your modifications to the flasher were incorrect. IME there is no need to modify a ch341a, that was a 10 years ago problem. Also be sure all power is removed from the device, internal battery disconnected.

And since you are flashing a stock device using an external programmer, this is the one time you actually do need to disable software WP (and clear the range) using flashrom.

Thanks for your help Mr. Chromebox! I followed your suggestion that I likely messed up my CH341a and instead used a RPi 4B to flash. (I used this guide for anyone trying to use a Pi in the future.) I’ve included a log below:

user@rpi-4:~ $ flashrom -p linux_spi:dev=/dev/spidev0.0 --wp-status
flashrom 1.4.0 on Linux 6.12.47+rpt-rpi-v8 (aarch64)
Using default 2000kHz clock. Use 'spispeed' parameter to override.
Found Winbond flash chip "W25Q256JV_M" (32768 kB, SPI) on linux_spi.
Protection range: start=0x00000000 length=0x00000000 (none)
Protection mode: hardware


user@rpi-4:~ $ flashrom -p linux_spi:dev=/dev/spidev0.0 --wp-disable
flashrom 1.4.0 on Linux 6.12.47+rpt-rpi-v8 (aarch64)
Using default 2000kHz clock. Use 'spispeed' parameter to override.
Found Winbond flash chip "W25Q256JV_M" (32768 kB, SPI) on linux_spi.
Failed to apply new WP settings: unexpected WP configuration read back from chip
Note: hardware status register protection is enabled. The chip's WP# pin must be set to an inactive voltage level to be able to change the WP settings.'


user@rpi-4:~ $ flashrom -p linux_spi:dev=/dev/spidev0.0 --wp-range 0,0
flashrom 1.4.0 on Linux 6.12.47+rpt-rpi-v8 (aarch64)
Using default 2000kHz clock. Use 'spispeed' parameter to override.
Found Winbond flash chip "W25Q256JV_M" (32768 kB, SPI) on linux_spi.
Activated protection range: start=0x00000000 length=0x00000000 (none)


user@rpi-4:~ $ flashrom -p linux_spi:dev=/dev/spidev0.0 --wp-status
flashrom 1.4.0 on Linux 6.12.47+rpt-rpi-v8 (aarch64)
Using default 2000kHz clock. Use 'spispeed' parameter to override.
Found Winbond flash chip "W25Q256JV_M" (32768 kB, SPI) on linux_spi.
Protection range: start=0x00000000 length=0x00000000 (none)
Protection mode: hardware


user@rpi-4:~ $ flashrom -p linux_spi:dev=/dev/spidev0.0 -w coreboot.rom --ifd -i bios -N
flashrom 1.4.0 on Linux 6.12.47+rpt-rpi-v8 (aarch64)
Using default 2000kHz clock. Use 'spispeed' parameter to override.
Found Winbond flash chip "W25Q256JV_M" (32768 kB, SPI) on linux_spi.
Reading ich descriptor... done.
Using region: "bios".
Failed to unlock flash status reg with wp support.
Reading old flash chip contents... done.
Erase/write done from 500000 to 1ffffff
Verifying flash... VERIFIED.


user@rpi-4:~ $ flashrom -p linux_spi:dev=/dev/spidev0.0 -v coreboot.rom --ifd -i bios
flashrom 1.4.0 on Linux 6.12.47+rpt-rpi-v8 (aarch64)
Using default 2000kHz clock. Use 'spispeed' parameter to override.
Found Winbond flash chip "W25Q256JV_M" (32768 kB, SPI) on linux_spi.
Reading ich descriptor... done.
Using region: "bios".
Verifying flash... VERIFIED.

I was able to successfully flash the full UEFI ROM, even though hardware write-protect was still enabled. Everything worked fine and I was able to install KDE Neon. Unsurprisingly, when I go to run the Firmware Utility Script through Linux it still shows as HW WP enabled. Would I have to use manually flash the shellball image to stock then use a SuzyQ cable to permanently disable WP? Or is there a way to disable WP from Linux? Thanks.

just use the rpi with flashrom