aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/AVRISP-MKII
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2012-05-20 15:43:51 +0000
committerDean Camera <dean@fourwalledcubicle.com>2012-05-20 15:43:51 +0000
commit063474561de084fbdd8c1ddc02fcce5b8abebe3e (patch)
tree831ba5778a2b6adf6f05be487f91d87ab1c18f2c /Projects/AVRISP-MKII
parent666088a38818e371cc8ad89360c960d86b311a49 (diff)
parentb181cf4fb87c289b2aed93e44d03b20b6b9ba623 (diff)
downloadlufa-063474561de084fbdd8c1ddc02fcce5b8abebe3e.tar.gz
lufa-063474561de084fbdd8c1ddc02fcce5b8abebe3e.tar.bz2
lufa-063474561de084fbdd8c1ddc02fcce5b8abebe3e.zip
Merge in latest trunk.
Diffstat (limited to 'Projects/AVRISP-MKII')
-rw-r--r--Projects/AVRISP-MKII/AVRISP-MKII.c5
-rw-r--r--Projects/AVRISP-MKII/AVRISP-MKII.txt23
-rw-r--r--Projects/AVRISP-MKII/Config/AppConfig.h1
-rw-r--r--Projects/AVRISP-MKII/Config/LUFAConfig.h2
-rw-r--r--Projects/AVRISP-MKII/Descriptors.c93
-rw-r--r--Projects/AVRISP-MKII/Descriptors.h44
-rw-r--r--Projects/AVRISP-MKII/Doxygen.conf36
-rw-r--r--Projects/AVRISP-MKII/makefile2
8 files changed, 166 insertions, 40 deletions
diff --git a/Projects/AVRISP-MKII/AVRISP-MKII.c b/Projects/AVRISP-MKII/AVRISP-MKII.c
index eaf04cb7a..236a2a878 100644
--- a/Projects/AVRISP-MKII/AVRISP-MKII.c
+++ b/Projects/AVRISP-MKII/AVRISP-MKII.c
@@ -72,6 +72,11 @@ void SetupHardware(void)
/* Hardware Initialization */
LEDs_Init();
+ #if defined(RESET_TOGGLES_LIBUSB_COMPAT)
+ UpdateCurrentCompatibilityMode();
+ #endif
+
+ /* USB Stack Initialization */
USB_Init();
}
diff --git a/Projects/AVRISP-MKII/AVRISP-MKII.txt b/Projects/AVRISP-MKII/AVRISP-MKII.txt
index a933f386a..cd1faf094 100644
--- a/Projects/AVRISP-MKII/AVRISP-MKII.txt
+++ b/Projects/AVRISP-MKII/AVRISP-MKII.txt
@@ -10,10 +10,10 @@
*
* The following list indicates what microcontrollers are compatible with this project.
*
- * - Series 7 USB AVRs (AT90USBxxx7)
- * - Series 6 USB AVRs (AT90USBxxx6)
- * - Series 4 USB AVRs (ATMEGAxxU4)
- * - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) - <i>8KB versions with reduced features only</i>
+ * \li Series 7 USB AVRs (AT90USBxxx7)
+ * \li Series 6 USB AVRs (AT90USBxxx6)
+ * \li Series 4 USB AVRs (ATMEGAxxU4)
+ * \li Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) - <i>8KB versions with reduced features only</i>
*
* \section Sec_Info USB Information:
*
@@ -37,7 +37,7 @@
* <td>Atmel AVRISP MKII Protocol Specification</td>
* </tr>
* <tr>
- * <td><b>Usable Speeds:</b></td>
+ * <td><b>Supported USB Speeds:</b></td>
* <td>Full Speed Mode</td>
* </tr>
* </table>
@@ -293,7 +293,18 @@
* <td>LIBUSB_DRIVER_COMPAT</td>
* <td>AppConfig.h</td>
* <td>Define to switch to a non-standard endpoint scheme, breaking compatibility with AVRStudio under Windows but making
- * the code compatible with software such as avrdude (all platforms) that use the libUSB driver.</td>
+ * the code compatible with software such as avrdude (all platforms) that use the libUSB driver.
+ *
+ * \note This option is incompatible with \c RESET_TOGGLES_LIBUSB_COMPAT.</td>
+ * </tr>
+ * <tr>
+ * <td>RESET_TOGGLES_LIBUSB_COMPAT</td>
+ * <td>AppConfig.h</td>
+ * <td>Define to make the /RESET line of the AVR toggle between Jungo and libUSB driver compatibility modes. Each time the AVR is
+ * reset externally via the reset pin, the compatibility mode will be toggled. The compatibility mode is preserved between
+ * power cycles and is not toggled via other forms of reset such as Watchdog or Brown Out.
+ *
+ * \note This option is incompatible with \c LIBUSB_DRIVER_COMPAT.</td>
* </tr>
* <tr>
* <td>XCK_RESCUE_CLOCK_ENABLE</td>
diff --git a/Projects/AVRISP-MKII/Config/AppConfig.h b/Projects/AVRISP-MKII/Config/AppConfig.h
index b7598a51c..26198e3d7 100644
--- a/Projects/AVRISP-MKII/Config/AppConfig.h
+++ b/Projects/AVRISP-MKII/Config/AppConfig.h
@@ -60,6 +60,7 @@
// #define INVERTED_ISP_MISO
// #define LIBUSB_DRIVER_COMPAT
+// #define RESET_TOGGLES_LIBUSB_COMPAT
// #define FIRMWARE_VERSION_MINOR 0x11
#endif \ No newline at end of file
diff --git a/Projects/AVRISP-MKII/Config/LUFAConfig.h b/Projects/AVRISP-MKII/Config/LUFAConfig.h
index 0a7ca2a3c..2071bfdd1 100644
--- a/Projects/AVRISP-MKII/Config/LUFAConfig.h
+++ b/Projects/AVRISP-MKII/Config/LUFAConfig.h
@@ -67,7 +67,7 @@
/* USB Device Mode Driver Related Tokens: */
// #define USE_RAM_DESCRIPTORS
- #define USE_FLASH_DESCRIPTORS
+// #define USE_FLASH_DESCRIPTORS
// #define USE_EEPROM_DESCRIPTORS
#define NO_INTERNAL_SERIAL
#define FIXED_CONTROL_ENDPOINT_SIZE 16
diff --git a/Projects/AVRISP-MKII/Descriptors.c b/Projects/AVRISP-MKII/Descriptors.c
index da57b7113..0a43dc902 100644
--- a/Projects/AVRISP-MKII/Descriptors.c
+++ b/Projects/AVRISP-MKII/Descriptors.c
@@ -37,6 +37,16 @@
#include "Descriptors.h"
+#if defined(RESET_TOGGLES_LIBUSB_COMPAT) || defined(__DOXYGEN__)
+ static bool AVRISP_NeedCompatibilitySwitch ATTR_NO_INIT;
+
+ /** Current AVRISP data IN endpoint address. */
+ uint8_t AVRISP_CurrDataINEndpointAddress;
+
+ /** Saved AVRISP data IN endpoint address in EEPROM. */
+ uint8_t AVRISP_CurrDataINEndpointAddress_EEPROM EEMEM;
+#endif
+
/** 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
@@ -69,7 +79,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
* 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.
*/
-const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
+USB_Descriptor_Configuration_t ConfigurationDescriptor =
{
.Config =
{
@@ -106,7 +116,11 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+#if defined(RESET_TOGGLES_LIBUSB_COMPAT)
+ .EndpointAddress = 0,
+#else
.EndpointAddress = AVRISP_DATA_IN_EPADDR,
+#endif
.Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = AVRISP_DATA_EPSIZE,
.PollingIntervalMS = 0x0A
@@ -174,7 +188,8 @@ const USB_Descriptor_String_t PROGMEM SerialString =
*/
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint8_t wIndex,
- const void** const DescriptorAddress)
+ const void** const DescriptorAddress,
+ uint8_t* DescriptorMemorySpace)
{
const uint8_t DescriptorType = (wValue >> 8);
const uint8_t DescriptorNumber = (wValue & 0xFF);
@@ -182,6 +197,8 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const void* Address = NULL;
uint16_t Size = NO_DESCRIPTOR;
+ *DescriptorMemorySpace = MEMSPACE_FLASH;
+
switch (DescriptorType)
{
case DTYPE_Device:
@@ -189,6 +206,11 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
Size = sizeof(USB_Descriptor_Device_t);
break;
case DTYPE_Configuration:
+ *DescriptorMemorySpace = MEMSPACE_RAM;
+ #if defined(RESET_TOGGLES_LIBUSB_COMPAT)
+ ConfigurationDescriptor.AVRISP_DataInEndpoint.EndpointAddress = AVRISP_CurrDataINEndpointAddress;
+ #endif
+
Address = &ConfigurationDescriptor;
Size = sizeof(USB_Descriptor_Configuration_t);
break;
@@ -220,3 +242,70 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
return Size;
}
+#if defined(RESET_TOGGLES_LIBUSB_COMPAT) || defined(__DOXYGEN__)
+/** Checks the state of the system status register MCUSR and indicates via a flag if
+ * the current AVRISP driver compatibility mode needs to be reset.
+ *
+ * When the \c RESET_TOGGLES_LIBUSB_COMPAT compile time option is enabled, pulling
+ * the reset line of the AVR low will toggle between Jungo and libUSB compatibility
+ * modes. Other forms of reset (such as power on or watchdog) will not force a mode
+ * change.
+ */
+void CheckExternalReset(void)
+{
+ /* If an external reset occured, we need to change compatibility mode */
+ AVRISP_NeedCompatibilitySwitch = (MCUSR == (1 << EXTRF));
+
+ MCUSR = 0;
+}
+
+/** Updates the device descriptors so that the correct compatibility mode is used
+ * when the \c RESET_TOGGLES_LIBUSB_COMPAT compile time option is enabled. This
+ * configures the programmer for either Jungo or libUSB driver compatibility. Each
+ * time the AVR is reset via pulling the reset line low the compatibility mode will
+ * be toggled. The current mode is stored in EEPROM and preserved through power
+ * cycles of the AVR.
+ */
+void UpdateCurrentCompatibilityMode(void)
+{
+ /* Load the current IN endpoint address stored in EEPROM */
+ AVRISP_CurrDataINEndpointAddress = eeprom_read_byte(&AVRISP_CurrDataINEndpointAddress_EEPROM);
+
+ /* Check if we need to switch compatibility modes */
+ if (AVRISP_NeedCompatibilitySwitch)
+ {
+ /* Toggle between compatibility modes */
+ AVRISP_CurrDataINEndpointAddress = (AVRISP_CurrDataINEndpointAddress == AVRISP_DATA_IN_EPADDR_LIBUSB) ?
+ AVRISP_DATA_IN_EPADDR_JUNGO : AVRISP_DATA_IN_EPADDR_LIBUSB;
+
+ /* Save the new mode into EEPROM */
+ eeprom_update_byte(&AVRISP_CurrDataINEndpointAddress_EEPROM, AVRISP_CurrDataINEndpointAddress);
+ }
+
+ LEDs_SetAllLEDs(LEDS_NO_LEDS);
+
+ /* Validate IN endpoint address and indicate current mode via LED flashes */
+ switch (AVRISP_CurrDataINEndpointAddress)
+ {
+ default:
+ /* Default to Jungo compatibility mode if saved EEPROM is invalid */
+ AVRISP_CurrDataINEndpointAddress = AVRISP_DATA_IN_EPADDR_JUNGO;
+ case AVRISP_DATA_IN_EPADDR_JUNGO:
+ /* Two flashes for Jungo compatibility mode */
+ for (uint8_t i = 0; i < 4; i++)
+ {
+ LEDs_ToggleLEDs(LEDS_ALL_LEDS);
+ Delay_MS(100);
+ }
+ break;
+ case AVRISP_DATA_IN_EPADDR_LIBUSB:
+ /* Five flashes for libUSB compatibility mode */
+ for (uint8_t i = 0; i < 10; i++)
+ {
+ LEDs_ToggleLEDs(LEDS_ALL_LEDS);
+ Delay_MS(100);
+ }
+ break;
+ }
+}
+#endif
diff --git a/Projects/AVRISP-MKII/Descriptors.h b/Projects/AVRISP-MKII/Descriptors.h
index 1b140f30d..1ff25635e 100644
--- a/Projects/AVRISP-MKII/Descriptors.h
+++ b/Projects/AVRISP-MKII/Descriptors.h
@@ -40,19 +40,34 @@
#include <avr/pgmspace.h>
#include <LUFA/Drivers/USB/USB.h>
+ #include <LUFA/Drivers/Board/LEDs.h>
+
+ #include "Config/AppConfig.h"
+
+ /* Preprocessor Checks: */
+ #if defined(LIBUSB_DRIVER_COMPAT) && defined(RESET_TOGGLES_LIBUSB_COMPAT)
+ #error LIBUSB_DRIVER_COMPAT and RESET_TOGGLES_LIBUSB_COMPAT are mutually exclusive.
+ #endif
/* Macros: */
- #if !defined(LIBUSB_DRIVER_COMPAT) || defined(__DOXYGEN__)
- /** Endpoint address of the AVRISP data OUT endpoint. */
- #define AVRISP_DATA_OUT_EPADDR (ENDPOINT_DIR_OUT | 2)
+ /** Endpoint address of the AVRISP data OUT endpoint. */
+ #define AVRISP_DATA_OUT_EPADDR (ENDPOINT_DIR_OUT | 2)
+
+ /** Endpoint address of the AVRISP data IN endpoint, when in Jungo driver compatibility mode. */
+ #define AVRISP_DATA_IN_EPADDR_JUNGO (ENDPOINT_DIR_IN | 2)
+
+ /** Endpoint address of the AVRISP data IN endpoint, when in LibUSB driver compatibility mode. */
+ #define AVRISP_DATA_IN_EPADDR_LIBUSB (ENDPOINT_DIR_IN | 3)
+ #if !defined(LIBUSB_DRIVER_COMPAT) || defined(__DOXYGEN__)
/** Endpoint address of the AVRISP data IN endpoint. */
- #define AVRISP_DATA_IN_EPADDR (ENDPOINT_DIR_IN | 2)
+ #define AVRISP_DATA_IN_EPADDR AVRISP_DATA_IN_EPADDR_JUNGO
+ #elif defined(RESET_TOGGLES_LIBUSB_COMPAT)
+ #define AVRISP_DATA_IN_EPADDR AVRISP_CurrDataINEndpointAddress
#else
- #define AVRISP_DATA_OUT_EPADDR (ENDPOINT_DIR_OUT | 2)
- #define AVRISP_DATA_IN_EPADDR (ENDPOINT_DIR_IN | 3)
+ #define AVRISP_DATA_IN_EPADDR AVRISP_DATA_IN_EPADDR_LIBUSB
#endif
-
+
/** Size in bytes of the AVRISP data endpoint. */
#define AVRISP_DATA_EPSIZE 64
@@ -71,11 +86,22 @@
USB_Descriptor_Endpoint_t AVRISP_DataOutEndpoint;
} USB_Descriptor_Configuration_t;
+ /* External Variables: */
+ #if defined(RESET_TOGGLES_LIBUSB_COMPAT)
+ extern uint8_t AVRISP_CurrDataINEndpointAddress;
+ #endif
+
/* Function Prototypes: */
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint8_t wIndex,
- const void** const DescriptorAddress)
- ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
+ const void** const DescriptorAddress,
+ uint8_t* const DescriptorMemorySpace)
+ ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3) ATTR_NON_NULL_PTR_ARG(4);
+
+ #if defined(RESET_TOGGLES_LIBUSB_COMPAT)
+ void CheckExternalReset(void) ATTR_NAKED ATTR_INIT_SECTION(3);
+ void UpdateCurrentCompatibilityMode(void);
+ #endif
#endif
diff --git a/Projects/AVRISP-MKII/Doxygen.conf b/Projects/AVRISP-MKII/Doxygen.conf
index 4f072c84c..24e139abe 100644
--- a/Projects/AVRISP-MKII/Doxygen.conf
+++ b/Projects/AVRISP-MKII/Doxygen.conf
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.0
+# Doxyfile 1.8.1
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
@@ -32,7 +32,7 @@ PROJECT_NAME = "AVRISP-MKII Clone Programmer Project"
# This could be handy for archiving the generated documentation or
# if some version control system is used.
-PROJECT_NUMBER = 0.0.0
+PROJECT_NUMBER =
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer
@@ -563,12 +563,6 @@ MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES = YES
-
# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
# This will remove the Files entry from the Quick Index and from the
# Folder Tree View (if specified). The default is YES.
@@ -960,12 +954,6 @@ HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = NO
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
# page has loaded. For this to work a browser that supports
@@ -974,6 +962,17 @@ HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = YES
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+# entries shown in the various tree structured indices initially; the user
+# can expand and collapse entries dynamically later on. Doxygen will expand
+# the tree to such a level that at most the specified number of entries are
+# visible (unless a fully collapsed tree already exceeds this amount).
+# So setting the number of entries 1 will produce a full collapsed tree by
+# default. 0 is a special value representing an infinite number of entries
+# and will result in a full expanded tree by default.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
# If the GENERATE_DOCSET tag is set to YES, additional index files
# will be generated that can be used as input for Apple's Xcode 3
# integrated development environment, introduced with OSX 10.5 (Leopard).
@@ -1131,7 +1130,7 @@ ECLIPSE_DOC_ID = org.doxygen.Project
# navigation tree you can set this option to NO if you already set
# GENERATE_TREEVIEW to YES.
-DISABLE_INDEX = NO
+DISABLE_INDEX = YES
# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information.
@@ -1152,11 +1151,6 @@ GENERATE_TREEVIEW = YES
ENUM_VALUES_PER_LINE = 1
-# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
-# and Class Hierarchy pages using a tree view instead of an ordered list.
-
-USE_INLINE_TREES = NO
-
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
@@ -1725,7 +1719,7 @@ CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = NO
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
# then doxygen will show the dependencies a directory has on other directories
# in a graphical way. The dependency relations are determined by the #include
# relations between the files in the directories.
diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile
index d0c2567fe..f3a457e20 100644
--- a/Projects/AVRISP-MKII/makefile
+++ b/Projects/AVRISP-MKII/makefile
@@ -699,7 +699,7 @@ clean_list :
doxygen:
@echo Generating Project Documentation \($(TARGET)\)...
- @if ( doxygen Doxygen.conf 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then \
+ @if ( ( cat Doxygen.conf ; echo "HTML_STYLESHEET=$(LUFA_PATH)/LUFA/DoxygenPages/Style/Style.css" ) | doxygen - 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then \
exit 1; \
fi;
@echo Documentation Generation Complete.