Merge tag 'LUFA-210130' into ProMicro
authorPeter Henn <Peter.Henn@web.de>
Wed, 29 Dec 2021 12:10:53 +0000 (12:10 +0000)
committerPeter Henn <Peter.Henn@web.de>
Sun, 2 Jan 2022 00:00:59 +0000 (00:00 +0000)
- use merge strategy "theirs", means in principle rebase ProMicro branch
  to LUFA-210130
- Still remove FUSE_BOOTRST check in Application_Jump_Check, although it
  is in meantime fixed, but ProMicro would now no longer enter bootloader
  once a application is flashed.

1  2 
Bootloaders/DFU/BootloaderDFU.c
Bootloaders/DFU/BootloaderDFU.h
Bootloaders/DFU/makefile

@@@ -1,13 -1,13 +1,13 @@@
  /*
               LUFA Library
-      Copyright (C) Dean Camera, 2017.
+      Copyright (C) Dean Camera, 2021.
  
    dean [at] fourwalledcubicle [dot] com
             www.lufa-lib.org
  */
  
  /*
-   Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+   Copyright 2021  Dean Camera (dean [at] fourwalledcubicle [dot] com)
  
    Permission to use, copy, modify, distribute, and sell this
    software and its documentation for any purpose is hereby granted
@@@ -132,6 -132,17 +132,6 @@@ void Application_Jump_Check(void
                /* Re-enable JTAG debugging */
                JTAG_ENABLE();
        #else
 -              /* Check if the device's BOOTRST fuse is set */
 -              if (!(BootloaderAPI_ReadFuse(GET_HIGH_FUSE_BITS) & ~FUSE_BOOTRST))
 -              {
 -                      /* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
 -                      if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
 -                        JumpToApplication = true;
 -
 -                      /* Clear reset source */
 -                      MCUSR &= ~(1 << EXTRF);
 -              }
 -              else
                {
                        /* If the reset source was the bootloader and the key is correct, clear it and jump to the application;
                         * this can happen in the HWBE fuse is set, and the HBE pin is low during the watchdog reset */
        }
  }
  
 +
 +static volatile bool stayinbootloader;
 +
  /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
   *  runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start
   *  the loaded application code.
@@@ -174,43 -182,18 +174,46 @@@ int main(void
        SetupHardware();
  
        /* Turn on first LED on the board to indicate that the bootloader has started */
 -      LEDs_SetAllLEDs(LEDS_LED1);
 +      //LEDs_SetAllLEDs(LEDS_LED1);
  
        /* Enable global interrupts so that the USB stack can function */
        GlobalInterruptEnable();
  
        /* Run the USB management task while the bootloader is supposed to be running */
 +      /*if bit_is_clear(PINB,PB5)     // PB5 is Digital 9 on Arduino Pro Micro
 +      {
 +              loop_until_bit_is_set(PINB,PB5);
 +
 +              while ((RunBootloader || WaitForExit) && bit_is_set(PINB,PB5))
 +                      USB_USBTask();
 +
 +              loop_until_bit_is_clear(PINB,PB5);
 +      }*/
 +
 +      stayinbootloader = false;
 +
 +      uint16_t i = 0;
        while (RunBootloader || WaitForExit)
 -        USB_USBTask();
 +      {
 +              USB_USBTask();
 +
 +              if (!stayinbootloader)
 +              {
 +                      _delay_ms(1);
 +                      if (i++ > 5000)
 +                      {
 +                              break;
 +                      }
 +              }
 +              else
 +              {
 +                      i = 0;
 +              }
 +      }
  
+       /* Wait a short time to end all USB transactions and then disconnect */
+       _delay_us(1000);
        /* Reset configured hardware back to their original states for the user application */
        ResetHardware();
  
@@@ -234,11 -217,7 +237,11 @@@ static void SetupHardware(void
  
        /* Initialize the USB and other board hardware drivers */
        USB_Init();
 -      LEDs_Init();
 +      //LEDs_Init();
 +      DDRB = 1;
 +      PORTB = _BV(PB5);
 +      DDRD = 0b00100000;
 +      PORTD = 0;
  
        /* Bootloader active LED toggle timer initialization */
        TIMSK1 = (1 << TOIE1);
@@@ -250,11 -229,7 +253,11 @@@ static void ResetHardware(void
  {
        /* Shut down the USB and other board hardware drivers */
        USB_Disable();
 -      LEDs_Disable();
 +      //LEDs_Disable();
 +      DDRB = 0;
 +      PORTB = 0;
 +      DDRD = 0;
 +      PORTD = 0;
  
        /* Disable Bootloader active LED toggle timer */
        TIMSK1 = 0;
  /** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */
  ISR(TIMER1_OVF_vect, ISR_BLOCK)
  {
 -      LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
 +      //LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
 +      PORTB &= ~_BV(PB0);
 +      _delay_ms(5);
 +      PORTB |= _BV(PB0);
  }
  
  /** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
@@@ -287,13 -259,8 +290,13 @@@ void EVENT_USB_Device_ControlRequest(vo
                return;
        }
  
 +stayinbootloader = true;
 +
        /* Activity - toggle indicator LEDs */
 -      LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
 +      //LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
 +      PORTB &= ~_BV(PB0);
 +      _delay_ms(5);
 +      PORTB |= _BV(PB0);
  
        /* Get the size of the command and data from the wLength value */
        SentCommand.DataSize = USB_ControlRequest.wLength;
                                                        }
  
                                                        /* Write the next word into the current flash page */
-                                                       boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_16_LE());
+                                                       BootloaderAPI_FillWord(CurrFlashAddress.Long, Endpoint_Read_16_LE());
  
                                                        /* Adjust counters */
                                                        WordsInFlashPage      += 1;
                                                        if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining))
                                                        {
                                                                /* Commit the flash page to memory */
-                                                               boot_page_write(CurrFlashPageStartAddress);
-                                                               boot_spm_busy_wait();
+                                                               BootloaderAPI_WritePage(CurrFlashPageStartAddress);
  
                                                                /* Check if programming incomplete */
                                                                if (WordsRemaining)
                                                                        WordsInFlashPage          = 0;
  
                                                                        /* Erase next page's temp buffer */
-                                                                       boot_page_erase(CurrFlashAddress.Long);
-                                                                       boot_spm_busy_wait();
+                                                                       BootloaderAPI_ErasePage(CurrFlashAddress.Long);
                                                                }
                                                        }
                                                }
  
                                                /* Once programming complete, start address equals the end address */
                                                StartAddr = EndAddr;
