« Close

Datasheets and User Guides

App Notes

Software & Driver


U3 Firmware

Firmware files require LJSelfUpgrade V1.21 or higher in order to upgrade the U3, which is included in the labjack installer.

U3A and U3B refer to old hardware versions of the U3. U3Afirmware is for U3 hardware 1.20, and U3Bfirmware is for U3 hardware 1.21. U3C is for the U3-LV and U3-HV.

WARNING: This warning applies to anyone using a programming utility other than LJSelfUpgrade. Attempting to program a U3A with U3B firmware will result in improper programming. This is because the U3A does not have sufficient code space to handle the U3B firmware. If a U3A is programmed with U3B firmware the device can be recovered by jumpering to flash mode and loading U3A firmware. A U3B can be programmed with U3A firmware and will function as a U3A. LJSelfUpgrade will not allow firmware for one version to be programmed onto the other.


U3C Firmware (Hardware 1.30)

1.46: Watchdog wasn't getting cleared unless response packet was read very quickly. Fixed. Timer1 was returning incorrect data when set to modes 2 or 3.

1.44: Feedback will now thrown an error when an AIN is read while stream is active. Added special range support to high voltage channels in modbus. Compatibility settings written by the user will now be loaded at startup. When calling the deprecated, low-level, SWDT config command the bit for enabling a DIO change will be recognized as the bit for DIOA not DIOB. Added a bus idle check to the I2C. Timer modes 5 and 6 (counter and counter with debounce) now respond to their proper timer mode numbers (they were swapped). Timer 1 will now be properly set during initialization. I2C will now return ACK information when only reading. Only one ack for the address will be reported. Improved timer performance. Changed the watchdog so that it will not clear until the host computer has read the response. Fixed a problem that was causing edge32 and edge16 timer modes to return improper data while streaming with reset. Increased I2C max clock stretch time to 1000 clock cycles. When a timer is set to mode 0 or 1 (PWM) reading the timer will return the controlling count.

Click To Expand Change Log

1.32: Added special channel support to CR functions. SPI modes changed to match documentation. Added Line-to-Line timer mode. Added 1-wire communication. ModBus related: Added DAC limit checking. Will now compensate for 8-bit or 16-bit DAC calibration. Added support for 3.3V input range. Added Negative Chn support for chn 199 (GND).  Channels 193 and 124 for logging FIO, EIO, CIO in LJLogUD will now work correctly. Fixed an issue that was corrupting data returned by modbus. Added modbus data format check. Changed the default device name string to ASCII. Fixed an issue that could prevent counters from being enabled by the startup settings system. Fixed a problem that could force DACs to 8-bit mode.

1.24: Added extended default system. Added ModBus functionality. Added extended watchdog function. Fixed a problem that was clearing SWDT settings during initialization. Enabled descriptor string reading. USB has been updated to improve compatibility with Linux kernels prior to 2.6.28.

WARNING: Upgrading across this boundary will reset startup setting to the manufacturer's defaults. Downgrading across this boundary will result in randomized startup values.

1.12: Fixed an issue that was corrupting stream channels. Changed the time interval of the short_wait feedback function from 64 to 128us

1.11: Port digital state functions are now allowed to update EIO6 and EIO7.

1.10: Added a compatibility bit that forces the DACs to 8-bit mode to reduce noise.

1.09: Stream will no longer decode channel 193 to channel 1. Added stream channel 194 for CIO lines.

1.08: Improved UART support for hardware 1.30. Changed counters so that resets will occur after reading the value.

1.07: Fixed a problem that was causing EIO6 and 7 to not work with the I2C function.

1.04: Fixed a problem that was causing stream channel 193 to return inappropriate data.

1.03: Fixed a problem that was causing Digital port IO types to apply changes to incorrect channels. Fixed a problem that was causing analog read of EIO[0:3] to report voltages on other channels.

1.02: ConfigIO will no longer throw errors when no write bits are set.


U3B Firmware (Hardware 1.21)

1.54: Added a clock stretching feature to the I2C function. USB has been updated to improve compatibility with Linux kernels prior to 2.6.28.

1.52: Added an I2C option to disable the stop used when restarting. Sending 255 to the debounce function will now have the same effect as 254. Added an I2C option to enable clock stretching, up to a maximum of 50 clock periods.

1.50: State DIO functions will now force masked pins to output.

1.49: I2C acknowledge array now includes the address byte. Added an error to prevent AIN functions from being called while streaming. Added an error to prevent using channel 30 (Vref) as the negative channel while using Vdd as the reference voltage (30 is an invalid Negative channel while using Vdd as Vref). Stream channel 193 now returns FIO in the LSB to match the documentation.

1.44: Fixed CIO startup sequence. Default CIO settings will now be loaded properly. Removed level sensitivity from timer debounce mode. Debounce quantity is now 1+requested amount.


