/**************************************************************************
* CPU_init_critICal临界区寄存器
* 设置一些重要的寄存器,并进行内存测试。
*************************************************************************
*/
#define INTCON (0x01c00000+0x200000) /* 中断控制器 */
#define INTMSK (0x01c00000+0x20000c) /* 中断控制屏蔽寄存器 */
#define LOCKTIME (0x01c00000+0x18000c)
#define PLLCON (0x01c00000+0x180000)
#define CLKCON (0x01c00000+0x180004)
#define WTCON (0x01c00000+0x130000)
cpu_init_crit:
/* 关闭看门狗 */
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
/** 清除所有中断位,设置INTMRs实现。*/
ldr r1,=INTMSK
ldr r0, =0x03fffeff
str r0, [r1]
ldr r1, =INTCON
ldr r0, =0x05
str r0, [r1]
/* 设置时钟控制寄存器 */
ldr r1, =LOCKTIME
ldrb r0, =800
strb r0, [r1]
/* 设置锁相环,控制CPU运行速度。 */
ldr r1, =PLLCON
#if CONFIG_S3C44B0_CLOCK_SPEED==66
ldr r0, =0x34031 /* 66MHz (QUARTz=11MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
str r0, [r1]
ldr r1,=CLKCON
ldr r0, =0x7ff8
str r0, [r1]
/* 调用子函数返回 */
mov pc, lr
/*************************************************/
/* 实际的中断向量表 */
/*************************************************/
real_vectors:
b reset
b undefined_instruction
b SOFtware_interrupt
b prefetch_abort
b data_abort
b not_used
b IRQ
b fiq
/*************************************************/
undefined_instruction:
mov r6, #3
b reset
software_interrupt:
mov r6, #4
b reset
prefetch_abort:
mov r6, #5
b reset
data_abort:
mov r6, #6
b reset
not_used:
/* we *should* never reach this */
mov r6, #7
b reset
irq:
mov r6, #8
b reset
fiq:
mov r6, #9
b reset
把引导的汇编看完,已经准备C的运行环境,下面就开始学习C的源程序,从start.S文件里到跳文件lib_arm\board.c里运
行.
/*引导程序从汇编start.S里跳到这里执行。蔡军生 2005/07/19*/
void start_armboot (void)
{
/* 声明一个全局指针,它是指向一个数据结构,用于保存参数。
并且它占用r8寄存器,用它来保存内存地址,达到全局使用目的。
*/
DECLARE_GLOBAL_DATA_PTR;
ulong size;
init_fnc_t **init_fnc_ptr;
char *s;
#if defined(CONFIG_VFD) defined(CONFIG_LCD) unsigned long addr;
#endif
/* gd指针可写,因为已经分配一个寄存器给它作为变量。
这里就相当于把后面算出来的地址保存到r8寄存器.
*/
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
/* 下面一句是阻止3.4以上版本的GCC进行代码优化,把后面的代码删除掉。 */
__asm__ __volatile__("": : :"memory");
/* 清空gd指向的结构 */
MEMSet ((void*)gd, 0, sizeof (gd_t));
/* */
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
mEMSet (gd->bd, 0, sizeof (bd_t));
monitor_flash_len = _bss_start - _armboot_start;
这一段准备好保存参数的全局变量区.
后面就是一系列的初始化和获取正确的参数.
上一篇:如何开发arm(5)