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对应分析文章)

   

   

 

posted @ 2016-09-08 14:12  达达kiki  阅读(113)  评论(0编辑  收藏  举报