HP LaserJet P1102w Firmware Update on Mac

Update: as of the last few versions, the standard HP firmware updater appears to be working fine on the most recent OS X versions. What follows is now strictly of academic value.

I have had an HP P1102w printer for over a year now.
I've had no complaints about it so far, but a firmware update was recently released that adds AirPrint support, allowing printing from iOS devices.
The problem is: the firmware updater refuses to do anything on OS X (at least in 10.6.8 and 10.7.x).

I searched but was never able to find a solution that worked.
So, I did what any normal person would do: I loaded it up in gdb.

Apparently it gets stuck in a spin wait trying to acquire a lock to obtain the network browse results…

If you skip over that call, it brings up the window, just without any network printers listed. That's fine, since it's not too big of a deal to plug the printer in to USB just to do the firmware update.

Download the firmware update, mount the disk image, drag the downloader to your Downloads folder, and plug in the printer via USB.

  1. NOTE: this will only work with the 20110512 version of the firmware update, whose md5 is
    MD5 (LJP1100_P1560_P1600_FW_Update.dmg) = 537ca4e21c949e201d2f956272918bc9
  2. NOTE: only try this if you know what you are doing and understand why this works… I'm not responsible if you break something…

There are two methods that basically do the same thing. If you have dev tools installed, you can do Method A. Otherwise, you'd have to use Method B.

Open a terminal window and do one of the following:

Method A

This method uses the debugger to set a breakpoint before calling for the network browse results, then sets the next instruction to be after, skipping the hang.

cd ~/Downloads/"hp LaserJet Firmware Download Utility.app"/Contents/MacOS
gdb "hp LaserJet Firmware Download Utility"
break *0x2925
set $eip=0x292a

Method B

This method creates a copy of the executable with the instructions that make the call that hangs replaced with NOPs.

cd ~/Downloads/"hp LaserJet Firmware Download Utility.app"/Contents/MacOS
dd if="hp LaserJet Firmware Download Utility" of=fixed bs=1 count=43301
printf "\220\220\220\220\220" >> fixed
dd if="hp LaserJet Firmware Download Utility" bs=1 skip=43306 >> fixed
chmod u+x fixed

A few seconds later, the firmware updater will appear and you can select the USB printer to continue. The firmware will update, the printer will reboot, et voila.

You may also like...

2 Responses

  1. Bil Elkus says:

    1) I think you are missing quotation marks in line 1 around the name of the utility, and
    2) When I tried this, after line 6 the utility launched, I selected the printer in the USB pull down tab, hit OK and after a few seconds the utility crashed! tried 3 times

    • doogie says:

      Thanks for the correction. I've updated the text.
      Did you use the gdb method or the dd method?
      I definitely was able to complete the update, but perhaps there are other factors that influence the success.

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.