forked from mfulz_github/qmk_firmware
Combined Mouse, MouseViaInt and MouseFullInt demos into a single unified demo.
Corrections to Keyboard demo. Removed AVRISP_Programmer project due to code quality concerns.
This commit is contained in:
parent
48400df13c
commit
88051e78a2
|
@ -5,15 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage CDC Class USB AVR Bootloader
|
||||
*
|
||||
* This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109
|
||||
* protocol compatible programming software to load firmware onto the AVR.
|
||||
*
|
||||
* Out of the box this bootloader builds for the USB1287, and will fit into 4KB of bootloader space. If
|
||||
* you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU
|
||||
* values in the accompanying makefile.
|
||||
*
|
||||
* This bootloader is compatible with the open source application AVRDUDE, or Atmel's AVRPROG.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -37,4 +32,27 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109
|
||||
* protocol compatible programming software to load firmware onto the AVR.
|
||||
*
|
||||
* Out of the box this bootloader builds for the USB1287, and will fit into 4KB of bootloader space. If
|
||||
* you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU
|
||||
* values in the accompanying makefile.
|
||||
*
|
||||
* This bootloader is compatible with the open source application AVRDUDE, or Atmel's AVRPROG.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,27 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage DFU Class USB AVR Bootloader
|
||||
*
|
||||
* This bootloader enumerates to the host as a DFU Class device, allowing for DFU-compatible programming
|
||||
* software to load firmware onto the AVR.
|
||||
*
|
||||
* This bootloader is compatible with Atmel's FLIP application. However, it requires the use of Atmel's
|
||||
* DFU drivers. You will need to install Atmel's DFU drivers prior to using this bootloader.
|
||||
*
|
||||
* As an open-source option, this bootloader is also compatible with the Linux Atmel USB DFU Programmer
|
||||
* software, available for download at http://sourceforge.net/projects/dfu-programmer/.
|
||||
*
|
||||
* If SECURE_MODE is defined as true, upon startup the bootloader will be locked, with only the chip erase
|
||||
* function available (similar to Atmel's DFU bootloader). If SECURE_MODE is defined as false, all functions
|
||||
* are usable on startup without the prerequisite firmware erase.
|
||||
*
|
||||
* Out of the box this bootloader builds for the USB1287, and should fit into 4KB of bootloader space. If
|
||||
* you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU
|
||||
* values in the accompanying makefile.
|
||||
*
|
||||
* <b>NOTE:</b> This device spoofs Atmel's DFU Bootloader USB VID and PID so that the Atmel DFU bootloader
|
||||
* drivers included with FLIP will work. If you do not wish to use Atmel's ID codes, please
|
||||
* manually change them in Descriptors.c and alter your driver's INF file accordingly.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -49,4 +32,46 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* This bootloader enumerates to the host as a DFU Class device, allowing for DFU-compatible programming
|
||||
* software to load firmware onto the AVR.
|
||||
*
|
||||
* This bootloader is compatible with Atmel's FLIP application. However, it requires the use of Atmel's
|
||||
* DFU drivers. You will need to install Atmel's DFU drivers prior to using this bootloader.
|
||||
*
|
||||
* As an open-source option, this bootloader is also compatible with the Linux Atmel USB DFU Programmer
|
||||
* software, available for download at http://sourceforge.net/projects/dfu-programmer/.
|
||||
*
|
||||
* If SECURE_MODE is defined as true, upon startup the bootloader will be locked, with only the chip erase
|
||||
* function available (similar to Atmel's DFU bootloader). If SECURE_MODE is defined as false, all functions
|
||||
* are usable on startup without the prerequisite firmware erase.
|
||||
*
|
||||
* Out of the box this bootloader builds for the USB1287, and should fit into 4KB of bootloader space. If
|
||||
* you wish to enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU
|
||||
* values in the accompanying makefile.
|
||||
*
|
||||
* <b>NOTE:</b> This device spoofs Atmel's DFU Bootloader USB VID and PID so that the Atmel DFU bootloader
|
||||
* drivers included with FLIP will work. If you do not wish to use Atmel's ID codes, please
|
||||
* manually change them in Descriptors.c and alter your driver's INF file accordingly.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>SECURE_MODE</td>
|
||||
* <td>BootloaderDFU.h</td>
|
||||
* <td>If defined to true, the bootloader will not accept any memory commands other than a chip erase on statup, until an
|
||||
* erase has been perfomed. This can be used in conjunction with the AVR's lockbits to prevent the AVRs firmware from
|
||||
* being dumped by unauthorized persons.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -57,9 +57,9 @@
|
|||
|
||||
/* Macros: */
|
||||
/** HID Class specific request to send the next HID report to the device. */
|
||||
#define REQ_SetReport 0x09
|
||||
#define REQ_SetReport 0x09
|
||||
|
||||
#define TEENSY_STARTAPPLICATION 0xFFFF
|
||||
#define TEENSY_STARTAPPLICATION 0xFFFF
|
||||
|
||||
/* Event Handlers: */
|
||||
/** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */
|
||||
|
|
|
@ -5,15 +5,11 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Teensy HID Class USB AVR Bootloader
|
||||
*
|
||||
* This bootloader enumerates to the host as a HID Class device, allowing for Teensy compatible programming
|
||||
* software to load firmware onto the AVR, such as the official software at http://www.pjrc.com/teensy/.
|
||||
*
|
||||
* Out of the box this bootloader builds for the USB162, and will fit into 2KB of bootloader space.
|
||||
*
|
||||
* This spoofs (with permission) the offical Teensy bootloader's VID and PID, so that the software remains
|
||||
* compatible with no changes.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>USB Mode:</b></td>
|
||||
|
@ -38,4 +34,26 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* This bootloader enumerates to the host as a HID Class device, allowing for Teensy compatible programming
|
||||
* software to load firmware onto the AVR, such as the official software at http://www.pjrc.com/teensy/.
|
||||
*
|
||||
* Out of the box this bootloader builds for the USB162, and will fit into 2KB of bootloader space.
|
||||
*
|
||||
* This spoofs (with permission) the offical Teensy bootloader's VID and PID, so that the software remains
|
||||
* compatible with no changes.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -33,10 +33,6 @@
|
|||
* Main source file for the Audio Input demo. This file contains the main tasks of the demo and
|
||||
* is responsible for the initial application hardware configuration.
|
||||
*/
|
||||
|
||||
/* --- Project Configuration --- */
|
||||
//#define MICROPHONE_BIASED_TO_HALF_RAIL
|
||||
/* --- --- --- --- --- --- --- --- */
|
||||
|
||||
#include "AudioInput.h"
|
||||
|
||||
|
|
|
@ -5,21 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Audio Input Device Demo
|
||||
*
|
||||
* Audio demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Audio Input device using the
|
||||
* basic USB Audio drivers in all modern OSes (i.e. no special drivers
|
||||
* required).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a USB microphone. Incomming audio from the ADC channel 1 will
|
||||
* be sampled and sent to the host computer.
|
||||
*
|
||||
* To use, connect a microphone to the ADC channel 2.
|
||||
*
|
||||
* Under Windows, if a driver request dialogue pops up, select the option
|
||||
* to automatically install the appropriate drivers.
|
||||
*
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -45,4 +34,37 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Audio demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Audio Input device using the
|
||||
* basic USB Audio drivers in all modern OSes (i.e. no special drivers
|
||||
* required).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a USB microphone. Incomming audio from the ADC channel 1 will
|
||||
* be sampled and sent to the host computer.
|
||||
*
|
||||
* To use, connect a microphone to the ADC channel 2.
|
||||
*
|
||||
* Under Windows, if a driver request dialogue pops up, select the option
|
||||
* to automatically install the appropriate drivers.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>MICROPHONE_BIASED_TO_HALF_RAIL</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -34,13 +34,6 @@
|
|||
* is responsible for the initial application hardware configuration.
|
||||
*/
|
||||
|
||||
/* --- Project Configuration (Choose ONE) --- */
|
||||
//#define AUDIO_OUT_MONO
|
||||
#define AUDIO_OUT_STEREO
|
||||
//#define AUDIO_OUT_LEDS
|
||||
//#define AUDIO_OUT_PORTC
|
||||
/* --- --- --- --- --- --- --- --- --- --- --- */
|
||||
|
||||
#include "AudioOutput.h"
|
||||
|
||||
/* Project Tags, for reading out using the ButtLoad project */
|
||||
|
|
|
@ -5,23 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Audio Output Device Demo
|
||||
*
|
||||
* Audio demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Audio Output device using the
|
||||
* basic USB Audio drivers in all modern OSes (i.e. no special drivers
|
||||
* required).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a USB speaker. Incomming audio will output in 8-bit PWM onto
|
||||
* the timer output (timer 3 for the AT90USBXXX6/7 USB AVRs, timer 1 for
|
||||
* the AT90USBXXX2 controller AVRs) compare channel A for AUDIO_OUT_MONO
|
||||
* mode, on channels A and B for AUDIO_OUT_STEREO and on the board LEDs
|
||||
* for AUDIO_OUT_LEDS mode. Decouple audio outputs with a capacitor and
|
||||
* attach to a speaker to hear the audio.
|
||||
*
|
||||
* Under Windows, if a driver request dialogue pops up, select the option
|
||||
* to automatically install the appropriate drivers.
|
||||
*
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -47,4 +34,55 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Audio demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Audio Output device using the
|
||||
* basic USB Audio drivers in all modern OSes (i.e. no special drivers
|
||||
* required).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a USB speaker. Incomming audio will output in 8-bit PWM onto
|
||||
* the timer output (timer 3 for the AT90USBXXX6/7 USB AVRs, timer 1 for
|
||||
* the AT90USBXXX2 controller AVRs) compare channel A for AUDIO_OUT_MONO
|
||||
* mode, on channels A and B for AUDIO_OUT_STEREO and on the board LEDs
|
||||
* for AUDIO_OUT_LEDS mode. Decouple audio outputs with a capacitor and
|
||||
* attach to a speaker to hear the audio.
|
||||
*
|
||||
* Under Windows, if a driver request dialogue pops up, select the option
|
||||
* to automatically install the appropriate drivers.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>AUDIO_OUT_STEREO</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this outputs the audio samples in stereo to the timer output pins of the microcontroller.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>AUDIO_OUT_MONO</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this outputs the audio samples in mono to the timer output pin of the microcontroller.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>AUDIO_OUT_LEDS</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this outputs the audio samples in stereo to the board LEDs.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>AUDIO_OUT_PORTC</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this outputs the audio samples in mono to port C of the microcontroller, for connection to an
|
||||
* external DAC.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -176,7 +176,7 @@ CSTANDARD = -std=gnu99
|
|||
CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
|
||||
CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
|
||||
CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||
|
||||
CDEFS += -DAUDIO_OUT_STEREO
|
||||
|
||||
# Place -D or -U options here for ASM sources
|
||||
ADEFS = -DF_CPU=$(F_CPU)
|
||||
|
|
|
@ -6,19 +6,9 @@
|
|||
|
||||
/** \mainpage Communications Device Class Device (Virtual Serial Port)
|
||||
*
|
||||
* Communications Device Class demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a CDC device acting as a virtual serial port. Joystick
|
||||
* actions are transmitted to the host as strings. The device
|
||||
* does not respond to serial data sent from the host.
|
||||
*
|
||||
* After running this demo for the first time on a new computer,
|
||||
* you will need to supply the .INF file located in this demo
|
||||
* project's directory as the device's driver when running under
|
||||
* Windows. This will enable Windows to use its inbuilt CDC drivers,
|
||||
* negating the need for custom drivers for the device. Other
|
||||
* Operating Systems should automatically use their own inbuilt
|
||||
* CDC-ACM drivers.
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -42,4 +32,32 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Communications Device Class demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a CDC device acting as a virtual serial port. Joystick
|
||||
* actions are transmitted to the host as strings. The device
|
||||
* does not respond to serial data sent from the host.
|
||||
*
|
||||
* After running this demo for the first time on a new computer,
|
||||
* you will need to supply the .INF file located in this demo
|
||||
* project's directory as the device's driver when running under
|
||||
* Windows. This will enable Windows to use its inbuilt CDC drivers,
|
||||
* negating the need for custom drivers for the device. Other
|
||||
* Operating Systems should automatically use their own inbuilt
|
||||
* CDC-ACM drivers.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,17 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage CDC Host Demo
|
||||
*
|
||||
* CDC host demonstration application. This gives a simple reference application
|
||||
* for implementing a USB CDC host, for CDC devices using the standard ACM profile.
|
||||
*
|
||||
* This demo prints out received CDC data through the serial port.
|
||||
*
|
||||
* Not that this demo is only compatible with devices which report the correct CDC
|
||||
* and ACM class, subclass and protocol values. Most USB-Serial cables have vendor
|
||||
* specific features, thus use vendor-specfic class/subclass/protocol codes to force
|
||||
* the user to use specialized drivers. This demo is not compaible with such devices.
|
||||
*
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -39,4 +32,28 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* CDC host demonstration application. This gives a simple reference application
|
||||
* for implementing a USB CDC host, for CDC devices using the standard ACM profile.
|
||||
*
|
||||
* This demo prints out received CDC data through the serial port.
|
||||
*
|
||||
* Not that this demo is only compatible with devices which report the correct CDC
|
||||
* and ACM class, subclass and protocol values. Most USB-Serial cables have vendor
|
||||
* specific features, thus use vendor-specfic class/subclass/protocol codes to force
|
||||
* the user to use specialized drivers. This demo is not compaible with such devices.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -6,28 +6,9 @@
|
|||
|
||||
/** \mainpage Dual Communications Device Class Device (Dual Virtual Serial Port)
|
||||
*
|
||||
* Dual Communications Device Class demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a compound device with dual CDC functions acting as a pair
|
||||
* of virtual serial ports. This demo uses Interface Association
|
||||
* Descriptors to link together the pair of related CDC
|
||||
* descriptors for each virtual serial port, which may not be
|
||||
* supported in all OSes - Windows Vista is supported, as is
|
||||
* XP (although the latter may need a hotfix to function).
|
||||
*
|
||||
* Joystick actions are transmitted to the host as strings
|
||||
* through the first serial port. The device does not respond to
|
||||
* serial data sent from the host in the first serial port.
|
||||
*
|
||||
* The second serial port echoes back data sent from the host.
|
||||
*
|
||||
* After running this demo for the first time on a new computer,
|
||||
* you will need to supply the .INF file located in this demo
|
||||
* project's directory as the device's driver when running under
|
||||
* Windows. This will enable Windows to use its inbuilt CDC drivers,
|
||||
* negating the need for custom drivers for the device. Other
|
||||
* Operating Systems should automatically use their own inbuilt
|
||||
* CDC-ACM drivers.
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -54,4 +35,41 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Dual Communications Device Class demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a compound device with dual CDC functions acting as a pair
|
||||
* of virtual serial ports. This demo uses Interface Association
|
||||
* Descriptors to link together the pair of related CDC
|
||||
* descriptors for each virtual serial port, which may not be
|
||||
* supported in all OSes - Windows Vista is supported, as is
|
||||
* XP (although the latter may need a hotfix to function).
|
||||
*
|
||||
* Joystick actions are transmitted to the host as strings
|
||||
* through the first serial port. The device does not respond to
|
||||
* serial data sent from the host in the first serial port.
|
||||
*
|
||||
* The second serial port echoes back data sent from the host.
|
||||
*
|
||||
* After running this demo for the first time on a new computer,
|
||||
* you will need to supply the .INF file located in this demo
|
||||
* project's directory as the device's driver when running under
|
||||
* Windows. This will enable Windows to use its inbuilt CDC drivers,
|
||||
* negating the need for custom drivers for the device. Other
|
||||
* Operating Systems should automatically use their own inbuilt
|
||||
* CDC-ACM drivers.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -6,18 +6,9 @@
|
|||
|
||||
/** \mainpage Joystick Device Demo
|
||||
*
|
||||
* Joystick demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Keyboard device, for USB Joysticks
|
||||
* using the standard Keyboard HID profile.
|
||||
*
|
||||
* This device will show up as a generic joystick device, with two buttons.
|
||||
* Pressing the joystick inwards is the first button, and the HWB button
|
||||
* is the second.
|
||||
*
|
||||
* Moving the joystick on the selected board moves the joystick location on
|
||||
* the host computer.
|
||||
*
|
||||
* Currently only single interface joysticks are supported.
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -41,4 +32,31 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Joystick demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Keyboard device, for USB Joysticks
|
||||
* using the standard Keyboard HID profile.
|
||||
*
|
||||
* This device will show up as a generic joystick device, with two buttons.
|
||||
* Pressing the joystick inwards is the first button, and the HWB button
|
||||
* is the second.
|
||||
*
|
||||
* Moving the joystick on the selected board moves the joystick location on
|
||||
* the host computer.
|
||||
*
|
||||
* Currently only single interface joysticks are supported.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -140,6 +140,15 @@ EVENT_HANDLER(USB_Reset)
|
|||
*/
|
||||
EVENT_HANDLER(USB_Disconnect)
|
||||
{
|
||||
/* Stop running keyboard reporting and USB management tasks */
|
||||
#if !defined(INTERRUPT_DATA_ENDPOINT)
|
||||
Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_STOP);
|
||||
#endif
|
||||
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);
|
||||
#endif
|
||||
|
||||
/* Indicate USB not ready */
|
||||
UpdateStatus(Status_USBNotReady);
|
||||
}
|
||||
|
@ -171,6 +180,11 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
|
||||
/* Indicate USB connected and ready */
|
||||
UpdateStatus(Status_USBReady);
|
||||
|
||||
#if !defined(INTERRUPT_DATA_ENDPOINT)
|
||||
/* Start running keyboard reporting task */
|
||||
Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_RUN);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Keyboard demonstration application. This gives a simple reference application
|
||||
* for implementing a USB Keyboard using the basic USB HID drivers in all modern
|
||||
* OSes (i.e. no special drivers required). It is boot protocol compatible, and thus
|
||||
|
|
|
@ -5,21 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Keyboard Host Demo
|
||||
*
|
||||
* Keyboard host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse keyboard, for USB keyboards using
|
||||
* the standard keyboard HID profile.
|
||||
*
|
||||
* Pressed alpha-numeric, enter or space key is transmitted through the serial
|
||||
* USART at serial settings 9600, 8, N, 1.
|
||||
*
|
||||
* This uses a naive method where the keyboard is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* KeyboardHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface keyboards are supported.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -43,4 +32,33 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Keyboard host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse keyboard, for USB keyboards using
|
||||
* the standard keyboard HID profile.
|
||||
*
|
||||
* Pressed alpha-numeric, enter or space key is transmitted through the serial
|
||||
* USART at serial settings 9600, 8, N, 1.
|
||||
*
|
||||
* This uses a naive method where the keyboard is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* KeyboardHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface keyboards are supported.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -59,7 +59,7 @@
|
|||
#define KEYBOARD_DATAPIPE 1
|
||||
|
||||
/** HID Class Specific request to set the report protocol mode */
|
||||
#define REQ_SetProtocol 0x0B
|
||||
#define REQ_SetProtocol 0x0B
|
||||
|
||||
/* Type Defines: */
|
||||
/** Type define for a standard Boot Protocol Keyboard report */
|
||||
|
|
|
@ -4,23 +4,11 @@
|
|||
* documentation pages. It is not a project source file.
|
||||
*/
|
||||
|
||||
/** \mainpage Keyboard Host Demo
|
||||
*
|
||||
* Keyboard host demonstration application, using pipe interrupts. This gives
|
||||
* a simple reference application for implementing a USB Keyboard host utilizing
|
||||
* the LUFA pipe interrupt system, for USB keyboards using the standard Keyboard
|
||||
* HID profile.
|
||||
*
|
||||
* Pressed alpha-numeric, enter or space key is transmitted through the serial
|
||||
* USART at serial settings 9600, 8, N, 1.
|
||||
*
|
||||
* This uses a naive method where the keyboard is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* KeyboardHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface keyboards are supported.
|
||||
/** \mainpage Keyboard Host Demo (via interrupts)
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -44,4 +32,34 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Keyboard host demonstration application, using pipe interrupts. This gives
|
||||
* a simple reference application for implementing a USB Keyboard host utilizing
|
||||
* the LUFA pipe interrupt system, for USB keyboards using the standard Keyboard
|
||||
* HID profile.
|
||||
*
|
||||
* Pressed alpha-numeric, enter or space key is transmitted through the serial
|
||||
* USART at serial settings 9600, 8, N, 1.
|
||||
*
|
||||
* This uses a naive method where the keyboard is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* KeyboardHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface keyboards are supported.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,19 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Keyboard Host With HID Descriptor Parser Demo
|
||||
*
|
||||
* Keyboard host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Keyboard host, for USB keyboards using
|
||||
* the standard Keyboard HID profile. It uses a HID parser for the HID reports,
|
||||
* allowing for correct operation across all USB keyboards. This demo supports
|
||||
* keyboards with a single HID report.
|
||||
*
|
||||
* Pressed alpha-numeric, enter or space key is transmitted through the serial
|
||||
* USART at serial settings 9600, 8, N, 1. On connection to a USB keyboard, the
|
||||
* report items will be processed and printed as a formatted list through the
|
||||
* USART before the keyboard is fully enumerated.
|
||||
*
|
||||
* Currently only single interface keyboards are supported.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -41,4 +32,31 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Keyboard host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Keyboard host, for USB keyboards using
|
||||
* the standard Keyboard HID profile. It uses a HID parser for the HID reports,
|
||||
* allowing for correct operation across all USB keyboards. This demo supports
|
||||
* keyboards with a single HID report.
|
||||
*
|
||||
* Pressed alpha-numeric, enter or space key is transmitted through the serial
|
||||
* USART at serial settings 9600, 8, N, 1. On connection to a USB keyboard, the
|
||||
* report items will be processed and printed as a formatted list through the
|
||||
* USART before the keyboard is fully enumerated.
|
||||
*
|
||||
* Currently only single interface keyboards are supported.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -6,22 +6,9 @@
|
|||
|
||||
/** \mainpage Dual HID Keyboard and Mouse Device Demo
|
||||
*
|
||||
* Keyboard/Mouse demonstration application. This gives a simple reference
|
||||
* application for implementing a composite device containing both USB Keyboard
|
||||
* and USB Mouse functionality using the basic USB HID drivers in all modern OSes
|
||||
* (i.e. no special drivers required). This example uses two seperate HID
|
||||
* interfaces for each function. It is boot protocol compatible, and thus works under
|
||||
* compatible BIOS as if it was a native keyboard and mouse (e.g. PS/2).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a keyboard when the USB connection to a host is present and the HWB is not
|
||||
* pressed. When enabled, manipulate the joystick to send the letters
|
||||
* a, b, c, d and e. See the USB HID documentation for more information
|
||||
* on sending keyboard event and keypresses.
|
||||
*
|
||||
* When the HWB is pressed, the mouse mode is enabled. When enabled, move the
|
||||
* joystick to move the pointer, and push the joystick inwards to simulate a
|
||||
* left-button click.
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -45,4 +32,35 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Keyboard/Mouse demonstration application. This gives a simple reference
|
||||
* application for implementing a composite device containing both USB Keyboard
|
||||
* and USB Mouse functionality using the basic USB HID drivers in all modern OSes
|
||||
* (i.e. no special drivers required). This example uses two seperate HID
|
||||
* interfaces for each function. It is boot protocol compatible, and thus works under
|
||||
* compatible BIOS as if it was a native keyboard and mouse (e.g. PS/2).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a keyboard when the USB connection to a host is present and the HWB is not
|
||||
* pressed. When enabled, manipulate the joystick to send the letters
|
||||
* a, b, c, d and e. See the USB HID documentation for more information
|
||||
* on sending keyboard event and keypresses.
|
||||
*
|
||||
* When the HWB is pressed, the mouse mode is enabled. When enabled, move the
|
||||
* joystick to move the pointer, and push the joystick inwards to simulate a
|
||||
* left-button click.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,21 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage MIDI Input Device Demo
|
||||
*
|
||||
* MIDI demonstration application. This gives a simple reference
|
||||
* application for implementing the USB-MIDI class in USB devices.
|
||||
* It is built upon the USB Audio class.
|
||||
*
|
||||
* Joystick movements are translated into note on/off messages and
|
||||
* are sent to the host PC as MIDI streams which can be read by any
|
||||
* MIDI program supporting MIDI IN devices.
|
||||
*
|
||||
* If the HWB is not pressed, channel 1 (default piano) is used. If
|
||||
* the HWB is set, then channel 10 (default percussion) is selected.
|
||||
*
|
||||
* This device implements MIDI-THRU mode, with the IN MIDI data being
|
||||
* generated by the device itself. OUT MIDI data is discarded.
|
||||
*
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -45,4 +34,32 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* MIDI demonstration application. This gives a simple reference
|
||||
* application for implementing the USB-MIDI class in USB devices.
|
||||
* It is built upon the USB Audio class.
|
||||
*
|
||||
* Joystick movements are translated into note on/off messages and
|
||||
* are sent to the host PC as MIDI streams which can be read by any
|
||||
* MIDI program supporting MIDI IN devices.
|
||||
*
|
||||
* If the HWB is not pressed, channel 1 (default piano) is used. If
|
||||
* the HWB is set, then channel 10 (default percussion) is selected.
|
||||
*
|
||||
* This device implements MIDI-THRU mode, with the IN MIDI data being
|
||||
* generated by the device itself. OUT MIDI data is discarded.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -62,8 +62,9 @@
|
|||
/** Maximum length of a SCSI command which can be issued by the device or host in a Mass Storage bulk wrapper. */
|
||||
#define MAX_SCSI_COMMAND_LENGTH 16
|
||||
|
||||
/** Total number of Logical Units (drives) in the device. By default, the total device capacity is shared equally between
|
||||
* each drive - this can be set to any positive non-zero amount. */
|
||||
/** Total number of Logical Units (drives) in the device. The total device capacity is shared equally between
|
||||
* each drive - this can be set to any positive non-zero amount.
|
||||
*/
|
||||
#define TOTAL_LUNS 2
|
||||
|
||||
/** Blocks in each LUN, calculated from the total capacity divided by the total number of Logical Units in the device. */
|
||||
|
|
|
@ -6,25 +6,9 @@
|
|||
|
||||
/** \mainpage Mass Storage Device Demo
|
||||
*
|
||||
* Dual LUN Mass Storage demonstration application. This gives a simple
|
||||
* reference application for implementing a multiple LUN USB Mass Storage
|
||||
* device using the basic USB UFI drivers in all modern OSes (i.e. no
|
||||
* special drivers required).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function as an
|
||||
* external mass storage device with two LUNs (seperate disks) which may
|
||||
* be formatted and used in the same manner as commercial USB Mass Storage
|
||||
* devices.
|
||||
*
|
||||
* You will need to format the mass storage drives upon first run of this
|
||||
* demonstration - as the device acts only as a data block transport between
|
||||
* the host and the storage media, it does not matter what file system is used,
|
||||
* as the data interpretation is performed by the host and not the USB device.
|
||||
*
|
||||
* This demo is not restricted to only two LUNs; by changing the TOTAL_LUNS
|
||||
* value in MassStorageDualLUN.h, any number of LUNs can be used (from 1 to
|
||||
* 255), with each LUN being allocated an equal portion of the available
|
||||
* Dataflash memory.
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -51,4 +35,44 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Dual LUN Mass Storage demonstration application. This gives a simple
|
||||
* reference application for implementing a multiple LUN USB Mass Storage
|
||||
* device using the basic USB UFI drivers in all modern OSes (i.e. no
|
||||
* special drivers required).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function as an
|
||||
* external mass storage device with two LUNs (seperate disks) which may
|
||||
* be formatted and used in the same manner as commercial USB Mass Storage
|
||||
* devices.
|
||||
*
|
||||
* You will need to format the mass storage drives upon first run of this
|
||||
* demonstration - as the device acts only as a data block transport between
|
||||
* the host and the storage media, it does not matter what file system is used,
|
||||
* as the data interpretation is performed by the host and not the USB device.
|
||||
*
|
||||
* This demo is not restricted to only two LUNs; by changing the TOTAL_LUNS
|
||||
* value in MassStorageDualLUN.h, any number of LUNs can be used (from 1 to
|
||||
* 255), with each LUN being allocated an equal portion of the available
|
||||
* Dataflash memory.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>TOTAL_LUNS</td>
|
||||
* <td>MassStorage.h</td>
|
||||
* <td>Total number of Logical Units (drives) in the device. The total device capacity is shared equally between each drive
|
||||
* - this can be set to any positive non-zero amount.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,15 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Mass Storage Host Demo
|
||||
*
|
||||
* Mass Storage host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mass Storage host, for USB storage devices
|
||||
* using the standard Mass Storage USB profile.
|
||||
*
|
||||
* The first 512 bytes (boot sector) of an attached disk's memory will be dumped
|
||||
* out of the serial port in HEX and ASCII form when it is attached to the AT90USB1287
|
||||
* AVR. The device will then wait for HWB to be pressed, whereupon the entire ASCII contents
|
||||
* of the disk will be dumped to the serial port.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -40,4 +35,27 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Mass Storage host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mass Storage host, for USB storage devices
|
||||
* using the standard Mass Storage USB profile.
|
||||
*
|
||||
* The first 512 bytes (boot sector) of an attached disk's memory will be dumped
|
||||
* out of the serial port in HEX and ASCII form when it is attached to the AT90USB1287
|
||||
* AVR. The device will then wait for HWB to be pressed, whereupon the entire ASCII contents
|
||||
* of the disk will be dumped to the serial port.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -45,8 +45,13 @@ BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
|
|||
/* Scheduler Task List */
|
||||
TASK_LIST
|
||||
{
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
{ Task: USB_USBTask , TaskStatus: TASK_STOP },
|
||||
#endif
|
||||
|
||||
#if !defined(INTERRUPT_DATA_ENDPOINT)
|
||||
{ Task: USB_Mouse_Report , TaskStatus: TASK_STOP },
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Global Variables */
|
||||
|
@ -118,14 +123,34 @@ EVENT_HANDLER(USB_Connect)
|
|||
UsingReportProtocol = true;
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Reset event. This fires when the USB interface is reset by the USB host, before the
|
||||
* enumeration process begins, and enables the control endpoint interrupt so that control requests can be handled
|
||||
* asynchronously when they arrive rather than when the control endpoint is polled manually.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Reset)
|
||||
{
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Select the control endpoint */
|
||||
Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
|
||||
|
||||
/* Enable the endpoint SETUP interrupt ISR for the control endpoint */
|
||||
USB_INT_Enable(ENDPOINT_INT_SETUP);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via
|
||||
* the status LEDs and stops the USB management and Mouse reporting tasks.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Disconnect)
|
||||
{
|
||||
/* Stop running mouse reporting and USB management tasks */
|
||||
/* Stop running keyboard reporting and USB management tasks */
|
||||
#if !defined(INTERRUPT_DATA_ENDPOINT)
|
||||
Scheduler_SetTaskMode(USB_Mouse_Report, TASK_STOP);
|
||||
#endif
|
||||
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);
|
||||
#endif
|
||||
|
||||
/* Indicate USB not ready */
|
||||
UpdateStatus(Status_USBNotReady);
|
||||
|
@ -141,11 +166,18 @@ EVENT_HANDLER(USB_ConfigurationChanged)
|
|||
ENDPOINT_DIR_IN, MOUSE_EPSIZE,
|
||||
ENDPOINT_BANK_SINGLE);
|
||||
|
||||
#if defined(INTERRUPT_DATA_ENDPOINT)
|
||||
/* Enable the endpoint IN interrupt ISR for the report endpoint */
|
||||
USB_INT_Enable(ENDPOINT_INT_IN);
|
||||
#endif
|
||||
|
||||
/* Indicate USB connected and ready */
|
||||
UpdateStatus(Status_USBReady);
|
||||
|
||||
#if !defined(INTERRUPT_DATA_ENDPOINT)
|
||||
/* Start running mouse reporting task */
|
||||
Scheduler_SetTaskMode(USB_Mouse_Report, TASK_RUN);
|
||||
#endif
|
||||
}
|
||||
|
||||
/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific
|
||||
|
@ -163,7 +195,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket)
|
|||
USB_MouseReport_Data_t MouseReportData;
|
||||
|
||||
/* Create the next mouse report for transmission to the host */
|
||||
GetNextReport(&MouseReportData);
|
||||
CreateMouseReport(&MouseReportData);
|
||||
|
||||
/* Ignore report type and ID number value */
|
||||
Endpoint_Discard_Word();
|
||||
|
@ -278,7 +310,7 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
|||
*
|
||||
* \return Boolean true if the new report differs from the last report, false otherwise
|
||||
*/
|
||||
bool GetNextReport(USB_MouseReport_Data_t* ReportData)
|
||||
bool CreateMouseReport(USB_MouseReport_Data_t* ReportData)
|
||||
{
|
||||
static uint8_t PrevJoyStatus = 0;
|
||||
static bool PrevHWBStatus = false;
|
||||
|
@ -315,6 +347,45 @@ bool GetNextReport(USB_MouseReport_Data_t* ReportData)
|
|||
return InputChanged;
|
||||
}
|
||||
|
||||
/** Sends the next HID report to the host, via the keyboard data endpoint. */
|
||||
static inline void SendNextReport(void)
|
||||
{
|
||||
USB_MouseReport_Data_t MouseReportData;
|
||||
bool SendReport = true;
|
||||
|
||||
/* Create the next mouse report for transmission to the host */
|
||||
CreateMouseReport(&MouseReportData);
|
||||
|
||||
/* Check if the idle period is set*/
|
||||
if (IdleCount)
|
||||
{
|
||||
/* Determine if the idle period has elapsed */
|
||||
if (!(IdleMSRemaining))
|
||||
{
|
||||
/* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */
|
||||
IdleMSRemaining = (IdleCount << 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Idle period not elapsed, indicate that a report must not be sent */
|
||||
SendReport = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Select the Mouse Report Endpoint */
|
||||
Endpoint_SelectEndpoint(MOUSE_EPNUM);
|
||||
|
||||
/* Check if Mouse Endpoint Ready for Read/Write and if we should send a new report */
|
||||
if (Endpoint_ReadWriteAllowed() && SendReport)
|
||||
{
|
||||
/* Write Mouse Report Data */
|
||||
Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData));
|
||||
|
||||
/* Finalize the stream transfer to send the last packet */
|
||||
Endpoint_ClearCurrentBank();
|
||||
}
|
||||
}
|
||||
|
||||
/** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to
|
||||
* log to a serial port, or anything else that is suitable for status updates.
|
||||
*
|
||||
|
@ -342,45 +413,57 @@ void UpdateStatus(uint8_t CurrentStatus)
|
|||
LEDs_SetAllLEDs(LEDMask);
|
||||
}
|
||||
|
||||
#if !defined(INTERRUPT_DATA_ENDPOINT)
|
||||
/** Task to manage HID report generation and transmission to the host, when in report mode. */
|
||||
TASK(USB_Mouse_Report)
|
||||
{
|
||||
USB_MouseReport_Data_t MouseReportData;
|
||||
bool SendReport = true;
|
||||
|
||||
/* Create the next mouse report for transmission to the host */
|
||||
GetNextReport(&MouseReportData);
|
||||
|
||||
/* Check if the idle period is set*/
|
||||
if (IdleCount)
|
||||
{
|
||||
/* Determine if the idle period has elapsed */
|
||||
if (!(IdleMSRemaining))
|
||||
{
|
||||
/* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */
|
||||
IdleMSRemaining = (IdleCount << 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Idle period not elapsed, indicate that a report must not be sent */
|
||||
SendReport = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if the USB system is connected to a host */
|
||||
if (USB_IsConnected)
|
||||
{
|
||||
/* Send the next mouse report to the host */
|
||||
SendNextReport();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as
|
||||
* a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send
|
||||
* HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB
|
||||
* controller. It is also used to respond to standard and class specific requests send to the device on the control
|
||||
* endpoint, by handing them off to the LUFA library when they are received.
|
||||
*/
|
||||
ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
|
||||
{
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
/* Check if the control endpoint has received a request */
|
||||
if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))
|
||||
{
|
||||
/* Clear the endpoint interrupt */
|
||||
Endpoint_ClearEndpointInterrupt(ENDPOINT_CONTROLEP);
|
||||
|
||||
/* Process the control request */
|
||||
USB_USBTask();
|
||||
|
||||
/* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */
|
||||
USB_INT_Clear(ENDPOINT_INT_SETUP);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(INTERRUPT_DATA_ENDPOINT)
|
||||
/* Check if mouse endpoint has interrupted */
|
||||
if (Endpoint_HasEndpointInterrupted(MOUSE_EPNUM))
|
||||
{
|
||||
/* Select the Mouse Report Endpoint */
|
||||
Endpoint_SelectEndpoint(MOUSE_EPNUM);
|
||||
|
||||
/* Check if Mouse Endpoint Ready for Read/Write and if we should send a new report */
|
||||
if (Endpoint_ReadWriteAllowed() && SendReport)
|
||||
{
|
||||
/* Write Mouse Report Data */
|
||||
Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData));
|
||||
|
||||
/* Finalize the stream transfer to send the last packet */
|
||||
Endpoint_ClearCurrentBank();
|
||||
}
|
||||
/* Clear the endpoint IN interrupt flag */
|
||||
USB_INT_Clear(ENDPOINT_INT_IN);
|
||||
|
||||
/* Clear the Mouse Report endpoint interrupt and select the endpoint */
|
||||
Endpoint_ClearEndpointInterrupt(MOUSE_EPNUM);
|
||||
|
||||
/* Send the next mouse report to the host */
|
||||
SendNextReport();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -103,6 +103,9 @@
|
|||
/** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Disconnect);
|
||||
|
||||
/** Indicates that this module will catch the USB_Reset event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Reset);
|
||||
|
||||
/** Indicates that this module will catch the USB_ConfigurationChanged event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_ConfigurationChanged);
|
||||
|
||||
|
@ -110,7 +113,7 @@
|
|||
HANDLES_EVENT(USB_UnhandledControlPacket);
|
||||
|
||||
/* Function Prototypes: */
|
||||
bool GetNextReport(USB_MouseReport_Data_t* ReportData);
|
||||
bool CreateMouseReport(USB_MouseReport_Data_t* ReportData);
|
||||
void UpdateStatus(uint8_t CurrentStatus);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,17 +6,9 @@
|
|||
|
||||
/** \mainpage Mouse Device Demo
|
||||
*
|
||||
* Mouse demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse using the basic USB HID
|
||||
* drivers in all modern OSes (i.e. no special drivers required). It is
|
||||
* boot protocol compatible, and thus works under compatible BIOS as if
|
||||
* it was a native mouse (e.g. PS/2).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a mouse when the USB connection to a host is present. To use
|
||||
* the mouse, move the joystick to move the pointer, and push the
|
||||
* joystick inwards to simulate a left-button click. The HWB serves as
|
||||
* the right mouse button.
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -40,4 +32,44 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Mouse demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse using the basic USB HID
|
||||
* drivers in all modern OSes (i.e. no special drivers required). It is
|
||||
* boot protocol compatible, and thus works under compatible BIOS as if
|
||||
* it was a native mouse (e.g. PS/2).
|
||||
*
|
||||
* On startup the system will automatically enumerate and function
|
||||
* as a mouse when the USB connection to a host is present. To use
|
||||
* the mouse, move the joystick to move the pointer, and push the
|
||||
* joystick inwards to simulate a left-button click. The HWB serves as
|
||||
* the right mouse button.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>INTERRUPT_CONTROL_ENDPOINT</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this causes the demo to enable interrupts for the control endpoint,
|
||||
* which services control requests from the host. If not defined, the control endpoint
|
||||
* is serviced via polling using the task scheduler.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>INTERRUPT_DATA_ENDPOINT</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, this causes the demo to enable interrupts for the data endpoint,
|
||||
* which services outgoing mouse button and movement reports to the host. If not defined,
|
||||
* the data endpoint is serviced via polling using the task scheduler.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -177,7 +177,6 @@ CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
|
|||
CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
|
||||
CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||
|
||||
|
||||
# Place -D or -U options here for ASM sources
|
||||
ADEFS = -DF_CPU=$(F_CPU)
|
||||
|
||||
|
|
|
@ -5,22 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Mouse Host Demo
|
||||
*
|
||||
* Mouse host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse host, for USB mice using
|
||||
* the standard mouse HID profile.
|
||||
*
|
||||
* Mouse movement and button presses are displayed on the board LEDs,
|
||||
* as well as printed out the serial terminal as formatted dY, dY and
|
||||
* button status information.
|
||||
*
|
||||
* This uses a naive method where the mouse is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* MouseHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface mice are supported.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -44,4 +32,34 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Mouse host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse host, for USB mice using
|
||||
* the standard mouse HID profile.
|
||||
*
|
||||
* Mouse movement and button presses are displayed on the board LEDs,
|
||||
* as well as printed out the serial terminal as formatted dY, dY and
|
||||
* button status information.
|
||||
*
|
||||
* This uses a naive method where the mouse is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* MouseHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface mice are supported.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -4,24 +4,9 @@
|
|||
* documentation pages. It is not a project source file.
|
||||
*/
|
||||
|
||||
/** \mainpage Mouse Host Demo
|
||||
*
|
||||
* Mouse host demonstration application, using pipe interrupts. This
|
||||
* gives a simple reference application for implementing a USB Mouse
|
||||
* host utilizing the LUFA pipe interrupt system, for USB mice using
|
||||
* the standard mouse HID profile.
|
||||
*
|
||||
* Mouse movement and button presses are displayed on the board LEDs,
|
||||
* as well as printed out the serial terminal as formatted dY, dY and
|
||||
* button status information.
|
||||
*
|
||||
* This uses a naive method where the mouse is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* MouseHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface mice are supported.
|
||||
/** \mainpage Mouse Host Demo (via interrupts)
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -45,4 +30,37 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* Mouse host demonstration application, using pipe interrupts. This
|
||||
* gives a simple reference application for implementing a USB Mouse
|
||||
* host utilizing the LUFA pipe interrupt system, for USB mice using
|
||||
* the standard mouse HID profile.
|
||||
*
|
||||
* Mouse movement and button presses are displayed on the board LEDs,
|
||||
* as well as printed out the serial terminal as formatted dY, dY and
|
||||
* button status information.
|
||||
*
|
||||
* This uses a naive method where the mouse is set to Boot Protocol mode, so
|
||||
* that the report structure is fixed and known. A better implementation
|
||||
* uses the HID report parser for correct report data processing across
|
||||
* all compatable mice with advanced characteristics, as shown in the
|
||||
* MouseHostWithParser demo application.
|
||||
*
|
||||
* Currently only single interface mice are supported.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,19 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Mouse Host With HID Descriptor Parser Demo
|
||||
*
|
||||
* Mouse host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse host, for USB mice using
|
||||
* the standard mouse HID profile. It uses a HID parser for the HID
|
||||
* reports, allowing for correct operation across all USB mice. This
|
||||
* demo supports mice with a single HID report.
|
||||
*
|
||||
* Mouse movement and button presses are displayed on the board LEDs.
|
||||
* On connection to a USB mouse, the report items will be processed and
|
||||
* printed as a formatted list through the USART before the mouse is
|
||||
* fully enumerated.
|
||||
*
|
||||
* Currently only single interface mice are supported.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -41,4 +32,31 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Mouse host demonstration application. This gives a simple reference
|
||||
* application for implementing a USB Mouse host, for USB mice using
|
||||
* the standard mouse HID profile. It uses a HID parser for the HID
|
||||
* reports, allowing for correct operation across all USB mice. This
|
||||
* demo supports mice with a single HID report.
|
||||
*
|
||||
* Mouse movement and button presses are displayed on the board LEDs.
|
||||
* On connection to a USB mouse, the report items will be processed and
|
||||
* printed as a formatted list through the USART before the mouse is
|
||||
* fully enumerated.
|
||||
*
|
||||
* Currently only single interface mice are supported.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,7 +5,11 @@
|
|||
*/
|
||||
|
||||
/** \mainpage RNDIS Class Ethernet Demo (with Webserver/Telnet)
|
||||
*
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* Remote Network Driver Interface demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a CDC RNDIS device acting as a simple network interface for
|
||||
|
@ -37,6 +41,8 @@
|
|||
* recommended that it be replaced with an external open source TCP/IP
|
||||
* stack that is feature complete, such as the uIP stack.
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>USB Mode:</b></td>
|
||||
|
@ -59,4 +65,51 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>NO_DECODE_ETHERNET</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, received Ethernet headers will not be decoded and printed to the device serial port.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>NO_DECODE_ARP</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, received ARP headers will not be decoded and printed to the device serial port.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>NO_DECODE_IP</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, received IP headers will not be decoded and printed to the device serial port.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>NO_DECODE_ICMP</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, received ICMP headers will not be decoded and printed to the device serial port.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>NO_DECODE_TCP</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, received TCP headers will not be decoded and printed to the device serial port.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>NO_DECODE_UDP</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, received UDP headers will not be decoded and printed to the device serial port.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>NO_DECODE_DHCP</td>
|
||||
* <td>Makefile CDEFS</td>
|
||||
* <td>When defined, received DHCP headers will not be decoded and printed to the device serial port.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -5,14 +5,10 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Still Image Host Demo
|
||||
*
|
||||
* Still Image host demonstration application. This gives a simple reference
|
||||
* application for implementing a Still Image host, for USB devices such as
|
||||
* digital cameras.
|
||||
*
|
||||
* This demo will enumerate an attached USB Still Image device, print out its
|
||||
* information structure, open a session with the device and finally close the
|
||||
* session.
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -37,4 +33,26 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Still Image host demonstration application. This gives a simple reference
|
||||
* application for implementing a Still Image host, for USB devices such as
|
||||
* digital cameras.
|
||||
*
|
||||
* This demo will enumerate an attached USB Still Image device, print out its
|
||||
* information structure, open a session with the device and finally close the
|
||||
* session.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -6,25 +6,9 @@
|
|||
|
||||
/** \mainpage Test Application for the LUFA library
|
||||
*
|
||||
* Test application. Demonstrates several aspects of the LUFA
|
||||
* Library. On startup the current temperature will be printed
|
||||
* through the USART every 10 seconds, and the current joystick
|
||||
* position will be indicated via the LEDs on the selected board.
|
||||
* Pressing the HWB will initiate the USB subsystem, enumerating
|
||||
* the device (which has <b>no actual functionality beyond
|
||||
* enumeration as a device or as a host in this demo</b>, and serves
|
||||
* only to demonstrate the USB portion of the library). It will
|
||||
* also suspend the joystick and temperature monitoring tasks.
|
||||
*
|
||||
* Pressing the HWB a second time will turn off the USB system
|
||||
* and resume the temperature printing task (but not the joystick
|
||||
* monitoring task).
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* When activated, the USB events will be printed through the
|
||||
* serial USART.
|
||||
*
|
||||
* When the USB subsystem is activated, the board LEDs will show
|
||||
* the current USB status.
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -48,4 +32,38 @@
|
|||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Test application. Demonstrates several aspects of the LUFA
|
||||
* Library. On startup the current temperature will be printed
|
||||
* through the USART every 10 seconds, and the current joystick
|
||||
* position will be indicated via the LEDs on the selected board.
|
||||
* Pressing the HWB will initiate the USB subsystem, enumerating
|
||||
* the device (which has <b>no actual functionality beyond
|
||||
* enumeration as a device or as a host in this demo</b>, and serves
|
||||
* only to demonstrate the USB portion of the library). It will
|
||||
* also suspend the joystick and temperature monitoring tasks.
|
||||
*
|
||||
* Pressing the HWB a second time will turn off the USB system
|
||||
* and resume the temperature printing task (but not the joystick
|
||||
* monitoring task).
|
||||
*
|
||||
* When activated, the USB events will be printed through the
|
||||
* serial USART.
|
||||
*
|
||||
* When the USB subsystem is activated, the board LEDs will show
|
||||
* the current USB status.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td>
|
||||
* None
|
||||
* </td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -6,19 +6,9 @@
|
|||
|
||||
/** \mainpage USB to Serial Converter Demo (via CDC-ACM class)
|
||||
*
|
||||
* Communications Device Class demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a USB to Serial converter using the CDC class. Sent and
|
||||
* received data on the serial port is communicated to the USB
|
||||
* host.
|
||||
*
|
||||
* After running this demo for the first time on a new computer,
|
||||
* you will need to supply the .INF file located in this demo
|
||||
* project's directory as the device's driver when running under
|
||||
* Windows. This will enable Windows to use its inbuilt CDC drivers,
|
||||
* negating the need for custom drivers for the device. Other
|
||||
* Operating Systems should automatically use their own inbuilt
|
||||
* CDC-ACM drivers.
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
|
@ -42,4 +32,37 @@
|
|||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Communications Device Class demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a USB to Serial converter using the CDC class. Sent and
|
||||
* received data on the serial port is communicated to the USB
|
||||
* host.
|
||||
*
|
||||
* After running this demo for the first time on a new computer,
|
||||
* you will need to supply the .INF file located in this demo
|
||||
* project's directory as the device's driver when running under
|
||||
* Windows. This will enable Windows to use its inbuilt CDC drivers,
|
||||
* negating the need for custom drivers for the device. Other
|
||||
* Operating Systems should automatically use their own inbuilt
|
||||
* CDC-ACM drivers.
|
||||
*
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>BUFF_STATICSIZE</td>
|
||||
* <td>RingBuff.h</td>
|
||||
* <td>Defines the maximum number of bytes which can be buffered in each Ring Buffer.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -58,12 +58,6 @@ all:
|
|||
|
||||
make -C Mouse clean
|
||||
make -C Mouse all
|
||||
|
||||
make -C MouseFullInt clean
|
||||
make -C MouseFullInt all
|
||||
|
||||
make -C MouseViaInt clean
|
||||
make -C MouseViaInt all
|
||||
|
||||
make -C MouseHost clean
|
||||
make -C MouseHost all
|
||||
|
@ -102,8 +96,6 @@ all:
|
|||
make -C MassStorageHost $@
|
||||
make -C MIDI $@
|
||||
make -C Mouse $@
|
||||
make -C MouseFullInt $@
|
||||
make -C MouseViaInt $@
|
||||
make -C MouseHost $@
|
||||
make -C MouseHostWithParser $@
|
||||
make -C MouseHostViaInt $@
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -8,7 +8,6 @@
|
|||
*
|
||||
* \section Sec_ChangeLogXXXXXX Version XXXXXX
|
||||
*
|
||||
* - Added new incomplete BluetoothHost demo
|
||||
* - Changed AVRISP Programmer descriptors to use a newly allocated 0x204F PID value
|
||||
* - Fixed MagStripe project configuration descriptor containing an unused (blank) endpoint descriptor
|
||||
* - Incorporated makefile changes by Denver Gingerich to retain compatibility with stock (non-WinAVR) AVR-GCC installations
|
||||
|
@ -37,9 +36,10 @@
|
|||
* to Kenneth Clubb)
|
||||
* - Added DataflashManager_WriteBlocks_RAM() and DataflashManager_ReadBlocks_RAM() functions to the MassStorage demo, to allow for easy
|
||||
* interfacing with a FAT library for dataflash file level access
|
||||
* - Incomplete non-functional BluetoothHost demo removed until it has reached a stable state to prevent confusion
|
||||
* - Corrected CDC class bootloader to fix a few bugs, changed address counter to store x2 addresses for convenience
|
||||
* - Fixed typos in the SPI driver SPI_SPEED_FCPU_DIV_64 and SPI_SPEED_FCPU_DIV_128 masks (thanks to Markus Zocholl)
|
||||
* - Keyboard and Mouse demos (normal, data interrupt and fully interrupt driven) combined into unified keyboard and mouse demos
|
||||
* - Removed AVRISP_Programmer project due to code quality concerns
|
||||
*
|
||||
* \section Sec_ChangeLog090209 Version 090209
|
||||
*
|
||||
|
|
|
@ -1,176 +0,0 @@
|
|||
Instructions for converting the LUFA USBtoSerial Demo to an AVR ISP Programmer.
|
||||
By Opendous Inc., Copyright under the Creative Commons Attribution License:
|
||||
http://creativecommons.org/licenses/by/3.0/
|
||||
|
||||
1) Start with the LUFA/Demos/USBtoSerial firmware.
|
||||
- rename USBtoSerial.c, USBtoSerial.h, and USBtoSerial.aps to
|
||||
AVRISP_Programmer.*
|
||||
- edit AVRISP_Programmer.aps and rename all instances of "USBtoSerial" to
|
||||
"AVRISP_Programmer"
|
||||
- copy AVRISP_Programmer.txt from an older version of AVRISP_Programmer
|
||||
|
||||
2) Edit makefile by changing TARGET from "USBtoSerial" to "AVRISP_Programmer"
|
||||
|
||||
3) Edit AVRISP_Programmer.h:
|
||||
- change ifdef _USB_TO_SERIAL_H to _AVRISP_PROGRAMMER_H_
|
||||
- rename ReconfigureUSART(void) to ReconfigureSPI(void)
|
||||
- add void processHostSPIRequest(void); & void delay_ms(uint8_t dly);
|
||||
- replace the define for Serial.h with one for SPI.h:
|
||||
#include <libs/LUFA/Drivers/AT90USBXXX/SPI.h>
|
||||
|
||||
4) Make alterations to Descriptors.c
|
||||
- change manufacturer string to "www.AVRopendous.org", length=19
|
||||
- change product string to "LUFA-Based AVR ISP Programmer", length=29
|
||||
|
||||
5) Edit Ringbuff.h to enable the Peek Command: #define BUFF_USEPEEK
|
||||
|
||||
6) Edit AVRISP_Programmer.c:
|
||||
- change #include "USBtoSerial.h" to #include "AVRISP_Programmer.h"
|
||||
- change BUTTLOADTAG(ProjName to "LUFA AVR910 ISP Programmer"
|
||||
- in main(), rename ReconfigureUSART() to Reconfigure();
|
||||
- in EVENT_HANDLER(USB_UnhandledControlPacket), rename ReconfigureUSART
|
||||
- delete the ISRs: ISR(USART1_RX_vect) & ISR(USART1_TX_vect)
|
||||
- delete ReconfigureUSART(void)
|
||||
- add void ReconfigureSPI(void), void processHostSPIRequest(void),
|
||||
and void delay_ms(uint8_t dly) from a previous version
|
||||
- add Timer1 and SPI initialization code to main():
|
||||
/* Hardware Initialization */
|
||||
//LEDs_Init();
|
||||
DDRB = 0;
|
||||
PORTB = 0;
|
||||
DDRC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2
|
||||
// PC2 is also used for RESET, so set it HIGH initially - note 'P' command sets it to LOW (Active)
|
||||
PORTC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2
|
||||
DDRD = 0;
|
||||
PORTD = (1 << PB7); // only PB7(HWB) should be High as this is the bootloader pin
|
||||
// Prepare PortB for SPI - set PB0(^SS), PB1(SCK), PB2(MOSI) as output as well as all other pins except PB3(MISO)
|
||||
DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2) | (0 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6) | (1 << PB7);
|
||||
PORTB |= (1 << PB0);
|
||||
|
||||
// initialize Timer1 for use in delay function
|
||||
TCCR1A = 0;
|
||||
//TCCR1B = (1 << CS10); // no prescaling, use CLK
|
||||
TCCR1B = ((1 << CS12) | (1 << CS10)); // prescale by CLK/1024
|
||||
// 8MHz/1024 = 7813 ticks per second --> ~8 ticks per millisecond (ms)
|
||||
timerval = TCNT1; // start timer1
|
||||
|
||||
- In TASK(CDC_Task) in the
|
||||
if (USB_IsConnected) {
|
||||
if (Endpoint_ReadWriteAllowed()) {
|
||||
while (Endpoint_BytesInEndpoint()) {
|
||||
...
|
||||
structure, after Buffer_StoreElement(&Rx_Buffer, Endpoint_Read_Byte()):
|
||||
|
||||
/* Each time there is an element, check which comand should be
|
||||
run and if enough data is available to run that command.
|
||||
There are 1-byte, 2-byte, 3-byte, 4-byte commands, and 5-byte commands
|
||||
Remember that the "which command" byte counts as 1 */
|
||||
if (Rx_Buffer.Elements == 0) {
|
||||
// do nothing, wait for data
|
||||
} else {
|
||||
tempByte = Buffer_PeekElement(&Rx_Buffer); // peek at first element
|
||||
|
||||
/* make sure the issued command and associated data are all ready */
|
||||
if (Rx_Buffer.Elements == 1) { // zero data byte command
|
||||
if ((tempByte == 'P') | (tempByte == 'a') | (tempByte == 'm') |
|
||||
(tempByte == 'R') | (tempByte == 'd') | (tempByte == 'e') |
|
||||
(tempByte == 'L') | (tempByte == 's') | (tempByte == 't') |
|
||||
(tempByte == 'S') | (tempByte == 'V') | (tempByte == 'v') |
|
||||
(tempByte == 'p') | (tempByte == 'F')) {
|
||||
processHostSPIRequest(); // command has enough data, process it
|
||||
}
|
||||
} else if (Rx_Buffer.Elements == 2) { // one data byte command
|
||||
if ((tempByte == 'T') | (tempByte == 'c') | (tempByte == 'C') |
|
||||
(tempByte == 'D') | (tempByte == 'l') | (tempByte == 'f') |
|
||||
(tempByte == 'x') | (tempByte == 'y')) {
|
||||
processHostSPIRequest(); // command has enough data, process it
|
||||
}
|
||||
} else if (Rx_Buffer.Elements == 3) { // two data byte command
|
||||
if ((tempByte == 'A') | (tempByte == 'Z')) {
|
||||
processHostSPIRequest(); // command has enough data, process it
|
||||
}
|
||||
} else if (Rx_Buffer.Elements == 4) { // three data byte command
|
||||
if ((tempByte == ':')) {
|
||||
processHostSPIRequest(); // command has enough data, process it
|
||||
}
|
||||
} else if (Rx_Buffer.Elements == 5) { // four data byte command
|
||||
if ((tempByte == '.')) {
|
||||
processHostSPIRequest(); // command has enough data, process it
|
||||
}
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
- need to add code to flush the buffer. Change:
|
||||
/* Check if Rx buffer contains data */
|
||||
if (Rx_Buffer.Elements)
|
||||
{
|
||||
/* Initiate the transmission of the buffer contents if USART idle*/
|
||||
if (!(Transmitting))
|
||||
{
|
||||
Transmitting = true;
|
||||
Serial_TxByte(Buffer_GetElement(&Rx_Buffer));
|
||||
}
|
||||
}
|
||||
To:
|
||||
/* Check if Rx buffer contains data */
|
||||
if (Rx_Buffer.Elements)
|
||||
{
|
||||
/* Initiate the transmission of the buffer contents if USART idle*/
|
||||
if (!(Transmitting))
|
||||
{
|
||||
Transmitting = true;
|
||||
/* The following flushes the receive buffer to prepare for new
|
||||
data and commands. Need to flush the buffer as the command
|
||||
byte which is peeked above needs to be dealt with, otherwise
|
||||
the command bytes will overflow the buffer eventually */
|
||||
//Buffer_GetElement(&Rx_Buffer); // also works
|
||||
Buffer_Initialize(&Rx_Buffer);
|
||||
}
|
||||
}
|
||||
|
||||
- need to add the following defines and globals:
|
||||
#define RESETPORT PORTB
|
||||
#define RESETPIN PB0
|
||||
#define RESETPORT2 PORTC
|
||||
#define RESETPIN2 PC2
|
||||
#define CR_HEX '\r'
|
||||
|
||||
#define DELAY_VERYSHORT 0x01
|
||||
#define DELAY_SHORT 0x02
|
||||
#define DELAY_MEDIUM 0x03
|
||||
#define DELAY_LONG 0x05
|
||||
#define DELAY_MULTIPLE 0x04
|
||||
|
||||
/* AVR Device Codes - Can have a maximum of 14 but can be any you want.
|
||||
Note that these are completely irrelevent. If AVRdude supports a
|
||||
device, then that device is programmable. Use -F switch to ignore
|
||||
device codes. */
|
||||
#define AVRDEVCODE01 0x55 /* ATtiny12 */
|
||||
#define AVRDEVCODE02 0x56 /* ATtiny15 */
|
||||
#define AVRDEVCODE03 0x5E /* ATtiny261 */
|
||||
#define AVRDEVCODE04 0x76 /* ATmega8 */
|
||||
#define AVRDEVCODE05 0x74 /* ATmega16 */
|
||||
#define AVRDEVCODE06 0x72 /* ATmega32 */
|
||||
#define AVRDEVCODE07 0x45 /* ATmega64 */
|
||||
#define AVRDEVCODE08 0x74 /* ATmega644 */
|
||||
#define AVRDEVCODE09 0x43 /* ATmega128 */
|
||||
#define AVRDEVCODE10 0x63 /* ATmega162 */
|
||||
#define AVRDEVCODE11 0x78 /* ATmega169 */
|
||||
#define AVRDEVCODE12 0x6C /* AT90S4434 */
|
||||
#define AVRDEVCODE13 0x38 /* AT90S8515A */
|
||||
#define AVRDEVCODE14 0x65 /* AT90S8555 */
|
||||
|
||||
/* some global variables used throughout */
|
||||
uint8_t tempIOreg = 0;
|
||||
uint8_t tempIOreg2 = 0;
|
||||
uint8_t tempIOreg3 = 0;
|
||||
uint8_t tempIOreg4 = 0;
|
||||
uint8_t dataWidth = 0;
|
||||
uint8_t firstRun = 1;
|
||||
uint8_t deviceCode = 0;
|
||||
uint8_t tempByte = 0;
|
||||
uint16_t currAddress = 0;
|
||||
uint16_t timerval = 0;
|
||||
|
|
@ -1 +0,0 @@
|
|||
<AVRStudio><MANAGEMENT><ProjectName>AVRISP_Programmer</ProjectName><Created>30-Sep-2008 14:18:39</Created><LastEdit>30-Sep-2008 14:18:52</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>30-Sep-2008 14:18:39</Created><Version>4</Version><Build>4, 14, 0, 589</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile></ObjectFile><EntryFile></EntryFile><SaveFolder>C:\Users\Dean\Documents\Electronics\Projects\WORK\MyUSBWORK\Demos\AVRISP_Programmer\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET></CURRENT_TARGET><CURRENT_PART></CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>Descriptors.c</SOURCEFILE><SOURCEFILE>RingBuff.c</SOURCEFILE><SOURCEFILE>AVRISP_Programmer.c</SOURCEFILE><HEADERFILE>Descriptors.h</HEADERFILE><HEADERFILE>RingBuff.h</HEADERFILE><HEADERFILE>AVRISP_Programmer.h</HEADERFILE><OTHERFILE>makefile</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>YES</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE>makefile</EXTERNALMAKEFILE><PART>atmega128</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>AVRISP_Programmer.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\WinAVR-20080512\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\WinAVR-20080512\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/><sort sorted="0" column="0" ordername="0" orderaddress="0" ordergroup="0"/></IOView><Files></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>
|
|
@ -1,763 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2009.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
AVR ISP Programmer code Copyright 2009 Opendous Inc. (www.opendous.org)
|
||||
For more info and usage instructions for this firmware, visit:
|
||||
http://code.google.com/p/avropendous/wiki/AVR_ISP_Programmer
|
||||
|
||||
Note that this firmware is designed to work with AVRdude:
|
||||
http://savannah.nongnu.org/projects/avrdude
|
||||
But should work with other software that supports the AVR910 ISP
|
||||
programmer or STK200 hardware.
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
and its documentation for any purpose and without fee is hereby
|
||||
granted, provided that the above copyright notice appear in all
|
||||
copies and that both that the copyright notice and this
|
||||
permission notice and warranty disclaimer appear in supporting
|
||||
documentation, and that the name of the author not be used in
|
||||
advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
The author disclaim all warranties with regard to this
|
||||
software, including all implied warranties of merchantability
|
||||
and fitness. In no event shall the author be liable for any
|
||||
special, indirect or consequential damages or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether
|
||||
in an action of contract, negligence or other tortious action,
|
||||
arising out of or in connection with the use or performance of
|
||||
this software.
|
||||
*/
|
||||
|
||||
/*
|
||||
Usage:
|
||||
avrdude -vv -F -P COM7 -c avr910 -p t261
|
||||
Note -F flag which overrides signature check and enables programming
|
||||
of any "In-System Programmable via SPI Port" AVR MCU. Part number,
|
||||
t261, should be set to your target device.
|
||||
avrdude -vv -F -P COM7 -c avr910 -p t261 -U flash:w:PROG.hex
|
||||
PROG.hex is the hex file to program your t261 AVR with
|
||||
avrdude -vv -F -P COM7 -b 115200 -c avr910 -p t261 -U flash:w:test.hex
|
||||
The -b 115200 sets the SPI clock to 62.5kHz from the default 125kHz and may
|
||||
work when the default programming speed fails.
|
||||
AVROSP.exe -dATtiny261 -cCOM7 -rf
|
||||
AVRosp is the Open Source AVR ISP Programming Software available from Atmel.com
|
||||
|
||||
Note: on Linux systems, COM7 should be replaced with someting like /dev/ttyACM0
|
||||
You can determine this value by running dmesg after plugging in the device
|
||||
Note: you must RESET the programmer after each use (AVRdude session).
|
||||
|
||||
Note: If you experience errors with older devices, try changing the DELAY defines
|
||||
|
||||
MISO, MOSI, and SCK are connected directly from the AVRopendous board
|
||||
to the pin of the same functionality on the target. RESET pin on the target
|
||||
can be connected either to SS (PB0), or PC2. Do not have any other pins
|
||||
connected - especially HWB pin, to avoid unintentional behaviour.
|
||||
|
||||
AVR910 functionality was overlayed on USBtoSerial functionality.
|
||||
Keep this in mind when looking over the code.
|
||||
Default target speed is 125kHz and corresponds to 19200 baud, which
|
||||
is the default setting for AVRdude.
|
||||
|
||||
Changing "Baud-Rate" will change the SPI speed. Defualt SPI clock speed
|
||||
is 8Mhz / 4 = 2MHz. 8Mhz is the device clock speed. This is the setting at
|
||||
9600 baud. The following is a table of baud-rate vs. SPI Speed that will result
|
||||
9600 = 2Mhz
|
||||
14400 = 1MHz
|
||||
19200 = 125kHz (AVRdude Default)
|
||||
38400 = 250kHz
|
||||
57600 = 500kHz
|
||||
115200 = 62.5kHz
|
||||
|
||||
Before running, you will need to install the INF file that
|
||||
is located in the project directory. This will enable
|
||||
Windows to use its inbuilt CDC drivers, negating the need
|
||||
for special Windows drivers for the device. To install,
|
||||
right-click the .INF file and choose the Install option.
|
||||
*/
|
||||
|
||||
/* TODO: - fix the requirement that a RESET must be performed after each session, which
|
||||
is only an issue under Windows. Everything works fine under Linux
|
||||
*/
|
||||
|
||||
#include "AVRISP_Programmer.h"
|
||||
|
||||
/* Project Tags, for reading out using the ButtLoad project */
|
||||
BUTTLOADTAG(ProjName, "LUFA AVR910 ISP Programmer");
|
||||
BUTTLOADTAG(BuildTime, __TIME__);
|
||||
BUTTLOADTAG(BuildDate, __DATE__);
|
||||
BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING);
|
||||
|
||||
|
||||
#define RESETPORT PORTB
|
||||
#define RESETPIN PB0
|
||||
#define RESETPORT2 PORTC
|
||||
#define RESETPIN2 PC2
|
||||
#define CR_HEX '\r'
|
||||
|
||||
#define DELAY_VERYSHORT 0x01
|
||||
#define DELAY_SHORT 0x02
|
||||
#define DELAY_MEDIUM 0x03
|
||||
#define DELAY_LONG 0x05
|
||||
#define DELAY_MULTIPLE 0x02
|
||||
|
||||
|
||||
/* AVR Device Codes - Can have a maximum of 14 but can be any you want.
|
||||
Note that these are completely irrelevent. If AVRdude supports a device,
|
||||
then that device is programmable. Use -F switch to ignore device codes. */
|
||||
#define AVRDEVCODE01 0x55 /* ATtiny12 */
|
||||
#define AVRDEVCODE02 0x56 /* ATtiny15 */
|
||||
#define AVRDEVCODE03 0x5E /* ATtiny261 */
|
||||
#define AVRDEVCODE04 0x76 /* ATmega8 */
|
||||
#define AVRDEVCODE05 0x74 /* ATmega16 */
|
||||
#define AVRDEVCODE06 0x72 /* ATmega32 */
|
||||
#define AVRDEVCODE07 0x45 /* ATmega64 */
|
||||
#define AVRDEVCODE08 0x74 /* ATmega644 */
|
||||
#define AVRDEVCODE09 0x43 /* ATmega128 */
|
||||
#define AVRDEVCODE10 0x63 /* ATmega162 */
|
||||
#define AVRDEVCODE11 0x78 /* ATmega169 */
|
||||
#define AVRDEVCODE12 0x6C /* AT90S4434 */
|
||||
#define AVRDEVCODE13 0x38 /* AT90S8515A */
|
||||
#define AVRDEVCODE14 0x65 /* AT90S8555 */
|
||||
|
||||
|
||||
/* Scheduler Task List */
|
||||
TASK_LIST
|
||||
{
|
||||
{ Task: USB_USBTask , TaskStatus: TASK_STOP },
|
||||
{ Task: CDC_Task , TaskStatus: TASK_STOP },
|
||||
};
|
||||
|
||||
/* Globals: */
|
||||
/** Contains the current baud rate and other settings of the virtual serial port.
|
||||
*
|
||||
These values are set by the host via a class-specific request, and the physical USART should be reconfigured to match the
|
||||
new settings each time they are changed by the host.
|
||||
*/
|
||||
CDC_Line_Coding_t LineCoding = { BaudRateBPS: 9600,
|
||||
CharFormat: OneStopBit,
|
||||
ParityType: Parity_None,
|
||||
DataBits: 8 };
|
||||
|
||||
/** Ring (circular) buffer to hold the RX data - data from the host to the attached device on the serial port. */
|
||||
RingBuff_t Rx_Buffer;
|
||||
|
||||
/** Ring (circular) buffer to hold the TX data - data from the attached device on the serial port to the host. */
|
||||
RingBuff_t Tx_Buffer;
|
||||
|
||||
/** Flag to indicate if the USART is currently transmitting data from the Rx_Buffer circular buffer. */
|
||||
volatile bool Transmitting = false;
|
||||
|
||||
/* some global variables used throughout */
|
||||
uint16_t currAddress = 0;
|
||||
|
||||
/** Main program entry point. This routine configures the hardware required by the application, then
|
||||
starts the scheduler to run the application tasks.
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
/* Disable watchdog if enabled by bootloader/fuses */
|
||||
MCUSR &= ~(1 << WDRF);
|
||||
wdt_disable();
|
||||
|
||||
/* Disable clock division */
|
||||
clock_prescale_set(clock_div_1);
|
||||
|
||||
/* Hardware Initialization */
|
||||
LEDs_Init();
|
||||
ReconfigureSPI();
|
||||
|
||||
DDRC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2
|
||||
// PC2 is also used for RESET, so set it HIGH initially - note 'P' command sets it to LOW (Active)
|
||||
PORTC |= ((1 << PC2) | (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7)); //AT90USBxx2
|
||||
DDRD = 0;
|
||||
PORTD = (1 << PB7); // only PB7(HWB) should be High as this is the bootloader pin
|
||||
// Prepare PortB for SPI - set PB0(^SS), PB1(SCK), PB2(MOSI) as output as well as all other pins except PB3(MISO)
|
||||
DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2) | (0 << PB3) | (1 << PB4) | (1 << PB5) | (1 << PB6) | (1 << PB7);
|
||||
PORTB |= (1 << PB0);
|
||||
// make sure DataFlash devices to not interfere - deselect them by setting PE0 and PE1 HIGH:
|
||||
PORTE = 0xFF;
|
||||
DDRE = 0xFF;
|
||||
|
||||
/* Ringbuffer Initialization */
|
||||
Buffer_Initialize(&Rx_Buffer);
|
||||
Buffer_Initialize(&Tx_Buffer);
|
||||
|
||||
/* Indicate USB not ready */
|
||||
UpdateStatus(Status_USBNotReady);
|
||||
|
||||
/* Initialize Scheduler so that it can be used */
|
||||
Scheduler_Init();
|
||||
|
||||
/* Initialize USB Subsystem */
|
||||
USB_Init();
|
||||
|
||||
/* Scheduling - routine never returns, so put this last in the main function */
|
||||
Scheduler_Start();
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs and
|
||||
starts the library USB task to begin the enumeration and USB management process.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Connect)
|
||||
{
|
||||
/* Start USB management task */
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_RUN);
|
||||
|
||||
/* Indicate USB enumerating */
|
||||
UpdateStatus(Status_USBEnumerating);
|
||||
}
|
||||
|
||||
/** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via
|
||||
the status LEDs and stops the USB management and CDC management tasks.
|
||||
*/
|
||||
EVENT_HANDLER(USB_Disconnect)
|
||||
{
|
||||
/* Stop running CDC and USB management tasks */
|
||||
Scheduler_SetTaskMode(CDC_Task, TASK_STOP);
|
||||
Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);
|
||||
|
||||
/* Indicate USB not ready */
|
||||
UpdateStatus(Status_USBNotReady);
|
||||
}
|
||||
|
||||
/** Event handler for the USB_ConfigurationChanged event. This is fired when the host set the current configuration
|
||||
of the USB device after enumeration - the device endpoints are configured and the CDC management task started.
|
||||
*/
|
||||
EVENT_HANDLER(USB_ConfigurationChanged)
|
||||
{
|
||||
/* Setup CDC Notification, Rx and Tx Endpoints */
|
||||
Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT,
|
||||
ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE,
|
||||
ENDPOINT_BANK_SINGLE);
|
||||
|
||||
Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK,
|
||||
ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE,
|
||||
ENDPOINT_BANK_SINGLE);
|
||||
|
||||
Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK,
|
||||
ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE,
|
||||
ENDPOINT_BANK_SINGLE);
|
||||
|
||||
/* Indicate USB connected and ready */
|
||||
UpdateStatus(Status_USBReady);
|
||||
|
||||
/* Start CDC task */
|
||||
Scheduler_SetTaskMode(CDC_Task, TASK_RUN);
|
||||
}
|
||||
|
||||
/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific
|
||||
control requests that are not handled internally by the USB library (including the CDC control commands,
|
||||
which are all issued via the control endpoint), so that they can be handled appropriately for the application.
|
||||
*/
|
||||
EVENT_HANDLER(USB_UnhandledControlPacket)
|
||||
{
|
||||
uint8_t* LineCodingData = (uint8_t*)&LineCoding;
|
||||
|
||||
/* Process CDC specific control requests */
|
||||
switch (bRequest)
|
||||
{
|
||||
case REQ_GetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSetupReceived();
|
||||
|
||||
/* Write the line coding data to the control endpoint */
|
||||
Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(LineCoding));
|
||||
|
||||
/* Finalize the stream transfer to send the last packet or clear the host abort */
|
||||
Endpoint_ClearSetupOUT();
|
||||
}
|
||||
|
||||
break;
|
||||
case REQ_SetLineEncoding:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSetupReceived();
|
||||
|
||||
/* Read the line coding data in from the host into the global struct */
|
||||
Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(LineCoding));
|
||||
|
||||
/* Finalize the stream transfer to clear the last packet from the host */
|
||||
Endpoint_ClearSetupIN();
|
||||
|
||||
/* Reconfigure the USART with the new settings */
|
||||
ReconfigureSPI();
|
||||
}
|
||||
|
||||
break;
|
||||
case REQ_SetControlLineState:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
||||
{
|
||||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSetupReceived();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsSetupINReady()));
|
||||
Endpoint_ClearSetupIN();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/** Task to manage CDC data transmission and reception to and from the host, from and to the physical USART. */
|
||||
TASK(CDC_Task)
|
||||
{
|
||||
if (USB_IsConnected)
|
||||
{
|
||||
/* Select the Serial Rx Endpoint */
|
||||
Endpoint_SelectEndpoint(CDC_RX_EPNUM);
|
||||
|
||||
if (Endpoint_ReadWriteAllowed())
|
||||
{
|
||||
/* Read the received data endpoint into the transmission buffer */
|
||||
while (Endpoint_BytesInEndpoint())
|
||||
{
|
||||
/* Wait until the buffer has space for a new character */
|
||||
while (!((BUFF_STATICSIZE - Rx_Buffer.Elements)));
|
||||
|
||||
/* Store each character from the endpoint */
|
||||
Buffer_StoreElement(&Rx_Buffer, Endpoint_Read_Byte());
|
||||
|
||||
/* Run the given command once enough data is available. */
|
||||
if (Rx_Buffer.Elements)
|
||||
{
|
||||
const uint8_t ZeroDataByteCommands[] = {'P', 'a', 'm', 'R', 'd', 'e', 'L', 's', 't', 'S', 'V', 'v', 'p', 'F'};
|
||||
const uint8_t OneDataByteCommands[] = {'T', 'c', 'C', 'D', 'l', 'f', 'x', 'y'};
|
||||
const uint8_t TwoDataByteCommands[] = {'A', 'Z'};
|
||||
const uint8_t ThreeDataByteCommands[] = {':'};
|
||||
const uint8_t FourDataByteCommands[] = {'.'};
|
||||
|
||||
const struct
|
||||
{
|
||||
const uint8_t TotalCommands;
|
||||
const uint8_t* CommandBytes;
|
||||
} AVR910Commands[] = {{sizeof(ZeroDataByteCommands), ZeroDataByteCommands},
|
||||
{sizeof(OneDataByteCommands), OneDataByteCommands},
|
||||
{sizeof(TwoDataByteCommands), TwoDataByteCommands},
|
||||
{sizeof(ThreeDataByteCommands), ThreeDataByteCommands},
|
||||
{sizeof(FourDataByteCommands), FourDataByteCommands}};
|
||||
|
||||
/* Determine the data length of the issued command */
|
||||
uint8_t CommandDataLength = (Rx_Buffer.Elements - 1);
|
||||
|
||||
/* Loop through each of the possible command bytes allowable from the given command data length */
|
||||
for (uint8_t CurrentCommand = 0; CurrentCommand < AVR910Commands[CommandDataLength].TotalCommands; CurrentCommand++)
|
||||
{
|
||||
/* If issues command matches an allowable command, process it */
|
||||
if (Buffer_PeekElement(&Rx_Buffer) == AVR910Commands[CommandDataLength].CommandBytes[CurrentCommand])
|
||||
processHostSPIRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear the endpoint buffer */
|
||||
Endpoint_ClearCurrentBank();
|
||||
}
|
||||
|
||||
/* Select the Serial Tx Endpoint */
|
||||
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
|
||||
|
||||
/* Check if the Tx buffer contains anything to be sent to the host */
|
||||
if (Tx_Buffer.Elements)
|
||||
{
|
||||
/* Wait until Serial Tx Endpoint Ready for Read/Write */
|
||||
while (!(Endpoint_ReadWriteAllowed()));
|
||||
|
||||
/* Check before sending the data if the endpoint is completely full */
|
||||
bool IsFull = (Endpoint_BytesInEndpoint() == CDC_TXRX_EPSIZE);
|
||||
|
||||
/* Write the transmission buffer contents to the received data endpoint */
|
||||
while (Tx_Buffer.Elements && (Endpoint_BytesInEndpoint() < CDC_TXRX_EPSIZE))
|
||||
Endpoint_Write_Byte(Buffer_GetElement(&Tx_Buffer));
|
||||
|
||||
/* Send the data */
|
||||
Endpoint_ClearCurrentBank();
|
||||
|
||||
/* If a full endpoint was sent, we need to send an empty packet afterwards to terminate the transfer */
|
||||
if (IsFull)
|
||||
{
|
||||
/* Wait until Serial Tx Endpoint Ready for Read/Write */
|
||||
while (!(Endpoint_ReadWriteAllowed()));
|
||||
|
||||
/* Send an empty packet to terminate the transfer */
|
||||
Endpoint_ClearCurrentBank();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to
|
||||
* log to a serial port, or anything else that is suitable for status updates.
|
||||
*
|
||||
* \param CurrentStatus Current status of the system, from the USBtoSerial_StatusCodes_t enum
|
||||
*/
|
||||
void UpdateStatus(uint8_t CurrentStatus)
|
||||
{
|
||||
uint8_t LEDMask = LEDS_NO_LEDS;
|
||||
|
||||
/* Set the LED mask to the appropriate LED mask based on the given status code */
|
||||
switch (CurrentStatus)
|
||||
{
|
||||
case Status_USBNotReady:
|
||||
LEDMask = (LEDS_LED1);
|
||||
break;
|
||||
case Status_USBEnumerating:
|
||||
LEDMask = (LEDS_LED1 | LEDS_LED2);
|
||||
break;
|
||||
case Status_USBReady:
|
||||
LEDMask = (LEDS_LED2 | LEDS_LED4);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set the board LEDs to the new LED mask */
|
||||
LEDs_SetAllLEDs(LEDMask);
|
||||
}
|
||||
|
||||
/** Reconfigures SPI to match the current serial port settings issued by the host. */
|
||||
void ReconfigureSPI(void)
|
||||
{
|
||||
uint8_t SPCRmask = (1 << SPE) | (1 << MSTR); // always enable SPI as Master
|
||||
uint8_t SPSRmask = 0;
|
||||
|
||||
/* Determine stop bits - 1.5 stop bits is set as 1 stop bit due to hardware limitations */
|
||||
/* For SPI, determine whether format is LSB or MSB */
|
||||
if (LineCoding.CharFormat == TwoStopBits) {
|
||||
SPCRmask |= (1 << DORD);
|
||||
} else if (LineCoding.CharFormat == OneStopBit) {
|
||||
SPCRmask |= (0 << DORD);
|
||||
}
|
||||
|
||||
/* Determine data size - 5, 6, 7, or 8 bits are supported */
|
||||
/* Changing line coding changes SPI Mode
|
||||
CPOL=0, CPHA=0 Sample (Rising) Setup (Falling) SPI-Mode0 == 8 bits line coding
|
||||
CPOL=0, CPHA=1 Setup (Rising) Sample (Falling) SPI-Mode1 == 7 bits line coding
|
||||
CPOL=1, CPHA=0 Sample (Falling) Setup (Rising) SPI-Mode2 == 6 bits line coding
|
||||
CPOL=1, CPHA=1 Setup (Falling) Sample (Rising) SPI-Mode3 == 5 bits line coding
|
||||
*/
|
||||
if (LineCoding.DataBits == 5) {
|
||||
SPCRmask |= ((1 << CPOL) | (1 << CPHA));
|
||||
} else if (LineCoding.DataBits == 6) {
|
||||
SPCRmask |= ((1 << CPOL) | (0 << CPHA));
|
||||
} else if (LineCoding.DataBits == 7) {
|
||||
SPCRmask |= ((0 << CPOL) | (1 << CPHA));
|
||||
} else if (LineCoding.DataBits == 8) {
|
||||
SPCRmask |= ((0 << CPOL) | (0 << CPHA));
|
||||
}
|
||||
|
||||
|
||||
/* Set the USART baud rate register to the desired baud rate value */
|
||||
/* also alter the SPI speed via value of baud rate */
|
||||
if (LineCoding.BaudRateBPS == 9600) { // 2Mhz SPI (Fosc / 4)
|
||||
SPCRmask |= ((0 << SPR1) | (0 << SPR0));
|
||||
SPSRmask |= (0 << SPI2X);
|
||||
} else if (LineCoding.BaudRateBPS == 14400) { // 1Mhz SPI (Fosc / 8)
|
||||
SPCRmask |= ((0 << SPR1) | (1 << SPR0));
|
||||
SPSRmask |= (1 << SPI2X);
|
||||
} else if (LineCoding.BaudRateBPS == 57600) { // 500kHz SPI (Fosc / 16)
|
||||
SPCRmask |= ((0 << SPR1) | (1 << SPR0));
|
||||
SPSRmask |= (0 << SPI2X);
|
||||
} else if (LineCoding.BaudRateBPS == 38400) { // 250kHz SPI (Fosc / 32)
|
||||
SPCRmask |= ((1 << SPR1) | (0 << SPR0));
|
||||
SPSRmask |= (1 << SPI2X);
|
||||
} else if (LineCoding.BaudRateBPS == 19200) { // 125kHz SPI (Fosc / 64)
|
||||
SPCRmask |= ((1 << SPR1) | (0 << SPR0));
|
||||
SPSRmask |= (0 << SPI2X);
|
||||
} else if (LineCoding.BaudRateBPS == 115200) { // 62.5kHz SPI (Fosc / 128)
|
||||
SPCRmask |= ((1 << SPR1) | (1 << SPR0));
|
||||
SPSRmask |= (0 << SPI2X);
|
||||
}
|
||||
|
||||
SPCR = SPCRmask;
|
||||
SPSR = SPSRmask;
|
||||
}
|
||||
|
||||
|
||||
/* process data according to AVR910 protocol */
|
||||
void processHostSPIRequest(void) {
|
||||
|
||||
uint8_t readByte1 = 0;
|
||||
uint8_t readByte2 = 0;
|
||||
uint8_t readByte3 = 0;
|
||||
uint8_t readByte4 = 0;
|
||||
uint8_t firstByte = 0;
|
||||
|
||||
/* Taken from a90isp_ver23.asm:
|
||||
+-------------+------------+------+
|
||||
;* Commands | Host writes | Host reads | |
|
||||
;* -------- +-----+-------+------+-----+ |
|
||||
;* | ID | data | data | | Note |
|
||||
;* +-----------------------------------+-----+-------+------+-----+------+
|
||||
;* | Enter programming mode | 'P' | | | 13d | 1 |
|
||||
;* | Report autoincrement address | 'a' | | | 'Y' | |
|
||||
;* | Set address | 'A' | ah al | | 13d | 2 |
|
||||
;* | Write program memory, low byte | 'c' | dd | | 13d | 3 |
|
||||
;* | Write program memory, high byte | 'C' | dd | | 13d | 3 |
|
||||
;* | Issue Page Write | 'm' | | | 13d | |
|
||||
;* | Read program memory | 'R' | |dd(dd)| | 4 |
|
||||
;* | Write data memory | 'D' | dd | | 13d | |
|
||||
;* | Read data memory | 'd' | | dd | | |
|
||||
;* | Chip erase | 'e' | | | 13d | |
|
||||
;* | Write lock bits | 'l' | dd | | 13d | |
|
||||
;* | Write fuse bits | 'f' | dd | | 13d | 11 |
|
||||
;* | Read fuse and lock bits | 'F' | | dd | | 11 |
|
||||
;* | Leave programming mode | 'L' | | | 13d | 5 |
|
||||
;* | Select device type | 'T' | dd | | 13d | 6 |
|
||||
;* | Read signature bytes | 's' | | 3*dd | | |
|
||||
;* | Return supported device codes | 't' | | n*dd | 00d | 7 |
|
||||
;* | Return software identifier | 'S' | | s[7] | | 8 |
|
||||
;* | Return sofware version | 'V' | |dd dd | | 9 |
|
||||
;* | Return hardware version | 'v' | |dd dd | | 9 |
|
||||
;* | Return programmer type | 'p' | | dd | | 10 |
|
||||
;* | Set LED | 'x' | dd | | 13d | 12 |
|
||||
;* | Clear LED | 'y' | dd | | 13d | 12 |
|
||||
;* | Universial command | ':' | 3*dd | dd | 13d | |
|
||||
;* | New universal command | '.' | 4*dd | dd | 13d | |
|
||||
;* | Special test command | 'Z' | 2*dd | dd | | |
|
||||
*/
|
||||
|
||||
firstByte = Buffer_GetElement(&Rx_Buffer);
|
||||
Buffer_Initialize(&Tx_Buffer); // make sure the buffer is clear before proceeding
|
||||
|
||||
if (firstByte == 'P') { // enter Programming mode
|
||||
// enable SPI -- already done
|
||||
// enter programming mode on target:
|
||||
//PORTB = 0; // set clock to zero
|
||||
RESETPORT = (1 << RESETPIN); // set RESET pin on target to 1
|
||||
RESETPORT2 = (1 << RESETPIN2);
|
||||
_delay_ms(DELAY_SHORT);
|
||||
//RESETPORT = (RESETPORT & ~(1 << RESETPIN)); // set RESET pin on target to 0 - Active
|
||||
RESETPORT = 0x00;
|
||||
RESETPORT2 = 0;
|
||||
_delay_ms(DELAY_SHORT);
|
||||
SPI_SendByte(0xAC);
|
||||
SPI_SendByte(0x53);
|
||||
SPI_SendByte(0x00);
|
||||
SPI_SendByte(0x00);
|
||||
_delay_ms(DELAY_VERYSHORT);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'T') { // Select device type
|
||||
Buffer_GetElement(&Rx_Buffer); // set device type
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'a') { // Report autoincrement address
|
||||
Buffer_StoreElement(&Tx_Buffer, 'Y'); // return 'Y' - Auto-increment enabled
|
||||
|
||||
} else if (firstByte == 'A') { //Load Address
|
||||
// get two bytes over serial and set currAddress to them
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer); // high byte
|
||||
readByte2 = Buffer_GetElement(&Rx_Buffer); // low byte
|
||||
currAddress = (readByte1 << 8) | (readByte2);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'c') { // Write program memory, low byte
|
||||
// send 4 bytes over SPI; 0x40, then Address High Byte, then Low, then data
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
SPI_SendByte(0x40);
|
||||
SPI_SendByte((currAddress >> 8)); // high byte
|
||||
SPI_SendByte((currAddress)); // low byte
|
||||
SPI_SendByte(readByte1); // data
|
||||
_delay_ms(DELAY_MEDIUM); // certain MCUs require a delay of about 24585 cycles
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'C') { // Write program memory, high byte
|
||||
// send 4 bytes over SPI; 0x48, then Address High Byte, then Low, then data
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
SPI_SendByte(0x48);
|
||||
SPI_SendByte((currAddress >> 8)); // high byte
|
||||
SPI_SendByte((currAddress)); // low byte
|
||||
SPI_SendByte(readByte1); // data
|
||||
currAddress++; // increment currAddress
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'm') { // Write Program Memory Page
|
||||
// send 4 bytes over SPI; 0x4c, then Address High Byte, then Low, then 0x00
|
||||
SPI_SendByte(0x4C);
|
||||
SPI_SendByte((currAddress >> 8)); // high byte
|
||||
SPI_SendByte((currAddress)); // low byte
|
||||
SPI_SendByte(0x00);
|
||||
_delay_ms(DELAY_LONG);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'R') { // Read Program Memory
|
||||
// send 4 bytes over SPI; 0x28, then Address High Byte, then Low, then send back read data from 4th byte over serial
|
||||
SPI_SendByte(0x28);
|
||||
SPI_SendByte((currAddress >> 8)); // high byte
|
||||
SPI_SendByte((currAddress)); // low byte
|
||||
readByte1 = SPI_TransferByte(0x00); // read in data
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte1);
|
||||
// send 4 bytes over SPI; 0x20, then Address High Byte, then Low, then send back read data from 4th byte over serial
|
||||
SPI_SendByte(0x20);
|
||||
SPI_SendByte((currAddress >> 8)); // high byte
|
||||
SPI_SendByte((currAddress)); // low byte
|
||||
readByte2 = SPI_TransferByte(0x00); // read in data
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte2);
|
||||
currAddress++; // increment currAddress
|
||||
|
||||
} else if (firstByte == 'D') { // Write Data Memory
|
||||
// send 4 bytes over SPI; 0xc0, then Address High Byte, then Low, then data
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
SPI_SendByte(0xC0);
|
||||
SPI_SendByte((currAddress >> 8)); // high byte
|
||||
SPI_SendByte((currAddress)); // low byte
|
||||
SPI_SendByte(readByte1); // data
|
||||
_delay_ms(DELAY_MEDIUM);
|
||||
currAddress++; // increment currAddress
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'd') { // Read Data Memory
|
||||
// send 4 bytes over SPI; 0xa0, then Address High Byte, then Low, then send back read data from 4th byte over serial
|
||||
SPI_SendByte(0xA0);
|
||||
SPI_SendByte((currAddress >> 8)); // high byte
|
||||
SPI_SendByte((currAddress)); // low byte
|
||||
readByte1 = SPI_TransferByte(0x00); // read in data
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte1);
|
||||
currAddress++; // increment currAddress
|
||||
|
||||
} else if (firstByte == 'e') { // erase the target device
|
||||
// send 4 bytes over SPI; 0xac, 0x80, 0x04, 0x00
|
||||
SPI_SendByte(0xAC);
|
||||
SPI_SendByte(0x80);
|
||||
SPI_SendByte(0x04);
|
||||
SPI_SendByte(0x00);
|
||||
_delay_ms(DELAY_LONG);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'l') { // write lock bits
|
||||
// send 4 bytes over SPI; 0xac, [andi s_data 0x06], 0xe0, 0x00
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer); // read in lock bits data
|
||||
SPI_SendByte(0xAC);
|
||||
SPI_SendByte(((0x06 & readByte1) | 0xE0)); // TODO - is this correct???
|
||||
SPI_SendByte(0x00);
|
||||
SPI_SendByte(0x00);
|
||||
_delay_ms(DELAY_MEDIUM);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'f') { // write fuse bits
|
||||
// ignore this command, but need to remove data from the receive buffer
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'L') { // leave programming mode
|
||||
RESETPORT |= (1 << RESETPIN); // set RESET pin on target to 1
|
||||
RESETPORT2 |= (1 << RESETPIN2); // set RESET pin on target to 1
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 's') { // Read signature bytes
|
||||
// send 4 bytes over SPI; 0x30, 0x00, 0x02, read and send last byte over serial
|
||||
SPI_SendByte(0x30);
|
||||
SPI_SendByte(0x00);
|
||||
SPI_SendByte(0x02);
|
||||
readByte1 = SPI_TransferByte(0x00); // read in data
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte1);
|
||||
SPI_SendByte(0x30);
|
||||
SPI_SendByte(0x00);
|
||||
SPI_SendByte(0x01);
|
||||
readByte1 = SPI_TransferByte(0x00); // read in data
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte1);
|
||||
SPI_SendByte(0x30);
|
||||
SPI_SendByte(0x00);
|
||||
SPI_SendByte(0x00);
|
||||
readByte1 = SPI_TransferByte(0x00); // read in data
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte1);
|
||||
|
||||
} else if (firstByte == 't') { // Return supported device codes
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE01);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE02);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE03);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE04);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE05);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE06);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE07);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE08);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE09);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE10);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE11);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE12);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE13);
|
||||
Buffer_StoreElement(&Tx_Buffer, AVRDEVCODE14);
|
||||
Buffer_StoreElement(&Tx_Buffer, 0x00);
|
||||
|
||||
} else if (firstByte == 'S') { // Return software identifier
|
||||
// return string[7] with "AVR ISP"
|
||||
Buffer_StoreElement(&Tx_Buffer, 'A');
|
||||
Buffer_StoreElement(&Tx_Buffer, 'V');
|
||||
Buffer_StoreElement(&Tx_Buffer, 'R');
|
||||
Buffer_StoreElement(&Tx_Buffer, 0x20);
|
||||
Buffer_StoreElement(&Tx_Buffer, 'I');
|
||||
Buffer_StoreElement(&Tx_Buffer, 'S');
|
||||
Buffer_StoreElement(&Tx_Buffer, 'P');
|
||||
|
||||
} else if (firstByte == 'V') { // Return sofware version
|
||||
//return two bytes, software Major then Minor
|
||||
Buffer_StoreElement(&Tx_Buffer, '2');
|
||||
Buffer_StoreElement(&Tx_Buffer, '3');
|
||||
|
||||
} else if (firstByte == 'v') { // Return hardware version
|
||||
//return two bytes, hardware Major then Minor
|
||||
Buffer_StoreElement(&Tx_Buffer, ('1'));
|
||||
Buffer_StoreElement(&Tx_Buffer, ('0'));
|
||||
|
||||
} else if (firstByte == 'p') { // Return programmer type
|
||||
// return 'S' for Serial Programmer
|
||||
Buffer_StoreElement(&Tx_Buffer, 'S');
|
||||
|
||||
} else if (firstByte == 'x') { // set LED
|
||||
// ignore this command, but need to remove data from the receive buffer
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'y') { // clear LED
|
||||
// ignore this command, but need to remove data from the receive buffer
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == ':') { // Universal Command
|
||||
// get 3 bytes over serial
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
readByte2 = Buffer_GetElement(&Rx_Buffer);
|
||||
readByte3 = Buffer_GetElement(&Rx_Buffer);
|
||||
SPI_SendByte(readByte1);
|
||||
SPI_SendByte(readByte2);
|
||||
SPI_SendByte(readByte3);
|
||||
readByte1 = SPI_TransferByte(0x00);
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte1);
|
||||
_delay_ms(DELAY_MEDIUM);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == '.') { // New Universal Command
|
||||
// get 4 bytes over serial
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
readByte2 = Buffer_GetElement(&Rx_Buffer);
|
||||
readByte3 = Buffer_GetElement(&Rx_Buffer);
|
||||
readByte4 = Buffer_GetElement(&Rx_Buffer);
|
||||
SPI_SendByte(readByte1);
|
||||
SPI_SendByte(readByte2);
|
||||
SPI_SendByte(readByte3);
|
||||
readByte1 = SPI_TransferByte(readByte4);
|
||||
Buffer_StoreElement(&Tx_Buffer, readByte1);
|
||||
_delay_ms(DELAY_MEDIUM);
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
|
||||
} else if (firstByte == 'Z') { // Special test command
|
||||
// do nothing, but need to remove data from the receive buffer
|
||||
readByte1 = Buffer_GetElement(&Rx_Buffer);
|
||||
readByte2 = Buffer_GetElement(&Rx_Buffer);
|
||||
|
||||
} else {
|
||||
// do nothing, but need to return with a carriage return
|
||||
Buffer_StoreElement(&Tx_Buffer, CR_HEX); // return carriage return (CR_HEX) if successful
|
||||
}
|
||||
}
|
||||
|
|
@ -1,195 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2009.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
and its documentation for any purpose and without fee is hereby
|
||||
granted, provided that the above copyright notice appear in all
|
||||
copies and that both that the copyright notice and this
|
||||
permission notice and warranty disclaimer appear in supporting
|
||||
documentation, and that the name of the author not be used in
|
||||
advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
The author disclaim all warranties with regard to this
|
||||
software, including all implied warranties of merchantability
|
||||
and fitness. In no event shall the author be liable for any
|
||||
special, indirect or consequential damages or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether
|
||||
in an action of contract, negligence or other tortious action,
|
||||
arising out of or in connection with the use or performance of
|
||||
this software.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
* Header file for USBtoSerial.c.
|
||||
*/
|
||||
|
||||
#ifndef _AVRISP_PROGRAMMER_H_
|
||||
#define _AVRISP_PROGRAMMER_H_
|
||||
|
||||
/* Includes: */
|
||||
#include <avr/io.h>
|
||||
#include <avr/wdt.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/power.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
#include "Descriptors.h"
|
||||
#include "RingBuff.h"
|
||||
|
||||
#include <LUFA/Version.h> // Library Version Information
|
||||
#include <LUFA/Common/ButtLoadTag.h> // PROGMEM tags readable by the ButtLoad project
|
||||
#include <LUFA/Drivers/USB/USB.h> // USB Functionality
|
||||
#include <LUFA/Drivers/AT90USBXXX/SPI.h> // SPI driver
|
||||
#include <LUFA/Drivers/Board/LEDs.h> // LEDs driver
|
||||
#include <LUFA/Scheduler/Scheduler.h> // Simple scheduler for task management
|
||||
|
||||
/* Macros: */
|
||||
/** CDC Class specific request to get the current virtual serial port configuration settings. */
|
||||
#define REQ_GetLineEncoding 0x21
|
||||
|
||||
/** CDC Class specific request to set the current virtual serial port configuration settings. */
|
||||
#define REQ_SetLineEncoding 0x20
|
||||
|
||||
/** CDC Class specific request to set the current virtual serial port handshake line states. */
|
||||
#define REQ_SetControlLineState 0x22
|
||||
|
||||
/** Notification type constant for a change in the virtual serial port handshake line states, for
|
||||
* use with a USB_Notification_Header_t notification structure when sent to the host via the CDC
|
||||
* notification endpoint.
|
||||
*/
|
||||
#define NOTIF_SerialState 0x20
|
||||
|
||||
/** Mask for the DTR handshake line for use with the REQ_SetControlLineState class specific request
|
||||
* from the host, to indicate that the DTR line state should be high.
|
||||
*/
|
||||
#define CONTROL_LINE_OUT_DTR (1 << 0)
|
||||
|
||||
/** Mask for the RTS handshake line for use with the REQ_SetControlLineState class specific request
|
||||
* from the host, to indicate that theRTS line state should be high.
|
||||
*/
|
||||
#define CONTROL_LINE_OUT_RTS (1 << 1)
|
||||
|
||||
/** Mask for the DCD handshake line for use with the a NOTIF_SerialState class specific notification
|
||||
* from the device to the host, to indicate that the DCD line state is currently high.
|
||||
*/
|
||||
#define CONTROL_LINE_IN_DCD (1 << 0)
|
||||
|
||||
/** Mask for the DSR handshake line for use with the a NOTIF_SerialState class specific notification
|
||||
* from the device to the host, to indicate that the DSR line state is currently high.
|
||||
*/
|
||||
#define CONTROL_LINE_IN_DSR (1 << 1)
|
||||
|
||||
/** Mask for the BREAK handshake line for use with the a NOTIF_SerialState class specific notification
|
||||
* from the device to the host, to indicate that the BREAK line state is currently high.
|
||||
*/
|
||||
#define CONTROL_LINE_IN_BREAK (1 << 2)
|
||||
|
||||
/** Mask for the RING handshake line for use with the a NOTIF_SerialState class specific notification
|
||||
* from the device to the host, to indicate that the RING line state is currently high.
|
||||
*/
|
||||
#define CONTROL_LINE_IN_RING (1 << 3)
|
||||
|
||||
/** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host,
|
||||
* to indicate that a framing error has ocurred on the virtual serial port.
|
||||
*/
|
||||
#define CONTROL_LINE_IN_FRAMEERROR (1 << 4)
|
||||
|
||||
/** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host,
|
||||
* to indicate that a parity error has ocurred on the virtual serial port.
|
||||
*/
|
||||
#define CONTROL_LINE_IN_PARITYERROR (1 << 5)
|
||||
|
||||
/** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host,
|
||||
* to indicate that a data overrun error has ocurred on the virtual serial port.
|
||||
*/
|
||||
#define CONTROL_LINE_IN_OVERRUNERROR (1 << 6)
|
||||
|
||||
/* Event Handlers: */
|
||||
/** Indicates that this module will catch the USB_Connect event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Connect);
|
||||
|
||||
/** Indicates that this module will catch the USB_Disconnect event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_Disconnect);
|
||||
|
||||
/** Indicates that this module will catch the USB_ConfigurationChanged event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_ConfigurationChanged);
|
||||
|
||||
/** Indicates that this module will catch the USB_UnhandledControlPacket event when thrown by the library. */
|
||||
HANDLES_EVENT(USB_UnhandledControlPacket);
|
||||
|
||||
/* Type Defines: */
|
||||
/** Type define for the virtual serial port line encoding settings, for storing the current USART configuration
|
||||
* as set by the host via a class specific request.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second */
|
||||
uint8_t CharFormat; /**< Character format of the virtual serial port, a value from the
|
||||
* CDCDevice_CDC_LineCodingFormats_t enum
|
||||
*/
|
||||
uint8_t ParityType; /**< Parity setting of the virtual serial port, a value from the
|
||||
* CDCDevice_LineCodingParity_t enum
|
||||
*/
|
||||
uint8_t DataBits; /**< Bits of data per charater of the virtual serial port */
|
||||
} CDC_Line_Coding_t;
|
||||
|
||||
/** Type define for a CDC notification, sent to the host via the CDC notification endpoint to indicate a
|
||||
* change in the device state asynchronously.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t NotificationType; /**< Notification type, a mask of REQDIR_*, REQTYPE_* and REQREC_* constants
|
||||
* from the library StdRequestType.h header
|
||||
*/
|
||||
uint8_t Notification; /**< Notification value, a NOTIF_* constant */
|
||||
uint16_t wValue; /**< Notification wValue, notification-specific */
|
||||
uint16_t wIndex; /**< Notification wIndex, notification-specific */
|
||||
uint16_t wLength; /**< Notification wLength, notification-specific */
|
||||
} USB_Notification_Header_t;
|
||||
|
||||
/* Enums: */
|
||||
/** Enum for the possible line encoding formats of a virtual serial port. */
|
||||
enum CDCDevice_CDC_LineCodingFormats_t
|
||||
{
|
||||
OneStopBit = 0, /**< Each frame contains one stop bit */
|
||||
OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits */
|
||||
TwoStopBits = 2, /**< Each frame contains two stop bits */
|
||||
};
|
||||
|
||||
/** Enum for the possible line encoding parity settings of a virtual serial port. */
|
||||
enum CDCDevice_LineCodingParity_t
|
||||
{
|
||||
Parity_None = 0, /**< No parity bit mode on each frame */
|
||||
Parity_Odd = 1, /**< Odd parity bit mode on each frame */
|
||||
Parity_Even = 2, /**< Even parity bit mode on each frame */
|
||||
Parity_Mark = 3, /**< Mark parity bit mode on each frame */
|
||||
Parity_Space = 4, /**< Space parity bit mode on each frame */
|
||||
};
|
||||
|
||||
/** Enum for the possible status codes for passing to the UpdateStatus() function. */
|
||||
enum USBtoSerial_StatusCodes_t
|
||||
{
|
||||
Status_USBNotReady = 0, /**< USB is not ready (disconnected from a USB host) */
|
||||
Status_USBEnumerating = 1, /**< USB interface is enumerating */
|
||||
Status_USBReady = 2, /**< USB interface is connected and ready */
|
||||
};
|
||||
|
||||
/* Tasks: */
|
||||
TASK(CDC_Task);
|
||||
|
||||
/* Function Prototypes: */
|
||||
void ReconfigureSPI(void);
|
||||
void UpdateStatus(uint8_t CurrentStatus);
|
||||
void processHostSPIRequest(void);
|
||||
|
||||
#endif
|
|
@ -1,89 +0,0 @@
|
|||
/** \file
|
||||
*
|
||||
* This file contains special DoxyGen information for the generation of the main page and other special
|
||||
* documentation pages. It is not a project source file.
|
||||
*/
|
||||
|
||||
/** \mainpage AVRISP_Programmer
|
||||
*
|
||||
* Communications Device Class demonstration application.
|
||||
* This gives a simple reference application for implementing
|
||||
* a USB to Serial converter using the CDC class. Data communicated
|
||||
* over the USB Virtual Serial Port according to Atmel's AVR910
|
||||
* protocol is used to program AVR MCUs that are
|
||||
* "In-System Programmable via SPI Port".
|
||||
*
|
||||
* After running this firmware for the first time on a new computer,
|
||||
* you will need to supply the .INF file located in this demo
|
||||
* project's directory as the device's driver when running under
|
||||
* Windows. This will enable Windows to use its inbuilt CDC drivers,
|
||||
* negating the need for custom drivers for the device. Other
|
||||
* Operating Systems should automatically use their own inbuilt
|
||||
* CDC-ACM drivers.
|
||||
*
|
||||
* Usage:
|
||||
* avrdude -vv -F -P COM7 -c avr910 -p t261
|
||||
* Note -F flag which overrides signature check and enables programming
|
||||
* of any "In-System Programmable via SPI Port" AVR MCU. Part number,
|
||||
* t261, should be set to your target device.
|
||||
* avrdude -vv -F -P COM7 -c avr910 -p t261 -U flash:w:PROG.hex
|
||||
* PROG.hex is the hex file to program your t261 AVR with
|
||||
* avrdude -vv -F -P COM7 -b 115200 -c avr910 -p t261 -U flash:w:test.hex
|
||||
* The -b 115200 sets the SPI clock to 62.5kHz from the default 125kHz and may
|
||||
* work when the default programming speed fails.
|
||||
* AVROSP.exe -dATtiny261 -cCOM7 -rf
|
||||
* AVRosp is the Open Source AVR ISP Programming Software available from Atmel.com
|
||||
*
|
||||
* Note: on Linux systems, COM7 should be replaced with someting like /dev/ttyACM0
|
||||
* You can determine this value by running dmesg after plugging in the device
|
||||
* Note: you must RESET the programmer after each use (AVRdude session).
|
||||
*
|
||||
* Note: If you experience errors with older devices, try changing DELAY_LONG
|
||||
* to a larger value, such as 0xFF in AVRISP_Programmer.c
|
||||
*
|
||||
* MISO, MOSI, and SCK are connected directly from the AVRopendous board
|
||||
* to the pin of the same functionality on the target. RESET pin on the target
|
||||
* can be connected either to SS (PB0), or PC2. Do not have any other pins
|
||||
* connected - especially HWB pin, to avoid unintentional behaviour.
|
||||
*
|
||||
* AVR910 functionality was overlayed on USBtoSerial functionality.
|
||||
* Keep this in mind when looking over the code.
|
||||
* Default target speed is 125kHz and corresponds to 19200 baud, which
|
||||
* is the default setting for AVRdude.
|
||||
*
|
||||
* Changing "Baud-Rate" will change the SPI speed. Defualt SPI clock speed
|
||||
* is 8Mhz / 4 = 2MHz. 8Mhz is the device clock speed. This is the setting at
|
||||
* 9600 baud. The following is a table of baud-rate vs. SPI Speed that will result
|
||||
* 9600 = 2Mhz
|
||||
* 14400 = 1MHz
|
||||
* 19200 = 125kHz (AVRdude Default)
|
||||
* 38400 = 250kHz
|
||||
* 57600 = 500kHz
|
||||
* 115200 = 62.5kHz
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>USB Mode:</b></td>
|
||||
* <td>Device</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>USB Class:</b></td>
|
||||
* <td>Communications Device Class (CDC)</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>USB Subclass:</b></td>
|
||||
* <td>Abstract Control Model (ACM)</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>Relevant Standards:</b></td>
|
||||
* <td>USBIF CDC Class Standard</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>Usable Speeds:</b></td>
|
||||
* <td>Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
Binary file not shown.
Before Width: | Height: | Size: 73 KiB |
|
@ -1,263 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2009.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
and its documentation for any purpose and without fee is hereby
|
||||
granted, provided that the above copyright notice appear in all
|
||||
copies and that both that the copyright notice and this
|
||||
permission notice and warranty disclaimer appear in supporting
|
||||
documentation, and that the name of the author not be used in
|
||||
advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
The author disclaim all warranties with regard to this
|
||||
software, including all implied warranties of merchantability
|
||||
and fitness. In no event shall the author be liable for any
|
||||
special, indirect or consequential damages or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether
|
||||
in an action of contract, negligence or other tortious action,
|
||||
arising out of or in connection with the use or performance of
|
||||
this software.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
* USB Device Descriptors, for library use when in USB device mode. Descriptors are special
|
||||
* computer-readable structures which the host requests upon device enumeration, to determine
|
||||
* the device's capabilities and functions.
|
||||
*/
|
||||
|
||||
#include "Descriptors.h"
|
||||
|
||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
|
||||
* device characteristics, including the supported USB version, control endpoint size and the
|
||||
* number of device configurations. The descriptor is read out by the USB host when the enumeration
|
||||
* process begins.
|
||||
*/
|
||||
USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
|
||||
{
|
||||
Header: {Size: sizeof(USB_Descriptor_Device_t), Type: DTYPE_Device},
|
||||
|
||||
USBSpecification: VERSION_BCD(01.10),
|
||||
Class: 0x02,
|
||||
SubClass: 0x00,
|
||||
Protocol: 0x00,
|
||||
|
||||
Endpoint0Size: 8,
|
||||
|
||||
VendorID: 0x03EB,
|
||||
ProductID: 0x204F,
|
||||
ReleaseNumber: 0x0000,
|
||||
|
||||
ManufacturerStrIndex: 0x01,
|
||||
ProductStrIndex: 0x02,
|
||||
SerialNumStrIndex: NO_DESCRIPTOR,
|
||||
|
||||
NumberOfConfigurations: 1
|
||||
};
|
||||
|
||||
/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
|
||||
* of the device in one of its supported configurations, including information about any device interfaces
|
||||
* and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
|
||||
* a configuration so that the host may correctly communicate with the USB device.
|
||||
*/
|
||||
USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
||||
{
|
||||
Config:
|
||||
{
|
||||
Header: {Size: sizeof(USB_Descriptor_Configuration_Header_t), Type: DTYPE_Configuration},
|
||||
|
||||
TotalConfigurationSize: sizeof(USB_Descriptor_Configuration_t),
|
||||
TotalInterfaces: 2,
|
||||
|
||||
ConfigurationNumber: 1,
|
||||
ConfigurationStrIndex: NO_DESCRIPTOR,
|
||||
|
||||
ConfigAttributes: (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED),
|
||||
|
||||
MaxPowerConsumption: USB_CONFIG_POWER_MA(100)
|
||||
},
|
||||
|
||||
CCI_Interface:
|
||||
{
|
||||
Header: {Size: sizeof(USB_Descriptor_Interface_t), Type: DTYPE_Interface},
|
||||
|
||||
InterfaceNumber: 0,
|
||||
AlternateSetting: 0,
|
||||
|
||||
TotalEndpoints: 1,
|
||||
|
||||
Class: 0x02,
|
||||
SubClass: 0x02,
|
||||
Protocol: 0x01,
|
||||
|
||||
InterfaceStrIndex: NO_DESCRIPTOR
|
||||
},
|
||||
|
||||
CDC_Functional_IntHeader:
|
||||
{
|
||||
Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), Type: 0x24},
|
||||
SubType: 0x00,
|
||||
|
||||
Data: {0x01, 0x10}
|
||||
},
|
||||
|
||||
CDC_Functional_CallManagement:
|
||||
{
|
||||
Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), Type: 0x24},
|
||||
SubType: 0x01,
|
||||
|
||||
Data: {0x03, 0x01}
|
||||
},
|
||||
|
||||
CDC_Functional_AbstractControlManagement:
|
||||
{
|
||||
Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), Type: 0x24},
|
||||
SubType: 0x02,
|
||||
|
||||
Data: {0x06}
|
||||
},
|
||||
|
||||
CDC_Functional_Union:
|
||||
{
|
||||
Header: {Size: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), Type: 0x24},
|
||||
SubType: 0x06,
|
||||
|
||||
Data: {0x00, 0x01}
|
||||
},
|
||||
|
||||
ManagementEndpoint:
|
||||
{
|
||||
Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
|
||||
|
||||
EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM),
|
||||
Attributes: EP_TYPE_INTERRUPT,
|
||||
EndpointSize: CDC_NOTIFICATION_EPSIZE,
|
||||
PollingIntervalMS: 0xFF
|
||||
},
|
||||
|
||||
DCI_Interface:
|
||||
{
|
||||
Header: {Size: sizeof(USB_Descriptor_Interface_t), Type: DTYPE_Interface},
|
||||
|
||||
InterfaceNumber: 1,
|
||||
AlternateSetting: 0,
|
||||
|
||||
TotalEndpoints: 2,
|
||||
|
||||
Class: 0x0A,
|
||||
SubClass: 0x00,
|
||||
Protocol: 0x00,
|
||||
|
||||
InterfaceStrIndex: NO_DESCRIPTOR
|
||||
},
|
||||
|
||||
DataOutEndpoint:
|
||||
{
|
||||
Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
|
||||
|
||||
EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM),
|
||||
Attributes: EP_TYPE_BULK,
|
||||
EndpointSize: CDC_TXRX_EPSIZE,
|
||||
PollingIntervalMS: 0x00
|
||||
},
|
||||
|
||||
DataInEndpoint:
|
||||
{
|
||||
Header: {Size: sizeof(USB_Descriptor_Endpoint_t), Type: DTYPE_Endpoint},
|
||||
|
||||
EndpointAddress: (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM),
|
||||
Attributes: EP_TYPE_BULK,
|
||||
EndpointSize: CDC_TXRX_EPSIZE,
|
||||
PollingIntervalMS: 0x00
|
||||
}
|
||||
};
|
||||
|
||||
/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
|
||||
* the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
|
||||
* via the language ID table available at USB.org what languages the device supports for its string descriptors.
|
||||
*/
|
||||
USB_Descriptor_String_t PROGMEM LanguageString =
|
||||
{
|
||||
Header: {Size: USB_STRING_LEN(1), Type: DTYPE_String},
|
||||
|
||||
UnicodeString: {LANGUAGE_ID_ENG}
|
||||
};
|
||||
|
||||
/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
|
||||
* form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
||||
* Descriptor.
|
||||
*/
|
||||
USB_Descriptor_String_t PROGMEM ManufacturerString =
|
||||
{
|
||||
Header: {Size: USB_STRING_LEN(19), Type: DTYPE_String},
|
||||
|
||||
UnicodeString: L"www.AVRopendous.org"
|
||||
};
|
||||
|
||||
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
|
||||
* and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
|
||||
* Descriptor.
|
||||
*/
|
||||
USB_Descriptor_String_t PROGMEM ProductString =
|
||||
{
|
||||
Header: {Size: USB_STRING_LEN(29), Type: DTYPE_String},
|
||||
|
||||
UnicodeString: L"LUFA-Based AVR ISP Programmer"
|
||||
};
|
||||
|
||||
/** This function is called by the library when in device mode, and must be overridden (see StdDescriptors.h
|
||||
* documentation) by the application code so that the address and size of a requested descriptor can be given
|
||||
* to the USB library. When the device recieves a Get Descriptor request on the control endpoint, this function
|
||||
* is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
|
||||
* USB host.
|
||||
*/
|
||||
uint16_t USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)
|
||||
{
|
||||
const uint8_t DescriptorType = (wValue >> 8);
|
||||
const uint8_t DescriptorNumber = (wValue & 0xFF);
|
||||
|
||||
void* Address = NULL;
|
||||
uint16_t Size = NO_DESCRIPTOR;
|
||||
|
||||
switch (DescriptorType)
|
||||
{
|
||||
case DTYPE_Device:
|
||||
Address = DESCRIPTOR_ADDRESS(DeviceDescriptor);
|
||||
Size = sizeof(USB_Descriptor_Device_t);
|
||||
break;
|
||||
case DTYPE_Configuration:
|
||||
Address = DESCRIPTOR_ADDRESS(ConfigurationDescriptor);
|
||||
Size = sizeof(USB_Descriptor_Configuration_t);
|
||||
break;
|
||||
case DTYPE_String:
|
||||
switch (DescriptorNumber)
|
||||
{
|
||||
case 0x00:
|
||||
Address = DESCRIPTOR_ADDRESS(LanguageString);
|
||||
Size = pgm_read_byte(&LanguageString.Header.Size);
|
||||
break;
|
||||
case 0x01:
|
||||
Address = DESCRIPTOR_ADDRESS(ManufacturerString);
|
||||
Size = pgm_read_byte(&ManufacturerString.Header.Size);
|
||||
break;
|
||||
case 0x02:
|
||||
Address = DESCRIPTOR_ADDRESS(ProductString);
|
||||
Size = pgm_read_byte(&ProductString.Header.Size);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
*DescriptorAddress = Address;
|
||||
return Size;
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2009.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
and its documentation for any purpose and without fee is hereby
|
||||
granted, provided that the above copyright notice appear in all
|
||||
copies and that both that the copyright notice and this
|
||||
permission notice and warranty disclaimer appear in supporting
|
||||
documentation, and that the name of the author not be used in
|
||||
advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
The author disclaim all warranties with regard to this
|
||||
software, including all implied warranties of merchantability
|
||||
and fitness. In no event shall the author be liable for any
|
||||
special, indirect or consequential damages or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether
|
||||
in an action of contract, negligence or other tortious action,
|
||||
arising out of or in connection with the use or performance of
|
||||
this software.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
* Header file for Descriptors.c.
|
||||
*/
|
||||
|
||||
#ifndef _DESCRIPTORS_H_
|
||||
#define _DESCRIPTORS_H_
|
||||
|
||||
/* Includes: */
|
||||
#include <LUFA/Drivers/USB/USB.h>
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
/* Macros: */
|
||||
/** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a
|
||||
* uniform structure but variable sized data payloads, thus cannot be represented accurately by
|
||||
* a single typedef struct. A macro is used instead so that functional descriptors can be created
|
||||
* easily by specifying the size of the payload. This allows sizeof() to work correctly.
|
||||
*
|
||||
* \param DataSize Size in bytes of the CDC functional descriptor's data payload
|
||||
*/
|
||||
#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize) \
|
||||
struct \
|
||||
{ \
|
||||
USB_Descriptor_Header_t Header; \
|
||||
uint8_t SubType; \
|
||||
uint8_t Data[DataSize]; \
|
||||
}
|
||||
|
||||
/** Endpoint number of the CDC device-to-host notification IN endpoint. */
|
||||
#define CDC_NOTIFICATION_EPNUM 2
|
||||
|
||||
/** Endpoint number of the CDC device-to-host data IN endpoint. */
|
||||
#define CDC_TX_EPNUM 3
|
||||
|
||||
/** Endpoint number of the CDC host-to-device data OUT endpoint. */
|
||||
#define CDC_RX_EPNUM 4
|
||||
|
||||
/** Size in bytes of the CDC device-to-host notification IN endpoint. */
|
||||
#define CDC_NOTIFICATION_EPSIZE 8
|
||||
|
||||
/** Size in bytes of the CDC data IN and OUT endpoints. */
|
||||
#define CDC_TXRX_EPSIZE 16
|
||||
|
||||
/* Type Defines: */
|
||||
/** Type define for the device configuration descriptor structure. This must be defined in the
|
||||
* application code, as the configuration descriptor contains several sub-descriptors which
|
||||
* vary between devices, and which describe the device's usage to the host.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
USB_Descriptor_Configuration_Header_t Config;
|
||||
USB_Descriptor_Interface_t CCI_Interface;
|
||||
CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader;
|
||||
CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_CallManagement;
|
||||
CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement;
|
||||
CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union;
|
||||
USB_Descriptor_Endpoint_t ManagementEndpoint;
|
||||
USB_Descriptor_Interface_t DCI_Interface;
|
||||
USB_Descriptor_Endpoint_t DataOutEndpoint;
|
||||
USB_Descriptor_Endpoint_t DataInEndpoint;
|
||||
} USB_Descriptor_Configuration_t;
|
||||
|
||||
/* Function Prototypes: */
|
||||
uint16_t USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)
|
||||
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -1,55 +0,0 @@
|
|||
; Windows LUFA USB to Serial Setup File
|
||||
; Copyright (c) 2000 Microsoft Corporation
|
||||
|
||||
[Version]
|
||||
Signature="$Windows NT$"
|
||||
Class=Ports
|
||||
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
|
||||
Provider=%COMPANY%
|
||||
LayoutFile=layout.inf
|
||||
DriverVer=06/06/2006,1.0.0.0
|
||||
|
||||
[Manufacturer]
|
||||
%MFGNAME% = ManufName
|
||||
|
||||
[DestinationDirs]
|
||||
DefaultDestDir=12
|
||||
|
||||
[ManufName]
|
||||
%Modem3% = Modem3, USB\VID_03EB&PID_204B
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; Windows 2000/XP Sections
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
[Modem3.nt]
|
||||
CopyFiles=USBModemCopyFileSection
|
||||
AddReg=Modem3.nt.AddReg
|
||||
|
||||
[USBModemCopyFileSection]
|
||||
usbser.sys,,,0x20
|
||||
|
||||
[Modem3.nt.AddReg]
|
||||
HKR,,DevLoader,,*ntkern
|
||||
HKR,,NTMPDriver,,usbser.sys
|
||||
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
|
||||
|
||||
[Modem3.nt.Services]
|
||||
AddService=usbser, 0x00000002, DriverService
|
||||
|
||||
[DriverService]
|
||||
DisplayName=%SERVICE%
|
||||
ServiceType=1
|
||||
StartType=3
|
||||
ErrorControl=1
|
||||
ServiceBinary=%12%\usbser.sys
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; String Definitions
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
[Strings]
|
||||
COMPANY="LUFA Library"
|
||||
MFGNAME="Dean Camera"
|
||||
Modem3="USB Virtual Serial Port"
|
||||
SERVICE="USB Virtual Serial Port CDC Driver"
|
|
@ -1,120 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2009.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
and its documentation for any purpose and without fee is hereby
|
||||
granted, provided that the above copyright notice appear in all
|
||||
copies and that both that the copyright notice and this
|
||||
permission notice and warranty disclaimer appear in supporting
|
||||
documentation, and that the name of the author not be used in
|
||||
advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
The author disclaim all warranties with regard to this
|
||||
software, including all implied warranties of merchantability
|
||||
and fitness. In no event shall the author be liable for any
|
||||
special, indirect or consequential damages or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether
|
||||
in an action of contract, negligence or other tortious action,
|
||||
arising out of or in connection with the use or performance of
|
||||
this software.
|
||||
*/
|
||||
|
||||
#include "RingBuff.h"
|
||||
|
||||
void Buffer_Initialize(RingBuff_t* Buffer)
|
||||
{
|
||||
BUFF_ATOMIC_BLOCK
|
||||
{
|
||||
Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer;
|
||||
Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
|
||||
Buffer->Elements = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Buffer_StoreElement(RingBuff_t* Buffer, RingBuff_Data_t Data)
|
||||
{
|
||||
BUFF_ATOMIC_BLOCK
|
||||
{
|
||||
#if defined(BUFF_DROPOLD)
|
||||
if (Buffer->Elements == BUFF_LENGTH)
|
||||
{
|
||||
Buffer->OutPtr++;
|
||||
|
||||
if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH])
|
||||
Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
Buffer->Elements++;
|
||||
}
|
||||
#elif defined(BUFF_DROPNEW)
|
||||
if (Buffer->Elements == BUFF_LENGTH)
|
||||
return;
|
||||
|
||||
Buffer->Elements++;
|
||||
#elif defined(BUFF_NODROPCHECK)
|
||||
Buffer->Elements++;
|
||||
#endif
|
||||
|
||||
*(Buffer->InPtr) = Data;
|
||||
Buffer->InPtr++;
|
||||
|
||||
if (Buffer->InPtr == &Buffer->Buffer[BUFF_LENGTH])
|
||||
Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer;
|
||||
}
|
||||
}
|
||||
|
||||
RingBuff_Data_t Buffer_GetElement(RingBuff_t* Buffer)
|
||||
{
|
||||
RingBuff_Data_t BuffData;
|
||||
|
||||
BUFF_ATOMIC_BLOCK
|
||||
{
|
||||
#if defined(BUFF_EMPTYRETURNSZERO)
|
||||
if (!(Buffer->Elements))
|
||||
return 0;
|
||||
#elif !defined(BUFF_NOEMPTYCHECK)
|
||||
#error No empty buffer check behaviour specified.
|
||||
#endif
|
||||
|
||||
BuffData = *(Buffer->OutPtr);
|
||||
|
||||
Buffer->OutPtr++;
|
||||
Buffer->Elements--;
|
||||
|
||||
if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH])
|
||||
Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
|
||||
}
|
||||
|
||||
return BuffData;
|
||||
}
|
||||
|
||||
#if defined(BUFF_USEPEEK)
|
||||
RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* Buffer)
|
||||
{
|
||||
RingBuff_Data_t BuffData;
|
||||
|
||||
BUFF_ATOMIC_BLOCK
|
||||
{
|
||||
#if defined(BUFF_EMPTYRETURNSZERO)
|
||||
if (!(Buffer->Elements))
|
||||
return 0;
|
||||
#elif !defined(BUFF_NOEMPTYCHECK)
|
||||
#error No empty buffer check behaviour specified.
|
||||
#endif
|
||||
|
||||
BuffData = *(Buffer->OutPtr);
|
||||
}
|
||||
|
||||
return BuffData;
|
||||
}
|
||||
#endif
|
|
@ -1,116 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2009.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
and its documentation for any purpose and without fee is hereby
|
||||
granted, provided that the above copyright notice appear in all
|
||||
copies and that both that the copyright notice and this
|
||||
permission notice and warranty disclaimer appear in supporting
|
||||
documentation, and that the name of the author not be used in
|
||||
advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
The author disclaim all warranties with regard to this
|
||||
software, including all implied warranties of merchantability
|
||||
and fitness. In no event shall the author be liable for any
|
||||
special, indirect or consequential damages or any damages
|
||||
whatsoever resulting from loss of use, data or profits, whether
|
||||
in an action of contract, negligence or other tortious action,
|
||||
arising out of or in connection with the use or performance of
|
||||
this software.
|
||||
*/
|
||||
|
||||
/* Buffer Configuration: */
|
||||
/* Buffer length - select static size of created ringbuffers: */
|
||||
#define BUFF_STATICSIZE 128 // Set to the static ringbuffer size for all ringbuffers (place size after define)
|
||||
|
||||
/* Volatile mode - uncomment to make buffers volatile, for use in ISRs, etc: */
|
||||
#define BUFF_VOLATILE // Uncomment to cause all ring buffers to become volatile (and atomic if multi-byte) in access
|
||||
|
||||
/* Drop mode - select behaviour when Buffer_StoreElement called on a full buffer: */
|
||||
#define BUFF_DROPOLD // Uncomment to cause full ring buffers to drop the oldest character to make space when full
|
||||
// #define BUFF_DROPNEW // Uncomment to cause full ring buffers to drop the new character when full
|
||||
// #define BUFF_NODROPCHECK // Uncomment to ignore full ring buffer checks - checking left to user!
|
||||
|
||||
/* Underflow behaviour - select behaviour when Buffer_GetElement is called with an empty ringbuffer: */
|
||||
//#define BUFF_EMPTYRETURNSZERO // Uncomment to return 0 when an empty ringbuffer is read
|
||||
#define BUFF_NOEMPTYCHECK // Uncomment to disable checking of empty ringbuffers - checking left to user!
|
||||
|
||||
/* Buffer storage type - set the datatype for the stored data */
|
||||
#define BUFF_DATATYPE uint8_t // Change to the data type that is going to be stored into the buffer
|
||||
|
||||
/* Peek routine - uncomment to include the peek routine (fetches next byte without removing it from the buffer */
|
||||
#define BUFF_USEPEEK
|
||||
|
||||
#ifndef _RINGBUFF_H_
|
||||
#define _RINGBUFF_H_
|
||||
|
||||
/* Includes: */
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <util/atomic.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <LUFA/Common/Common.h>
|
||||
|
||||
/* Defines and checks: */
|
||||
#if defined(BUFF_STATICSIZE)
|
||||
#define BUFF_LENGTH BUFF_STATICSIZE
|
||||
#else
|
||||
#error No buffer length specified!
|
||||
#endif
|
||||
|
||||
#if !(defined(BUFF_DROPOLD) || defined(BUFF_DROPNEW) || defined(BUFF_NODROPCHECK))
|
||||
#error No buffer drop mode specified.
|
||||
#endif
|
||||
|
||||
#if !defined(BUFF_DATATYPE)
|
||||
#error Ringbuffer storage data type not specified.
|
||||
#endif
|
||||
|
||||
#if defined(BUFF_VOLATILE)
|
||||
#define BUFF_MODE volatile
|
||||
#define BUFF_ATOMIC_BLOCK ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
|
||||
#else
|
||||
#define BUFF_MODE
|
||||
#define BUFF_ATOMIC_BLOCK
|
||||
#endif
|
||||
|
||||
#if (BUFF_STATICSIZE > LONG_MAX)
|
||||
#define RingBuff_Elements_t uint64_t
|
||||
#elif (BUFF_STATICSIZE > INT_MAX)
|
||||
#define RingBuff_Elements_t uint32_t
|
||||
#elif (BUFF_STATICSIZE > CHAR_MAX)
|
||||
#define RingBuff_Elements_t uint16_t
|
||||
#else
|
||||
#define RingBuff_Elements_t uint8_t
|
||||
#endif
|
||||
|
||||
/* Type Defines: */
|
||||
typedef BUFF_DATATYPE RingBuff_Data_t;
|
||||
|
||||
typedef BUFF_MODE struct
|
||||
{
|
||||
RingBuff_Data_t Buffer[BUFF_LENGTH];
|
||||
RingBuff_Data_t* InPtr;
|
||||
RingBuff_Data_t* OutPtr;
|
||||
RingBuff_Elements_t Elements;
|
||||
} RingBuff_t;
|
||||
|
||||
/* Function Prototypes: */
|
||||
void Buffer_Initialize(RingBuff_t* Buff);
|
||||
void Buffer_StoreElement(RingBuff_t* Buffer, RingBuff_Data_t Data);
|
||||
RingBuff_Data_t Buffer_GetElement(RingBuff_t* Buffer);
|
||||
#if defined(BUFF_USEPEEK)
|
||||
RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* Buffer);
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1,104 +0,0 @@
|
|||
ubuntu@ubuntu:~/LUFA/Bootloaders/LUFA_DFU_Bootloader_AT90USB162$ sudo avrdude -vv -F -P /dev/ttyACM0 -c avr910 -p usb162 -U flash:w:BootloaderDFU.hex
|
||||
|
||||
avrdude: Version 5.5, compiled on May 9 2008 at 13:04:46
|
||||
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
|
||||
|
||||
System wide configuration file is "/etc/avrdude.conf"
|
||||
User configuration file is "/home/ubuntu/.avrduderc"
|
||||
User configuration file does not exist or is not a regular file, skipping
|
||||
|
||||
Using Port : /dev/ttyACM0
|
||||
Using Programmer : avr910
|
||||
AVR Part : AT90USB162
|
||||
Chip Erase delay : 9000 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 65 10 8 0 no 512 4 0 9000 9000 0x00 0x00
|
||||
flash 65 6 128 0 yes 16384 128 128 4500 4500 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
|
||||
efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
|
||||
lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
|
||||
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
|
||||
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
|
||||
|
||||
Programmer Type : avr910
|
||||
Description : Atmel Low Cost Serial Programmer
|
||||
|
||||
Found programmer: Id = "AVR ISP"; type = S
|
||||
Software Version = 2.3; Hardware Version = 1.0
|
||||
Programmer supports auto addr increment.
|
||||
|
||||
Programmer supports the following devices:
|
||||
Device code: 0x55 = ATtiny12
|
||||
Device code: 0x56 = ATtiny15
|
||||
Device code: 0x5e = ATtiny2313
|
||||
Device code: 0x76 = ATMEGA8
|
||||
Device code: 0x74 = ATMEGA6450
|
||||
Device code: 0x72 = ATMEGA32
|
||||
Device code: 0x45 = ATMEGA64
|
||||
Device code: 0x74 = ATMEGA6450
|
||||
Device code: 0x43 = ATMEGA128
|
||||
Device code: 0x63 = ATMEGA162
|
||||
Device code: 0x78 = ATMEGA169
|
||||
Device code: 0x6c = AT90S4434
|
||||
Device code: 0x38 = AT90S8515
|
||||
Device code: 0x65 = (unknown)
|
||||
|
||||
avrdude: warning: selected device is not supported by programmer: usb162
|
||||
avrdude: AVR device initialized and ready to accept instructions
|
||||
|
||||
Reading | ################################################## | 100% 0.00s
|
||||
|
||||
avrdude: Device signature = 0x1e9482
|
||||
avrdude: safemode: lfuse reads as 5E
|
||||
avrdude: safemode: hfuse reads as D9
|
||||
avrdude: safemode: efuse reads as F4
|
||||
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
|
||||
To disable this feature, specify the -D option.
|
||||
avrdude: erasing chip
|
||||
avrdude: reading input file "BootloaderDFU.hex"
|
||||
avrdude: input file BootloaderDFU.hex auto detected as Intel Hex
|
||||
avrdude: writing flash (16066 bytes):
|
||||
|
||||
Writing | ################################################## | 100% 33.39s
|
||||
|
||||
|
||||
|
||||
avrdude: 16066 bytes of flash written
|
||||
avrdude: verifying flash memory against BootloaderDFU.hex:
|
||||
avrdude: load data flash data from input file BootloaderDFU.hex:
|
||||
avrdude: input file BootloaderDFU.hex auto detected as Intel Hex
|
||||
avrdude: input file BootloaderDFU.hex contains 16066 bytes
|
||||
avrdude: reading on-chip flash data:
|
||||
|
||||
Reading | ################################################## | 100% 16.07s
|
||||
|
||||
|
||||
|
||||
avrdude: verifying ...
|
||||
avrdude: 16066 bytes of flash verified
|
||||
|
||||
avrdude: safemode: lfuse reads as 5E
|
||||
avrdude: safemode: hfuse reads as D9
|
||||
avrdude: safemode: efuse reads as F4
|
||||
avrdude: safemode: Fuses OK
|
||||
|
||||
avrdude done. Thank you.
|
||||
|
|
@ -1,726 +0,0 @@
|
|||
# Hey Emacs, this is a -*- makefile -*-
|
||||
#----------------------------------------------------------------------------
|
||||
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
|
||||
# >> Modified for use with the LUFA project. <<
|
||||
#
|
||||
# Released to the Public Domain
|
||||
#
|
||||
# Additional material for this makefile was written by:
|
||||
# Peter Fleury
|
||||
# Tim Henigan
|
||||
# Colin O'Flynn
|
||||
# Reiner Patommel
|
||||
# Markus Pfaff
|
||||
# Sander Pool
|
||||
# Frederik Rouleau
|
||||
# Carlos Lamas
|
||||
# Dean Camera
|
||||
# Opendous Inc.
|
||||
# Denver Gingerich
|
||||
#
|
||||
#----------------------------------------------------------------------------
|
||||
# On command line:
|
||||
#
|
||||
# make all = Make software.
|
||||
#
|
||||
# make clean = Clean out built project files.
|
||||
#
|
||||
# make coff = Convert ELF to AVR COFF.
|
||||
#
|
||||
# make extcoff = Convert ELF to AVR Extended COFF.
|
||||
#
|
||||
# make program = Download the hex file to the device, using avrdude.
|
||||
# Please customize the avrdude settings below first!
|
||||
#
|
||||
# make dfu = Download the hex file to the device, using dfu-programmer (must
|
||||
# have dfu-programmer installed).
|
||||
#
|
||||
# make flip = Download the hex file to the device, using Atmel FLIP (must
|
||||
# have Atmel FLIP installed).
|
||||
#
|
||||
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
|
||||
# (must have dfu-programmer installed).
|
||||
#
|
||||
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
|
||||
# (must have Atmel FLIP installed).
|
||||
#
|
||||
# make doxygen = Generate DoxyGen documentation for the project (must have
|
||||
# DoxyGen installed)
|
||||
#
|
||||
# make debug = Start either simulavr or avarice as specified for debugging,
|
||||
# with avr-gdb or avr-insight as the front end for debugging.
|
||||
#
|
||||
# make filename.s = Just compile filename.c into the assembler code only.
|
||||
#
|
||||
# make filename.i = Create a preprocessed source file for use in submitting
|
||||
# bug reports to the GCC project.
|
||||
#
|
||||
# To rebuild project do "make clean" then "make all".
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
# MCU name
|
||||
MCU = at90usb1287
|
||||
|
||||
|
||||
# Target board (USBKEY, STK525, STK526, RZUSBSTICK, USER or blank for projects not requiring
|
||||
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||
# "Board" inside the application directory.
|
||||
BOARD = USBKEY
|
||||
|
||||
|
||||
# Processor frequency.
|
||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||
# processor frequency. You can then use this symbol in your source code to
|
||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
# Typical values are:
|
||||
# F_CPU = 1000000
|
||||
# F_CPU = 1843200
|
||||
# F_CPU = 2000000
|
||||
# F_CPU = 3686400
|
||||
# F_CPU = 4000000
|
||||
# F_CPU = 7372800
|
||||
# F_CPU = 8000000
|
||||
# F_CPU = 11059200
|
||||
# F_CPU = 14745600
|
||||
# F_CPU = 16000000
|
||||
# F_CPU = 18432000
|
||||
# F_CPU = 20000000
|
||||
F_CPU = 8000000
|
||||
|
||||
|
||||
# Input clock frequency.
|
||||
# This will define a symbol, F_CLOCK, in all source code files equal to the
|
||||
# input clock frequency (before any prescaling is performed). This value may
|
||||
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||
# at the end, this will be done automatically to create a 32-bit value in your
|
||||
# source code.
|
||||
#
|
||||
# If no clock division is performed on the input clock inside the AVR (via the
|
||||
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||
F_CLOCK = 8000000
|
||||
|
||||
|
||||
# Output format. (can be srec, ihex, binary)
|
||||
FORMAT = ihex
|
||||
|
||||
|
||||
# Target file name (without extension).
|
||||
TARGET = AVRISP_Programmer
|
||||
|
||||
|
||||
# Object files directory
|
||||
# To put object files in current directory, use a dot (.), do NOT make
|
||||
# this an empty or blank macro!
|
||||
OBJDIR = .
|
||||
|
||||
|
||||
# List C source files here. (C dependencies are automatically generated.)
|
||||
SRC = $(TARGET).c \
|
||||
Descriptors.c \
|
||||
RingBuff.c \
|
||||
../../LUFA/Scheduler/Scheduler.c \
|
||||
../../LUFA/Drivers/AT90USBXXX/Serial.c \
|
||||
../../LUFA/Drivers/USB/LowLevel/LowLevel.c \
|
||||
../../LUFA/Drivers/USB/LowLevel/Endpoint.c \
|
||||
../../LUFA/Drivers/USB/LowLevel/DevChapter9.c \
|
||||
../../LUFA/Drivers/USB/HighLevel/USBTask.c \
|
||||
../../LUFA/Drivers/USB/HighLevel/USBInterrupt.c \
|
||||
../../LUFA/Drivers/USB/HighLevel/Events.c \
|
||||
../../LUFA/Drivers/USB/HighLevel/StdDescriptors.c \
|
||||
|
||||
# List C++ source files here. (C dependencies are automatically generated.)
|
||||
CPPSRC =
|
||||
|
||||
|
||||
# List Assembler source files here.
|
||||
# Make them always end in a capital .S. Files ending in a lowercase .s
|
||||
# will not be considered source files but generated files (assembler
|
||||
# output from the compiler), and will be deleted upon "make clean"!
|
||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
||||
# it will preserve the spelling of the filenames, and gcc itself does
|
||||
# care about how the name is spelled on its command-line.
|
||||
ASRC =
|
||||
|
||||
|
||||
# Optimization level, can be [0, 1, 2, 3, s].
|
||||
# 0 = turn off optimization. s = optimize for size.
|
||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||
OPT = s
|
||||
|
||||
|
||||
# Debugging format.
|
||||
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
|
||||
# AVR Studio 4.10 requires dwarf-2.
|
||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||
DEBUG = dwarf-2
|
||||
|
||||
|
||||
# List any extra directories to look for include files here.
|
||||
# Each directory must be seperated by a space.
|
||||
# Use forward slashes for directory separators.
|
||||
# For a directory that has spaces, enclose it in quotes.
|
||||
EXTRAINCDIRS = ../../
|
||||
|
||||
|
||||
# Compiler flag to set the C Standard level.
|
||||
# c89 = "ANSI" C
|
||||
# gnu89 = c89 plus GCC extensions
|
||||
# c99 = ISO C99 standard (not yet fully implemented)
|
||||
# gnu99 = c99 plus GCC extensions
|
||||
CSTANDARD = -std=gnu99
|
||||
|
||||
|
||||
# Place -D or -U options here for C sources
|
||||
CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
|
||||
CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY
|
||||
CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
|
||||
|
||||
|
||||
# Place -D or -U options here for ASM sources
|
||||
ADEFS = -DF_CPU=$(F_CPU)
|
||||
|
||||
|
||||
# Place -D or -U options here for C++ sources
|
||||
CPPDEFS = -DF_CPU=$(F_CPU)UL
|
||||
#CPPDEFS += -D__STDC_LIMIT_MACROS
|
||||
#CPPDEFS += -D__STDC_CONSTANT_MACROS
|
||||
|
||||
|
||||
|
||||
#---------------- Compiler Options C ----------------
|
||||
# -g*: generate debugging information
|
||||
# -O*: optimization level
|
||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||
# -Wall...: warning level
|
||||
# -Wa,...: tell GCC to pass this to the assembler.
|
||||
# -adhlns...: create assembler listing
|
||||
CFLAGS = -g$(DEBUG)
|
||||
CFLAGS += $(CDEFS)
|
||||
CFLAGS += -O$(OPT)
|
||||
CFLAGS += -funsigned-char
|
||||
CFLAGS += -funsigned-bitfields
|
||||
CFLAGS += -ffunction-sections
|
||||
CFLAGS += -fpack-struct
|
||||
CFLAGS += -fshort-enums
|
||||
CFLAGS += -finline-limit=20
|
||||
CFLAGS += -Wall
|
||||
CFLAGS += -Wstrict-prototypes
|
||||
CFLAGS += -Wundef
|
||||
#CFLAGS += -fno-unit-at-a-time
|
||||
#CFLAGS += -Wunreachable-code
|
||||
#CFLAGS += -Wsign-compare
|
||||
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
|
||||
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||
CFLAGS += $(CSTANDARD)
|
||||
|
||||
|
||||
#---------------- Compiler Options C++ ----------------
|
||||
# -g*: generate debugging information
|
||||
# -O*: optimization level
|
||||
# -f...: tuning, see GCC manual and avr-libc documentation
|
||||
# -Wall...: warning level
|
||||
# -Wa,...: tell GCC to pass this to the assembler.
|
||||
# -adhlns...: create assembler listing
|
||||
CPPFLAGS = -g$(DEBUG)
|
||||
CPPFLAGS += $(CPPDEFS)
|
||||
CPPFLAGS += -O$(OPT)
|
||||
CPPFLAGS += -funsigned-char
|
||||
CPPFLAGS += -funsigned-bitfields
|
||||
CPPFLAGS += -fpack-struct
|
||||
CPPFLAGS += -fshort-enums
|
||||
CPPFLAGS += -fno-exceptions
|
||||
CPPFLAGS += -Wall
|
||||
CFLAGS += -Wundef
|
||||
#CPPFLAGS += -mshort-calls
|
||||
#CPPFLAGS += -fno-unit-at-a-time
|
||||
#CPPFLAGS += -Wstrict-prototypes
|
||||
#CPPFLAGS += -Wunreachable-code
|
||||
#CPPFLAGS += -Wsign-compare
|
||||
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
|
||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||
#CPPFLAGS += $(CSTANDARD)
|
||||
|
||||
|
||||
#---------------- Assembler Options ----------------
|
||||
# -Wa,...: tell GCC to pass this to the assembler.
|
||||
# -adhlns: create listing
|
||||
# -gstabs: have the assembler create line number information; note that
|
||||
# for use in COFF files, additional information about filenames
|
||||
# and function names needs to be present in the assembler source
|
||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
|
||||
# dump that will be displayed for a given single line of source input.
|
||||
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
|
||||
|
||||
|
||||
#---------------- Library Options ----------------
|
||||
# Minimalistic printf version
|
||||
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
||||
|
||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||
|
||||
# If this is left blank, then it will use the Standard printf version.
|
||||
PRINTF_LIB =
|
||||
#PRINTF_LIB = $(PRINTF_LIB_MIN)
|
||||
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
|
||||
|
||||
|
||||
# Minimalistic scanf version
|
||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||
|
||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||
|
||||
# If this is left blank, then it will use the Standard scanf version.
|
||||
SCANF_LIB =
|
||||
#SCANF_LIB = $(SCANF_LIB_MIN)
|
||||
#SCANF_LIB = $(SCANF_LIB_FLOAT)
|
||||
|
||||
|
||||
MATH_LIB = -lm
|
||||
|
||||
|
||||
# List any extra directories to look for libraries here.
|
||||
# Each directory must be seperated by a space.
|
||||
# Use forward slashes for directory separators.
|
||||
# For a directory that has spaces, enclose it in quotes.
|
||||
EXTRALIBDIRS =
|
||||
|
||||
|
||||
|
||||
#---------------- External Memory Options ----------------
|
||||
|
||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||
# used for variables (.data/.bss) and heap (malloc()).
|
||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||
|
||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||
# only used for heap (malloc()).
|
||||
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
|
||||
|
||||
EXTMEMOPTS =
|
||||
|
||||
|
||||
|
||||
#---------------- Linker Options ----------------
|
||||
# -Wl,...: tell GCC to pass this to linker.
|
||||
# -Map: create map file
|
||||
# --cref: add cross reference to map file
|
||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||
LDFLAGS += -Wl,--relax
|
||||
LDFLAGS += -Wl,--gc-sections
|
||||
LDFLAGS += $(EXTMEMOPTS)
|
||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
|
||||
#LDFLAGS += -T linker_script.x
|
||||
|
||||
|
||||
|
||||
#---------------- Programming Options (avrdude) ----------------
|
||||
|
||||
# Programming hardware: alf avr910 avrisp bascom bsd
|
||||
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
|
||||
#
|
||||
# Type: avrdude -c ?
|
||||
# to get a full listing.
|
||||
#
|
||||
AVRDUDE_PROGRAMMER = jtagmkII
|
||||
|
||||
# com1 = serial port. Use lpt1 to connect to parallel port.
|
||||
AVRDUDE_PORT = usb
|
||||
|
||||
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
||||
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
|
||||
|
||||
|
||||
# Uncomment the following if you want avrdude's erase cycle counter.
|
||||
# Note that this counter needs to be initialized first using -Yn,
|
||||
# see avrdude manual.
|
||||
#AVRDUDE_ERASE_COUNTER = -y
|
||||
|
||||
# Uncomment the following if you do /not/ wish a verification to be
|
||||
# performed after programming the device.
|
||||
#AVRDUDE_NO_VERIFY = -V
|
||||
|
||||
# Increase verbosity level. Please use this when submitting bug
|
||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||
# to submit bug reports.
|
||||
#AVRDUDE_VERBOSE = -v -v
|
||||
|
||||
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
|
||||
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
|
||||
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
||||
|
||||
|
||||
|
||||
#---------------- Debugging Options ----------------
|
||||
|
||||
# For simulavr only - target MCU frequency.
|
||||
DEBUG_MFREQ = $(F_CPU)
|
||||
|
||||
# Set the DEBUG_UI to either gdb or insight.
|
||||
# DEBUG_UI = gdb
|
||||
DEBUG_UI = insight
|
||||
|
||||
# Set the debugging back-end to either avarice, simulavr.
|
||||
DEBUG_BACKEND = avarice
|
||||
#DEBUG_BACKEND = simulavr
|
||||
|
||||
# GDB Init Filename.
|
||||
GDBINIT_FILE = __avr_gdbinit
|
||||
|
||||
# When using avarice settings for the JTAG
|
||||
JTAG_DEV = /dev/com1
|
||||
|
||||
# Debugging port used to communicate between GDB / avarice / simulavr.
|
||||
DEBUG_PORT = 4242
|
||||
|
||||
# Debugging host used to communicate between GDB / avarice / simulavr, normally
|
||||
# just set to localhost unless doing some sort of crazy debugging when
|
||||
# avarice is running on a different computer.
|
||||
DEBUG_HOST = localhost
|
||||
|
||||
|
||||
|
||||
#============================================================================
|
||||
|
||||
|
||||
# Define programs and commands.
|
||||
SHELL = sh
|
||||
CC = avr-gcc
|
||||
OBJCOPY = avr-objcopy
|
||||
OBJDUMP = avr-objdump
|
||||
SIZE = avr-size
|
||||
AR = avr-ar rcs
|
||||
NM = avr-nm
|
||||
AVRDUDE = avrdude
|
||||
REMOVE = rm -f
|
||||
REMOVEDIR = rm -rf
|
||||
COPY = cp
|
||||
WINSHELL = cmd
|
||||
|
||||
# Define Messages
|
||||
# English
|
||||
MSG_ERRORS_NONE = Errors: none
|
||||
MSG_BEGIN = -------- begin --------
|
||||
MSG_END = -------- end --------
|
||||
MSG_SIZE_BEFORE = Size before:
|
||||
MSG_SIZE_AFTER = Size after:
|
||||
MSG_COFF = Converting to AVR COFF:
|
||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||
MSG_FLASH = Creating load file for Flash:
|
||||
MSG_EEPROM = Creating load file for EEPROM:
|
||||
MSG_EXTENDED_LISTING = Creating Extended Listing:
|
||||
MSG_SYMBOL_TABLE = Creating Symbol Table:
|
||||
MSG_LINKING = Linking:
|
||||
MSG_COMPILING = Compiling C:
|
||||
MSG_COMPILING_CPP = Compiling C++:
|
||||
MSG_ASSEMBLING = Assembling:
|
||||
MSG_CLEANING = Cleaning project:
|
||||
MSG_CREATING_LIBRARY = Creating library:
|
||||
|
||||
|
||||
|
||||
|
||||
# Define all object files.
|
||||
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
|
||||
|
||||
# Define all listing files.
|
||||
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
|
||||
|
||||
|
||||
# Compiler flags to generate dependency files.
|
||||
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||
|
||||
|
||||
# Combine all necessary flags and optional flags.
|
||||
# Add target processor to flags.
|
||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
|
||||
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
|
||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Default target.
|
||||
all: begin gccversion sizebefore build checkhooks checklibmode checkboard sizeafter end
|
||||
|
||||
# Change the build target to build a HEX file or a library.
|
||||
build: elf hex eep lss sym
|
||||
#build: lib
|
||||
|
||||
|
||||
elf: $(TARGET).elf
|
||||
hex: $(TARGET).hex
|
||||
eep: $(TARGET).eep
|
||||
lss: $(TARGET).lss
|
||||
sym: $(TARGET).sym
|
||||
LIBNAME=lib$(TARGET).a
|
||||
lib: $(LIBNAME)
|
||||
|
||||
|
||||
|
||||
# Eye candy.
|
||||
# AVR Studio 3.x does not check make's exit code but relies on
|
||||
# the following magic strings to be generated by the compile job.
|
||||
begin:
|
||||
@echo
|
||||
@echo $(MSG_BEGIN)
|
||||
|
||||
end:
|
||||
@echo $(MSG_END)
|
||||
@echo
|
||||
|
||||
|
||||
# Display size of file.
|
||||
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
|
||||
ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
|
||||
MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
|
||||
FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
|
||||
|
||||
sizebefore:
|
||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
|
||||
2>/dev/null; echo; fi
|
||||
|
||||
sizeafter:
|
||||
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
|
||||
2>/dev/null; echo; fi
|
||||
|
||||
checkhooks: build
|
||||
@echo
|
||||
@echo ------- Unhooked LUFA Events -------
|
||||
@$(shell) (grep -s '^Event.*LUFA/.*\\.o' $(TARGET).map | \
|
||||
cut -d' ' -f1 | cut -d'_' -f2- | grep ".*") || \
|
||||
echo "(None)"
|
||||
@echo ------------------------------------
|
||||
|
||||
checklibmode:
|
||||
@echo
|
||||
@echo ----------- Library Mode -----------
|
||||
@$(shell) ($(CC) $(ALL_CFLAGS) -E -dM - < /dev/null \
|
||||
| grep 'USB_\(DEVICE\|HOST\)_ONLY' | cut -d' ' -f2 | grep ".*") \
|
||||
|| echo "No specific mode (both device and host mode allowable)."
|
||||
@echo ------------------------------------
|
||||
|
||||
checkboard:
|
||||
@echo
|
||||
@echo ---------- Selected Board ----------
|
||||
@echo Selected board model is $(BOARD).
|
||||
@echo ------------------------------------
|
||||
|
||||
# Display compiler version information.
|
||||
gccversion :
|
||||
@$(CC) --version
|
||||
|
||||
|
||||
|
||||
# Program the device.
|
||||
program: $(TARGET).hex $(TARGET).eep
|
||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||
|
||||
flip: $(TARGET).hex
|
||||
batchisp -hardware usb -device $(MCU) -operation erase f
|
||||
batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
|
||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||
|
||||
dfu: $(TARGET).hex
|
||||
dfu-programmer $(MCU) erase
|
||||
dfu-programmer $(MCU) flash --debug 1 $(TARGET).hex
|
||||
dfu-programmer $(MCU) reset
|
||||
|
||||
flip-ee: $(TARGET).hex $(TARGET).eep
|
||||
copy $(TARGET).eep $(TARGET)eep.hex
|
||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
|
||||
batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
|
||||
batchisp -hardware usb -device $(MCU) -operation start reset 0
|
||||
|
||||
dfu-ee: $(TARGET).hex $(TARGET).eep
|
||||
dfu-programmer $(MCU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep
|
||||
dfu-programmer $(MCU) reset
|
||||
|
||||
|
||||
# Generate avr-gdb config/init file which does the following:
|
||||
# define the reset signal, load the target file, connect to target, and set
|
||||
# a breakpoint at main().
|
||||
gdb-config:
|
||||
@$(REMOVE) $(GDBINIT_FILE)
|
||||
@echo define reset >> $(GDBINIT_FILE)
|
||||
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
|
||||
@echo end >> $(GDBINIT_FILE)
|
||||
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
|
||||
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
|
||||
ifeq ($(DEBUG_BACKEND),simulavr)
|
||||
@echo load >> $(GDBINIT_FILE)
|
||||
endif
|
||||
@echo break main >> $(GDBINIT_FILE)
|
||||
|
||||
debug: gdb-config $(TARGET).elf
|
||||
ifeq ($(DEBUG_BACKEND), avarice)
|
||||
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
|
||||
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
|
||||
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
|
||||
@$(WINSHELL) /c pause
|
||||
|
||||
else
|
||||
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
|
||||
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
|
||||
endif
|
||||
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
|
||||
|
||||
|
||||
|
||||
|
||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||
COFFCONVERT = $(OBJCOPY) --debugging
|
||||
COFFCONVERT += --change-section-address .data-0x800000
|
||||
COFFCONVERT += --change-section-address .bss-0x800000
|
||||
COFFCONVERT += --change-section-address .noinit-0x800000
|
||||
COFFCONVERT += --change-section-address .eeprom-0x810000
|
||||
|
||||
|
||||
|
||||
coff: $(TARGET).elf
|
||||
@echo
|
||||
@echo $(MSG_COFF) $(TARGET).cof
|
||||
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
|
||||
|
||||
|
||||
extcoff: $(TARGET).elf
|
||||
@echo
|
||||
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
|
||||
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
|
||||
|
||||
|
||||
|
||||
# Create final output files (.hex, .eep) from ELF output file.
|
||||
%.hex: %.elf
|
||||
@echo
|
||||
@echo $(MSG_FLASH) $@
|
||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
||||
|
||||
%.eep: %.elf
|
||||
@echo
|
||||
@echo $(MSG_EEPROM) $@
|
||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
|
||||
|
||||
# Create extended listing file from ELF output file.
|
||||
%.lss: %.elf
|
||||
@echo
|
||||
@echo $(MSG_EXTENDED_LISTING) $@
|
||||
$(OBJDUMP) -h -z -S $< > $@
|
||||
|
||||
# Create a symbol table from ELF output file.
|
||||
%.sym: %.elf
|
||||
@echo
|
||||
@echo $(MSG_SYMBOL_TABLE) $@
|
||||
$(NM) -n $< > $@
|
||||
|
||||
|
||||
|
||||
# Create library from object files.
|
||||
.SECONDARY : $(TARGET).a
|
||||
.PRECIOUS : $(OBJ)
|
||||
%.a: $(OBJ)
|
||||
@echo
|
||||
@echo $(MSG_CREATING_LIBRARY) $@
|
||||
$(AR) $@ $(OBJ)
|
||||
|
||||
|
||||
# Link: create ELF output file from object files.
|
||||
.SECONDARY : $(TARGET).elf
|
||||
.PRECIOUS : $(OBJ)
|
||||
%.elf: $(OBJ)
|
||||
@echo
|
||||
@echo $(MSG_LINKING) $@
|
||||
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
|
||||
|
||||
|
||||
# Compile: create object files from C source files.
|
||||
$(OBJDIR)/%.o : %.c
|
||||
@echo
|
||||
@echo $(MSG_COMPILING) $<
|
||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||
|
||||
|
||||
# Compile: create object files from C++ source files.
|
||||
$(OBJDIR)/%.o : %.cpp
|
||||
@echo
|
||||
@echo $(MSG_COMPILING_CPP) $<
|
||||
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
|
||||
|
||||
|
||||
# Compile: create assembler files from C source files.
|
||||
%.s : %.c
|
||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||
|
||||
|
||||
# Compile: create assembler files from C++ source files.
|
||||
%.s : %.cpp
|
||||
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
|
||||
|
||||
|
||||
# Assemble: create object files from assembler source files.
|
||||
$(OBJDIR)/%.o : %.S
|
||||
@echo
|
||||
@echo $(MSG_ASSEMBLING) $<
|
||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||
|
||||
|
||||
# Create preprocessed source for use in sending a bug report.
|
||||
%.i : %.c
|
||||
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
|
||||
|
||||
|
||||
# Target: clean project.
|
||||
clean: begin clean_list clean_binary end
|
||||
|
||||
clean_binary:
|
||||
$(REMOVE) $(TARGET).hex
|
||||
|
||||
clean_list:
|
||||
@echo $(MSG_CLEANING)
|
||||
$(REMOVE) $(TARGET).eep
|
||||
$(REMOVE) $(TARGET)eep.hex
|
||||
$(REMOVE) $(TARGET).cof
|
||||
$(REMOVE) $(TARGET).elf
|
||||
$(REMOVE) $(TARGET).map
|
||||
$(REMOVE) $(TARGET).sym
|
||||
$(REMOVE) $(TARGET).lss
|
||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o)
|
||||
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst)
|
||||
$(REMOVE) $(SRC:.c=.s)
|
||||
$(REMOVE) $(SRC:.c=.d)
|
||||
$(REMOVE) $(SRC:.c=.i)
|
||||
$(REMOVEDIR) .dep
|
||||
|
||||
|
||||
doxygen:
|
||||
@echo Generating Project Documentation...
|
||||
@doxygen Doxygen.conf
|
||||
@echo Documentation Generation Complete.
|
||||
|
||||
clean_doxygen:
|
||||
rm -rf Documentation
|
||||
|
||||
# Create object files directory
|
||||
$(shell mkdir $(OBJDIR) 2>/dev/null)
|
||||
|
||||
|
||||
# Include the dependency files.
|
||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||
|
||||
|
||||
# Listing of phony targets.
|
||||
.PHONY : all checkhooks checklibmode checkboard \
|
||||
begin finish end sizebefore sizeafter gccversion \
|
||||
build elf hex eep lss sym coff extcoff clean \
|
||||
clean_list clean_binary program debug gdb-config \
|
||||
doxygen dfu flip flip-ee dfu-ee
|
|
@ -5,7 +5,36 @@
|
|||
*/
|
||||
|
||||
/** \mainpage Denver Gingerich's USBSnoop Magnetic Card Reader Project
|
||||
*
|
||||
*
|
||||
* \section SSec_Info USB Information:
|
||||
*
|
||||
* The following table gives a rundown of the USB utilization of this demo.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>USB Mode:</b></td>
|
||||
* <td>Device</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>USB Class:</b></td>
|
||||
* <td>Human Interface Device (HID)</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>USB Subclass:</b></td>
|
||||
* <td>Keyboard</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>Relevant Standards:</b></td>
|
||||
* <td>USBIF HID Standard, USBIF HID Usage Tables</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>Usable Speeds:</b></td>
|
||||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* \section SSec_Description Project Description:
|
||||
*
|
||||
* Firmware for a USB AVR powered USB TTL magnetic stripe reader (using a card
|
||||
* reader such as the Omron V3B-4K) by Denver Gingerich. This project is designed
|
||||
* to be used with the open source Stripe Snoop project at http://stripesnoop.sourceforge.net/.
|
||||
|
@ -51,7 +80,6 @@
|
|||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
*
|
||||
* This project is based on the LUFA Keyboard demonstration application,
|
||||
* written by Denver Gingerich.
|
||||
*
|
||||
|
@ -60,26 +88,20 @@
|
|||
* obtained from the magnetic stripe reader is "typed" through the keyboard
|
||||
* driver as 0's and 1's. After every card swipe, the demo will send a return key.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>USB Mode:</b></td>
|
||||
* <td>Device</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>USB Class:</b></td>
|
||||
* <td>Human Interface Device (HID)</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>USB Subclass:</b></td>
|
||||
* <td>Keyboard</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>Relevant Standards:</b></td>
|
||||
* <td>USBIF HID Standard, USBIF HID Usage Tables</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><b>Usable Speeds:</b></td>
|
||||
* <td>Low Speed Mode, Full Speed Mode</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
||||
* \section SSec_Options Project Options
|
||||
*
|
||||
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
|
||||
*
|
||||
* <table>
|
||||
* <tr>
|
||||
* <td><b>Define Name:</b></td>
|
||||
* <td><b>Location:</b></td>
|
||||
* <td><b>Description:</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>MAX_BITS</td>
|
||||
* <td>CircularBitBuffer.h</td>
|
||||
* <td>Gives the maximum number of bits per track which can be buffered by the device for later transmission to a host.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*/
|
|
@ -16,10 +16,6 @@
|
|||
all:
|
||||
make -C Magstripe clean
|
||||
make -C Magstripe all
|
||||
|
||||
make -C AVRISP_Programmer clean
|
||||
make -C AVRISP_Programmer all
|
||||
|
||||
%:
|
||||
make -C Magstripe $@
|
||||
make -C AVRISP_Programmer $@
|
||||
|
|
Loading…
Reference in New Issue