V-USB Reference Implementations


PowerSwitch is an example application using Objective Development’s firmware-only USB driver for Atmel’s AVR microcontrollers (V-USB).

PowerSwitch provides 8 bits of parallel output intended to switch e.g. the power supply to electronic devices. The PowerSwitch firmware is accompanied by a command line tool for Unix to control the device. (The command line tool can also be compiled on Windows using minGW and libusb-win32.)

For previous releases of V-USB, PowerSwitch was the reference implementation. There was no separate package for V-USB, it was only available as part of PowerSwitch.

Besides being a reference implementation, PowerSwitch may be very useful by itself. If you have a server farm at your provider’s site, you can use it to reboot machines without manual interaction on the site. Contrary to e.g. USB to serial or parallel converters (which would have been a very tempting demo, too), this type of hardware is not available in the stores.

Using PowerSwitch

After wiring the circuit, flashing the firmware into the controller and installing the command line tool, use the command powerSwitch to control the device. It is probably easiest to explain this tool with some examples:

To switch on port 3, type:

powerSwitch on 3

To switch off port 0, use:

powerSwitch off 0

And to turn off port 3 for 5 seconds (e.g. to reboot a connected computer), use:

powerSwitch off 3 5

If you want to know the status of all outputs, type:

powerSwitch status

(Caution: If a temporary action is active, the output will display it. This may be relevant if you parse it for a web interface!)

If you prefer a Graphic User Interface, please have a look at Krzysiek’s gPowerSwitch. This is a GTK+ based application implementing the same functionality as the command line tool described above.


Download PowerSwitch
PowerSwitch.2012-12-08.tar.gz Download264 kB
PowerSwitch.2012-12-08.zip Download298 kB
PowerSwitch.2008-02-28.tar.gz Download245 kB
PowerSwitch.2008-02-28.zip Download270 kB
PowerSwitch.2008-02-16.tar.gz Download245 kB
PowerSwitch.2008-02-16.zip Download269 kB
PowerSwitch.2008-02-05.tar.gz Download244 kB
PowerSwitch.2008-02-05.zip Download268 kB
PowerSwitch.2008-01-21.tar.gz Download244 kB
PowerSwitch.2008-01-21.zip Download268 kB
PowerSwitch.2007-12-01.tar.gz Download243 kB
PowerSwitch.2007-12-01.zip Download267 kB
PowerSwitch.2007-10-23.tar.gz Download244 kB
PowerSwitch.2007-10-23.zip Download272 kB
PowerSwitch.2007-08-07.tar.gz Download243 kB
PowerSwitch.2007-08-07.zip Download270 kB
PowerSwitch.2007-07-19.tar.gz Download239 kB
PowerSwitch.2007-07-19.zip Download263 kB
PowerSwitch.2007-06-25.tar.gz Download239 kB
PowerSwitch.2007-06-25.zip Download263 kB
PowerSwitch.2007-03-29.tar.gz Download232 kB
PowerSwitch.2007-03-29.zip Download247 kB
PowerSwitch.2006-07-18.tar.gz Download195 kB
PowerSwitch.2006-07-18.zip Download207 kB
PowerSwitch.2006-06-26.tar.gz Download192 kB
PowerSwitch.2006-06-26.zip Download204 kB
PowerSwitch.2006-03-26.tar.gz Download190 kB
PowerSwitch.2006-03-26.zip Download202 kB
PowerSwitch.2006-03-14.tar.gz Download187 kB
PowerSwitch.2006-03-14.zip Download198 kB
PowerSwitch.2006-02-20.tar.gz Download184 kB
PowerSwitch.2006-02-20.zip Download193 kB
PowerSwitch.2006-02-07.tar.gz Download183 kB
PowerSwitch.2005-06-14.tar.gz Download174 kB
PowerSwitch.2005-04-18.tar.gz Download173 kB
PowerSwitch_DelphiSource.zip Download302 kB

Recent Changes to the USB Driver

Release 2012-12-08

  • Updated to newest driver.

Release 2008-02-28

  • Added hooks so that application firmware can be informed about USB reset and address assignment.
  • Added optional routine usbMeasureFrameLength() which can be used to calibrate the AVR’s internal RC oscillator based on the USB frame time.

Release 2008-02-16

  • Fixed a bug in 16.5 MHz module where interrupt handler modified a register before it was pushed. This bug was introduced with code restructuring in version 2007-12-01.
  • Optimized CRC computation (saved a couple of bytes in code size).

Release 2008-02-05

  • Fixed bug in 15 and 16 MHz module which caused USB enumeration to fail on some hosts.

Release 2008-01-21

  • Renamed all include-only assembler files from *.S to *.inc so that users don’t accidentally link them.
  • Distribute leap bits more evenly in transmit loop of 16 MHz module.

Release 2007-12-01

  • Made endpoint numbers configurable so that given interface definitions can be matched. See USB_CFG_EP3_NUMBER in usbconfig-prototype.h.
  • Store endpoint number for interrupt/bulk-out so that usbFunctionWriteOut() can handle any number of endpoints.
  • Define usbDeviceConnect() and usbDeviceDisconnect() even if no USB_CFG_PULLUP_IOPORTNAME is defined. Directly set D+ and D- to 0 in this case.

Release 2007-08-07

  • Added a 15 MHz version.
  • Name of interrupt vector can now be configured. This makes it easier to work with other hardware interrupts than INT0.

Release 2007-07-07

  • 16.0 MHz version: Check for SE0 in stuffed bits. Hubs may delay end of packet by up to one bit.

Release 2007-06-25

  • USB version is now 1.1 instead of 1.01. This is what the standard demands.
  • Internal RC oscillator at 16.5 MHz now supported.
  • Crystal oscillator at 16 MHz now supported.

Release 2007-03-29

  • Merged in some code size improvements suggested by Dick Streefland.
  • Removed special alignment requirements for usbRxBuf (thanks again to Dick for this hint).
  • Driver is now published under the GNU General Public License Version 2.

Release 2007-02-01

  • Further improved compiler compatibility.
  • usbDeviceDisconnect() takes pull-up resistor to high impedance now.

Release 2006-07-18

  • Documentation updates.
  • Allow flexible control over all USB descriptors.
  • Implementation of USB STALL is now more standards conformant.
  • Improved IAR compiler compatibility.

Release 2006-06-26

  • Added provision for one more interrupt-in endpoint (endpoint 3).
  • Added provision for one interrupt-out endpoint (endpoint 1).
  • Added flow control macros for USB.
  • Added provision for custom configuration descriptor.
  • Allow any two port bits for D+ and D-.
  • Use USB_CFG_IOPORTNAME instead of USB_CFG_IOPORT. We now construct the variable name from the single port letter instead of computing the address of related ports from the output-port address.