-                                               /* Re-enable the RWW section of flash */
-                                               boot_rww_enable();
                                        }
                                        else                                                   // Write EEPROM
                                        {
@@@ -727,8 -689,7 +725,7 @@@ static void ProcessMemProgCommand(void
                        } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};
  
                        /* Erase the current page's temp buffer */
-                       boot_page_erase(CurrFlashAddress.Long);
-                       boot_spm_busy_wait();
+                       BootloaderAPI_ErasePage(CurrFlashAddress.Long);
                }
  
                /* Set the state so that the next DNLOAD requests reads in the firmware */
@@@ -825,21 -786,9 +822,9 @@@ static void ProcessWriteCommand(void
        }
        else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF))                 // Erase flash
        {
-               uint32_t CurrFlashAddress = 0;
                /* Clear the application section of flash */
-               while (CurrFlashAddress < (uint32_t)BOOT_START_ADDR)
-               {
-                       boot_page_erase(CurrFlashAddress);
-                       boot_spm_busy_wait();
-                       boot_page_write(CurrFlashAddress);
-                       boot_spm_busy_wait();
-                       CurrFlashAddress += SPM_PAGESIZE;
-               }
-               /* Re-enable the RWW section of flash as writing to the flash locks it out */
-               boot_rww_enable();
+               for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
+                       BootloaderAPI_ErasePage(CurrFlashAddress);
  
                /* Memory has been erased, reset the security bit so that programming/reading is allowed */
                IsSecure = false;
@@@ -1,13 -1,13 +1,13 @@@
  /*
               LUFA Library
-      Copyright (C) Dean Camera, 2017.
+      Copyright (C) Dean Camera, 2021.
  
    dean [at] fourwalledcubicle [dot] com
             www.lufa-lib.org
  */
  
  /*
-   Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+   Copyright 2021  Dean Camera (dean [at] fourwalledcubicle [dot] com)
  
    Permission to use, copy, modify, distribute, and sell this
    software and its documentation for any purpose is hereby granted
@@@ -52,7 -52,7 +52,7 @@@
                #include "Config/AppConfig.h"
  
                #include <LUFA/Drivers/USB/USB.h>
 -              #include <LUFA/Drivers/Board/LEDs.h>
 +              //#include <LUFA/Drivers/Board/LEDs.h>
                #include <LUFA/Platform/Platform.h>
  
        /* Preprocessor Checks: */
diff --combined Bootloaders/DFU/makefile
@@@ -1,6 -1,6 +1,6 @@@
  #
  #             LUFA Library
- #     Copyright (C) Dean Camera, 2017.
+ #     Copyright (C) Dean Camera, 2021.
  #
  #  dean [at] fourwalledcubicle [dot] com
  #           www.lufa-lib.org
@@@ -11,9 -11,9 +11,9 @@@
  
  # Run "make help" for target help.
  
 -MCU          = at90usb1287
 +MCU          = atmega32u4
  ARCH         = AVR8
 -BOARD        = USBKEY
 +BOARD        = USER
  F_CPU        = 8000000
  F_USB        = $(F_CPU)
  OPTIMIZATION = s
@@@ -22,12 -22,13 +22,13 @@@ SRC          = $(TARGET).c Descriptors.
  LUFA_PATH    = ../../LUFA
  CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
  LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
+ LTO          = Y
  
  # Flash size and bootloader section sizes of the target, in KB. These must
  # match the target's total FLASH size and the bootloader size set in the
  # device's fuses.
 -FLASH_SIZE_KB         = 128
 -BOOT_SECTION_SIZE_KB  = 8
 +FLASH_SIZE_KB         = 32
 +BOOT_SECTION_SIZE_KB  = 4
  
  # Bootloader address calculation formulas
  # Do not modify these macros, but rather modify the dependent values above.