board/osmo-sdr: Add DFU support for the startup code

DFU mode will be entered if:
 - 0xDFDFDFDF magic is at AT91C_IRAM
 - Button is pressed
 - No valid firmware seem to be present (start addr = 0xffffffff)

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
This commit is contained in:
Sylvain Munaut 2012-03-29 10:40:00 +02:00
parent e3a39f0d8b
commit 3b3b41d2ba
1 changed files with 33 additions and 0 deletions

View File

@ -33,6 +33,7 @@
#include "board.h"
#include "exceptions.h"
#include "board_lowlevel.h"
#include <usb/device/dfu/dfu.h>
//------------------------------------------------------------------------------
// External Variables
@ -121,6 +122,20 @@ IntFunc exception_table[] = {
IrqHandlerNotUsed // 30 not used
};
#if defined(BOARD_USB_DFU) && !defined(dfu)
static void BootIntoApp(void)
{
unsigned int *pSrc;
void (*appReset)(void);
pSrc = (unsigned int *) ((unsigned char *)AT91C_IFLASH0 + BOARD_DFU_BOOT_SIZE);
if (pSrc[1] == 0xffffffff)
return;
AT91C_BASE_NVIC->NVIC_VTOFFR = ((unsigned int)(pSrc)) | (0x0 << 7);
appReset = pSrc[1];
appReset();
}
#endif
//------------------------------------------------------------------------------
/// This is the code that gets called on processor reset. To initialize the
@ -131,6 +146,24 @@ void ResetException(void)
unsigned int *pSrc, *pDest;
LowLevelInit();
#if defined(BOARD_USB_DFU) && !defined(dfu)
#ifdef BOARD_DFU_BTN_PIOA
/* There is a PIO button that can be used to enter DFU */
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
AT91C_BASE_PIOA->PIO_PPUER = (1 << BOARD_DFU_BTN_PIOA);
AT91C_BASE_PIOA->PIO_ODR = (1 << BOARD_DFU_BTN_PIOA);
AT91C_BASE_PIOA->PIO_PER = (1 << BOARD_DFU_BTN_PIOA);
if (AT91C_BASE_PIOA->PIO_PDSR & (1 << BOARD_DFU_BTN_PIOA) &&
#else /* BOARD_DFU_BTN_PIOA */
if (1 &&
#endif /* BOARD_DFU_BTN_PIOA */
*((unsigned long *)USB_DFU_MAGIC_ADDR) != USB_DFU_MAGIC) {
BootIntoApp();
}
#endif
#if defined(psram)
pDest = &_vect_start;
pSrc = &_svectorrelocate;