diff options
Diffstat (limited to 'Projects/AVRISP-MKII')
-rw-r--r-- | Projects/AVRISP-MKII/AVRISP-MKII.c | 5 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/AVRISP-MKII.txt | 23 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/Config/AppConfig.h | 1 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/Config/LUFAConfig.h | 2 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/Descriptors.c | 93 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/Descriptors.h | 44 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/Doxygen.conf | 36 | ||||
-rw-r--r-- | Projects/AVRISP-MKII/makefile | 2 |
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. |