原创 s5pc100中uboot移植之内存控制器的设置

2011-7-8 10:11 1093 4 4 分类: MCU/ 嵌入式

作者:王劲男,华清远见嵌入式培训中心讲师。

s5pc100是三星公司推出的基于Cortax-A8核心的一款专门针对应用、消费类电子产品而设计的芯片,针对它的介绍网上有很多了,我们就不专门介绍这款芯片了。

今天是针对U-boot的移植。我们先来看看u-boot的特点,u-boot是Boot-loader的一种可以负责板子上电后硬件初始化工作,以及内核引导。它可以为用户提供一个可交互的界面,使开机过程可控,可调,方便开发人员调试。

今天我们移植的版本是u-boot1.3.1这是一个比较成熟的版本,我们先来看看要移植一个u-boot需要注意哪些问题。

首先我们应该先拿到一个u-boot源码,应该是如下图:

《源码》

其中比较重要的、有针对性的目录是board, cpu, include等。我们要修改的大部分内容将集中在这些目录里面。

由于,篇幅有限这次只介绍CPU中针对内存控制器的初始化部分的内容:

ldr r0, =0xE6000000
        ldr r1, =0xE0000000
        ldr r2, [r1]
        bic r2, #0xfffffdff
        mov r2, r2, lsr #9
        cmp r2, #0x1
        beq onenand_pop

这部分内容是用汇编语言写的看起来比较清爽,没有太多的复杂的逻辑。

上面的代码是用来判断我们处理器的封装形式的,其中r1中存放着芯片ID寄存器的地址,这是一个32位寄存器,其中记录了芯片的型号如果是s5pc100的话,这个寄存器的前20位应该是“0x43100”。其中,第9位是用来判断芯片的封装形式的,如果为1,表示是POP形式就是。为0,表示是分立元件。我们一般使用分立式元件。

ldr r1, =0x6a101000
        str r1, [r0, #0x18]
        ldr r1, =0x000084f4
        str r1, [r0, #0x1c]
        ldr r1, =0x0
        str r1, [r0, #0x20]

这部分是真对,DDR内存而设置的,DLL(delay locked loop)参数。

ldr r1, =0x6a101002
        str r1, [r0,#0x18]
        ldr r1, =0x6a101003
        str r1, [r0,#0x18]

这是开启DLL工作。
        ldr r2, =0xe6000040
        loop1:
        ldr r1,[r2]
        ands r1,r1,#4
        beq loop1

检查DLL锁,是否已经锁上。

ldr r1,[r2]
        mov r1,r1, LSR #(0x6)
        ldr r2, =0xE6000018
        ldr r3,[r2]
        bic r3,r3,#(0xff000000)
        orr r1,r3,r2
        str r1,[r2]

ldr r1, =0x6a101003
        str r1, [r0, #0x18]

ldr r1, =0x6a101009
        str r1, [r0, #0x18]

完成必要的设置,暂停DLL。

ldr r1, =0x20f01313
        str r1, [r0, #0x08]
        ldr r1, =0x40f01313
        str r1, [r0, #0x0c]

配置256MB内存AXI设置地址。

ldr r1, =0x20000000
        str r1, [r0, #0x14]
        ldr r1, =0x00100004
        str r1, [r0, #0x28]

设置自刷新周期

ldr r1, =0x0000050E
        str r1,[r0, #0x30]
        ldr r1, =0x16233297
        str r1, [r0,#0x34]
        ldr r1, =0x23230000
        str r1, [r0,#0x38]

ldr r1, =0x07c80232
        str r1, [r0, #]

这个地方是设置内存芯片的交流(AC)参数时序信息包括TimingAref, TimingRow, TimingData 和 TimingPower

ldr r1, =0x07000000
        str r1, [r0, #0x10]
        ldr r1, =0x01000000
        str r1, [r0, #0x10]

ldr r1, =0x00020000
        str r1, [r0, #0x10]

ldr r1, =0x00030000
        str r1, [r0, #0x10]

ldr r1, =0x00010400
        str r1, [r0, #0x10]

ldr r1, =0x00000532
        str r1, [r0, #0x10]

ldr r1, =0x01000000
        str r1, [r0, #0x10]

ldr r1, =0x05000000
        str r1, [r0, #0x10]

ldr r1, =0x00000432
        str r1, [r0, #0x10]

ldr r1, =0x00010780
        str r1, [r0, #0x10]

ldr r1, =0x00010402
        str r1, [r0, #0x10]

首先是唤醒chip0,然后所有模块预充电(这是为读取操作做准备),对bank2-3发msr/emsr命令(模式设定),设定内存进入自动刷新模式。最后是对EMRS寄存器进行设设置。

ldr r1, =0x00ff20b0
        str r1, [r0, #0x0]
        ldr r1, =0x00212413
        str r1, [r0, #0x4]
        b exit_cpu_init

打开自动刷新,设定读数据的取周期,设定内存的类型为DDR2和32位位宽。芯片数是2片,BL(burst length)=4。

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条