Remove legacy AVRISP-MKII clone compatibility compile options.

pull/1469/head
Dean Camera 9 years ago
parent cfe2b9eff1
commit 1d2369e9be

@ -152,15 +152,13 @@ void AVRISP_Task(void)
* \param[in] wValue Descriptor type and index to retrieve
* \param[in] wIndex Sub-index to retrieve (such as a localized string language)
* \param[out] DescriptorAddress Address of the retrieved descriptor
* \param[out] DescriptorMemorySpace Memory space that the descriptor is stored in
*
* \return Length of the retrieved descriptor in bytes, or NO_DESCRIPTOR if the descriptor was not found
*/
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
const void** const DescriptorAddress,
uint8_t* DescriptorMemorySpace)
const void** const DescriptorAddress)
{
return AVRISP_GetDescriptor(wValue, wIndex, DescriptorAddress, DescriptorMemorySpace);
return AVRISP_GetDescriptor(wValue, wIndex, DescriptorAddress);
}

@ -83,9 +83,8 @@
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
const void** const DescriptorAddress,
uint8_t* const DescriptorMemorySpace)
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3) ATTR_NON_NULL_PTR_ARG(4);
const void** const DescriptorAddress)
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
#endif

@ -44,16 +44,24 @@
*
* \section Sec_Description Project Description
*
* Firmware for an Atmel Studio/AVR Studio compatible AVRISP-MKII clone programmer. This project will enable the USB
* Firmware for an Atmel Studio compatible AVRISP-MKII clone programmer. This project will enable the USB
* AVR series of microcontrollers to act as a clone of the official Atmel AVRISP-MKII programmer, usable within
* Atmel Studio/AVR Studio or with any software capable of driving a real Atmel AVRISP-MKII programmer. In its most
* basic form, it allows for the programming of AVR TINY, MEGA and XMEGA devices aat the programmer's VCC voltage from
* within Atmel Studio/AVR Studio with no special hardware other than the USB AVR and the parts needed for the USB
* Atmel Studio or with any software capable of driving a real Atmel AVRISP-MKII programmer. In its most
* basic form, it allows for the programming of AVR TINY, MEGA and XMEGA devices at the programmer's VCC voltage from
* within Atmel Studio with no special hardware other than the USB AVR and the parts needed for the USB
* interface. If the user desires, more advanced circuits incorporating level conversion can be made to allow for the
* programming of target AVRs running at a different voltage to the programmer.
*
* This device spoofs Atmel's official AVRISP-MKII device PID so that it remains compatible with Atmel's AVRISP-MKII
* drivers. When prompted, direct your OS to install Atmel's AVRISP-MKII drivers provided with Atmel Studio/AVR Studio.
* drivers. It is currently tested working under the following configurations:
*
* - <b>Windows:</b> Atmel Studio 7, with alternative driver
* - <b>Windows:</b> AVRDUDE 6.2, with alternative driver
* - <b>Linux:</b> AVRDUDE 6.1
*
* <b>Note that this clone requires an alternative driver under Windows,</b> due to an incompatible change in the official
* Jungo based driver. The alternative driver given here will function with both real and clone AVRISP devices in Atmel
* Studio 7 onwards under Windows - and as a bonus, also provides AVRDude access to the programmer.
*
* Note that this design currently has the following limitations:
* - No reversed/shorted target connector detection and notification
@ -69,23 +77,11 @@
*
* \section Sec_KnownIssues Known Issues:
*
* \par Incompatible with newer AVRDUDE releases.
* Due to <a href="http://savannah.nongnu.org/bugs/index.php?40831">a change in 6.0.1 and never AVRDUDE releases</a>,
* these builds are incompatible with the AVRISP-MKII clone project. Use an older 5.x release until AVRDUDE is patched.
*
* \par XMEGA EEPROM programming fails in some cases.
* Several users have reported that XMEGA EEPROM programming fails unless the chip is erased first. If a non-blank EEPROM
* is present, writing further EEPROM data causes corruption.
* <a href="https://github.com/abcminiuser/lufa/issues/25">LUFA issue tracker entry</a>.
*
* \par Does not work with Atmel Studio 6.2 or newer in some cases.
* If the libUSB filter driver is used to bind both libUSB and Jungo drivers to the clone device at the same time, it will
* no longer work in Atmel Studio 6.2 and newer. This is due to a change in the latter; Atmel Studio now supports both
* drivers for various tools, but while the libUSB driver is given preference the inner workings of Atmel Studio cannot
* communicate with the AVR-ISP MKII with libUSB (this is true for the genuine tool also). Uninstall the filter driver and
* install only the standard libUSB driver, or Jungo driver. The \c RESET_TOGGLES_LIBUSB_COMPAT compile option (detailed
* below) is a suitable workaround to this issue.
*
* \section Sec_Installation Installation
* The programmer supports multiple platforms, both Windows and Linux.
*
@ -95,36 +91,9 @@
* is compatible with the free open source AVRDude programming software project.
*
* \subsection SSec_WindowsInstallation Windows Installation
* On Windows systems, due to an unfortunate limitation of the USB AVR devices and the driver used in the official AVR
* Studio/Atmel Studio platform, the programmer cannot be made compatible with AVRDude and AVR Studio/Atmel Studio at the
* same time. Instead, the programmer will be compatible with the official Atmel software by default, with a recompilation
* with the \c LIBUSB_DRIVER_COMPAT token (see \ref Sec_Options) being required to use the alternative libUSB driver
* compatibility mode that will allow the programmer to work under AVRDude on Windows.
*
* If compiled for Atmel Studio/AVR Studio compatibility, install the Jungo device drivers that ship with the Atmel software.
* If compiled in the alternative libUSB compatibility mode for AVRDude use, install the libUSB drivers that are included
* with your compiled copy of AVRDude, or create them using the libUSB-Win32 (http://sourceforge.net/projects/libusb-win32)
* project.
*
* For convenience, the programmer will report two different serial numbers depending on the firmware compatibility mode, so
* that the correct driver can be installed for the matching firmware. If the \c RESET_TOGGLES_LIBUSB_COMPAT compile option
* is used (see \ref Sec_Options) this allows for an easy way to automatically switch device drivers along with the firmware
* compatibility mode. The serials are:
*
* <table>
* <tr>
* <th><b>Serial Number:</b></th>
* <th><b>Compatibility Mode:</b></th>
* </tr>
* <tr>
* <td>000200012345</td>
* <td>Jungo (Atmel Studio) Compatibility</td>
* </tr>
* <tr>
* <td>000200112345</td>
* <td>libUSB Compatibility</td>
* </tr>
* </table>
* On Windows systems, due to an unfortunate limitation of the USB AVR devices and the Atmel Studio platform, the programmer
* requires an alternative libUSB based driver. Uninstall the existing Jungo driver for the device (if installed) and replace
* it with the driver that ships with this project, to enable access to the programmer in Atmel Studio and AVRDUDE.
*
* \section Sec_ISP ISP Connections
* Connections to the device for SPI programming (when enabled):
@ -351,26 +320,6 @@
* \n \n <i>Ignored when compiled for targets lacking an ADC, or when NO_VTARGET_DETECT is defined.</i></td>
* </tr>
* <tr>
* <td>LIBUSB_DRIVER_COMPAT</td>
* <td>AppConfig.h</td>
* <td>Define to switch to a non-standard endpoint scheme, breaking compatibility with Atmel Studio/AVR Studio under Windows but
* making 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.
*
* When this option is enabled, all board LEDs will flash twice on startup for Jungo compatibility mode, and five times for
* libUSB compatibility mode.
*
* \note This option is incompatible with \c LIBUSB_DRIVER_COMPAT.</td>
* </tr>
* <tr>
* <td>XCK_RESCUE_CLOCK_ENABLE</td>
* <td>AppConfig.h</td>
* <td>Define to move the ISP rescue clock to the AVR's XCK pin instead of the OCR1A output pin. This is useful for existing programming

@ -37,17 +37,6 @@
#include "AVRISPDescriptors.h"
#if defined(RESET_TOGGLES_LIBUSB_COMPAT) || defined(__DOXYGEN__)
/** Indicates if an external reset has occurred and the compatibility mode needs to be altered */
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
@ -80,7 +69,7 @@ const USB_Descriptor_Device_t PROGMEM AVRISP_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.
*/
AVRISP_USB_Descriptor_Configuration_t AVRISP_ConfigurationDescriptor =
const AVRISP_USB_Descriptor_Configuration_t PROGMEM AVRISP_ConfigurationDescriptor =
{
.Config =
{
@ -117,11 +106,7 @@ AVRISP_USB_Descriptor_Configuration_t AVRISP_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
@ -159,7 +144,7 @@ const USB_Descriptor_String_t PROGMEM AVRISP_ProductString = USB_STRING_DESCRIPT
/** Serial number string. This is a Unicode string containing the device's unique serial number, expressed as a
* series of uppercase hexadecimal digits.
*/
USB_Descriptor_String_t AVRISP_SerialString = USB_STRING_DESCRIPTOR(L"000200012345\0"
const USB_Descriptor_String_t PROGMEM AVRISP_SerialString = USB_STRING_DESCRIPTOR(L"000200012345\0"
// Note: Real AVRISP-MKII has the embedded NUL byte, bug in firmware?
);
@ -171,8 +156,7 @@ USB_Descriptor_String_t AVRISP_SerialString = USB_STRING_DESCRIPTOR(L"0002000123
*/
uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
const void** const DescriptorAddress,
uint8_t* DescriptorMemorySpace)
const void** const DescriptorAddress)
{
const uint8_t DescriptorType = (wValue >> 8);
const uint8_t DescriptorNumber = (wValue & 0xFF);
@ -180,8 +164,6 @@ uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
const void* Address = NULL;
uint16_t Size = NO_DESCRIPTOR;
*DescriptorMemorySpace = MEMSPACE_FLASH;
switch (DescriptorType)
{
case DTYPE_Device:
@ -189,12 +171,6 @@ uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
Size = sizeof(USB_Descriptor_Device_t);
break;
case DTYPE_Configuration:
*DescriptorMemorySpace = MEMSPACE_RAM;
#if defined(RESET_TOGGLES_LIBUSB_COMPAT)
/* Update the configuration descriptor with the current endpoint address */
AVRISP_ConfigurationDescriptor.AVRISP_DataInEndpoint.EndpointAddress = AVRISP_CurrDataINEndpointAddress;
#endif
Address = &AVRISP_ConfigurationDescriptor;
Size = sizeof(AVRISP_USB_Descriptor_Configuration_t);
break;
@ -216,11 +192,6 @@ uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
case AVRISP_STRING_ID_Serial:
Address = &AVRISP_SerialString;
Size = AVRISP_SerialString.Header.Size;
/* Update serial number to have a different serial based on the current endpoint address */
((uint16_t*)&AVRISP_SerialString.UnicodeString)[6] = cpu_to_le16('0' + (AVRISP_DATA_IN_EPADDR & ENDPOINT_EPNUM_MASK));
*DescriptorMemorySpace = MEMSPACE_RAM;
break;
}
@ -230,73 +201,3 @@ uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
*DescriptorAddress = Address;
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 occurred, 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;
}
Delay_MS(500);
}
#endif

@ -44,29 +44,12 @@
#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: */
/** 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(RESET_TOGGLES_LIBUSB_COMPAT)
#define AVRISP_DATA_IN_EPADDR AVRISP_CurrDataINEndpointAddress
#elif defined(LIBUSB_DRIVER_COMPAT)
#define AVRISP_DATA_IN_EPADDR AVRISP_DATA_IN_EPADDR_LIBUSB
#else
/** Endpoint address of the AVRISP data IN endpoint. */
#define AVRISP_DATA_IN_EPADDR AVRISP_DATA_IN_EPADDR_JUNGO
#endif
/** Endpoint address of the AVRISP data IN endpoint. */
#define AVRISP_DATA_IN_EPADDR (ENDPOINT_DIR_IN | 2)
/** Size in bytes of the AVRISP data endpoint. */
#define AVRISP_DATA_EPSIZE 64
@ -107,22 +90,11 @@
AVRISP_STRING_ID_Serial = 3, /**< Serial number string ID */
};
/* External Variables: */
#if defined(RESET_TOGGLES_LIBUSB_COMPAT)
extern uint8_t AVRISP_CurrDataINEndpointAddress;
#endif
/* Function Prototypes: */
uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
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
const void** const DescriptorAddress)
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
#endif