U3A Firmware (Hardware 1.20)

1.44: Improved code layout to prevent upgrade issues.

1.43: Fixed an upgrading issue that was causing flash corruption. The corruption caused the U3 to reset whenever a AIN command was executed.

Click To Expand Change Log

1.41: (May 3, 2007) Fixed an issue that was causing the U3 hardware version 1.20 to reset when acquiring analog data.

1.40: (April 6, 2007) Improved 16-bit PWM updates.

1.38: (March 6, 2007) Added support for reading the lower 32-bits of the system timer as a stream channel.

1.36: (February 27, 2007) More flash protection.

1.35: (February 7, 2007) A new error was added to indicate a missed scan count overflow while stream auto-recover is active. Added additional flash protection.

1.32: (January 22, 2007) Occasionally the U3 experiences unexpected flash modification. This new firmware adds serval new flash protections to prevent unintentional flash changes.

1.28: (December 12, 2006) Improved counter reading in stream mode. (U3 hardware Rev 1.21 only).

1.26: (September 14, 2006) Added special stream channels for counters and timers. Firm counter data can now be read while streaming. (U3 hardware Rev 1.21 only).

1.20: (September 8, 2006) Major change to Upgrade procedure. (Requires LJSelfUpgrade 1.11)

1.19: (August 28, 2006) Initial stream implementation. (U3 hardware Rev 1.21 only)

1.18: (August 25, 2006) Updated settling times for the higher clock speed of the U3 rev 1.21.

1.17: (August 15, 2006) Added support for changing USB descriptor strings. Added logic to prevent roll issues in between low and high system timer reads.

1.16: (August 10, 2006) Fixed issue affecting FIO4 when streaming or using Wait IOType in Feedback function. Added I2C and UART functions.

1.14: (July 25, 2006) Moved power-up defaults to earlier in the startup sequence. Fixed a problem where DAC1 enable power-up default was not working correctly.

1.12: (July 19, 2006) Unknown functions now return checksum error.

1.10: (July 11, 2006) Fixed a problem that was preventing DAC defaults from working if DIO defaults were not being used.

1.09: (July 6, 2006) Minor changes made to the way that timers are enabled and disabled.

1.06: (May 30, 2006) Fixed issue with the FIOAnalog and EIOAnalog parameters in the ConfigIO function.

1.05: (May 18, 2006) Changed descriptors to fix a Mac enumeration issue that occurred with more than one U3 connected to a hub.

1.04: (May 2, 2006) Added initial functionality for hardware rev 1.21.

1.03: (April 18, 2006) Improved accuracy of the short wait function. Improved the SoftPWM functions. Resolution is now 100us.

1.02: (April 11, 2006) Changed stop timer mode to use positive edges. Write either PCA module will reset the PCA counter.



It looks like for me to use the higher resolution of the newest U3 I needed to use the beta v1.35 firmware. 

v1.32 (the latest official release as I write this) only gives me the older 8-bit control. 



Firmware 1.35 fixes the compatibility mode selection mechanism that forces the DACs to 8-bit mode. All the U3's tested here at LabJack have been stuck in 10-bit mode. I'm not sure how yours got stuck in 8-bit mode.

My U3's DAC was also stuck on 8-bit, until I downloaded 1.32.


I purchased U3-LV from an online auction, and downloaded the software. The hardware version is 1.3. I downloaded the firmware file and first few lines of the file is:

Minimum required LJSelfUpgrade version=1.16

And when I used LJSelfUpgrade to upgrade, it showed message:

Unauthorized device.  Please call LabJack Corporation at 303-942-0228 or email [email protected] for assistance.

Can you please tell me what is the problem?



That means the device was not properly authorized by LabJack, which is part of our final test procedure.  A little extra suspicious since it came from an online auction.  We will talk to you through email to help you get your U3 going and research where it came from.

is it possible to install it on a regular usb drive making it u3 ?

I'm sorry but I don't understand what you are asking.  The U3 firmware here is to update our LabJack U3 data acquisition and control device.

I have two of the U3-LV products. Attempting to upgrade the firmware is a little confusing. LJ Self Upgrade instructs upgrade files to be saved in \LJSeflUpgrade\ugradefiles folder which I could not find. After creating the folders the under the Labjack folder I do not have permission to save the files in the new folder. Using Google Chrome and clicking on the firmware upgrade file, nothing happens so I tried Internet Explorer which opened a new page and listed all the hex data from the upgrade file on the page. I saved this in My Documents directory but no matter how I save the file, cicking the LJ Self Upgrade "Program" button continues to give the following: "Error: Problem creating image from upgrade file".

A second question: I wasn't sure from the wording if the LJM Python library is available for the U3 or only available for the T7. Can you clarify? I've tried it but receive the following error: "AttributeError: function 'LJM_Open' not found". Perhaps I've answered my own question.


