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.
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:
(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.
Recent Changes to the USB Driver
- Updated to newest driver.
- 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.
- 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).
- Fixed bug in 15 and 16 MHz module which caused USB enumeration to fail on some hosts.
- 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.
- 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.
- 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.
- 16.0 MHz version: Check for SE0 in stuffed bits. Hubs may delay end of packet by up to one bit.
- 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.
- 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.
- Further improved compiler compatibility.
- usbDeviceDisconnect() takes pull-up resistor to high impedance now.
- Documentation updates.
- Allow flexible control over all USB descriptors.
- Implementation of USB STALL is now more standards conformant.
- Improved IAR compiler compatibility.
- 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.