@ -59,12 +59,10 @@
#define VTARGET_REF_VOLTS 5
#define VTARGET_SCALE_FACTOR 1
// #define VTARGET_USE_INTERNAL_REF
// #define NO_VTARGET_DETECT
#define NO_VTARGET_DETECT
// #define XCK_RESCUE_CLOCK_ENABLE
// #define INVERTED_ISP_MISO
// #define LIBUSB_DRIVER_COMPAT
// #define RESET_TOGGLES_LIBUSB_COMPAT
// #define FIRMWARE_VERSION_MINOR 0x11
#endif

@ -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

@ -59,8 +59,6 @@
// #define XCK_RESCUE_CLOCK_ENABLE
// #define INVERTED_ISP_MISO
// #define LIBUSB_DRIVER_COMPAT
// #define RESET_TOGGLES_LIBUSB_COMPAT
// #define FIRMWARE_VERSION_MINOR 0x11
#endif

@ -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

@ -198,8 +198,7 @@ const USB_Descriptor_String_t PROGMEM USART_ProductString = USB_STRING_DESCRIPTO
*/
uint16_t USART_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
const void** const DescriptorAddress,
uint8_t* const DescriptorMemorySpace)
const void** const DescriptorAddress)
{
const uint8_t DescriptorType = (wValue >> 8);
const uint8_t DescriptorNumber = (wValue & 0xFF);
@ -207,8 +206,6 @@ uint16_t USART_GetDescriptor(const uint16_t wValue,
const void* Address = NULL;
uint16_t Size = NO_DESCRIPTOR;
*DescriptorMemorySpace = MEMSPACE_FLASH;
switch (DescriptorType)
{
case DTYPE_Device:

@ -105,8 +105,7 @@
/* Function Prototypes: */
uint16_t USART_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
const void** const DescriptorAddress,
uint8_t* const DescriptorMemorySpace);
const void** const DescriptorAddress);
#endif

@ -276,19 +276,17 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI
* \param[in] wValue Descriptor type and index to retrieve
* \param[in] wIndex Sub-index to retrieve (such as a localized string language)
* \param[out] DescriptorAddress Address of the retrieved descriptor
* \param[out] DescriptorMemorySpace Memory space that the descriptor is stored in
*
* \return Length of the retrieved descriptor in bytes, or NO_DESCRIPTOR if the descriptor was not found
*/
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
const void** const DescriptorAddress,
uint8_t* const DescriptorMemorySpace)
const void** const DescriptorAddress)
{
/* Return the correct descriptors based on the selected mode */
if (CurrentFirmwareMode == MODE_USART_BRIDGE)
return USART_GetDescriptor(wValue, wIndex, DescriptorAddress, DescriptorMemorySpace);
return USART_GetDescriptor(wValue, wIndex, DescriptorAddress);
else
return AVRISP_GetDescriptor(wValue, wIndex, DescriptorAddress, DescriptorMemorySpace);
return AVRISP_GetDescriptor(wValue, wIndex, DescriptorAddress);
}

@ -96,9 +96,8 @@
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
const uint16_t wIndex,
const void** const DescriptorAddress,
uint8_t* const DescriptorMemorySpace)
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3) ATTR_NON_NULL_PTR_ARG(4);
const void** const DescriptorAddress)
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
#endif

@ -79,26 +79,6 @@
* <th><b>Description:</b></th>
* </tr>
* <tr>
* <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.
*
* \note This option is incompatible with \c RESET_TOGGLES_LIBUSB_COMPAT.</td>
* </tr>
* <tr>
* <td>RESET_TOGGLES_LIBUSB_COMPAT</td>
* <td>Makefile LUFA_OPTS</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.
*
* When this option is enabled, all board LEDs will flash twice on startup for Jungo compatibility mode, and five times for
* libUSB compatibility mode.
*
* \note This option is incompatible with \c LIBUSB_DRIVER_COMPAT.</td>
* </tr>
* <tr>
* <td>FIRMWARE_VERSION_MINOR</td>
* <td>AppConfig.h</td>
* <td>Define to set the minor firmware revision nunber reported to the host on request. By default this will use a firmware version compatible

Loading…
Cancel
Save