Try right-clicking on the file link (e.g. "U3Cfirmware_146_01212013.hex"), and do "Save Link As ..." or similar.  Then save it wherever you have permission, such as the desktop or your downloads folder.

LJMPython talks to the LJM driver which currently just supports the T7.  LabJackPython talks to the UD driver or Exodriver which support the U3/U6/UE9.


Installed python, labjack updater and httplib2 but when I ran the command both as the regular user I got the following failure.  


 sudo python selfUpgrader.py 3
Downloading firmware version 1.46 into a file called U3Cfirmware_146_01212013.hex
Downloading firmware from website...
Reading firmware file...
Firmware file provides firmware version 1.46.

Found a U3 with a serial number 320041147 and firmware version 1.32.
Is this the U3 you wish to upgrade? [Y/n] y
Checking Authorization...
libusb error: LIBUSB_ERROR_IO
Traceback (most recent call last):
  File "selfUpgrader.py", line 129, in <module>
    upgradeU3Firmware(filename, recovery, forceYes)
  File "/home/david/Development/git/firmware-upgrader/u36Upgrade.py", line 193, in upgradeU3Firmware
  File "/home/david/Development/git/firmware-upgrader/u36Upgrade.py", line 28, in checkAuth
  File "/usr/lib/python2.6/site-packages/LabJackPython.py", line 538, in _writeRead
    self.write(command, checksum = checksum)
  File "/usr/lib/python2.6/site-packages/LabJackPython.py", line 261, in write
    wb = self._writeToExodriver(writeBuffer, modbus)
  File "/usr/lib/python2.6/site-packages/LabJackPython.py", line 211, in _writeToExodriver
    raise LabJackException( "Could only write %s of %s bytes." % (writeBytes, len(writeBuffer) ) )
LabJackPython.LabJackException: Could only write 0 of 12 bytes.






If your U3's LED is blinking continuously after getting the error, the U3 is in flash mode. Use the following command to run selfUpgrader in recovery mode to continue upgrading the firmware:

python selfUpgrader.py -r 3


If the LED is on and solid after the error, try the normal command again to retry the firmware upgrade.

python selfUpgrader.py 3


Also, make sure you only have one U3 connected when upgrading your firmware. The README.txt also provides most of the information I mentioned.


Thanks for the quick reply!

  • Light on U3 not blinking
  • attempt to re-flash failed same way as first attempt.
  • Operating system is Centos 6.3
  • Linux 2.6.32-279.22.1.el6.i686 #1 SMP Wed Feb 6 00:31:03 UTC 2013 i686 i386 GNU/Linux




The error from your first comment indicates a USB IO error when sending the authorization check command to the U3, which occurs before switching to flash mode and updating the firmware. Not sure why that is happening, but lets obeserve/try some things:

1) When running selfUpgrader and the error occurs, does the U3's LED turn off or blink a couple times?

2) Make sure Watchdog is not enabled on your U3 when using selfUpgrader. 

3) Disconnect and reconnect your U3 to your computer and retry the upgrade. You can also try a different USB port to see if it makes a difference.

4) Make sure you have the latest Exodriver and LabJackPython from github and retry the upgrade:




If these don't help, try running a program or test code to make sure your U3 is operating normally. Also, after selfUpgrader fails, in a terminal use the "sudo dmesg" command to see if there are U3 and/or USB related system messages that may shed more light on the situation.

If you have a Windows machine, you can also try LJSelfUpgrade to upgrade your firmware. It may not have this issue.


Firmware upgraded.  It helps if you shut off any software actually using the labjack before you upgrade.  <facepalm>

Thanks for the help!




Glad you figured out the issue.

The current Exodriver version on github prevents other processes from "stealing" U3 USB handles from other processes. Most likely you are using an 8+ month old Exodriver version, your other software opened your U3 while selfUpgrader was running and invalidated selfUpgrader's U3 handle causing USB communications to fail (LIBUSB_ERROR_IO) afterwards. Under normal conditions only one process/program can access a LabJack device over USB at a time and can't invalidate a different process's USB handle.

Driver we're using is liblabjackusb.so.2.5.2  (this is from the link at /usr/local/lib  ) 

I believe this is what's contained in exodriver-master download located here: http://labjack.com/sites/default/files/2013/06/exodriver-master.zip

Is that the latest?



It looks like with that change we didn't update the Exodriver version number, and it's only available through github at the moment. The exodriver-master link you provided predates the update, so get the latest Exodriver on github. I'll look into incrementing the Exodriver version to 2.5.3 and updating the download on the "Software & Driver" page to our current version. Thanks for bringing this to our attention.

The github repository and "Software & Driver" page have been updated with the latest Linux Exodriver version 2.5.3.