X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/782614dbb55addcae8c9d4d9e1ce3dec81287282..77a9df36a77d2523dd2bc24fa17f9f04c6c175c5:/Bootloaders/DFU/BootloaderDFU.c diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c index 717c934e5..1dae162d2 100644 --- a/Bootloaders/DFU/BootloaderDFU.c +++ b/Bootloaders/DFU/BootloaderDFU.c @@ -87,7 +87,7 @@ static uint8_t Flash64KBPage = 0; */ static uint16_t StartAddr = 0x0000; -/** Memory end address, indicating the end address to read to/write from in the memory being addressed (either FLASH +/** Memory end address, indicating the end address to read from/write to in the memory being addressed (either FLASH * of EEPROM depending on the issued command from the host). */ static uint16_t EndAddr = 0x0000; @@ -109,7 +109,7 @@ int main(void) /* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */ PORTF |= (1 << 4); - _delay_ms(10); + Delay_MS(10); /* If the TCK pin is not jumpered to ground, start the user application instead */ RunBootloader = (!(PINF & (1 << 4))); @@ -119,6 +119,9 @@ int main(void) MCUCR &= ~(1 << JTD); #endif + /* Turn on first LED on the board to indicate that the bootloader has started */ + LEDs_SetAllLEDs(LEDS_LED1); + /* Enable global interrupts so that the USB stack can function */ sei(); @@ -149,6 +152,11 @@ void SetupHardware(void) /* Initialize the USB subsystem */ USB_Init(); + LEDs_Init(); + + /* Bootloader active LED toggle timer initialization */ + TIMSK1 = (1 << TOIE1); + TCCR1B = ((1 << CS11) | (1 << CS10)); } /** Resets all configured hardware required for the bootloader back to their original states. */ @@ -162,15 +170,18 @@ void ResetHardware(void) MCUCR = 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); +} + /** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to * the device from the USB host before passing along unhandled control requests to the library for processing * internally. */ void EVENT_USB_Device_ControlRequest(void) -{ - /* Get the size of the command and data from the wLength value */ - SentCommand.DataSize = USB_ControlRequest.wLength; - +{ /* Ignore any requests that aren't directed to the DFU interface */ if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) != (REQTYPE_CLASS | REQREC_INTERFACE)) @@ -178,6 +189,12 @@ void EVENT_USB_Device_ControlRequest(void) return; } + /* Activity - toggle indicator LEDs */ + LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2); + + /* Get the size of the command and data from the wLength value */ + SentCommand.DataSize = USB_ControlRequest.wLength; + switch (USB_ControlRequest.bRequest) { case DFU_REQ_DNLOAD: @@ -203,7 +220,7 @@ void EVENT_USB_Device_ControlRequest(void) } /* First byte of the data stage is the DNLOAD request's command */ - SentCommand.Command = Endpoint_Read_Byte(); + SentCommand.Command = Endpoint_Read_8(); /* One byte of the data stage is the command, so subtract it from the total data bytes */ SentCommand.DataSize--; @@ -212,7 +229,7 @@ void EVENT_USB_Device_ControlRequest(void) for (uint8_t DataByte = 0; (DataByte < sizeof(SentCommand.Data)) && Endpoint_BytesInEndpoint(); DataByte++) { - SentCommand.Data[DataByte] = Endpoint_Read_Byte(); + SentCommand.Data[DataByte] = Endpoint_Read_8(); SentCommand.DataSize--; } @@ -267,7 +284,7 @@ void EVENT_USB_Device_ControlRequest(void) } /* Write the next word into the current flash page */ - boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_Word_LE()); + boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_16_LE()); /* Adjust counters */ WordsInFlashPage += 1; @@ -316,7 +333,7 @@ void EVENT_USB_Device_ControlRequest(void) } /* Read the byte from the USB interface and write to to the EEPROM */ - eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_Byte()); + eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_8()); /* Adjust counters */ StartAddr++; @@ -348,12 +365,12 @@ void EVENT_USB_Device_ControlRequest(void) { /* Blank checking is performed in the DFU_DNLOAD request - if we get here we've told the host that the memory isn't blank, and the host is requesting the first non-blank address */ - Endpoint_Write_Word_LE(StartAddr); + Endpoint_Write_16_LE(StartAddr); } else { /* Idle state upload - send response to last issued command */ - Endpoint_Write_Byte(ResponseByte); + Endpoint_Write_8(ResponseByte); } } else @@ -388,9 +405,9 @@ void EVENT_USB_Device_ControlRequest(void) /* Read the flash word and send it via USB to the host */ #if (FLASHEND > 0xFFFF) - Endpoint_Write_Word_LE(pgm_read_word_far(CurrFlashAddress.Long)); + Endpoint_Write_16_LE(pgm_read_word_far(CurrFlashAddress.Long)); #else - Endpoint_Write_Word_LE(pgm_read_word(CurrFlashAddress.Long)); + Endpoint_Write_16_LE(pgm_read_word(CurrFlashAddress.Long)); #endif /* Adjust counters */ @@ -417,7 +434,7 @@ void EVENT_USB_Device_ControlRequest(void) } /* Read the EEPROM byte and send it via USB to the host */ - Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)StartAddr)); + Endpoint_Write_8(eeprom_read_byte((uint8_t*)StartAddr)); /* Adjust counters */ StartAddr++; @@ -436,17 +453,17 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearSETUP(); /* Write 8-bit status value */ - Endpoint_Write_Byte(DFU_Status); + Endpoint_Write_8(DFU_Status); /* Write 24-bit poll timeout value */ - Endpoint_Write_Byte(0); - Endpoint_Write_Word_LE(0); + Endpoint_Write_8(0); + Endpoint_Write_16_LE(0); /* Write 8-bit state value */ - Endpoint_Write_Byte(DFU_State); + Endpoint_Write_8(DFU_State); /* Write 8-bit state string ID number */ - Endpoint_Write_Byte(0); + Endpoint_Write_8(0); Endpoint_ClearIN(); @@ -464,7 +481,7 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearSETUP(); /* Write the current device state to the endpoint */ - Endpoint_Write_Byte(DFU_State); + Endpoint_Write_8(DFU_State); Endpoint_ClearIN(); @@ -503,7 +520,7 @@ static void DiscardFillerBytes(uint8_t NumberOfBytes) } else { - Endpoint_Discard_Byte(); + Endpoint_Discard_8(); } } }