Start.s详细分析2

3.硬件初始化

    之前分析一直是按照源码和韦东山的u-boot进行对比,但是在后面部分,一些代码涉及稍微大一些的修改,并且一些代码的的次序也有改变,所以从这里开始,我们先分析u-boot-1.1.6(100ask24x0),完成后再对源码进行分析,最后在做总结。

 

    a.接上版我们来到这一段代码:

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    adr     r0, _start    
    ldr     r1, _TEXT_BASE    
    cmp     r0, r1              
    blne    cpu_init_crit
#endif

    比较r0与r1值是否相同,这里比较的是两者的地址,在_star的地址为重定位之前它的值和_TEXT_BASE是不相同的,bl代表跳转,ne为比较ro、r1后的标志位,因为r0 != r1

    程序跳转至cpu_init_crit,关于这段代码的实现自己也有些疑惑,为什么一定要判断,到这里r0和r1肯定不同,为什么要多此一举,不可以直接用bl跳转到cpu_init_crit执行

吗?源码不就是直接使用bl跳转吗?那么我们来实验一把,将比较部分去掉运行下面一段,看看结果。

#ifndef CONFIG_SKIP_LOWLEVEL_INIT            
    bl    cpu_init_crit
#endif

    (暂时略过操作部分)

   

    b.cpu_init_crit

    分析完以上部分后我们来到最重要的cpu_init_crit部分,跳转到cpu_init_crit我们看到如下代码:

 1 cpu_init_crit:                                                                         
 2     mov    r0, #0   
 3     mcr    p15, 0, r0, c7, c7, 0    /* flush v3/v4 cache */
 4     mcr    p15, 0, r0, c8, c7, 0    /* flush v4 TLB */   
5 mrc p15, 0, r0, c1, c0, 0 6 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) 7 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) 8 orr r0, r0, #0x00000002 @ set bit 2 (A) Align 9 orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache 10 mcr p15, 0, r0, c1, c0, 0

    这里频繁用到了协处理器指令,mrc/mcr,我们直接找到协处理的操作方式:MCR{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>},分别对应mcr和mrc我们知道该部分大致进行了如下操作:

    1、对协处理器P15中的c7/c8位写零并清空v3/v4缓存

    2、将协处理器中p15的c1位的值0写入r0,猜测:相当于对r0、c1同时写0

    3、对ARM寄存器某些位操作,开启或关断某些功能

    4、将0写入r0及p15的c1,且协处理器不执行任何操作(看作是工作完后的清0过程)

    上述大致分析可以看出,几乎只要是arm9系列,该部分几乎是相同的,除非协处理器和上述操作过的寄存器的虚拟地址有所变化,一般不需要修改

    

    c.接着往下是该段代码:

1     mov    ip, lr             
2     bl     lowlevel_init  
3     mov    lr, ip               
4     mov    pc, lr 

    先将链接地址放到ip中,接着跳到lowlevel_init中执行,当执行完跳转回来后,再将储存在ip中的地址放到lr中,然后再将该地址传回给pc(程序计数器指示指令在寄存器中存放位置),于是程序跳回到cpu_init_crit处,完成该过程的硬件初始化。

 

    d.lowlevel_init

    内存相关配置,实现内存初始化,下面为相关代码:

    ldr     r0, =SMRDATA      
    ldr     r1, _TEXT_BASE                                                    
    sub     r0, r0, r1
    ldr     r1, =BWSCON
    add     r2, r0, #13*4                                 
0:
    ldr     r3, [r0], #4                                     
    str     r3, [r1], #4                               
    cmp     r2, r0
    bne     0b 
                                       
    mov    pc, lr

    .ltorg
SMRDATA:                                                                             
    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))  
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))                                                                   
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))                                                                   
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))                                                                   
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))                                                                   
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))                                                                   
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))                                                                   
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))                                                                                                     
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))                                                                                                     
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)              
    .word 0xb1                                                                                                                                                             
    .word 0x30                                                                                          
    .word 0x30  
BWSCON

    (BWSCON为内存初始化相关寄存器设置,该部分折叠)

    这一部分使用汇编的形式对内存进行的初始化,BWSCON中是对相关寄存器设置(总共13个寄存器,分别为:BWSCON、BANKCONx(x=0~7)、REFRESH、  BANKSIZE、MRSRB6、MRSRB7,相关设置见硬件部分),从u-boot整体来看,我们是先初始化内存,然后设置栈(因为栈设置的前提是内存能够被正常使用),同时泛观整个cpu初始化部分,我们可以看到一些好的编程习惯,比如用mov ip, lr来保存当前程序位置,又比如相关r0/r1操作后的清0,这些操作经验都是值得借鉴的。

 

 

  

 

posted @ 2016-09-10 21:22  达达kiki  阅读(100)  评论(0)    收藏  举报