Prologix sell several low cost GPIB controllers. I have one their old deprecated dongle "GPIB-USB Controller 4.2" and had fun with it with my pygpibtoolkit project.
It's a very simple dongle consisting in an Atmel ATMega164P microcontroller and a FTDI FT245FL chip for the USB<->RS232 convertion.
Unfortunately, it's no longer available (I find this unfortunate because it was really cheap, and very useful for hobbyist like me).
Upgrading the buggy firmware
My controller had the version 5.2 of the firmware, which really is buggy. For example if a device on the GPIB bus is continuously sending data and the controller is in "auto" mode (in which it automatically perform a reading of the available data), then it was impossible to send it commands anymore.
Unfortunately, the Prologix web site only describe the product as "No longer in production". There is still an available FAQ and the user manual, but the firmware update procedure is not described any more.
However, the directory serving all the firmwares for their products still have the firmwares for this device. The latest published version is the 4.2-6.95 (in fact, it's the version 6.95 of the firware for the version 4.2 of the USB-GPIB controller).
The content of this archive is:
unzip -l ~/Downloads/gpib-usb-4.2-6.95.zip
Archive: /home/david/Downloads/gpib-usb-4.2-6.95.zip
Length Date Time Name
--------- ---------- ----- ----
244837 2007-07-08 23:57 avrdude.conf
186880 2007-07-08 23:57 avrdude.exe
31162 2010-09-21 10:57 m16.hex
31542 2010-09-21 10:57 m164.hex
61440 2010-06-16 18:21 PxUpdate.exe
409 2009-01-21 11:00 readme.txt
--------- -------
556270 6 files
Obviously, Windows stuff only, and no documentation on how to upgrade the device on Linux.
But the fact it uses avrdude is good sign it might be possible to find solutions on Linux. According the names of the hex files, it seems there have 2 versions of the hardware, one with a ATMega16 and one with a ATMega164P (mine uses a 164P).
Now, the question is: how is the AVR programmed? There are dozens of 'backends' available on avrdude.
Doing a string on the main exe in the archive, PxUpdate.exe, shows a few interesting things, especially this:
strings PxUpdate.exe | grep -i avr
avrdude.exe -p %s -P \\.\COM%d -c avr109 -u -e -U flash:w:%s
AVRBOOT
So we know the command line used by this firmware update tool, and we known it uses the AVR's bootloader as decribed in the AVR109 application note.
But any attempt to read the content of the flash using:
avrdude -p m164p -c avr109 -U flash:r:flash.hex:i
fails stating the avr does not respond:
avrdude -P /dev/ttyUSB0 -p m164p -c avr109 -v -v -U flash:r:flash2.hex:i
avrdude: Version 6.1, compiled on Sep 11 2014 at 20:00:34
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/etc/avrdude.conf"
User configuration file is "/home/david/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyUSB0
Using Programmer : avr109
AVR Part : ATmega164P
Chip Erase delay : 55000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 4 10 128 0 no 512 4 0 9000 9000 0xff 0xff
flash 33 6 128 0 yes 16384 128 128 4500 4500 0xff 0xff
lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
calibration 0 0 0 0 no 4 0 0 0 0 0x00 0x00
Programmer Type : butterfly
Description : Atmel AppNote AVR109 Boot Loader
Connecting to programmer: .avrdude: ser_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
So there is something else required to put the device under firmware upgrade state. I was wondering if there is an undocumented controller command (anything starting with ++ is interpreted as a controller command), so I searched for the ++ string in PxUpdate.exe:
strings PxUpdate.exe | grep ++
Microsoft Visual C++ Runtime Library
++rst
No magic undocumented command, but a reset of the controller is performed by this tool. Let's try this:
stty -F /dev/ttyUSB0 speed 115200 cs8 -cstopb -parenb
echo -en '++rst\r' > /dev/ttyUSB0; avrdude -P /dev/ttyUSB0 -p m164p -c avr109 -v -v -U flash:r:flash2.hex:i
avrdude: Version 6.1, compiled on Sep 11 2014 at 20:00:34
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/etc/avrdude.conf"
User configuration file is "/home/david/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyUSB0
Using Programmer : avr109
AVR Part : ATmega164P
Chip Erase delay : 55000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 4 10 128 0 no 512 4 0 9000 9000 0xff 0xff
flash 33 6 128 0 yes 16384 128 128 4500 4500 0xff 0xff
lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
calibration 0 0 0 0 no 4 0 0 0 0 0x00 0x00
Programmer Type : butterfly
Description : Atmel AppNote AVR109 Boot Loader
Connecting to programmer: .
Found programmer: Id = "AVRBOOT"; type = S
Software Version = 1.0; Hardware Version = 1.0
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.
Programmer supports the following devices:
Device code: 0x76
avrdude: devcode selected: 0x76
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e940a
avrdude: safemode: Fuse reading not support by programmer.
Safemode disabled.
avrdude: reading flash memory:
Reading | ################################################## | 100% 0.26s
avrdude: writing output file "flash2.hex"
avrdude done. Thank you.
Much better!
Now I can upgrade the firmware:
echo -en '++rst\r' > /dev/ttyUSB0; avrdude -P /dev/ttyUSB0 -p m164p -c avr109 -v -v -U flash:w:m164.hex
Et voilĂ ! The Prologix GPIB-USB interface is upgraded to the latest available software. From what I've seen so far, it seems more stable (at least I can read data from my HP5442A and HP3456A in "fast" mode without loosing my GPIB controller.)