📄 startup.c
字号:
return TRUE;
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void AT91F_InitSDRAM()
{
/* Configure PIOC as peripheral (D16/D31) */
AT91C_BASE_PIOC->PIO_ASR = 0xFFFF0000 ;
AT91C_BASE_PIOC->PIO_BSR = 0x0 ;
AT91C_BASE_PIOC->PIO_PDR = 0xFFFF0000 ;
/* Setup MEMC to support all connected memories (CS0 = FLASH; CS1=SDRAM) */
*AT91C_EBI_CSA = 0x02 ;
/* Init SDRAM */
*AT91C_SDRC_CR = 0x2188c155 ; ////////////////////////
*AT91C_SDRC_MR = 0x2 ;
*(AT91_REG *)0x20000000 = 0 ;
*AT91C_SDRC_MR = 0x4 ;
*(AT91_REG *)0x20000000 = 0 ;
*(AT91_REG *)0x20000000 = 0 ;
*(AT91_REG *)0x20000000 = 0 ;
*(AT91_REG *)0x20000000 = 0 ;
*(AT91_REG *)0x20000000 = 0 ;
*(AT91_REG *)0x20000000 = 0 ;
*(AT91_REG *)0x20000000 = 0 ;
*(AT91_REG *)0x20000000 = 0 ;
*AT91C_SDRC_MR = 0x3 ;
*(AT91_REG *)0x20000080 = 0 ;
*AT91C_SDRC_TR = 0x2e0 ;
*(AT91_REG *)0x20000000 = 0 ;
*AT91C_SDRC_MR = 0x0 ;
*(AT91_REG *)0x20000000 = 0 ;
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void AT91F_LowLevelInit()
{
//*
uint8 status;
//step1
status = AT91F_WaitForMainClockFrequency();
//step2
AT91F_InitFlash();
//step3
status = AT91F_InitClocks(PLLAR,PLLBR,MCKR);
//step4
AT91F_InitSDRAM();
// AT91F_InitEBI_SMC2_ForDisplayController();
AT91F_AIC_Open(
AT91C_BASE_AIC, // pointer to the AIC registers
AT91C_AIC_BRANCH_OPCODE, // IRQ exception vector
0, // FIQ exception vector
0, // AIC default handler
0, // AIC spurious handler
0); // Protect mode
// Perform 8 End Of Interrupt Command to make s齬e AIC will not Lock out nIRQ
//8个中断优先级
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
//2007-03-16 gliethttp
//XDBGU_ini中会引用内存,这样会触发异常
//所以应该精简函数
// XDBGU_ini();
{
AT91F_DBGU_CfgPIO();
AT91F_DBGU_CfgPMC();
AT91F_US_Configure (
(AT91PS_USART) AT91C_BASE_DBGU, // DBGU基址
GMCLK, // GMCLK
AT91C_US_ASYNC_MODE , // mode Register to be programmed
115200 , // baudrate to be programmed
0);
AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
}
//gliethttp 2007-04-23
//使能指令cache
__asm
{
mrc p15,0,r0,c1,c0,0
orr r0,r0,(1<<12)
mcr p15,0,r0,c1,c0,0
}
#if __xHardDog_OK
xHardDog_Install();
#endif
//*/
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】
//【 创建人及创建时间 】gliethttp 2007-03-14
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
#define xsrc_base 0x10010000
#define xdst_base 0x20000000
extern uint32 Image$$RO$$Base;
extern uint32 Image$$ZI$$Limit;
void xCopy2SDRAM(void)
{register uint32 *src,*dst;
register uint32 i;
register uint32 dot;
register uint32 xcode_size = (uint32)&Image$$ZI$$Limit - (uint32)&Image$$RO$$Base;
register uint32 xdot_size;
#if __xHardDog_OK
register uint8 local_feed = 0;
#endif
xxxdprintf("\r\nFlash自启动代码加载...\r\n");
src = (uint32*)xsrc_base;
dst = (uint32*)xdst_base;
//#define xcode_size (1024*500/4)
xcode_size = 1024*500;
xcode_size /= 4;
xcode_size += 1;
xdot_size = (xcode_size/10);
for(i = 0,dot = 0;i < xcode_size;i++)
{
*dst++ = *src++;
dot++;
if(dot >= (xcode_size/10))
{
#if __xHardDog_OK
{
if(local_feed % 2)xHardDog_ON();//对IO操作是比较耗时的
else xHardDog_OFF();
++local_feed;
}
#endif
dot = 0;
xxxdprintf(".");
}
}
xxxdprintf("\r\n加载中\n\r");
}
//---------------------------------------------------------------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】
//【 创建人及创建时间 】gliethttp 2007-03-14
//【 修改人及修改时间 】
//【 修 改 原 因 】实现Flash中代码自拷贝后的remap
//【 功 能 描 述 】
//---------------------------------------------------------------------------------------------------------------------
void xat91_remap(void)
{
//合成irq跳转机器码
{uint32 *dst;
dst = (uint32*)0x00200018;
#if 1
*dst = 0xe51fff20;//在0地址合成ldr pc, [pc,#-0xF20]指令
#else
*dst = 0xe59ff000;
dst = (uint32*)0x00200020;
*dst = 0x20000018;
#endif
}
{//uint16 i;
uint16 *dst;
char *p;
dst = (uint16*)0x00200000;
AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB;
dst = (uint16*)0x500;
*dst = 0;
p = (char*)0x500;
*p = 0x88;
if((*dst & 0xff) != 0x88)
{
AT91C_BASE_MC->MC_RCR = AT91C_MC_RCB;
xxxdprintf("二次重映射!\r\n");
}else xxxdprintf("重映射!\r\n");
}
}
//⊙⊙⊙
//⊙⊙⊙完了⊙⊙⊙
//⊙⊙⊙over⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -