Posted on jeu. 10 mars 2016 (last updated on mar. 31 mai 2016)

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.

The Prologix GPIB-USB controller.

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.)