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.
- NOTE: this will only work with the 20110512 version of the firmware update, whose md5 is
MD5 (LJP1100_P1560_P1600_FW_Update.dmg) = 537ca4e21c949e201d2f956272918bc9
- 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:
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 run set $eip=0x292a cont
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 ./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.