Start.s详细分析1(接随笔部分)
(原创文章,作者:达达kiki,未经许可,谢绝转载)
材料准备:u-boot-1.1.6源码、u-boot-1.1.6针对100ask24x0平台代码(已编译)
目的:通过比较start.S来叙述s3c3440这款芯片在u-boot移植中做了哪些修改以及为什么要做这些修改
叙述习惯:1.不需要修改的地方简述,需要修改的地方详述
2.u-boot源码后称源u-boot,u-boot编译后的代码称改u-boot
stage1:
- 1、系统上电,进入svc模式
- 2、关闭看门狗,禁止所有中断
- 3、进行初级硬件初始化
- 4、将自身代码拷贝到SDRAM中
- 5、设置堆栈
- 6、清空bss段
- 7、跳转到C语言实现的stage2中
1.系统上电进入svc模式
这里的svc模式(Supervisor)指的是s3c2440芯片的管理模式,该款芯片共有7种模式,而此处选择的是用svc模式,选择原因可以阅读芯片手册,从开发者角度我们可以想象,为了用户不同需求,我们提供几种工作模式,有的针对系统移植,有的只使用ARM常规的功能,而svc就是一个针对系统操作的模式,芯片手册也有这样解释:Protected mode for the operating system,所以当我们完成寄存器操作配置后就能使用该功能了,这里对配置不做描述,代码如下:
reset: mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0
2.关闭看门狗,禁止中断
(吐槽:个人感觉“禁止中断”翻译得欠妥,从含义上说实际上应该是“掩盖”中断(Mask the interrupt),这样更符合计算机角度,当然“禁止中断”这个词便于更多人认识,但是也将很大部分人带进了“误区”)
源u-boot定义部分:
1 #if defined(CONFIG_S3C2400) 2 # define pWTCON 0x15300000 3 # define INTMSK 0x14400008 4 # define CLKDIVN 0x14800014 5 #elif defined(CONFIG_S3C2410) 6 # define pWTCON 0x53000000 7 # define INTMSK 0x4A000008 8 # define INTSUBMSK 0x4A00001C 9 # define CLKDIVN 0x4C000014 10 #endif
头文件中我们定义了CONFIG_S3C2410,因此选择第五行代码开始分析(之后这种涉及c语言知识部分会直接叙述),pWTCON(看门狗)、INTMSK(中断源屏蔽寄存器)、INTSUBMSK(子中断源屏蔽寄存器)、CLKDIVN(时钟分频)。
改u-boot添加了:
# define INTMOD 0X4A000004
INTMOD(中断模式判断寄存器),用于选择中断是工作在FIQ还是IRQ
总而言之,关中断的目的是关闭外部中断,也就是IRQ,但是快速中断(FIQ)在设定后仍然可以被触发,而INTMOD被定义了,但是在此处未被设定,应该有其他目的,继续往后看。
源u-boot操作部分:
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) ldr r0, =pWTCON mov r1, #0x0 str r1, [r0] /* * mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMSK str r1, [r0] # if defined(CONFIG_S3C2410) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, [r0] # endif /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN
mov r1, #3 str r1, [r0] #endif
关看门狗、关中断、设置时钟分频,改u-boot中该处隐去了时钟分频,而我们知道对于ARM启动而言时钟是肯定需要的,当我们往后看时会发现有一个clock_init,在这个clock中有时钟的初始化,分频FCLK:HCLK:PCLK = 1:2:4(时钟程序部分见2440对应分析文章)