📄 bootloader.c
字号:
/******************************************************************************/
/* This file is part of the ARM Toolchain package */
/* Copyright KEIL ELEKTRONIK GmbH 2005 - 2007 */
/******************************************************************************/
/* */
/* Bootloader.C 2-nd level bootloader for AT91SAM926x Devices */
/* */
/******************************************************************************/
#include <AT91SAM9260.H> // AT91SAM9260 definitions
#include <lib_AT91SAM9260.h> // Library function definitions
#include "FlashHW.h"
#include "Error.h" // Error definitions
#define STACK_SIZE 64 // Stack Size
#define DF_OFFSET 0x4200 // User Program offset in DataFlash
#define EXT_SDRAM (0x20000000) // Start address of external SDRAM
// Pointer to start of the External SDRAM where Application is copied
typedef void (*fnc)(void);
const fnc AppEntry = (fnc) EXT_SDRAM;
/**************************** Auxiliary Functions ******************************/
/*- GetProgramSize () ----------------------------------------------------------
*
* Get size of user program to be copied
* Parameter:
* Return Value: size in bytes
*/
static unsigned int GetProgramSize (void) {
unsigned char buf[32];
ReadPage_HW(DF_OFFSET, 32, buf);
return (*(unsigned long *)&buf[0x14]);
}
/*************************** 2-nd Level Bootloader *****************************/
/*- main () --------------------------------------------------------------------
*
* C routine for DataFlash Initialization and copying code from External Flash
* to External SDRAM
* Parameter:
* Return Value: 0 - OK, 1 - Failed
*/
int main (void) {
unsigned long prog_size, page_size;
unsigned long i;
InitFlashController_HW(0, 0, 0, 18432000);
// Copy code from External Flash to External SDRAM
prog_size = GetProgramSize (); // Number of bytes to copy
if (prog_size == 0xFFFFFFFF) // If no program exists in Ext Flash
return (1); // then Exit bootloader
// Get page size for copying
page_size = (unsigned long) GetPageSize_HW();
// If button BP4 is pressed while power-up then erase the flash reserved
// for 2-nd level bootloader
*AT91C_PIOA_PPUER = AT91C_PIO_PA31;
if (!(*AT91C_PIOA_PDSR & AT91C_PIO_PA31)) {
for (i = 0; i < DF_OFFSET; i += page_size)
ErasePage_HW(i);
return (1); // Exit bootloader
}
// Copy code from External Flash to External SDRAM
for (i = 0; i < prog_size; i += page_size)
ReadPage_HW(DF_OFFSET+i, page_size, (unsigned char *)(EXT_SDRAM+i));
// Leave only PIOC enabled (needed for External SDRAM)
*AT91C_PMC_PCER &= (1 << AT91C_ID_PIOC);
AppEntry(); // Start the copied Application
return (0);
}
/*******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -