菜鸟学习S3C2440bootloader第二话

本文详细介绍了S3C2440A芯片的时钟配置过程,包括UPLL和MPLL的设置方法及注意事项。解析了相关寄存器的含义及其配置参数,并解释了配置时的延时原因。

       ldr   r0,=UPLLCON

       ldr   r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV) 

       str   r1,[r0]

(配置UPLL,一般UPLL的值设置为48MHZ,或者96MHZ,因为一般较难找到一个合适的PLL值,所以手册上推荐了一些。本程序中有如下宏定义:#define UCLK 48000000(在option.h文件中),则对应手册上的推荐值,MDIV=56,PDIV=2,SDIV=2

       (在option.inc文件中又有如下代码,通过这段代码已经确定了U_MDIVU_PDIV U_SDIV值,那么上面的代码就是将相应分频值写入到UPLLCON。详细的内容去看数据手册的第7章,时钟与电源管理部分。)

       [ UCLK = 48000000

U_MDIV        EQU       56           ;Fin=12.0MHz Fout=48MHz

U_PDIV         EQU       2

              [ CPU_SEL = 32440001

U_SDIV         EQU       2            ; 2440A(我们设置的是这个值,因为用的芯片是S3C2440A

            |

U_SDIV         EQU       1            ; 2440X

            ]

       ]

       程序继续执行:

       nop 

       nop

       nop

       nop

       nop

       nop

       nop

这里面插入了7nop,在设置完UPLLCON寄存器后,需要至少延时7-clocks,等待硬件的配置完成。

       ;Configure MPLL

       ldr   r0,=MPLLCON

       ldr   r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=16.9344MHz

       str   r1,[r0]

       接下来配置MPLLCON寄存器,与UPLLCON部分相同,优龙2440的板子主频是400MHZ

       [ FCLK = 400000000

CLKDIV_VAL EQU       5            ;1:4:8

M_MDIV              EQU       92           ;Fin=12.0MHz Fout=400MHz

M_PDIV        EQU       1

              [ CPU_SEL = 32440001

M_SDIV        EQU       1            ; 2440A

              |

M_SDIV        EQU       0            ; 2440X

              ]

       ]

M_MDIV=92,M_PDIV=1,M_SDIV=1.本程序段将这几个值写入到了MPLLCON寄存器。

       ;Check if the boot is caused by the wake-up from SLEEP mode.

       ldr   r1,=GSTATUS2

       ldr   r0,[r1]

       tst    r0,#0x2

       ;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.

       bne  WAKEUP_SLEEP

检查引导程序是否是从休眠模式被唤醒的,如果是的话,就跳转到相应的程序段进行处理。

这里面用到了一个tst指令。首先了解一下这个指令。

       tst是位测试指令,根据测试结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。

       再来看GSTATUS2这个寄存器,查询芯片手册,GSTATUS2是复位状态寄存器,本程序测试的是它的第1位(0010),“Boot is caused by wakeup reset in sleep mode”,这个标志代表引导程序是从休眠模式被唤醒的。由于我这里并不是从休眠模式唤醒的,所以程序没有跳转,继续顺序执行。

       ;Set memory control registers

      ;ldr  r0,=SMRDATA    

      adrl r0, SMRDATA      ;be careful!, hzh    

       ldr   r1,=BWSCON       ;BWSCON Address   

       add r2, r0, #52     ;End address of SMRDATA  

 

0

       ldr   r3, [r0], #4  

       str   r3, [r1], #4  

       cmp r2, r0  

       bne %B0  

         

       mov r0, #&1000  

1

       subs       r0, r0, #1     

       bne %B1  

这里是设置存储器控制寄存器。首先还是了解一下adrl指令,它是中等范围的地址读取指令,比ADR伪指令可以读取更大范围的地址。SMRDATA是一个标号,将这个标号处的地址加载到了r0BWSCON是总线宽度与等待控制寄存器,将这个寄存器的地址加载到了r1。然后将SMRDATA+52地址值加载到r2,这个地址是SMRDATA的尾地址。在SMRDATA地址处存放的是用DCD指令分配的一定大小的字内存单元,这段内存存放的就是与存储器相关的控制寄存器的配置参数。再来看BWSCON的地址是0x48000000,然后是BANKCON0Bank0 控制寄存器)的地址是0x48000004BANKCON1Bank0 控制寄存器)的地址是0x48000008,以此类推,一直到BANKCON7的地址是0x48000020。接着是REFRESHSDRAM 刷新控制寄存)地址是:0x48000024BANKSIZE可调的bank 大小寄存器)地址是:0x48000028MRSRB6模式寄存器集寄存器bank6)地址是:0x4800002CMRSRB7模式寄存器集寄存器bank7)地址是:0x48000030。上面这些寄存器都是存储器控制的相关寄存器,地址全部连续,相差0x04. 那么现在知道了为什么ldr     r3, [r0], #4str       r3, [r1], #4,这两段代码,先将SMRDATA

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值